diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index c7b0de69f1a..c17dcefeefb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -233,6 +233,8 @@ public interface BindingContext { WritableSlice IS_ENUM_MOVED_TO_CLASS_OBJECT = Slices.createSimpleSlice(); WritableSlice LABEL_TARGET = Slices.sliceBuilder().build(); + WritableSlice> AMBIGUOUS_LABEL_TARGET = + Slices.>sliceBuilder().build(); WritableSlice VALUE_PARAMETER_AS_PROPERTY = Slices.sliceBuilder().build(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java index b3386e14b0c..c0676aae2a8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java @@ -26,11 +26,10 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.util.slicedmap.ReadOnlySlice; import org.jetbrains.jet.util.slicedmap.Slices; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; +import static org.jetbrains.jet.lang.diagnostics.Errors.AMBIGUOUS_LABEL; +import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_LABEL_TARGET; import static org.jetbrains.jet.lang.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR; /** @@ -253,4 +252,22 @@ public class BindingContextUtils { assert descriptor != null : "No descriptor for named declaration: " + declaration.getText() + "\n(of type " + declaration.getClass() + ")"; return descriptor; } + + public static void reportAmbiguousLabel( + @NotNull BindingTrace trace, + @NotNull JetSimpleNameExpression targetLabel, + @NotNull Collection declarationsByLabel + ) { + Collection targets = Lists.newArrayList(); + for (DeclarationDescriptor descriptor : declarationsByLabel) { + PsiElement element = descriptorToDeclaration(trace.getBindingContext(), descriptor); + if (element != null) { + targets.add(element); + } + } + if (!targets.isEmpty()) { + trace.record(AMBIGUOUS_LABEL_TARGET, targetLabel, targets); + } + trace.report(AMBIGUOUS_LABEL.on(targetLabel)); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java index 4b76ae933fb..c59eb597541 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java @@ -90,7 +90,7 @@ public class LabelResolver { else if (size == 0) { return resolveNamedLabel(labelName, labelExpression, reportUnresolved, context); } - context.trace.report(AMBIGUOUS_LABEL.on(labelExpression)); + BindingContextUtils.reportAmbiguousLabel(context.trace, labelExpression, declarationsByLabel); return null; } @@ -117,7 +117,7 @@ public class LabelResolver { } JetElement result = stack.peek(); - context.trace.record(BindingContext.LABEL_TARGET, labelExpression, result); + context.trace.record(LABEL_TARGET, labelExpression, result); return result; } @@ -172,7 +172,7 @@ public class LabelResolver { } } else { - context.trace.report(AMBIGUOUS_LABEL.on(targetLabel)); + BindingContextUtils.reportAmbiguousLabel(context.trace, targetLabel, declarationsByLabel); } return LabeledReceiverResolutionResult.labelResolutionFailed(); } diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java index 1229392cc8a..448e596d784 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_LABEL_TARGET; import static org.jetbrains.jet.lang.resolve.BindingContext.AMBIGUOUS_REFERENCE_TARGET; public abstract class JetPsiReference implements PsiPolyVariantReference { @@ -126,6 +127,10 @@ public abstract class JetPsiReference implements PsiPolyVariantReference { if (psiElements.size() > 1) { return PsiElementResolveResult.createResults(psiElements); } + Collection labelTargets = bindingContext.get(AMBIGUOUS_LABEL_TARGET, myExpression); + if (labelTargets != null && !labelTargets.isEmpty()) { + return PsiElementResolveResult.createResults(labelTargets); + } Collection standardLibraryElements = resolveStandardLibrarySymbol(bindingContext); if (standardLibraryElements.size() > 1) { return PsiElementResolveResult.createResults(standardLibraryElements);