Skip to content

Commit 4df8c75

Browse files
committed
fixup! in import/using expr, newline is allowed after first token
1 parent 444d411 commit 4df8c75

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

Units/parser-julia.r/library.d/expected.tags

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@ func2 input.jl /^import Module4.func1, Module4.func2$/;" kind:unknown scope:modu
1010
Module5 input.jl /^import Module5: func1, func2$/;" kind:module roles:imported
1111
func1 input.jl /^import Module5: func1, func2$/;" kind:unknown scope:module:Module5 roles:imported
1212
func2 input.jl /^import Module5: func1, func2$/;" kind:unknown scope:module:Module5 roles:imported
13+
MyModule input.jl /^module MyModule$/;" kind:module roles:def
14+
Module6 input.jl /^using Module6,$/;" kind:module roles:using
15+
Module7 input.jl /^ Module7,$/;" kind:module roles:using
16+
Module8 input.jl /^ Module8$/;" kind:module roles:using
17+
Module9 input.jl /^using Module9: func1,$/;" kind:module roles:using
18+
func1 input.jl /^using Module9: func1,$/;" kind:unknown scope:module:Module9 roles:using
19+
func2 input.jl /^ func2,$/;" kind:unknown scope:module:Module9 roles:using
20+
func3 input.jl /^ func3$/;" kind:unknown scope:module:Module9 roles:using

Units/parser-julia.r/library.d/input.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,13 @@ using Module2: func1, func2
33
import Module3
44
import Module4.func1, Module4.func2
55
import Module5: func1, func2
6+
7+
module MyModule
8+
using Module6,
9+
Module7,
10+
Module8
11+
12+
using Module9: func1,
13+
func2,
14+
func3
15+
end

parsers/julia.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,8 +1199,9 @@ static void parseModule (lexerState *lexer, vString *scope, int parent_kind)
11991199
//advanceToken(lexer, true);
12001200
//parseExpr(lexer, true, K_MODULE, scope);
12011201
}
1202+
12021203
/*
1203-
* Parse a token in import/using expression that may have a dot in it.
1204+
* Parse a token in import expression that may have a dot in it.
12041205
*/
12051206
static void parseImportToken(lexerState *lexer, vString *scope, int module_role, int unknown_role, vString *module_name)
12061207
{
@@ -1228,33 +1229,50 @@ static void parseImport (lexerState *lexer, vString *scope, int token_type)
12281229
vString *name = vStringNew();
12291230
int module_role;
12301231
int unknown_role;
1232+
/* capture the imported name */
1233+
advanceToken(lexer, true);
1234+
vStringCopy(name, lexer->token_str);
12311235
if (token_type == TOKEN_IMPORT)
12321236
{
12331237
module_role = JULIA_MODULE_IMPORTED;
12341238
unknown_role = JULIA_UNKNOWN_IMPORTED;
1239+
/* The import expression may look like "import Mod" or "import
1240+
* Mod.symbol", we have to deal with these 2 possibilities. */
1241+
parseImportToken(lexer, scope, module_role, unknown_role, name);
12351242
}
12361243
else /* if (token_type) == TOKEN_USING */
12371244
{
12381245
module_role = JULIA_MODULE_USING;
12391246
unknown_role = JULIA_UNKNOWN_USING;
1247+
/* The using expression always look like "using Mod", so we can tag it
1248+
* easily. */
1249+
addReferenceTag(lexer->token_str, K_MODULE, module_role, lexer->line, lexer->pos, NULL);
12401250
}
1241-
/* capture the imported name */
1242-
advanceToken(lexer, true);
1243-
vStringCopy(name, lexer->token_str);
1244-
parseImportToken(lexer, scope, module_role, unknown_role, name);
12451251
if (lexer->cur_c == ':' || lexer->cur_c == ',')
12461252
{
12471253
char delimiter = lexer->cur_c;
12481254
advanceChar(lexer);
12491255
advanceToken(lexer, true);
1256+
if (lexer->cur_token == TOKEN_NEWLINE)
1257+
{
1258+
advanceToken(lexer, true);
1259+
}
12501260
while (lexer->cur_token == TOKEN_IDENTIFIER || lexer->cur_token == TOKEN_MACROCALL)
12511261
{
1252-
if (delimiter == ',')
1262+
if (token_type == TOKEN_IMPORT && delimiter == ',')
12531263
{
1264+
/* import Mod1.symbol1, Mod2.symbol2, Mod3 */
12541265
parseImportToken(lexer, scope, module_role, unknown_role, name);
12551266
}
1267+
else if (token_type == TOKEN_USING && delimiter == ',')
1268+
{
1269+
/* using Mod1, Mod2 */
1270+
addReferenceTag(lexer->token_str, K_MODULE, module_role, lexer->line, lexer->pos, NULL);
1271+
}
12561272
else /* if (delimiter == ':') */
12571273
{
1274+
/* import Mod1: symbol1, symbol2 */
1275+
/* using Mod1: symbol1, symbol2 */
12581276
addReferenceTag(lexer->token_str, K_UNKNOWN, unknown_role, lexer->line, lexer->pos, name);
12591277
}
12601278
skipWhitespace(lexer, false);

0 commit comments

Comments
 (0)