| 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 |