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.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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 final ClassHierarchy hierarchy; | 85 final ClassHierarchy hierarchy; |
86 | 86 |
87 final CoreTypes coreTypes; | 87 final CoreTypes coreTypes; |
88 | 88 |
89 final bool isInstanceMember; | 89 final bool isInstanceMember; |
90 | 90 |
91 final Scope enclosingScope; | 91 final Scope enclosingScope; |
92 | 92 |
93 final bool enableNative; | 93 final bool enableNative; |
94 | 94 |
95 final bool isBuiltinLibrary; | 95 /// Whether to ignore an unresolved reference to `main` within the body of |
| 96 /// `_getMainClosure` when compiling the current library. |
| 97 /// |
| 98 /// This as a temporary workaround. The standalone VM and flutter have |
| 99 /// special logic to resolve `main` in `_getMainClosure`, this flag is used to |
| 100 /// ignore that reference to `main`, but only on libraries where we expect to |
| 101 /// see it (today that is dart:_builtin and dart:ui). |
| 102 /// |
| 103 // TODO(ahe,sigmund): remove when the VM gets rid of the special rule, see |
| 104 // https://github.com/dart-lang/sdk/issues/28989. |
| 105 final bool ignoreMainInGetMainClosure; |
96 | 106 |
97 @override | 107 @override |
98 final Uri uri; | 108 final Uri uri; |
99 | 109 |
100 final TypeInferrer _typeInferrer; | 110 final TypeInferrer _typeInferrer; |
101 | 111 |
102 @override | 112 @override |
103 final TypePromoter typePromoter; | 113 final TypePromoter typePromoter; |
104 | 114 |
105 /// Only used when [member] is a constructor. It tracks if an implicit super | 115 /// Only used when [member] is a constructor. It tracks if an implicit super |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 this.formalParameterScope, | 172 this.formalParameterScope, |
163 this.hierarchy, | 173 this.hierarchy, |
164 this.coreTypes, | 174 this.coreTypes, |
165 this.classBuilder, | 175 this.classBuilder, |
166 this.isInstanceMember, | 176 this.isInstanceMember, |
167 this.uri, | 177 this.uri, |
168 this._typeInferrer) | 178 this._typeInferrer) |
169 : enclosingScope = scope, | 179 : enclosingScope = scope, |
170 library = library, | 180 library = library, |
171 enableNative = library.loader.target.enableNative(library), | 181 enableNative = library.loader.target.enableNative(library), |
172 isBuiltinLibrary = | 182 ignoreMainInGetMainClosure = library.uri.scheme == 'dart' && |
173 library.uri.scheme == 'dart' && library.uri.path == "_builtin", | 183 (library.uri.path == "_builtin" || library.uri.path == "ui"), |
174 needsImplicitSuperInitializer = | 184 needsImplicitSuperInitializer = |
175 coreTypes.objectClass != classBuilder?.cls, | 185 coreTypes.objectClass != classBuilder?.cls, |
176 typePromoter = _typeInferrer.typePromoter, | 186 typePromoter = _typeInferrer.typePromoter, |
177 super(scope); | 187 super(scope); |
178 | 188 |
179 bool get hasParserError => recoverableErrors.isNotEmpty; | 189 bool get hasParserError => recoverableErrors.isNotEmpty; |
180 | 190 |
181 bool get inConstructor { | 191 bool get inConstructor { |
182 return functionNestingLevel == 0 && member is KernelConstructorBuilder; | 192 return functionNestingLevel == 0 && member is KernelConstructorBuilder; |
183 } | 193 } |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 // a program that uses deferred loading. Obviously, this is a temporary | 1084 // a program that uses deferred loading. Obviously, this is a temporary |
1075 // solution until we can fully implement deferred loading. | 1085 // solution until we can fully implement deferred loading. |
1076 addCompileTimeError(offset, message, wasHandled: false, silent: true); | 1086 addCompileTimeError(offset, message, wasHandled: false, silent: true); |
1077 return buildCompileTimeError(message, offset); | 1087 return buildCompileTimeError(message, offset); |
1078 } else if (!isQualified && isInstanceContext) { | 1088 } else if (!isQualified && isInstanceContext) { |
1079 assert(builder == null); | 1089 assert(builder == null); |
1080 if (constantExpressionRequired || member.isField) { | 1090 if (constantExpressionRequired || member.isField) { |
1081 return new UnresolvedAccessor(this, n, token); | 1091 return new UnresolvedAccessor(this, n, token); |
1082 } | 1092 } |
1083 return new ThisPropertyAccessor(this, token, n, null, null); | 1093 return new ThisPropertyAccessor(this, token, n, null, null); |
1084 } else if (isBuiltinLibrary && | 1094 } else if (ignoreMainInGetMainClosure && |
1085 name == "main" && | 1095 name == "main" && |
1086 member?.name == "_getMainClosure") { | 1096 member?.name == "_getMainClosure") { |
1087 // TODO(ahe): https://github.com/dart-lang/sdk/issues/28989 | |
1088 return new KernelNullLiteral()..fileOffset = offsetForToken(token); | 1097 return new KernelNullLiteral()..fileOffset = offsetForToken(token); |
1089 } else { | 1098 } else { |
1090 return new UnresolvedAccessor(this, n, token); | 1099 return new UnresolvedAccessor(this, n, token); |
1091 } | 1100 } |
1092 } else if (builder.isTypeDeclaration) { | 1101 } else if (builder.isTypeDeclaration) { |
1093 if (constantExpressionRequired && | 1102 if (constantExpressionRequired && |
1094 builder.isTypeVariable && | 1103 builder.isTypeVariable && |
1095 !member.isConstructor) { | 1104 !member.isConstructor) { |
1096 addCompileTimeError( | 1105 addCompileTimeError( |
1097 offsetForToken(token), "Not a constant expression."); | 1106 offsetForToken(token), "Not a constant expression."); |
(...skipping 2560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3658 if (starToken == null) { | 3667 if (starToken == null) { |
3659 return AsyncMarker.Async; | 3668 return AsyncMarker.Async; |
3660 } else { | 3669 } else { |
3661 assert(identical(starToken.stringValue, "*")); | 3670 assert(identical(starToken.stringValue, "*")); |
3662 return AsyncMarker.AsyncStar; | 3671 return AsyncMarker.AsyncStar; |
3663 } | 3672 } |
3664 } else { | 3673 } else { |
3665 return internalError("Unknown async modifier: $asyncToken"); | 3674 return internalError("Unknown async modifier: $asyncToken"); |
3666 } | 3675 } |
3667 } | 3676 } |
OLD | NEW |