From 9eee1175d9c3089ba53ebed12171bf57a40e80e3 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Tue, 27 Jun 2017 14:22:01 -0700 Subject: Allow "dotted" import paths The code: __import foo.bar; will try to import from a file matching "foo/bar.slang". I also went ahead and allowed a raw string literal in and import: __import "foo/bar"; (In the latter case, an explicit `/` must be used instead of `.`) --- source/slang/parser.cpp | 38 +++++++++++++++++++++++----- tests/front-end/import-subdir.slang | 7 +++++ tests/front-end/subdir/import-subdir-a.slang | 5 ++++ 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 tests/front-end/import-subdir.slang create mode 100644 tests/front-end/subdir/import-subdir-a.slang diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp index 1d843c821..3ffbc1263 100644 --- a/source/slang/parser.cpp +++ b/source/slang/parser.cpp @@ -794,15 +794,46 @@ namespace Slang } } + static TokenType peekTokenType(Parser* parser) + { + return parser->tokenReader.PeekTokenType(); + } + static RefPtr parseImportDecl( Parser* parser) { parser->ReadToken("__import"); auto decl = new ImportDecl(); - decl->nameToken = parser->ReadToken(TokenType::Identifier); decl->scope = parser->currentScope; + if (peekTokenType(parser) == TokenType::StringLiterial) + { + auto nameToken = parser->ReadToken(TokenType::StringLiterial); + nameToken.Content = getStringLiteralTokenValue(nameToken); + decl->nameToken = nameToken; + } + else + { + auto nameToken = parser->ReadToken(TokenType::Identifier); + + // We allow a dotted format for the name, as sugar + if (peekTokenType(parser) == TokenType::Dot) + { + StringBuilder sb; + sb << nameToken.Content; + while (AdvanceIf(parser, TokenType::Dot)) + { + sb << "/"; + sb << parser->ReadToken(TokenType::Identifier).Content; + } + + nameToken.Content = sb.ProduceString(); + } + + decl->nameToken = nameToken; + } + parser->ReadToken(TokenType::Semicolon); return decl; @@ -3093,11 +3124,6 @@ namespace Slang #endif } - static TokenType peekTokenType(Parser* parser) - { - return parser->tokenReader.PeekTokenType(); - } - // We *might* be looking at an application of a generic to arguments, // but we need to disambiguate to make sure. static RefPtr maybeParseGenericApp( diff --git a/tests/front-end/import-subdir.slang b/tests/front-end/import-subdir.slang new file mode 100644 index 000000000..0d3931a82 --- /dev/null +++ b/tests/front-end/import-subdir.slang @@ -0,0 +1,7 @@ +//TEST:SIMPLE: + +// Confirming that we can use "dot notation" to import via a subdirectory + +__import subdir.import_subdir_a; + +float bar(float x) { return foo(x); } \ No newline at end of file diff --git a/tests/front-end/subdir/import-subdir-a.slang b/tests/front-end/subdir/import-subdir-a.slang new file mode 100644 index 000000000..3962d4662 --- /dev/null +++ b/tests/front-end/subdir/import-subdir-a.slang @@ -0,0 +1,5 @@ +//TEST_IGNORE_FILE: + +// This is the imported code. + +float foo(float x) { return x; } \ No newline at end of file -- cgit v1.2.3