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

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

Issue 2938573002: Improve recovery from compile-time errors. (Closed)
Patch Set: Created 3 years, 6 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 '../fasta_codes.dart' 7 import '../fasta_codes.dart'
8 show 8 show
9 FastaMessage, 9 FastaMessage,
10 codeConstFieldWithoutInitializer, 10 codeConstFieldWithoutInitializer,
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 if (builder != null && member.isField && builder.isInstanceMember) { 1004 if (builder != null && member.isField && builder.isInstanceMember) {
1005 return new IncompleteError(this, token, 1005 return new IncompleteError(this, token,
1006 "Can't access 'this' in a field initializer to read '$name'."); 1006 "Can't access 'this' in a field initializer to read '$name'.");
1007 } 1007 }
1008 if (builder == null || (!isInstanceContext && builder.isInstanceMember)) { 1008 if (builder == null || (!isInstanceContext && builder.isInstanceMember)) {
1009 Name n = new Name(name, library.library); 1009 Name n = new Name(name, library.library);
1010 if (prefix != null && 1010 if (prefix != null &&
1011 prefix.deferred && 1011 prefix.deferred &&
1012 builder == null && 1012 builder == null &&
1013 "loadLibrary" == name) { 1013 "loadLibrary" == name) {
1014 return buildCompileTimeError( 1014 int offset = offsetForToken(token);
1015 "Deferred loading isn't implemented yet.", offsetForToken(token)); 1015 const String message = "Deferred loading isn't implemented yet.";
1016 // We report the error twice, the first time silently and marking it as
1017 // unhandled. This ensures that the compile-time error is reported
1018 // eagerly by kernel-service, thus preventing any attempts from running
1019 // a program that uses deferred loading. Obviously, this is a temporary
1020 // solution until we can fully implement deferred loading.
1021 addCompileTimeError(offset, message, wasHandled: false, silent: true);
1022 return buildCompileTimeError(message, offset);
1016 } else if (!isQualified && isInstanceContext) { 1023 } else if (!isQualified && isInstanceContext) {
1017 assert(builder == null); 1024 assert(builder == null);
1018 if (constantExpressionRequired || member.isField) { 1025 if (constantExpressionRequired || member.isField) {
1019 return new UnresolvedAccessor(this, n, token); 1026 return new UnresolvedAccessor(this, n, token);
1020 } 1027 }
1021 return new ThisPropertyAccessor(this, token, n, null, null); 1028 return new ThisPropertyAccessor(this, token, n, null, null);
1022 } else if (isBuiltinLibrary && 1029 } else if (isBuiltinLibrary &&
1023 name == "main" && 1030 name == "main" &&
1024 member?.name == "_getMainClosure") { 1031 member?.name == "_getMainClosure") {
1025 // TODO(ahe): https://github.com/dart-lang/sdk/issues/28989 1032 // TODO(ahe): https://github.com/dart-lang/sdk/issues/28989
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 name = ""; 2036 name = "";
2030 } 2037 }
2031 push(type); 2038 push(type);
2032 push(typeArguments ?? NullValue.TypeArguments); 2039 push(typeArguments ?? NullValue.TypeArguments);
2033 push(name); 2040 push(name);
2034 } 2041 }
2035 2042
2036 @override 2043 @override
2037 Expression buildStaticInvocation(Member target, Arguments arguments, 2044 Expression buildStaticInvocation(Member target, Arguments arguments,
2038 {bool isConst: false, int charOffset: -1, Member initialTarget}) { 2045 {bool isConst: false, int charOffset: -1, Member initialTarget}) {
2046 initialTarget ??= target;
2039 List<TypeParameter> typeParameters = target.function.typeParameters; 2047 List<TypeParameter> typeParameters = target.function.typeParameters;
2040 if (target is Constructor) { 2048 if (target is Constructor) {
2041 assert(!target.enclosingClass.isAbstract); 2049 assert(!target.enclosingClass.isAbstract);
2042 typeParameters = target.enclosingClass.typeParameters; 2050 typeParameters = target.enclosingClass.typeParameters;
2043 } 2051 }
2044 if (!checkArguments(target.function, arguments, typeParameters)) { 2052 if (!checkArguments(target.function, arguments, typeParameters)) {
2045 return throwNoSuchMethodError(new NullLiteral()..fileOffset = charOffset, 2053 return throwNoSuchMethodError(new NullLiteral()..fileOffset = charOffset,
2046 target.name.name, arguments, charOffset); 2054 target.name.name, arguments, charOffset);
2047 } 2055 }
2048 if (target is Constructor) { 2056 if (target is Constructor) {
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
2346 function.returnType = returnType; 2354 function.returnType = returnType;
2347 declaration.variable.type = function.functionType; 2355 declaration.variable.type = function.functionType;
2348 declaration.function = function; 2356 declaration.function = function;
2349 function.parent = declaration; 2357 function.parent = declaration;
2350 } else { 2358 } else {
2351 // If [declaration] isn't a [FunctionDeclaration], it must be because 2359 // If [declaration] isn't a [FunctionDeclaration], it must be because
2352 // there was a compile-time error. 2360 // there was a compile-time error.
2353 2361
2354 // TODO(paulberry): ensure that when integrating with analyzer, type 2362 // TODO(paulberry): ensure that when integrating with analyzer, type
2355 // inference is still performed for the dropped declaration. 2363 // inference is still performed for the dropped declaration.
2356 assert(library.compileTimeErrors.isNotEmpty); 2364 assert(library.hasCompileTimeErrors);
2357 } 2365 }
2358 push(declaration); 2366 push(declaration);
2359 } 2367 }
2360 2368
2361 @override 2369 @override
2362 void endUnnamedFunction(Token beginToken, Token token) { 2370 void endUnnamedFunction(Token beginToken, Token token) {
2363 debugEvent("UnnamedFunction"); 2371 debugEvent("UnnamedFunction");
2364 Statement body = popStatement(); 2372 Statement body = popStatement();
2365 AsyncMarker asyncModifier = pop(); 2373 AsyncMarker asyncModifier = pop();
2366 exitLocalScope(); 2374 exitLocalScope();
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
2880 } 2888 }
2881 return super.handleUnrecoverableError(token, message); 2889 return super.handleUnrecoverableError(token, message);
2882 } 2890 }
2883 2891
2884 @override 2892 @override
2885 Expression buildCompileTimeError(error, [int charOffset = -1]) { 2893 Expression buildCompileTimeError(error, [int charOffset = -1]) {
2886 // TODO(ahe): This method should be passed the erroneous expression, wrap 2894 // TODO(ahe): This method should be passed the erroneous expression, wrap
2887 // it in a class (TBD) from which the erroneous expression can be easily 2895 // it in a class (TBD) from which the erroneous expression can be easily
2888 // extracted. Similar for statements and initializers. See also [issue 2896 // extracted. Similar for statements and initializers. See also [issue
2889 // 29717](https://github.com/dart-lang/sdk/issues/29717) 2897 // 29717](https://github.com/dart-lang/sdk/issues/29717)
2890 addCompileTimeError(charOffset, error); 2898 addCompileTimeError(charOffset, error, wasHandled: true);
2891 return library.loader.throwCompileConstantError(library.loader 2899 return library.loader.throwCompileConstantError(library.loader
2892 .buildCompileTimeError( 2900 .buildCompileTimeError(
2893 formatUnexpected(uri, charOffset, error), charOffset)); 2901 formatUnexpected(uri, charOffset, error), charOffset));
2894 } 2902 }
2895 2903
2896 Expression wrapInCompileTimeError(Expression expression, String message) { 2904 Expression wrapInCompileTimeError(Expression expression, String message) {
2897 return new Let( 2905 return new Let(
2898 new VariableDeclaration.forValue(expression) 2906 new VariableDeclaration.forValue(expression)
2899 ..fileOffset = expression.fileOffset, 2907 ..fileOffset = expression.fileOffset,
2900 buildCompileTimeError(message, expression.fileOffset)) 2908 buildCompileTimeError(message, expression.fileOffset))
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
3014 } 3022 }
3015 3023
3016 @override 3024 @override
3017 void handleSymbolVoid(Token token) { 3025 void handleSymbolVoid(Token token) {
3018 debugEvent("SymbolVoid"); 3026 debugEvent("SymbolVoid");
3019 push(new Identifier(token)); 3027 push(new Identifier(token));
3020 } 3028 }
3021 3029
3022 @override 3030 @override
3023 dynamic addCompileTimeError(int charOffset, String message, 3031 dynamic addCompileTimeError(int charOffset, String message,
3024 {bool silent: false}) { 3032 {bool silent: false, bool wasHandled: false}) {
3025 // TODO(ahe): If constantExpressionRequired is set, set it to false to 3033 // TODO(ahe): If constantExpressionRequired is set, set it to false to
3026 // avoid a long list of errors. 3034 // avoid a long list of errors.
3027 return library.addCompileTimeError(charOffset, message, 3035 return library.addCompileTimeError(charOffset, message,
3028 fileUri: uri, silent: silent); 3036 fileUri: uri, silent: silent, wasHandled: wasHandled);
3029 } 3037 }
3030 3038
3031 @override 3039 @override
3032 void handleInvalidFunctionBody(Token token) { 3040 void handleInvalidFunctionBody(Token token) {
3033 if (member.isNative) { 3041 if (member.isNative) {
3034 push(NullValue.FunctionBody); 3042 push(NullValue.FunctionBody);
3035 } else { 3043 } else {
3036 push(new Block(<Statement>[ 3044 push(new Block(<Statement>[
3037 buildCompileTimeErrorStatement("Expected '{'.", token.charOffset) 3045 buildCompileTimeErrorStatement("Expected '{'.", token.charOffset)
3038 ])); 3046 ]));
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
3577 if (starToken == null) { 3585 if (starToken == null) {
3578 return AsyncMarker.Async; 3586 return AsyncMarker.Async;
3579 } else { 3587 } else {
3580 assert(identical(starToken.stringValue, "*")); 3588 assert(identical(starToken.stringValue, "*"));
3581 return AsyncMarker.AsyncStar; 3589 return AsyncMarker.AsyncStar;
3582 } 3590 }
3583 } else { 3591 } else {
3584 return internalError("Unknown async modifier: $asyncToken"); 3592 return internalError("Unknown async modifier: $asyncToken");
3585 } 3593 }
3586 } 3594 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/builder/library_builder.dart ('k') | pkg/front_end/lib/src/fasta/kernel/kernel_target.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698