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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Issue 2704753002: Implement line and column numbers. (Closed)
Patch Set: Change message. Created 3 years, 10 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.body_builder; 5 library fasta.body_builder;
6 6
7 import 'package:front_end/src/fasta/parser/parser.dart' show 7 import 'package:front_end/src/fasta/parser/parser.dart' show
8 FormalParameterType, 8 FormalParameterType,
9 optional; 9 optional;
10 10
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 import '../modifier.dart' show 72 import '../modifier.dart' show
73 Modifier, 73 Modifier,
74 constMask, 74 constMask,
75 finalMask; 75 finalMask;
76 76
77 import 'redirecting_factory_body.dart' show 77 import 'redirecting_factory_body.dart' show
78 getRedirectionTarget; 78 getRedirectionTarget;
79 79
80 import 'kernel_builder.dart'; 80 import 'kernel_builder.dart';
81 81
82 const bool showNits = false;
83
84 final Name callName = new Name("call"); 82 final Name callName = new Name("call");
85 83
86 final Name plusName = new Name("+"); 84 final Name plusName = new Name("+");
87 85
88 final Name minusName = new Name("-"); 86 final Name minusName = new Name("-");
89 87
90 final Name multiplyName = new Name("*"); 88 final Name multiplyName = new Name("*");
91 89
92 final Name divisionName = new Name("/"); 90 final Name divisionName = new Name("/");
93 91
(...skipping 25 matching lines...) Expand all
119 117
120 final bool isInstanceMember; 118 final bool isInstanceMember;
121 119
122 final Map<String, FieldInitializer> fieldInitializers = 120 final Map<String, FieldInitializer> fieldInitializers =
123 <String, FieldInitializer>{}; 121 <String, FieldInitializer>{};
124 122
125 final Scope enclosingScope; 123 final Scope enclosingScope;
126 124
127 final bool isDartLibrary; 125 final bool isDartLibrary;
128 126
127 @override
128 final Uri uri;
129
129 Scope formalParameterScope; 130 Scope formalParameterScope;
130 131
131 bool isFirstIdentifier = false; 132 bool isFirstIdentifier = false;
132 133
133 bool hasParserError = false; 134 bool hasParserError = false;
134 135
135 bool inInitializer = false; 136 bool inInitializer = false;
136 137
137 bool inCatchClause = false; 138 bool inCatchClause = false;
138 139
139 int functionNestingLevel = 0; 140 int functionNestingLevel = 0;
140 141
141 Statement compileTimeErrorInTry; 142 Statement compileTimeErrorInTry;
142 143
143 Statement compileTimeErrorInLoopOrSwitch; 144 Statement compileTimeErrorInLoopOrSwitch;
144 145
145 Scope switchScope; 146 Scope switchScope;
146 147
147 CloneVisitor cloner; 148 CloneVisitor cloner;
148 149
149 BodyBuilder(KernelLibraryBuilder library, this.member, Scope scope, 150 BodyBuilder(KernelLibraryBuilder library, this.member, Scope scope,
150 this.formalParameterScope, this.hierarchy, this.coreTypes, 151 this.formalParameterScope, this.hierarchy, this.coreTypes,
151 this.classBuilder, this.isInstanceMember) 152 this.classBuilder, this.isInstanceMember, this.uri)
152 : enclosingScope = scope, 153 : enclosingScope = scope,
153 library = library, 154 library = library,
154 isDartLibrary = library.uri.scheme == "dart", 155 isDartLibrary = library.uri.scheme == "dart",
155 super(scope); 156 super(scope);
156 157
157 bool get inConstructor { 158 bool get inConstructor {
158 return functionNestingLevel == 0 && member is KernelConstructorBuilder; 159 return functionNestingLevel == 0 && member is KernelConstructorBuilder;
159 } 160 }
160 161
161 bool get isInstanceContext { 162 bool get isInstanceContext {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 void enterSwitchScope() { 267 void enterSwitchScope() {
267 push(switchScope ?? NullValue.SwitchScope); 268 push(switchScope ?? NullValue.SwitchScope);
268 switchScope = scope; 269 switchScope = scope;
269 } 270 }
270 271
271 void exitSwitchScope() { 272 void exitSwitchScope() {
272 switchScope = pop(); 273 switchScope = pop();
273 } 274 }
274 275
275 @override 276 @override
276 Uri get uri => library.fileUri ?? library.uri;
277
278 @override
279 JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) { 277 JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) {
280 return new JumpTarget(kind, member, charOffset); 278 return new JumpTarget(kind, member, charOffset);
281 } 279 }
282 280
283 @override 281 @override
284 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { 282 void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
285 debugEvent("Metadata"); 283 debugEvent("Metadata");
286 pop(); // Arguments. 284 pop(); // Arguments.
287 popIfNotNull(periodBeforeName); // Postfix. 285 popIfNotNull(periodBeforeName); // Postfix.
288 pop(); // Type arguments. 286 pop(); // Type arguments.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 field.initializer = initializer; 331 field.initializer = initializer;
334 } 332 }
335 } 333 }
336 pop(); // Type. 334 pop(); // Type.
337 pop(); // Modifiers. 335 pop(); // Modifiers.
338 } 336 }
339 337
340 @override 338 @override
341 void endMember() { 339 void endMember() {
342 debugEvent("Member"); 340 debugEvent("Member");
343 checkEmpty(); 341 checkEmpty(-1);
344 } 342 }
345 343
346 @override 344 @override
347 void endFunctionBody(int count, Token beginToken, Token endToken) { 345 void endFunctionBody(int count, Token beginToken, Token endToken) {
348 debugEvent("FunctionBody"); 346 debugEvent("FunctionBody");
349 if (beginToken == null) { 347 if (beginToken == null) {
350 assert(count == 0); 348 assert(count == 0);
351 push(NullValue.Block); 349 push(NullValue.Block);
352 } else { 350 } else {
353 Block block = popBlock(count); 351 Block block = popBlock(count);
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 } 1144 }
1147 1145
1148 DartType toKernelType(String name, List<DartType> arguments, int charOffset) { 1146 DartType toKernelType(String name, List<DartType> arguments, int charOffset) {
1149 if (identical(name, "void")) return const VoidType(); 1147 if (identical(name, "void")) return const VoidType();
1150 if (identical(name, "dynamic")) return const DynamicType(); 1148 if (identical(name, "dynamic")) return const DynamicType();
1151 Builder builder = scope.lookup(name, charOffset, uri); 1149 Builder builder = scope.lookup(name, charOffset, uri);
1152 if (builder is TypeDeclarationBuilder) { 1150 if (builder is TypeDeclarationBuilder) {
1153 return builder.buildTypesWithBuiltArguments(arguments); 1151 return builder.buildTypesWithBuiltArguments(arguments);
1154 } 1152 }
1155 if (builder == null) { 1153 if (builder == null) {
1156 print("$uri: Type not found: $name"); 1154 warning("Type not found: '$name'.", charOffset);
1157 } else { 1155 } else {
1158 print("$uri: Not a type: $name"); 1156 warning("Not a type: '$name'.", charOffset);
1159 } 1157 }
1160 // TODO(ahe): Create an error somehow. 1158 // TODO(ahe): Create an error somehow.
1161 return const DynamicType(); 1159 return const DynamicType();
1162 } 1160 }
1163 1161
1164 @override 1162 @override
1165 void endType(Token beginToken, Token endToken) { 1163 void endType(Token beginToken, Token endToken) {
1166 // TODO(ahe): The scope is wrong for return types of generic functions. 1164 // TODO(ahe): The scope is wrong for return types of generic functions.
1167 debugEvent("Type"); 1165 debugEvent("Type");
1168 List<DartType> arguments = pop(); 1166 List<DartType> arguments = pop();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 "'${name.name}' isn't a field in this class."); 1291 "'${name.name}' isn't a field in this class.");
1294 thisKeyword = null; 1292 thisKeyword = null;
1295 } 1293 }
1296 } else if (thisKeyword == null) { 1294 } else if (thisKeyword == null) {
1297 variable = builder.build(); 1295 variable = builder.build();
1298 variable.initializer = name.initializer; 1296 variable.initializer = name.initializer;
1299 } else if (builder.isField && builder.parent == classBuilder) { 1297 } else if (builder.isField && builder.parent == classBuilder) {
1300 FieldBuilder field = builder; 1298 FieldBuilder field = builder;
1301 if (type != null) { 1299 if (type != null) {
1302 nit("Ignoring type on 'this' parameter '${name.name}'.", 1300 nit("Ignoring type on 'this' parameter '${name.name}'.",
1303 name.fileOffset); 1301 thisKeyword.charOffset);
1304 } 1302 }
1305 type = field.target.type ?? const DynamicType(); 1303 type = field.target.type ?? const DynamicType();
1306 variable = new VariableDeclaration(name.name, type: type, 1304 variable = new VariableDeclaration(name.name, type: type,
1307 initializer: name.initializer); 1305 initializer: name.initializer);
1308 } else { 1306 } else {
1309 addCompileTimeError(name.fileOffset, 1307 addCompileTimeError(name.fileOffset,
1310 "'${name.name}' isn't a field in this class."); 1308 "'${name.name}' isn't a field in this class.");
1311 } 1309 }
1312 } 1310 }
1313 variable ??= new VariableDeclaration(name.name, 1311 variable ??= new VariableDeclaration(name.name,
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
2160 void handleModifiers(int count) { 2158 void handleModifiers(int count) {
2161 debugEvent("Modifiers"); 2159 debugEvent("Modifiers");
2162 // TODO(ahe): Copied from outline_builder.dart. 2160 // TODO(ahe): Copied from outline_builder.dart.
2163 push(popList(count) ?? NullValue.Modifiers); 2161 push(popList(count) ?? NullValue.Modifiers);
2164 } 2162 }
2165 2163
2166 @override 2164 @override
2167 void handleRecoverableError(Token token, ErrorKind kind, Map arguments) { 2165 void handleRecoverableError(Token token, ErrorKind kind, Map arguments) {
2168 super.handleRecoverableError(token, kind, arguments); 2166 super.handleRecoverableError(token, kind, arguments);
2169 if (!hasParserError) { 2167 if (!hasParserError) {
2170 print("$uri:${recoverableErrors.last}"); 2168 print(new InputError(uri, recoverableErrors.last.beginOffset,
2169 recoverableErrors.last.kind).format());
2171 } 2170 }
2172 hasParserError = true; 2171 hasParserError = true;
2173 } 2172 }
2174 2173
2175 @override 2174 @override
2176 Token handleUnrecoverableError(Token token, ErrorKind kind, Map arguments) { 2175 Token handleUnrecoverableError(Token token, ErrorKind kind, Map arguments) {
2177 if (isDartLibrary && kind == ErrorKind.ExpectedFunctionBody) { 2176 if (isDartLibrary && kind == ErrorKind.ExpectedFunctionBody) {
2178 Token recover = skipNativeClause(token); 2177 Token recover = skipNativeClause(token);
2179 if (recover != null) return recover; 2178 if (recover != null) return recover;
2180 } else if (kind == ErrorKind.UnexpectedToken) { 2179 } else if (kind == ErrorKind.UnexpectedToken) {
2181 String expected = arguments["expected"]; 2180 String expected = arguments["expected"];
2182 const List<String> trailing = const <String>[")", "}", ";", ","]; 2181 const List<String> trailing = const <String>[")", "}", ";", ","];
2183 if (trailing.contains(token.stringValue) && trailing.contains(expected)) { 2182 if (trailing.contains(token.stringValue) && trailing.contains(expected)) {
2184 arguments.putIfAbsent("actual", () => token.value); 2183 arguments.putIfAbsent("actual", () => token.value);
2185 handleRecoverableError(token, ErrorKind.ExpectedButGot, arguments); 2184 handleRecoverableError(token, ErrorKind.ExpectedButGot, arguments);
2186 } 2185 }
2187 return token; 2186 return token;
2188 } 2187 }
2189 return super.handleUnrecoverableError(token, kind, arguments); 2188 return super.handleUnrecoverableError(token, kind, arguments);
2190 } 2189 }
2191 2190
2192 void warning(error, [int charOffset = -1]) {
2193 String message = new InputError(uri, charOffset, error).format();
2194 print(message);
2195 }
2196
2197 void nit(error, [int charOffset = -1]) {
2198 if (!showNits) return;
2199 String message = new InputError(uri, charOffset, error).format();
2200 print(message);
2201 }
2202
2203 @override 2191 @override
2204 Expression buildCompileTimeError(error, [int charOffset = -1]) { 2192 Expression buildCompileTimeError(error, [int charOffset = -1]) {
2205 String message = new InputError(uri, charOffset, error).format(); 2193 String message = new InputError(uri, charOffset, error).format();
2206 print(message); 2194 print(message);
2207 Builder constructor = library.loader.getCompileTimeError(); 2195 Builder constructor = library.loader.getCompileTimeError();
2208 return new Throw( 2196 return new Throw(
2209 buildStaticInvocation(constructor.target, 2197 buildStaticInvocation(constructor.target,
2210 new Arguments(<Expression>[new StringLiteral(message)]), 2198 new Arguments(<Expression>[new StringLiteral(message)]),
2211 isConst: false)); // TODO(ahe): Make this const. 2199 isConst: false)); // TODO(ahe): Make this const.
2212 } 2200 }
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
2686 } else if (node is TypeDeclarationBuilder) { 2674 } else if (node is TypeDeclarationBuilder) {
2687 return node.name; 2675 return node.name;
2688 } else if (node is PrefixBuilder) { 2676 } else if (node is PrefixBuilder) {
2689 return node.name; 2677 return node.name;
2690 } else if (node is ThisPropertyAccessor) { 2678 } else if (node is ThisPropertyAccessor) {
2691 return node.name.name; 2679 return node.name.name;
2692 } else { 2680 } else {
2693 return internalError("Unhandled: ${node.runtimeType}"); 2681 return internalError("Unhandled: ${node.runtimeType}");
2694 } 2682 }
2695 } 2683 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/errors.dart ('k') | pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698