Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(479)

Side by Side Diff: pkg/analyzer/lib/src/fasta/ast_builder.dart

Issue 2797343003: Support for parsing native function bodies with Fasta. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/analysis/file_state.dart ('k') | pkg/analyzer/test/generated/parser_fasta_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698