Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
index 59578cedf592ed68c0ea720ce38745bfcbb6d7c6..d0970fa01290df1405f4ab3b91221e2d39c0cbcb 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart |
@@ -64,7 +64,11 @@ import '../quote.dart' |
import '../modifier.dart' show Modifier, constMask, finalMask; |
-import 'redirecting_factory_body.dart' show getRedirectionTarget; |
+import 'redirecting_factory_body.dart' |
+ show |
+ RedirectingFactoryBody, |
+ getRedirectingFactoryBody, |
+ getRedirectionTarget; |
import 'kernel_builder.dart'; |
@@ -2173,6 +2177,15 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
nameToken.charOffset)); |
return; |
} |
+ RedirectingFactoryBody body = getRedirectingFactoryBody(target); |
+ if (body != null) { |
+ // If the redirection target is itself a redirecting factory, it |
+ // means that it is unresolved. So we set target to null so we |
+ // can generate a no-such-method error below. |
+ assert(body.isUnresolved); |
+ target = null; |
+ errorName = body.unresolvedName; |
+ } |
} |
if (target is Constructor || |
(target is Procedure && target.kind == ProcedureKind.Factory)) { |
@@ -2182,7 +2195,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper { |
initialTarget: initialTarget)); |
return; |
} else { |
- errorName = debugName(type.name, name); |
+ errorName ??= debugName(type.name, name); |
} |
} else { |
errorName = debugName(getNodeName(type), name); |