| Index: pkg/compiler/lib/src/native/behavior.dart
|
| diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
|
| index 26a57b76a915d0e87bc4850e68dd6bc0bfa74696..c742a7d1014b418d17711ca10e29263aaa638313 100644
|
| --- a/pkg/compiler/lib/src/native/behavior.dart
|
| +++ b/pkg/compiler/lib/src/native/behavior.dart
|
| @@ -196,7 +196,7 @@ class NativeBehavior {
|
| /// latter is used for the type strings of the form '' and 'var'.
|
| /// [validTags] can be used to restrict which tags are accepted.
|
| static void processSpecString(
|
| - DiagnosticListener listener,
|
| + DiagnosticReporter reporter,
|
| Spannable spannable,
|
| String specString,
|
| {Iterable<String> validTags,
|
| @@ -214,7 +214,7 @@ class NativeBehavior {
|
|
|
| void reportError(String message) {
|
| seenError = true;
|
| - listener.reportErrorMessage(
|
| + reporter.reportErrorMessage(
|
| spannable, MessageKind.GENERIC, {'text': message});
|
| }
|
|
|
| @@ -424,7 +424,12 @@ class NativeBehavior {
|
| return sideEffects;
|
| }
|
|
|
| - static NativeBehavior ofJsCall(Send jsCall, Compiler compiler, resolver) {
|
| + static NativeBehavior ofJsCall(
|
| + Send jsCall,
|
| + DiagnosticReporter reporter,
|
| + Parsing parsing,
|
| + CoreTypes coreTypes,
|
| + ForeignResolver resolver) {
|
| // The first argument of a JS-call is a string encoding various attributes
|
| // of the code.
|
| //
|
| @@ -435,7 +440,7 @@ class NativeBehavior {
|
|
|
| var argNodes = jsCall.arguments;
|
| if (argNodes.isEmpty || argNodes.tail.isEmpty) {
|
| - compiler.reportErrorMessage(
|
| + reporter.reportErrorMessage(
|
| jsCall,
|
| MessageKind.GENERIC,
|
| {'text': "JS expression takes two or more arguments."});
|
| @@ -444,7 +449,7 @@ class NativeBehavior {
|
|
|
| var specArgument = argNodes.head;
|
| if (specArgument is !StringNode || specArgument.isInterpolation) {
|
| - compiler.reportErrorMessage(
|
| + reporter.reportErrorMessage(
|
| specArgument, MessageKind.GENERIC,
|
| {'text': "JS first argument must be a string literal."});
|
| return behavior;
|
| @@ -452,7 +457,7 @@ class NativeBehavior {
|
|
|
| var codeArgument = argNodes.tail.head;
|
| if (codeArgument is !StringNode || codeArgument.isInterpolation) {
|
| - compiler.reportErrorMessage(
|
| + reporter.reportErrorMessage(
|
| codeArgument, MessageKind.GENERIC,
|
| {'text': "JS second argument must be a string literal."});
|
| return behavior;
|
| @@ -466,7 +471,7 @@ class NativeBehavior {
|
| dynamic resolveType(String typeString) {
|
| return _parseType(
|
| typeString,
|
| - compiler.resolution,
|
| + parsing,
|
| (name) => resolver.resolveTypeFromString(specArgument, name),
|
| specArgument);
|
| }
|
| @@ -492,7 +497,9 @@ class NativeBehavior {
|
| behavior.useGvn = useGvn;
|
| }
|
|
|
| - processSpecString(compiler, specArgument,
|
| + processSpecString(
|
| + reporter,
|
| + specArgument,
|
| specString,
|
| setSideEffects: setSideEffects,
|
| setThrows: setThrows,
|
| @@ -501,8 +508,8 @@ class NativeBehavior {
|
| resolveType: resolveType,
|
| typesReturned: behavior.typesReturned,
|
| typesInstantiated: behavior.typesInstantiated,
|
| - objectType: compiler.coreTypes.objectType,
|
| - nullType: compiler.coreTypes.nullType);
|
| + objectType: coreTypes.objectType,
|
| + nullType: coreTypes.nullType);
|
|
|
| if (!sideEffectsAreEncodedInSpecString) {
|
| new SideEffectsVisitor(behavior.sideEffects)
|
| @@ -519,7 +526,9 @@ class NativeBehavior {
|
| static void _fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
|
| NativeBehavior behavior,
|
| Send jsBuiltinOrEmbeddedGlobalCall,
|
| - Compiler compiler,
|
| + DiagnosticReporter reporter,
|
| + Parsing parsing,
|
| + CoreTypes coreTypes,
|
| ForeignResolver resolver,
|
| {bool isBuiltin,
|
| List<String> validTags}) {
|
| @@ -533,7 +542,7 @@ class NativeBehavior {
|
|
|
| Link<Node> argNodes = jsBuiltinOrEmbeddedGlobalCall.arguments;
|
| if (argNodes.isEmpty) {
|
| - compiler.internalError(jsBuiltinOrEmbeddedGlobalCall,
|
| + reporter.internalError(jsBuiltinOrEmbeddedGlobalCall,
|
| "JS $builtinOrGlobal expression has no type.");
|
| }
|
|
|
| @@ -541,13 +550,13 @@ class NativeBehavior {
|
| // This is, because we want to allow non-literals (like references to
|
| // enums) as names.
|
| if (argNodes.tail.isEmpty) {
|
| - compiler.internalError(jsBuiltinOrEmbeddedGlobalCall,
|
| + reporter.internalError(jsBuiltinOrEmbeddedGlobalCall,
|
| 'JS $builtinOrGlobal is missing name.');
|
| }
|
|
|
| if (!isBuiltin) {
|
| if (!argNodes.tail.tail.isEmpty) {
|
| - compiler.internalError(argNodes.tail.tail.head,
|
| + reporter.internalError(argNodes.tail.tail.head,
|
| 'JS embedded global has more than 2 arguments');
|
| }
|
| }
|
| @@ -556,7 +565,7 @@ class NativeBehavior {
|
| if (specLiteral == null) {
|
| // TODO(sra): We could accept a type identifier? e.g. JS(bool, '1<2'). It
|
| // is not very satisfactory because it does not work for void, dynamic.
|
| - compiler.internalError(argNodes.head, "Unexpected first argument.");
|
| + reporter.internalError(argNodes.head, "Unexpected first argument.");
|
| }
|
|
|
| String specString = specLiteral.dartString.slowToString();
|
| @@ -564,7 +573,7 @@ class NativeBehavior {
|
| dynamic resolveType(String typeString) {
|
| return _parseType(
|
| typeString,
|
| - compiler.resolution,
|
| + parsing,
|
| (name) => resolver.resolveTypeFromString(specLiteral, name),
|
| jsBuiltinOrEmbeddedGlobalCall);
|
| }
|
| @@ -573,32 +582,46 @@ class NativeBehavior {
|
| behavior.sideEffects.setTo(newEffects);
|
| }
|
|
|
| - processSpecString(compiler, jsBuiltinOrEmbeddedGlobalCall,
|
| - specString,
|
| - validTags: validTags,
|
| - resolveType: resolveType,
|
| - setSideEffects: setSideEffects,
|
| - typesReturned: behavior.typesReturned,
|
| - typesInstantiated: behavior.typesInstantiated,
|
| - objectType: compiler.coreTypes.objectType,
|
| - nullType: compiler.coreTypes.nullType);
|
| + processSpecString(
|
| + reporter,
|
| + jsBuiltinOrEmbeddedGlobalCall,
|
| + specString,
|
| + validTags: validTags,
|
| + resolveType: resolveType,
|
| + setSideEffects: setSideEffects,
|
| + typesReturned: behavior.typesReturned,
|
| + typesInstantiated: behavior.typesInstantiated,
|
| + objectType: coreTypes.objectType,
|
| + nullType: coreTypes.nullType);
|
| }
|
|
|
| - static NativeBehavior ofJsBuiltinCall(Send jsBuiltinCall,
|
| - Compiler compiler,
|
| - ForeignResolver resolver) {
|
| + static NativeBehavior ofJsBuiltinCall(
|
| + Send jsBuiltinCall,
|
| + DiagnosticReporter reporter,
|
| + Parsing parsing,
|
| + CoreTypes coreTypes,
|
| + ForeignResolver resolver) {
|
| NativeBehavior behavior = new NativeBehavior();
|
| behavior.sideEffects.setTo(new SideEffects());
|
|
|
| _fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
|
| - behavior, jsBuiltinCall, compiler, resolver, isBuiltin: true);
|
| + behavior,
|
| + jsBuiltinCall,
|
| + reporter,
|
| + parsing,
|
| + coreTypes,
|
| + resolver,
|
| + isBuiltin: true);
|
|
|
| return behavior;
|
| }
|
|
|
| - static NativeBehavior ofJsEmbeddedGlobalCall(Send jsEmbeddedGlobalCall,
|
| - Compiler compiler,
|
| - ForeignResolver resolver) {
|
| + static NativeBehavior ofJsEmbeddedGlobalCall(
|
| + Send jsEmbeddedGlobalCall,
|
| + DiagnosticReporter reporter,
|
| + Parsing parsing,
|
| + CoreTypes coreTypes,
|
| + ForeignResolver resolver) {
|
| NativeBehavior behavior = new NativeBehavior();
|
| // TODO(sra): Allow the use site to override these defaults.
|
| // Embedded globals are usually pre-computed data structures or JavaScript
|
| @@ -607,7 +630,12 @@ class NativeBehavior {
|
| behavior.throwBehavior = NativeThrowBehavior.NEVER;
|
|
|
| _fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
|
| - behavior, jsEmbeddedGlobalCall, compiler, resolver,
|
| + behavior,
|
| + jsEmbeddedGlobalCall,
|
| + reporter,
|
| + parsing,
|
| + coreTypes,
|
| + resolver,
|
| isBuiltin: false,
|
| validTags: const ['returns', 'creates']);
|
|
|
| @@ -637,20 +665,22 @@ class NativeBehavior {
|
| }
|
|
|
| static NativeBehavior ofFieldLoad(MemberElement field, Compiler compiler) {
|
| - DartType type = field.computeType(compiler.resolution);
|
| + Resolution resolution = compiler.resolution;
|
| + DartType type = field.computeType(resolution);
|
| var behavior = new NativeBehavior();
|
| behavior.typesReturned.add(type);
|
| // Declared types are nullable.
|
| - behavior.typesReturned.add(compiler.coreTypes.nullType);
|
| - behavior._capture(type, compiler.resolution);
|
| + behavior.typesReturned.add(resolution.coreTypes.nullType);
|
| + behavior._capture(type, resolution);
|
| behavior._overrideWithAnnotations(field, compiler);
|
| return behavior;
|
| }
|
|
|
| static NativeBehavior ofFieldStore(MemberElement field, Compiler compiler) {
|
| - DartType type = field.computeType(compiler.resolution);
|
| + Resolution resolution = compiler.resolution;
|
| + DartType type = field.computeType(resolution);
|
| var behavior = new NativeBehavior();
|
| - behavior._escape(type, compiler.resolution);
|
| + behavior._escape(type, resolution);
|
| // We don't override the default behaviour - the annotations apply to
|
| // loading the field.
|
| return behavior;
|
| @@ -689,6 +719,7 @@ class NativeBehavior {
|
| */
|
| static _collect(Element element, Compiler compiler, Element annotationClass,
|
| lookup(str)) {
|
| + DiagnosticReporter reporter = compiler.reporter;
|
| var types = null;
|
| for (MetadataAnnotation annotation in element.implementation.metadata) {
|
| annotation.ensureResolved(compiler.resolution);
|
| @@ -701,14 +732,13 @@ class NativeBehavior {
|
| Iterable<ConstantValue> fields = constructedObject.fields.values;
|
| // TODO(sra): Better validation of the constant.
|
| if (fields.length != 1 || !fields.single.isString) {
|
| - compiler.internalError(annotation,
|
| + reporter.internalError(annotation,
|
| 'Annotations needs one string: ${annotation.node}');
|
| }
|
| StringConstantValue specStringConstant = fields.single;
|
| String specString = specStringConstant.toDartString().slowToString();
|
| for (final typeString in specString.split('|')) {
|
| - var type =
|
| - _parseType(typeString, compiler.resolution, lookup, annotation);
|
| + var type = _parseType(typeString, compiler.parsing, lookup, annotation);
|
| if (types == null) types = [];
|
| types.add(type);
|
| }
|
| @@ -749,8 +779,9 @@ class NativeBehavior {
|
|
|
| static dynamic _parseType(
|
| String typeString,
|
| - Resolution resolution,
|
| + Parsing parsing,
|
| lookup(name), locationNodeOrElement) {
|
| + DiagnosticReporter reporter = parsing.reporter;
|
| if (typeString == '=Object') return SpecialType.JsObject;
|
| if (typeString == 'dynamic') {
|
| return const DynamicType();
|
| @@ -760,8 +791,8 @@ class NativeBehavior {
|
|
|
| int index = typeString.indexOf('<');
|
| if (index < 1) {
|
| - resolution.listener.reportErrorMessage(
|
| - _errorNode(locationNodeOrElement, resolution.parsing),
|
| + reporter.reportErrorMessage(
|
| + _errorNode(locationNodeOrElement, parsing),
|
| MessageKind.GENERIC,
|
| {'text': "Type '$typeString' not found."});
|
| return const DynamicType();
|
| @@ -771,8 +802,8 @@ class NativeBehavior {
|
| // TODO(sra): Parse type parameters.
|
| return type;
|
| }
|
| - resolution.listener.reportErrorMessage(
|
| - _errorNode(locationNodeOrElement, resolution.parsing),
|
| + reporter.reportErrorMessage(
|
| + _errorNode(locationNodeOrElement, parsing),
|
| MessageKind.GENERIC,
|
| {'text': "Type '$typeString' not found."});
|
| return const DynamicType();
|
|
|