record ambiguous label references
This commit is contained in:
@@ -233,6 +233,8 @@ public interface BindingContext {
|
||||
WritableSlice<ClassDescriptor, Boolean> IS_ENUM_MOVED_TO_CLASS_OBJECT = Slices.createSimpleSlice();
|
||||
|
||||
WritableSlice<JetReferenceExpression, PsiElement> LABEL_TARGET = Slices.<JetReferenceExpression, PsiElement>sliceBuilder().build();
|
||||
WritableSlice<JetReferenceExpression, Collection<? extends PsiElement>> AMBIGUOUS_LABEL_TARGET =
|
||||
Slices.<JetReferenceExpression, Collection<? extends PsiElement>>sliceBuilder().build();
|
||||
WritableSlice<ValueParameterDescriptor, PropertyDescriptor> VALUE_PARAMETER_AS_PROPERTY =
|
||||
Slices.<ValueParameterDescriptor, PropertyDescriptor>sliceBuilder().build();
|
||||
|
||||
|
||||
@@ -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<DeclarationDescriptor> declarationsByLabel
|
||||
) {
|
||||
Collection<PsiElement> 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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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<? extends PsiElement> labelTargets = bindingContext.get(AMBIGUOUS_LABEL_TARGET, myExpression);
|
||||
if (labelTargets != null && !labelTargets.isEmpty()) {
|
||||
return PsiElementResolveResult.createResults(labelTargets);
|
||||
}
|
||||
Collection<PsiElement> standardLibraryElements = resolveStandardLibrarySymbol(bindingContext);
|
||||
if (standardLibraryElements.size() > 1) {
|
||||
return PsiElementResolveResult.createResults(standardLibraryElements);
|
||||
|
||||
Reference in New Issue
Block a user