OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library fasta.analyzer.ast_builder; | 5 library fasta.analyzer.ast_builder; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; | 8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; |
9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; | 9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; |
10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; | 10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; |
11 import 'package:analyzer/dart/element/element.dart' show Element; | 11 import 'package:analyzer/dart/element/element.dart' show Element; |
12 import 'package:front_end/src/fasta/parser/parser.dart' | 12 import 'package:front_end/src/fasta/parser/parser.dart' |
13 show FormalParameterType; | 13 show FormalParameterType, Parser; |
14 import 'package:front_end/src/fasta/scanner/token.dart' | 14 import 'package:front_end/src/fasta/scanner/token.dart' |
15 show BeginGroupToken, Token; | 15 show BeginGroupToken, Token; |
16 | 16 |
17 import 'package:front_end/src/fasta/errors.dart' show internalError; | 17 import 'package:front_end/src/fasta/errors.dart' show internalError; |
18 import 'package:front_end/src/fasta/fasta_codes.dart' | 18 import 'package:front_end/src/fasta/fasta_codes.dart' |
19 show FastaMessage, codeExpectedExpression; | 19 show FastaMessage, codeExpectedExpression, codeExpectedFunctionBody; |
20 import 'package:front_end/src/fasta/kernel/kernel_builder.dart' | 20 import 'package:front_end/src/fasta/kernel/kernel_builder.dart' |
21 show Builder, KernelLibraryBuilder, ProcedureBuilder, Scope; | 21 show Builder, KernelLibraryBuilder, ProcedureBuilder, Scope; |
22 import 'package:front_end/src/fasta/parser/identifier_context.dart' | 22 import 'package:front_end/src/fasta/parser/identifier_context.dart' |
23 show IdentifierContext; | 23 show IdentifierContext; |
24 import 'package:front_end/src/fasta/quote.dart'; | 24 import 'package:front_end/src/fasta/quote.dart'; |
25 import 'package:front_end/src/fasta/source/scope_listener.dart' | 25 import 'package:front_end/src/fasta/source/scope_listener.dart' |
26 show JumpTargetKind, NullValue, ScopeListener; | 26 show JumpTargetKind, NullValue, ScopeListener; |
27 import 'analyzer.dart' show toKernel; | 27 import 'analyzer.dart' show toKernel; |
28 import 'element_store.dart' | 28 import 'element_store.dart' |
29 show | 29 show |
30 AnalyzerLocalVariableElemment, | 30 AnalyzerLocalVariableElemment, |
31 AnalyzerParameterElement, | 31 AnalyzerParameterElement, |
32 ElementStore, | 32 ElementStore, |
33 KernelClassElement; | 33 KernelClassElement; |
34 import 'package:analyzer/src/dart/error/syntactic_errors.dart'; | 34 import 'package:analyzer/src/dart/error/syntactic_errors.dart'; |
35 import 'token_utils.dart' show toAnalyzerToken, toAnalyzerCommentToken; | 35 import 'token_utils.dart' show toAnalyzerToken, toAnalyzerCommentToken; |
36 | 36 |
37 class AstBuilder extends ScopeListener { | 37 class AstBuilder extends ScopeListener { |
38 final AstFactory ast = standard.astFactory; | 38 final AstFactory ast = standard.astFactory; |
39 | 39 |
40 final ErrorReporter errorReporter; | 40 final ErrorReporter errorReporter; |
41 final KernelLibraryBuilder library; | 41 final KernelLibraryBuilder library; |
42 final Builder member; | 42 final Builder member; |
43 final ElementStore elementStore; | 43 final ElementStore elementStore; |
44 | 44 |
45 @override | 45 @override |
46 final Uri uri; | 46 final Uri uri; |
47 | 47 |
| 48 /** |
| 49 * The [Parser] that uses this listener, used to parse optional parts, e.g. |
| 50 * `native` support. |
| 51 */ |
| 52 Parser parser; |
| 53 |
48 /// The name of the class currently being parsed, or `null` if no class is | 54 /// The name of the class currently being parsed, or `null` if no class is |
49 /// being parsed. | 55 /// being parsed. |
50 String className; | 56 String className; |
51 | 57 |
52 AstBuilder(this.errorReporter, this.library, this.member, this.elementStore, | 58 AstBuilder(this.errorReporter, this.library, this.member, this.elementStore, |
53 Scope scope, | 59 Scope scope, |
54 [Uri uri]) | 60 [Uri uri]) |
55 : uri = uri ?? library.fileUri, | 61 : uri = uri ?? library.fileUri, |
56 super(scope); | 62 super(scope); |
57 | 63 |
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 toAnalyzerToken(closeCurlyBracket))); | 1111 toAnalyzerToken(closeCurlyBracket))); |
1106 } | 1112 } |
1107 } | 1113 } |
1108 | 1114 |
1109 @override | 1115 @override |
1110 void handleInvalidExpression(Token token) { | 1116 void handleInvalidExpression(Token token) { |
1111 debugEvent("InvalidExpression"); | 1117 debugEvent("InvalidExpression"); |
1112 } | 1118 } |
1113 | 1119 |
1114 @override | 1120 @override |
| 1121 void handleInvalidFunctionBody(Token token) { |
| 1122 debugEvent("InvalidFunctionBody"); |
| 1123 } |
| 1124 |
| 1125 @override |
1115 Token handleUnrecoverableError(Token token, FastaMessage message) { | 1126 Token handleUnrecoverableError(Token token, FastaMessage message) { |
1116 if (message.code == codeExpectedExpression) { | 1127 if (message.code == codeExpectedFunctionBody) { |
| 1128 if (identical('native', token.stringValue) && parser != null) { |
| 1129 Token nativeKeyword = token; |
| 1130 Token semicolon = parser.parseLiteralString(token.next); |
| 1131 token = parser.expectSemicolon(semicolon); |
| 1132 StringLiteral name = pop(); |
| 1133 pop(); // star |
| 1134 pop(); // async |
| 1135 push(ast.nativeFunctionBody( |
| 1136 toAnalyzerToken(nativeKeyword), name, toAnalyzerToken(semicolon))); |
| 1137 return token; |
| 1138 } |
| 1139 } else if (message.code == codeExpectedExpression) { |
1117 String lexeme = token.lexeme; | 1140 String lexeme = token.lexeme; |
1118 if (identical('async', lexeme) || identical('yield', lexeme)) { | 1141 if (identical('async', lexeme) || identical('yield', lexeme)) { |
1119 errorReporter?.reportErrorForOffset( | 1142 errorReporter?.reportErrorForOffset( |
1120 ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, | 1143 ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, |
1121 token.charOffset, | 1144 token.charOffset, |
1122 token.charCount); | 1145 token.charCount); |
1123 push(ast.simpleIdentifier(toAnalyzerToken(token))); | 1146 push(ast.simpleIdentifier(toAnalyzerToken(token))); |
1124 return token; | 1147 return token; |
1125 } | 1148 } |
1126 } | 1149 } |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1965 } else if (identical('static', s)) { | 1988 } else if (identical('static', s)) { |
1966 staticKeyword = token; | 1989 staticKeyword = token; |
1967 } else if (identical('var', s)) { | 1990 } else if (identical('var', s)) { |
1968 finalConstOrVarKeyword = token; | 1991 finalConstOrVarKeyword = token; |
1969 } else { | 1992 } else { |
1970 internalError('Unhandled modifier: $s'); | 1993 internalError('Unhandled modifier: $s'); |
1971 } | 1994 } |
1972 } | 1995 } |
1973 } | 1996 } |
1974 } | 1997 } |
OLD | NEW |