From 74b3ef3a3fd4e87cd82f70953b3b83b04a0bc5bd Mon Sep 17 00:00:00 2001 From: joe-conigliaro Date: Tue, 30 Jul 2019 11:49:47 +1000 Subject: [PATCH] minor module fixes --- compiler/parser.v | 43 +++++++++++++++++++++++++++++++++++++++++-- compiler/table.v | 38 -------------------------------------- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/compiler/parser.v b/compiler/parser.v index 8d93c8d602..4af1225726 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -317,13 +317,52 @@ fn (p mut Parser) imports() { if p.tok == .lpar { p.check(.lpar) for p.tok != .rpar && p.tok != .eof { - p.register_import() + p.import_statement() } p.check(.rpar) return } // `import foo` - p.register_import() + p.import_statement() +} + +fn (p mut Parser) import_statement() { + if p.tok != .name { + p.error('bad import format') + } + if p.peek() == .number && p.scanner.text[p.scanner.pos + 1] == `.` { + p.error('bad import format. module/submodule names cannot begin with a number.') + } + mut pkg := p.check_name().trim_space() + mut mod_alias := pkg + // submodule support + mut depth := 1 + for p.tok == .dot { + p.check(.dot) + submodule := p.check_name() + mod_alias = submodule + pkg += '.' + submodule + depth++ + if depth > MaxModuleDepth { + p.error('module depth of $MaxModuleDepth exceeded: $pkg') + } + } + // aliasing (import encoding.base64 as b64) + if p.tok == .key_as && p.peek() == .name { + p.check(.key_as) + mod_alias = p.check_name() + } + // add import to file scope import table + p.import_table.register_alias(mod_alias, pkg) + // Make sure there are no duplicate imports + if p.table.imports.contains(pkg) { + return + } + p.log('adding import $pkg') + p.table.imports << pkg + p.table.register_package(pkg) + + p.fgenln(' ' + pkg) } fn (p mut Parser) const_decl() { diff --git a/compiler/table.v b/compiler/table.v index 110eb229d4..8e6bb2aa7d 100644 --- a/compiler/table.v +++ b/compiler/table.v @@ -188,44 +188,6 @@ fn (t mut Table) register_package(pkg string) { t.packages << pkg } -fn (p mut Parser) register_import() { - if p.tok != .name { - p.error('bad import format') - } - mut pkg := p.lit.trim_space() - mut mod_alias := pkg - // submodule support - mut depth := 1 - p.next() - for p.tok == .dot { - p.check(.dot) - submodule := p.check_name() - mod_alias = submodule - pkg += '.' + submodule - depth++ - if depth > MaxModuleDepth { - p.error('module depth of $MaxModuleDepth exceeded: $pkg') - } - } - // aliasing (import encoding.base64 as b64) - if p.tok == .key_as && p.peek() == .name { - p.check(.key_as) - mod_alias = p.check_name() - } - // add import to file scope import table - p.import_table.register_alias(mod_alias, pkg) - // Make sure there are no duplicate imports - if p.table.imports.contains(pkg) { - return - } - p.log('adding import $pkg') - p.table.imports << pkg - p.table.register_package(pkg) - - p.fgenln(' ' + pkg) -} - - fn (p mut Parser) register_array(typ string) { if typ.contains('*') { println('bad arr $typ')