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, |
11 codeExpectedButGot, | 11 codeExpectedButGot, |
12 codeExpectedFunctionBody, | 12 codeExpectedFunctionBody, |
13 codeFinalFieldWithoutInitializer; | 13 codeFinalFieldWithoutInitializer; |
14 | 14 |
15 import '../parser/parser.dart' | 15 import '../parser/parser.dart' |
16 show Assert, FormalParameterType, MemberKind, optional; | 16 show Assert, FormalParameterType, MemberKind, optional; |
17 | 17 |
18 import '../parser/identifier_context.dart' show IdentifierContext; | 18 import '../parser/identifier_context.dart' show IdentifierContext; |
19 | 19 |
| 20 import '../parser/native_support.dart' show skipNativeClause; |
| 21 |
20 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; | 22 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'; |
21 | 23 |
22 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; | 24 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; |
23 | 25 |
24 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart' | 26 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart' |
25 show TypeInferrer; | 27 show TypeInferrer; |
26 | 28 |
27 import 'package:front_end/src/fasta/type_inference/type_promotion.dart' | 29 import 'package:front_end/src/fasta/type_inference/type_promotion.dart' |
28 show TypePromoter; | 30 show TypePromoter; |
29 | 31 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 88 |
87 final ClassHierarchy hierarchy; | 89 final ClassHierarchy hierarchy; |
88 | 90 |
89 final CoreTypes coreTypes; | 91 final CoreTypes coreTypes; |
90 | 92 |
91 final bool isInstanceMember; | 93 final bool isInstanceMember; |
92 | 94 |
93 final Scope enclosingScope; | 95 final Scope enclosingScope; |
94 | 96 |
95 final bool enableNative; | 97 final bool enableNative; |
| 98 final bool stringExpectedAfterNative; |
96 | 99 |
97 /// Whether to ignore an unresolved reference to `main` within the body of | 100 /// Whether to ignore an unresolved reference to `main` within the body of |
98 /// `_getMainClosure` when compiling the current library. | 101 /// `_getMainClosure` when compiling the current library. |
99 /// | 102 /// |
100 /// This as a temporary workaround. The standalone VM and flutter have | 103 /// This as a temporary workaround. The standalone VM and flutter have |
101 /// special logic to resolve `main` in `_getMainClosure`, this flag is used to | 104 /// special logic to resolve `main` in `_getMainClosure`, this flag is used to |
102 /// ignore that reference to `main`, but only on libraries where we expect to | 105 /// ignore that reference to `main`, but only on libraries where we expect to |
103 /// see it (today that is dart:_builtin and dart:ui). | 106 /// see it (today that is dart:_builtin and dart:ui). |
104 /// | 107 /// |
105 // TODO(ahe,sigmund): remove when the VM gets rid of the special rule, see | 108 // TODO(ahe,sigmund): remove when the VM gets rid of the special rule, see |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 Scope scope, | 176 Scope scope, |
174 this.formalParameterScope, | 177 this.formalParameterScope, |
175 this.hierarchy, | 178 this.hierarchy, |
176 this.coreTypes, | 179 this.coreTypes, |
177 this.classBuilder, | 180 this.classBuilder, |
178 this.isInstanceMember, | 181 this.isInstanceMember, |
179 this.uri, | 182 this.uri, |
180 this._typeInferrer) | 183 this._typeInferrer) |
181 : enclosingScope = scope, | 184 : enclosingScope = scope, |
182 library = library, | 185 library = library, |
183 enableNative = library.loader.target.enableNative(library), | 186 enableNative = |
| 187 library.loader.target.backendTarget.enableNative(library.uri), |
| 188 stringExpectedAfterNative = |
| 189 library.loader.target.backendTarget.nativeExtensionExpectsString, |
184 ignoreMainInGetMainClosure = library.uri.scheme == 'dart' && | 190 ignoreMainInGetMainClosure = library.uri.scheme == 'dart' && |
185 (library.uri.path == "_builtin" || library.uri.path == "ui"), | 191 (library.uri.path == "_builtin" || library.uri.path == "ui"), |
186 needsImplicitSuperInitializer = | 192 needsImplicitSuperInitializer = |
187 coreTypes.objectClass != classBuilder?.cls, | 193 coreTypes.objectClass != classBuilder?.cls, |
188 typePromoter = _typeInferrer.typePromoter, | 194 typePromoter = _typeInferrer.typePromoter, |
189 super(scope); | 195 super(scope); |
190 | 196 |
191 bool get hasParserError => recoverableErrors.isNotEmpty; | 197 bool get hasParserError => recoverableErrors.isNotEmpty; |
192 | 198 |
193 bool get inConstructor { | 199 bool get inConstructor { |
(...skipping 2800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2994 void handleRecoverableError(Token token, FastaMessage message) { | 3000 void handleRecoverableError(Token token, FastaMessage message) { |
2995 bool silent = hasParserError || | 3001 bool silent = hasParserError || |
2996 message.code == codeFinalFieldWithoutInitializer || | 3002 message.code == codeFinalFieldWithoutInitializer || |
2997 message.code == codeConstFieldWithoutInitializer; | 3003 message.code == codeConstFieldWithoutInitializer; |
2998 addCompileTimeError(message.charOffset, message.message, silent: silent); | 3004 addCompileTimeError(message.charOffset, message.message, silent: silent); |
2999 } | 3005 } |
3000 | 3006 |
3001 @override | 3007 @override |
3002 Token handleUnrecoverableError(Token token, FastaMessage message) { | 3008 Token handleUnrecoverableError(Token token, FastaMessage message) { |
3003 if (enableNative && message.code == codeExpectedFunctionBody) { | 3009 if (enableNative && message.code == codeExpectedFunctionBody) { |
3004 Token recover = library.loader.target.skipNativeClause(token); | 3010 Token recover = skipNativeClause(token, stringExpectedAfterNative); |
3005 if (recover != null) return recover; | 3011 if (recover != null) return recover; |
3006 } else if (message.code == codeExpectedButGot) { | 3012 } else if (message.code == codeExpectedButGot) { |
3007 String expected = message.arguments["string"]; | 3013 String expected = message.arguments["string"]; |
3008 const List<String> trailing = const <String>[")", "}", ";", ","]; | 3014 const List<String> trailing = const <String>[")", "}", ";", ","]; |
3009 if (trailing.contains(token.stringValue) && trailing.contains(expected)) { | 3015 if (trailing.contains(token.stringValue) && trailing.contains(expected)) { |
3010 handleRecoverableError(token, message); | 3016 handleRecoverableError(token, message); |
3011 return newSyntheticToken(token); | 3017 return newSyntheticToken(token); |
3012 } | 3018 } |
3013 } | 3019 } |
3014 return super.handleUnrecoverableError(token, message); | 3020 return super.handleUnrecoverableError(token, message); |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3722 if (starToken == null) { | 3728 if (starToken == null) { |
3723 return AsyncMarker.Async; | 3729 return AsyncMarker.Async; |
3724 } else { | 3730 } else { |
3725 assert(identical(starToken.stringValue, "*")); | 3731 assert(identical(starToken.stringValue, "*")); |
3726 return AsyncMarker.AsyncStar; | 3732 return AsyncMarker.AsyncStar; |
3727 } | 3733 } |
3728 } else { | 3734 } else { |
3729 return internalError("Unknown async modifier: $asyncToken"); | 3735 return internalError("Unknown async modifier: $asyncToken"); |
3730 } | 3736 } |
3731 } | 3737 } |
OLD | NEW |