aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-12-17 12:12:24 +0000
committergingerBill <bill@gingerbill.org>2017-12-17 12:12:24 +0000
commit436928d06a8bf38b5ee4b188169e02a609d8d955 (patch)
tree1a8c5eb5d5ae631aa8011defe45e0f7ac5c04fc4 /src/parser.cpp
parent32a502d14ebea99ed1f526904635ff66afda8fd4 (diff)
Fix "using in import"
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index e8dbd1a05..fb1d3e364 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -4359,22 +4359,31 @@ AstNode *parse_asm_stmt(AstFile *f) {
}
-AstNode *parse_import_decl(AstFile *f, bool is_using) {
+enum ImportDeclKind {
+ ImportDecl_Standard,
+ ImportDecl_Using,
+ ImportDecl_UsingIn,
+};
+
+AstNode *parse_import_decl(AstFile *f, ImportDeclKind kind) {
CommentGroup docs = f->lead_comment;
Token token = expect_token(f, Token_import);
Token import_name = {};
+ bool is_using = kind != ImportDecl_Standard;
- switch (f->curr_token.kind) {
- case Token_Ident:
- import_name = advance_token(f);
- break;
- default:
- import_name.pos = f->curr_token.pos;
- break;
- }
+ if (kind != ImportDecl_UsingIn) {
+ switch (f->curr_token.kind) {
+ case Token_Ident:
+ import_name = advance_token(f);
+ break;
+ default:
+ import_name.pos = f->curr_token.pos;
+ break;
+ }
- if (!is_using && is_blank_ident(import_name)) {
- syntax_error(import_name, "Illegal import name: '_'");
+ if (!is_using && is_blank_ident(import_name)) {
+ syntax_error(import_name, "Illegal import name: '_'");
+ }
}
Token file_path = expect_token_after(f, Token_String, "import");
@@ -4496,7 +4505,7 @@ AstNode *parse_stmt(AstFile *f) {
return parse_foreign_decl(f);
case Token_import:
- return parse_import_decl(f, false);
+ return parse_import_decl(f, ImportDecl_Standard);
case Token_export:
return parse_export_decl(f);
@@ -4528,7 +4537,7 @@ AstNode *parse_stmt(AstFile *f) {
CommentGroup docs = f->lead_comment;
Token token = expect_token(f, Token_using);
if (f->curr_token.kind == Token_import) {
- return parse_import_decl(f, true);
+ return parse_import_decl(f, ImportDecl_Using);
}
AstNode *decl = nullptr;
@@ -4542,7 +4551,7 @@ AstNode *parse_stmt(AstFile *f) {
if (f->curr_token.kind == Token_in) {
Token in_token = expect_token(f, Token_in);
if (f->curr_token.kind == Token_import) {
- AstNode *import_decl = parse_import_decl(f, true);
+ AstNode *import_decl = parse_import_decl(f, ImportDecl_UsingIn);
if (import_decl->kind == AstNode_ImportDecl) {
import_decl->ImportDecl.using_in_list = list;
}