()
| 24 | } |
| 25 | |
| 26 | func (p *Parser) parseModule() *ast.Module { |
| 27 | module := &ast.Module{} |
| 28 | if !p.match(lexer.TokenKeywordPackage) { |
| 29 | p.addCurrentSyntaxError(messages.FormatDiagnostic(messages.DiagnosticModuleMustStartWithPackage)) |
| 30 | return module |
| 31 | } |
| 32 | packageName, ok := p.expectIdentifier(messages.FormatDiagnostic(messages.DiagnosticExpectedPackageName)) |
| 33 | if ok { |
| 34 | module.PackageName = packageName |
| 35 | } |
| 36 | |
| 37 | for !p.check(lexer.TokenEOF) { |
| 38 | switch p.current().Kind { |
| 39 | case lexer.TokenSemicolon: |
| 40 | p.advance() |
| 41 | case lexer.TokenKeywordImport: |
| 42 | module.Imports = append(module.Imports, p.parseImportDecls()...) |
| 43 | case lexer.TokenKeywordType: |
| 44 | declaration := p.parseTypeDecl() |
| 45 | if declaration != nil { |
| 46 | module.Decls = append(module.Decls, declaration) |
| 47 | } |
| 48 | case lexer.TokenKeywordTask: |
| 49 | declaration := p.parseTaskDecl() |
| 50 | if declaration != nil { |
| 51 | module.Decls = append(module.Decls, declaration) |
| 52 | } |
| 53 | case lexer.TokenKeywordFunc: |
| 54 | declaration := p.parseFuncDecl() |
| 55 | if declaration != nil { |
| 56 | module.Decls = append(module.Decls, declaration) |
| 57 | } |
| 58 | default: |
| 59 | p.addCurrentSyntaxError(messages.FormatDiagnostic(messages.DiagnosticUnsupportedTopLevelDeclaration)) |
| 60 | p.synchronizeTopLevel() |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | if len(p.tokens) > 0 { |
| 65 | module.Span = spanFromTokenRange(p.tokens[0], p.tokens[len(p.tokens)-1]) |
| 66 | } |
| 67 | return module |
| 68 | } |
| 69 | |
| 70 | func (p *Parser) parseImportDecls() []ast.ImportDecl { |
| 71 | start := p.advance() |
no test coverage detected