| 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 a2ec63cf7006cdbfc964892a24ed6e9844cfe6db..fb5096b7ad2ee92d2dc44fb24f9f67447e143f51 100644
|
| --- a/pkg/compiler/lib/src/patch_parser.dart
|
| +++ b/pkg/compiler/lib/src/patch_parser.dart
|
| @@ -122,6 +122,8 @@ import 'compiler.dart' show
|
| Compiler;
|
| import 'common/tasks.dart' show
|
| CompilerTask;
|
| +import 'dart_types.dart' show
|
| + DartType;
|
| import 'diagnostics/diagnostic_listener.dart';
|
| import 'diagnostics/messages.dart' show
|
| MessageKind;
|
| @@ -170,9 +172,9 @@ class PatchParserTask extends CompilerTask {
|
| return compiler.readScript(originLibrary, patchUri)
|
| .then((Script script) {
|
| var patchLibrary = new LibraryElementX(script, null, originLibrary);
|
| - return compiler.withCurrentElement(patchLibrary, () {
|
| + return reporter.withCurrentElement(patchLibrary, () {
|
| loader.registerNewLibrary(patchLibrary);
|
| - compiler.withCurrentElement(patchLibrary.entryCompilationUnit, () {
|
| + reporter.withCurrentElement(patchLibrary.entryCompilationUnit, () {
|
| // This patches the elements of the patch library into [library].
|
| // Injected elements are added directly under the compilation unit.
|
| // Patch elements are stored on the patched functions or classes.
|
| @@ -197,7 +199,7 @@ class PatchParserTask extends CompilerTask {
|
| } 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.
|
| - compiler.internalError(
|
| + reporter.internalError(
|
| compilationUnit, "Parser error in patch file: $e");
|
| }
|
| });
|
| @@ -208,7 +210,7 @@ class PatchParserTask extends CompilerTask {
|
| // of calling its [parseNode] method.
|
| if (cls.cachedNode != null) return;
|
|
|
| - measure(() => compiler.withCurrentElement(cls, () {
|
| + measure(() => reporter.withCurrentElement(cls, () {
|
| MemberListener listener = new PatchMemberListener(compiler, cls);
|
| Parser parser = new PatchClassElementParser(listener);
|
| try {
|
| @@ -217,7 +219,7 @@ class PatchParserTask extends CompilerTask {
|
| } 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.
|
| - compiler.internalError(
|
| + reporter.internalError(
|
| cls, "Parser error in patch file: $e");
|
| }
|
| cls.cachedNode = listener.popNode();
|
| @@ -231,7 +233,7 @@ class PatchMemberListener extends MemberListener {
|
|
|
| PatchMemberListener(Compiler compiler, ClassElement enclosingClass)
|
| : this.compiler = compiler,
|
| - super(compiler, enclosingClass);
|
| + super(compiler.reporter, enclosingClass);
|
|
|
| @override
|
| void addMember(Element patch) {
|
| @@ -241,13 +243,13 @@ class PatchMemberListener extends MemberListener {
|
| if (patchVersion != null) {
|
| if (patchVersion.isActive(compiler.patchVersion)) {
|
| Element origin = enclosingClass.origin.localLookup(patch.name);
|
| - patchElement(compiler, origin, patch);
|
| - enclosingClass.addMember(patch, listener);
|
| + patchElement(compiler, reporter, origin, patch);
|
| + enclosingClass.addMember(patch, reporter);
|
| } else {
|
| // Skip this element.
|
| }
|
| } else {
|
| - enclosingClass.addMember(patch, listener);
|
| + enclosingClass.addMember(patch, reporter);
|
| }
|
| }
|
| }
|
| @@ -272,7 +274,7 @@ class PatchElementListener extends ElementListener implements Listener {
|
| CompilationUnitElement patchElement,
|
| int idGenerator())
|
| : this.compiler = compiler,
|
| - super(compiler, patchElement, idGenerator);
|
| + super(compiler.reporter, patchElement, idGenerator);
|
|
|
| @override
|
| void pushElement(Element patch) {
|
| @@ -284,22 +286,23 @@ class PatchElementListener extends ElementListener implements Listener {
|
| LibraryElement originLibrary = compilationUnitElement.library;
|
| assert(originLibrary.isPatched);
|
| Element origin = originLibrary.localLookup(patch.name);
|
| - patchElement(listener, origin, patch);
|
| - compilationUnitElement.addMember(patch, listener);
|
| + patchElement(compiler, reporter, origin, patch);
|
| + compilationUnitElement.addMember(patch, reporter);
|
| } else {
|
| // Skip this element.
|
| }
|
| } else {
|
| - compilationUnitElement.addMember(patch, listener);
|
| + compilationUnitElement.addMember(patch, reporter);
|
| }
|
| }
|
| }
|
|
|
| void patchElement(Compiler compiler,
|
| + DiagnosticReporter reporter,
|
| Element origin,
|
| Element patch) {
|
| if (origin == null) {
|
| - compiler.reportErrorMessage(
|
| + reporter.reportErrorMessage(
|
| patch, MessageKind.PATCH_NON_EXISTING, {'name': patch.name});
|
| return;
|
| }
|
| @@ -308,50 +311,52 @@ void patchElement(Compiler compiler,
|
| origin.isFunction ||
|
| origin.isAbstractField)) {
|
| // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
|
| - compiler.reportErrorMessage(origin, MessageKind.PATCH_NONPATCHABLE);
|
| + reporter.reportErrorMessage(origin, MessageKind.PATCH_NONPATCHABLE);
|
| return;
|
| }
|
| if (patch.isClass) {
|
| - tryPatchClass(compiler, origin, patch);
|
| + tryPatchClass(compiler, reporter, origin, patch);
|
| } else if (patch.isGetter) {
|
| - tryPatchGetter(compiler, origin, patch);
|
| + tryPatchGetter(reporter, origin, patch);
|
| } else if (patch.isSetter) {
|
| - tryPatchSetter(compiler, origin, patch);
|
| + tryPatchSetter(reporter, origin, patch);
|
| } else if (patch.isConstructor) {
|
| - tryPatchConstructor(compiler, origin, patch);
|
| + tryPatchConstructor(reporter, origin, patch);
|
| } else if(patch.isFunction) {
|
| - tryPatchFunction(compiler, origin, patch);
|
| + tryPatchFunction(reporter, origin, patch);
|
| } else {
|
| // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
|
| - compiler.reportErrorMessage(patch, MessageKind.PATCH_NONPATCHABLE);
|
| + reporter.reportErrorMessage(patch, MessageKind.PATCH_NONPATCHABLE);
|
| }
|
| }
|
|
|
| void tryPatchClass(Compiler compiler,
|
| + DiagnosticReporter reporter,
|
| Element origin,
|
| ClassElement patch) {
|
| if (!origin.isClass) {
|
| - compiler.reportError(
|
| - compiler.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NON_CLASS,
|
| {'className': patch.name}),
|
| <DiagnosticMessage>[
|
| - compiler.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_CLASS,
|
| {'className': patch.name}),
|
| ]);
|
| return;
|
| }
|
| - patchClass(compiler, origin, patch);
|
| + patchClass(compiler, reporter, origin, patch);
|
| }
|
|
|
| void patchClass(Compiler compiler,
|
| + DiagnosticReporter reporter,
|
| ClassElementX origin,
|
| ClassElementX patch) {
|
| if (origin.isPatched) {
|
| - compiler.internalError(origin,
|
| + reporter.internalError(origin,
|
| "Patching the same class more than once.");
|
| }
|
| origin.applyPatch(patch);
|
| @@ -445,9 +450,10 @@ class NativeAnnotationHandler implements EagerAnnotationHandler<String> {
|
| Element element,
|
| MetadataAnnotation annotation,
|
| ConstantValue constant) {
|
| - if (constant.getType(compiler.coreTypes).element !=
|
| - compiler.nativeAnnotationClass) {
|
| - compiler.internalError(annotation, 'Invalid @Native(...) annotation.');
|
| + DartType annotationType = constant.getType(compiler.coreTypes);
|
| + if (annotationType.element != compiler.nativeAnnotationClass) {
|
| + DiagnosticReporter reporter = compiler.reporter;
|
| + reporter.internalError(annotation, 'Invalid @Native(...) annotation.');
|
| }
|
| }
|
| }
|
| @@ -483,25 +489,26 @@ class PatchAnnotationHandler implements EagerAnnotationHandler<PatchVersion> {
|
| Element element,
|
| MetadataAnnotation annotation,
|
| ConstantValue constant) {
|
| - if (constant.getType(compiler.coreTypes).element !=
|
| - compiler.patchAnnotationClass) {
|
| - compiler.internalError(annotation, 'Invalid patch annotation.');
|
| + DartType annotationType = constant.getType(compiler.coreTypes);
|
| + if (annotationType.element != compiler.patchAnnotationClass) {
|
| + DiagnosticReporter reporter = compiler.reporter;
|
| + reporter.internalError(annotation, 'Invalid patch annotation.');
|
| }
|
| }
|
| }
|
|
|
|
|
| -void tryPatchGetter(DiagnosticListener listener,
|
| +void tryPatchGetter(DiagnosticReporter reporter,
|
| Element origin,
|
| FunctionElement patch) {
|
| if (!origin.isAbstractField) {
|
| - listener.reportError(
|
| - listener.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NON_GETTER,
|
| {'name': origin.name}),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_GETTER,
|
| {'getterName': patch.name}),
|
| @@ -510,13 +517,13 @@ void tryPatchGetter(DiagnosticListener listener,
|
| }
|
| AbstractFieldElement originField = origin;
|
| if (originField.getter == null) {
|
| - listener.reportError(
|
| - listener.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NO_GETTER,
|
| {'getterName': patch.name}),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_GETTER,
|
| {'getterName': patch.name}),
|
| @@ -524,20 +531,20 @@ void tryPatchGetter(DiagnosticListener listener,
|
| return;
|
| }
|
| GetterElementX getter = originField.getter;
|
| - patchFunction(listener, getter, patch);
|
| + patchFunction(reporter, getter, patch);
|
| }
|
|
|
| -void tryPatchSetter(DiagnosticListener listener,
|
| +void tryPatchSetter(DiagnosticReporter reporter,
|
| Element origin,
|
| FunctionElement patch) {
|
| if (!origin.isAbstractField) {
|
| - listener.reportError(
|
| - listener.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NON_SETTER,
|
| {'name': origin.name}),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_SETTER,
|
| {'setterName': patch.name}),
|
| @@ -546,13 +553,13 @@ void tryPatchSetter(DiagnosticListener listener,
|
| }
|
| AbstractFieldElement originField = origin;
|
| if (originField.setter == null) {
|
| - listener.reportError(
|
| - listener.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NO_SETTER,
|
| {'setterName': patch.name}),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_SETTER,
|
| {'setterName': patch.name}),
|
| @@ -560,57 +567,57 @@ void tryPatchSetter(DiagnosticListener listener,
|
| return;
|
| }
|
| SetterElementX setter = originField.setter;
|
| - patchFunction(listener, setter, patch);
|
| + patchFunction(reporter, setter, patch);
|
| }
|
|
|
| -void tryPatchConstructor(DiagnosticListener listener,
|
| +void tryPatchConstructor(DiagnosticReporter reporter,
|
| Element origin,
|
| FunctionElement patch) {
|
| if (!origin.isConstructor) {
|
| - listener.reportError(
|
| - listener.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NON_CONSTRUCTOR,
|
| {'constructorName': patch.name}),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
|
| {'constructorName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| - patchFunction(listener, origin, patch);
|
| + patchFunction(reporter, origin, patch);
|
| }
|
|
|
| -void tryPatchFunction(DiagnosticListener listener,
|
| +void tryPatchFunction(DiagnosticReporter reporter,
|
| Element origin,
|
| FunctionElement patch) {
|
| if (!origin.isFunction) {
|
| - listener.reportError(
|
| - listener.createMessage(
|
| + reporter.reportError(
|
| + reporter.createMessage(
|
| origin,
|
| MessageKind.PATCH_NON_FUNCTION,
|
| {'functionName': patch.name}),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_FUNCTION,
|
| {'functionName': patch.name}),
|
| ]);
|
| return;
|
| }
|
| - patchFunction(listener, origin, patch);
|
| + patchFunction(reporter, origin, patch);
|
| }
|
|
|
| -void patchFunction(DiagnosticListener listener,
|
| +void patchFunction(DiagnosticReporter reporter,
|
| BaseFunctionElementX origin,
|
| BaseFunctionElementX patch) {
|
| if (!origin.modifiers.isExternal) {
|
| - listener.reportError(
|
| - listener.createMessage(origin, MessageKind.PATCH_NON_EXTERNAL),
|
| + reporter.reportError(
|
| + reporter.createMessage(origin, MessageKind.PATCH_NON_EXTERNAL),
|
| <DiagnosticMessage>[
|
| - listener.createMessage(
|
| + reporter.createMessage(
|
| patch,
|
| MessageKind.PATCH_POINT_TO_FUNCTION,
|
| {'functionName': patch.name}),
|
| @@ -618,7 +625,7 @@ void patchFunction(DiagnosticListener listener,
|
| return;
|
| }
|
| if (origin.isPatched) {
|
| - listener.internalError(origin,
|
| + reporter.internalError(origin,
|
| "Trying to patch a function more than once.");
|
| }
|
| origin.applyPatch(patch);
|
|
|