| Index: pkg/compiler/lib/src/patch_parser.dart
|
| diff --git a/pkg/compiler/lib/src/patch_parser.dart b/pkg/compiler/lib/src/patch_parser.dart
|
| index 977d8a901f62a22ec8a0a5f8bef0dc9e083b2eba..6a1589ca321e72e18cd4cf674ecd3da99279f23a 100644
|
| --- a/pkg/compiler/lib/src/patch_parser.dart
|
| +++ b/pkg/compiler/lib/src/patch_parser.dart
|
| @@ -116,48 +116,32 @@ library dart2js.patchparser;
|
|
|
| import 'dart:async';
|
|
|
| -import 'constants/values.dart' show
|
| - ConstantValue;
|
| +import 'constants/values.dart' show ConstantValue;
|
| import 'common.dart';
|
| -import 'compiler.dart' show
|
| - Compiler;
|
| -import 'common/tasks.dart' show
|
| - CompilerTask;
|
| -import 'dart_types.dart' show
|
| - DartType;
|
| +import 'compiler.dart' show Compiler;
|
| +import 'common/tasks.dart' show CompilerTask;
|
| +import 'dart_types.dart' show DartType;
|
| import 'elements/elements.dart';
|
| -import 'elements/modelx.dart' show
|
| - BaseFunctionElementX,
|
| - ClassElementX,
|
| - GetterElementX,
|
| - LibraryElementX,
|
| - MetadataAnnotationX,
|
| - SetterElementX;
|
| -import 'js_backend/js_backend.dart' show
|
| - JavaScriptBackend;
|
| -import 'library_loader.dart' show
|
| - LibraryLoader;
|
| -import 'options.dart' show
|
| - ParserOptions;
|
| -import 'parser/listener.dart' show
|
| - Listener,
|
| - ParserError;
|
| -import 'parser/element_listener.dart' show
|
| - ElementListener;
|
| -import 'parser/member_listener.dart' show
|
| - MemberListener;
|
| -import 'parser/partial_elements.dart' show
|
| - PartialClassElement;
|
| -import 'parser/partial_parser.dart' show
|
| - PartialParser;
|
| -import 'parser/parser.dart' show
|
| - Parser;
|
| -import 'scanner/scanner.dart' show
|
| - Scanner;
|
| +import 'elements/modelx.dart'
|
| + show
|
| + BaseFunctionElementX,
|
| + ClassElementX,
|
| + GetterElementX,
|
| + LibraryElementX,
|
| + MetadataAnnotationX,
|
| + SetterElementX;
|
| +import 'js_backend/js_backend.dart' show JavaScriptBackend;
|
| +import 'library_loader.dart' show LibraryLoader;
|
| +import 'options.dart' show ParserOptions;
|
| +import 'parser/listener.dart' show Listener, ParserError;
|
| +import 'parser/element_listener.dart' show ElementListener;
|
| +import 'parser/member_listener.dart' show MemberListener;
|
| +import 'parser/partial_elements.dart' show PartialClassElement;
|
| +import 'parser/partial_parser.dart' show PartialParser;
|
| +import 'parser/parser.dart' show Parser;
|
| +import 'scanner/scanner.dart' show Scanner;
|
| import 'script.dart';
|
| -import 'tokens/token.dart' show
|
| - StringToken,
|
| - Token;
|
| +import 'tokens/token.dart' show StringToken, Token;
|
|
|
| class PatchParserTask extends CompilerTask {
|
| final String name = "Patching Parser";
|
| @@ -170,10 +154,9 @@ class PatchParserTask extends CompilerTask {
|
| * injections to the library, and returns a list of class
|
| * patches.
|
| */
|
| - Future patchLibrary(LibraryLoader loader,
|
| - Uri patchUri, LibraryElement originLibrary) {
|
| - return compiler.readScript(patchUri, originLibrary)
|
| - .then((Script script) {
|
| + Future patchLibrary(
|
| + LibraryLoader loader, Uri patchUri, LibraryElement originLibrary) {
|
| + return compiler.readScript(patchUri, originLibrary).then((Script script) {
|
| var patchLibrary = new LibraryElementX(script, null, originLibrary);
|
| return reporter.withCurrentElement(patchLibrary, () {
|
| loader.registerNewLibrary(patchLibrary);
|
| @@ -194,9 +177,8 @@ class PatchParserTask extends CompilerTask {
|
| Script script = compilationUnit.script;
|
| Token tokens = new Scanner(script.file).tokenize();
|
| Function idGenerator = compiler.getNextFreeClassId;
|
| - Listener patchListener = new PatchElementListener(compiler,
|
| - compilationUnit,
|
| - idGenerator);
|
| + Listener patchListener =
|
| + new PatchElementListener(compiler, compilationUnit, idGenerator);
|
| try {
|
| new PartialParser(patchListener, parserOptions).parseUnit(tokens);
|
| } on ParserError catch (e) {
|
| @@ -214,20 +196,19 @@ class PatchParserTask extends CompilerTask {
|
| if (cls.cachedNode != null) return;
|
|
|
| measure(() => reporter.withCurrentElement(cls, () {
|
| - MemberListener listener = new PatchMemberListener(compiler, cls);
|
| - Parser parser = new PatchClassElementParser(listener, parserOptions);
|
| - try {
|
| - Token token = parser.parseTopLevelDeclaration(cls.beginToken);
|
| - assert(identical(token, cls.endToken.next));
|
| - } on ParserError catch (e) {
|
| - // No need to recover from a parser error in platform libraries, user
|
| - // will never see this if the libraries are tested correctly.
|
| - reporter.internalError(
|
| - cls, "Parser error in patch file: $e");
|
| - }
|
| - cls.cachedNode = listener.popNode();
|
| - assert(listener.nodes.isEmpty);
|
| - }));
|
| + MemberListener listener = new PatchMemberListener(compiler, cls);
|
| + Parser parser = new PatchClassElementParser(listener, parserOptions);
|
| + try {
|
| + Token token = parser.parseTopLevelDeclaration(cls.beginToken);
|
| + assert(identical(token, cls.endToken.next));
|
| + } on ParserError catch (e) {
|
| + // No need to recover from a parser error in platform libraries, user
|
| + // will never see this if the libraries are tested correctly.
|
| + reporter.internalError(cls, "Parser error in patch file: $e");
|
| + }
|
| + cls.cachedNode = listener.popNode();
|
| + assert(listener.nodes.isEmpty);
|
| + }));
|
| }
|
| }
|
|
|
| @@ -237,8 +218,7 @@ class PatchMemberListener extends MemberListener {
|
| PatchMemberListener(Compiler compiler, ClassElement enclosingClass)
|
| : this.compiler = compiler,
|
| super(compiler.parsing.getScannerOptionsFor(enclosingClass),
|
| - compiler.reporter,
|
| - enclosingClass);
|
| + compiler.reporter, enclosingClass);
|
|
|
| @override
|
| void addMember(Element patch) {
|
| @@ -279,11 +259,10 @@ class PatchClassElementParser extends PartialParser {
|
| class PatchElementListener extends ElementListener implements Listener {
|
| final Compiler compiler;
|
|
|
| - PatchElementListener(Compiler compiler,
|
| - CompilationUnitElement patchElement,
|
| - int idGenerator())
|
| - : this.compiler = compiler,
|
| - super(compiler.parsing.getScannerOptionsFor(patchElement),
|
| + PatchElementListener(
|
| + Compiler compiler, CompilationUnitElement patchElement, int idGenerator())
|
| + : this.compiler = compiler,
|
| + super(compiler.parsing.getScannerOptionsFor(patchElement),
|
| compiler.reporter, patchElement, idGenerator);
|
|
|
| @override
|
| @@ -310,10 +289,8 @@ class PatchElementListener extends ElementListener implements Listener {
|
| }
|
| }
|
|
|
| -void patchElement(Compiler compiler,
|
| - DiagnosticReporter reporter,
|
| - Element origin,
|
| - Element patch) {
|
| +void patchElement(Compiler compiler, DiagnosticReporter reporter,
|
| + Element origin, Element patch) {
|
| if (origin == null) {
|
| reporter.reportErrorMessage(
|
| patch, MessageKind.PATCH_NON_EXISTING, {'name': patch.name});
|
| @@ -321,9 +298,9 @@ void patchElement(Compiler compiler,
|
| }
|
|
|
| if (!(origin.isClass ||
|
| - origin.isConstructor ||
|
| - origin.isFunction ||
|
| - origin.isAbstractField)) {
|
| + origin.isConstructor ||
|
| + origin.isFunction ||
|
| + origin.isAbstractField)) {
|
| // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
|
| reporter.reportErrorMessage(origin, MessageKind.PATCH_NONPATCHABLE);
|
| return;
|
| @@ -336,7 +313,7 @@ void patchElement(Compiler compiler,
|
| tryPatchSetter(reporter, origin, patch);
|
| } else if (patch.isConstructor) {
|
| tryPatchConstructor(reporter, origin, patch);
|
| - } else if(patch.isFunction) {
|
| + } else if (patch.isFunction) {
|
| tryPatchFunction(reporter, origin, patch);
|
| } else {
|
| // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
|
| @@ -344,34 +321,25 @@ void patchElement(Compiler compiler,
|
| }
|
| }
|
|
|
| -void tryPatchClass(Compiler compiler,
|
| - DiagnosticReporter reporter,
|
| - Element origin,
|
| - ClassElement patch) {
|
| +void tryPatchClass(Compiler compiler, DiagnosticReporter reporter,
|
| + Element origin, ClassElement patch) {
|
| if (!origin.isClass) {
|
| reporter.reportError(
|
| reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NON_CLASS,
|
| - {'className': patch.name}),
|
| + origin, MessageKind.PATCH_NON_CLASS, {'className': patch.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_CLASS,
|
| - {'className': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_CLASS,
|
| + {'className': patch.name}),
|
| ]);
|
| return;
|
| }
|
| patchClass(compiler, reporter, origin, patch);
|
| }
|
|
|
| -void patchClass(Compiler compiler,
|
| - DiagnosticReporter reporter,
|
| - ClassElementX origin,
|
| - ClassElementX patch) {
|
| +void patchClass(Compiler compiler, DiagnosticReporter reporter,
|
| + ClassElementX origin, ClassElementX patch) {
|
| if (origin.isPatched) {
|
| - reporter.internalError(origin,
|
| - "Patching the same class more than once.");
|
| + reporter.internalError(origin, "Patching the same class more than once.");
|
| }
|
| origin.applyPatch(patch);
|
| checkNativeAnnotation(compiler, patch);
|
| @@ -380,16 +348,15 @@ void patchClass(Compiler compiler,
|
| /// Check whether [cls] has a `@Native(...)` annotation, and if so, set its
|
| /// native name from the annotation.
|
| checkNativeAnnotation(Compiler compiler, ClassElement cls) {
|
| - EagerAnnotationHandler.checkAnnotation(compiler, cls,
|
| - const NativeAnnotationHandler());
|
| + EagerAnnotationHandler.checkAnnotation(
|
| + compiler, cls, const NativeAnnotationHandler());
|
| }
|
|
|
| checkJsInteropAnnotation(Compiler compiler, element) {
|
| - EagerAnnotationHandler.checkAnnotation(compiler, element,
|
| - const JsInteropAnnotationHandler());
|
| + EagerAnnotationHandler.checkAnnotation(
|
| + compiler, element, const JsInteropAnnotationHandler());
|
| }
|
|
|
| -
|
| /// Abstract interface for pre-resolution detection of metadata.
|
| ///
|
| /// The detection is handled in two steps:
|
| @@ -401,22 +368,16 @@ abstract class EagerAnnotationHandler<T> {
|
| /// Checks that [annotation] looks like a matching annotation and optionally
|
| /// applies actions on [element]. Returns a non-null annotation marker if the
|
| /// annotation matched and should be validated.
|
| - T apply(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation);
|
| + T apply(Compiler compiler, Element element, MetadataAnnotation annotation);
|
|
|
| /// Checks that the annotation value is valid.
|
| - void validate(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation,
|
| - ConstantValue constant);
|
| -
|
| + void validate(Compiler compiler, Element element,
|
| + MetadataAnnotation annotation, ConstantValue constant);
|
|
|
| /// Checks [element] for metadata matching the [handler]. Return a non-null
|
| /// annotation marker matching metadata was found.
|
| - static checkAnnotation(Compiler compiler,
|
| - Element element,
|
| - EagerAnnotationHandler handler) {
|
| + static checkAnnotation(
|
| + Compiler compiler, Element element, EagerAnnotationHandler handler) {
|
| for (MetadataAnnotation annotation in element.implementation.metadata) {
|
| var result = handler.apply(compiler, element, annotation);
|
| if (result != null) {
|
| @@ -424,8 +385,7 @@ abstract class EagerAnnotationHandler<T> {
|
| // [Compiler.onLibrariesLoaded].
|
| compiler.enqueuer.resolution.addDeferredAction(element, () {
|
| annotation.ensureResolved(compiler.resolution);
|
| - handler.validate(
|
| - compiler, element, annotation,
|
| + handler.validate(compiler, element, annotation,
|
| compiler.constants.getConstantValue(annotation.constant));
|
| });
|
| return result;
|
| @@ -452,9 +412,8 @@ class NativeAnnotationHandler implements EagerAnnotationHandler<String> {
|
| return null;
|
| }
|
|
|
| - String apply(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation) {
|
| + String apply(
|
| + Compiler compiler, Element element, MetadataAnnotation annotation) {
|
| if (element.isClass) {
|
| String native = getNativeAnnotation(annotation);
|
| if (native != null) {
|
| @@ -466,10 +425,8 @@ class NativeAnnotationHandler implements EagerAnnotationHandler<String> {
|
| return null;
|
| }
|
|
|
| - void validate(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation,
|
| - ConstantValue constant) {
|
| + void validate(Compiler compiler, Element element,
|
| + MetadataAnnotation annotation, ConstantValue constant) {
|
| DartType annotationType = constant.getType(compiler.coreTypes);
|
| if (annotationType.element != compiler.nativeAnnotationClass) {
|
| DiagnosticReporter reporter = compiler.reporter;
|
| @@ -486,9 +443,8 @@ class JsInteropAnnotationHandler implements EagerAnnotationHandler<bool> {
|
| bool hasJsNameAnnotation(MetadataAnnotation annotation) =>
|
| annotation.beginToken != null && annotation.beginToken.next.value == 'JS';
|
|
|
| - bool apply(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation) {
|
| + bool apply(
|
| + Compiler compiler, Element element, MetadataAnnotation annotation) {
|
| bool hasJsInterop = hasJsNameAnnotation(annotation);
|
| if (hasJsInterop) {
|
| JavaScriptBackend backend = compiler.backend;
|
| @@ -500,14 +456,13 @@ class JsInteropAnnotationHandler implements EagerAnnotationHandler<bool> {
|
| }
|
|
|
| @override
|
| - void validate(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation,
|
| - ConstantValue constant) {
|
| + void validate(Compiler compiler, Element element,
|
| + MetadataAnnotation annotation, ConstantValue constant) {
|
| JavaScriptBackend backend = compiler.backend;
|
| if (constant.getType(compiler.coreTypes).element !=
|
| backend.helpers.jsAnnotationClass) {
|
| - compiler.reporter.internalError(annotation, 'Invalid @JS(...) annotation.');
|
| + compiler.reporter
|
| + .internalError(annotation, 'Invalid @JS(...) annotation.');
|
| }
|
| }
|
| }
|
| @@ -532,17 +487,14 @@ class PatchAnnotationHandler implements EagerAnnotationHandler<PatchVersion> {
|
| }
|
|
|
| @override
|
| - PatchVersion apply(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation) {
|
| + PatchVersion apply(
|
| + Compiler compiler, Element element, MetadataAnnotation annotation) {
|
| return getPatchVersion(annotation);
|
| }
|
|
|
| @override
|
| - void validate(Compiler compiler,
|
| - Element element,
|
| - MetadataAnnotation annotation,
|
| - ConstantValue constant) {
|
| + void validate(Compiler compiler, Element element,
|
| + MetadataAnnotation annotation, ConstantValue constant) {
|
| DartType annotationType = constant.getType(compiler.coreTypes);
|
| if (annotationType.element != compiler.patchAnnotationClass) {
|
| DiagnosticReporter reporter = compiler.reporter;
|
| @@ -551,21 +503,15 @@ class PatchAnnotationHandler implements EagerAnnotationHandler<PatchVersion> {
|
| }
|
| }
|
|
|
| -
|
| -void tryPatchGetter(DiagnosticReporter reporter,
|
| - Element origin,
|
| - FunctionElement patch) {
|
| +void tryPatchGetter(
|
| + DiagnosticReporter reporter, Element origin, FunctionElement patch) {
|
| if (!origin.isAbstractField) {
|
| reporter.reportError(
|
| reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NON_GETTER,
|
| - {'name': origin.name}),
|
| + origin, MessageKind.PATCH_NON_GETTER, {'name': origin.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_GETTER,
|
| - {'getterName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_GETTER,
|
| + {'getterName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| @@ -573,14 +519,10 @@ void tryPatchGetter(DiagnosticReporter reporter,
|
| if (originField.getter == null) {
|
| reporter.reportError(
|
| reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NO_GETTER,
|
| - {'getterName': patch.name}),
|
| + origin, MessageKind.PATCH_NO_GETTER, {'getterName': patch.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_GETTER,
|
| - {'getterName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_GETTER,
|
| + {'getterName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| @@ -588,20 +530,15 @@ void tryPatchGetter(DiagnosticReporter reporter,
|
| patchFunction(reporter, getter, patch);
|
| }
|
|
|
| -void tryPatchSetter(DiagnosticReporter reporter,
|
| - Element origin,
|
| - FunctionElement patch) {
|
| +void tryPatchSetter(
|
| + DiagnosticReporter reporter, Element origin, FunctionElement patch) {
|
| if (!origin.isAbstractField) {
|
| reporter.reportError(
|
| reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NON_SETTER,
|
| - {'name': origin.name}),
|
| + origin, MessageKind.PATCH_NON_SETTER, {'name': origin.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_SETTER,
|
| - {'setterName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_SETTER,
|
| + {'setterName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| @@ -609,14 +546,10 @@ void tryPatchSetter(DiagnosticReporter reporter,
|
| if (originField.setter == null) {
|
| reporter.reportError(
|
| reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NO_SETTER,
|
| - {'setterName': patch.name}),
|
| + origin, MessageKind.PATCH_NO_SETTER, {'setterName': patch.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_SETTER,
|
| - {'setterName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_SETTER,
|
| + {'setterName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| @@ -624,70 +557,57 @@ void tryPatchSetter(DiagnosticReporter reporter,
|
| patchFunction(reporter, setter, patch);
|
| }
|
|
|
| -void tryPatchConstructor(DiagnosticReporter reporter,
|
| - Element origin,
|
| - FunctionElement patch) {
|
| +void tryPatchConstructor(
|
| + DiagnosticReporter reporter, Element origin, FunctionElement patch) {
|
| if (!origin.isConstructor) {
|
| reporter.reportError(
|
| - reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NON_CONSTRUCTOR,
|
| + reporter.createMessage(origin, MessageKind.PATCH_NON_CONSTRUCTOR,
|
| {'constructorName': patch.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
|
| - {'constructorName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
|
| + {'constructorName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| patchFunction(reporter, origin, patch);
|
| }
|
|
|
| -void tryPatchFunction(DiagnosticReporter reporter,
|
| - Element origin,
|
| - FunctionElement patch) {
|
| +void tryPatchFunction(
|
| + DiagnosticReporter reporter, Element origin, FunctionElement patch) {
|
| if (!origin.isFunction) {
|
| reporter.reportError(
|
| - reporter.createMessage(
|
| - origin,
|
| - MessageKind.PATCH_NON_FUNCTION,
|
| + reporter.createMessage(origin, MessageKind.PATCH_NON_FUNCTION,
|
| {'functionName': patch.name}),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_FUNCTION,
|
| - {'functionName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_FUNCTION,
|
| + {'functionName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| patchFunction(reporter, origin, patch);
|
| }
|
|
|
| -void patchFunction(DiagnosticReporter reporter,
|
| - BaseFunctionElementX origin,
|
| - BaseFunctionElementX patch) {
|
| +void patchFunction(DiagnosticReporter reporter, BaseFunctionElementX origin,
|
| + BaseFunctionElementX patch) {
|
| if (!origin.modifiers.isExternal) {
|
| reporter.reportError(
|
| reporter.createMessage(origin, MessageKind.PATCH_NON_EXTERNAL),
|
| <DiagnosticMessage>[
|
| - reporter.createMessage(
|
| - patch,
|
| - MessageKind.PATCH_POINT_TO_FUNCTION,
|
| - {'functionName': patch.name}),
|
| + reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_FUNCTION,
|
| + {'functionName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| if (origin.isPatched) {
|
| - reporter.internalError(origin,
|
| - "Trying to patch a function more than once.");
|
| + reporter.internalError(
|
| + origin, "Trying to patch a function more than once.");
|
| }
|
| origin.applyPatch(patch);
|
| }
|
|
|
| PatchVersion getPatchVersion(Compiler compiler, Element element) {
|
| - return EagerAnnotationHandler.checkAnnotation(compiler, element,
|
| - const PatchAnnotationHandler());
|
| + return EagerAnnotationHandler.checkAnnotation(
|
| + compiler, element, const PatchAnnotationHandler());
|
| }
|
|
|
| class PatchVersion {
|
|
|