Rewrite BindingContextUtils.descriptorToDeclaration utilities family to use SourceElement for getting PSI
Remove DESCRIPTOR_TO_DECLARATION context key
This commit is contained in:
@@ -158,7 +158,7 @@ public interface BindingContext {
|
|||||||
backingFieldRequired = valueNotFound ? false : backingFieldRequired;
|
backingFieldRequired = valueNotFound ? false : backingFieldRequired;
|
||||||
assert backingFieldRequired != null;
|
assert backingFieldRequired != null;
|
||||||
// TODO: user BindingContextAccessors
|
// TODO: user BindingContextAccessors
|
||||||
PsiElement declarationPsiElement = map.get(BindingContextUtils.DESCRIPTOR_TO_DECLARATION, propertyDescriptor);
|
PsiElement declarationPsiElement = BindingContextUtils.descriptorToDeclaration(null, propertyDescriptor);
|
||||||
if (declarationPsiElement instanceof JetParameter) {
|
if (declarationPsiElement instanceof JetParameter) {
|
||||||
JetParameter jetParameter = (JetParameter) declarationPsiElement;
|
JetParameter jetParameter = (JetParameter) declarationPsiElement;
|
||||||
return jetParameter.hasValOrVarNode() ||
|
return jetParameter.hasValOrVarNode() ||
|
||||||
@@ -193,35 +193,21 @@ public interface BindingContext {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
WritableSlice<PsiElement, ClassDescriptor> CLASS =
|
WritableSlice<PsiElement, ClassDescriptor> CLASS = Slices.<PsiElement, ClassDescriptor>sliceBuilder().build();
|
||||||
Slices.<PsiElement, ClassDescriptor>sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION)
|
WritableSlice<PsiElement, ScriptDescriptor> SCRIPT = Slices.<PsiElement, ScriptDescriptor>sliceBuilder().build();
|
||||||
.build();
|
|
||||||
WritableSlice<PsiElement, ScriptDescriptor> SCRIPT =
|
|
||||||
Slices.<PsiElement, ScriptDescriptor>sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION)
|
|
||||||
.build();
|
|
||||||
WritableSlice<JetTypeParameter, TypeParameterDescriptor> TYPE_PARAMETER =
|
WritableSlice<JetTypeParameter, TypeParameterDescriptor> TYPE_PARAMETER =
|
||||||
Slices.<JetTypeParameter, TypeParameterDescriptor>sliceBuilder()
|
Slices.<JetTypeParameter, TypeParameterDescriptor>sliceBuilder().build();
|
||||||
.setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build();
|
|
||||||
/**
|
/**
|
||||||
* @see BindingContextUtils#recordFunctionDeclarationToDescriptor(BindingTrace, PsiElement, SimpleFunctionDescriptor)}
|
* @see BindingContextUtils#recordFunctionDeclarationToDescriptor(BindingTrace, PsiElement, SimpleFunctionDescriptor)}
|
||||||
*/
|
*/
|
||||||
WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.<PsiElement, SimpleFunctionDescriptor>sliceBuilder()
|
WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.<PsiElement, SimpleFunctionDescriptor>sliceBuilder().build();
|
||||||
.setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build();
|
WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.<PsiElement, ConstructorDescriptor>sliceBuilder().build();
|
||||||
WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.<PsiElement, ConstructorDescriptor>sliceBuilder()
|
WritableSlice<PsiElement, VariableDescriptor> VARIABLE = Slices.<PsiElement, VariableDescriptor>sliceBuilder().build();
|
||||||
.setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build();
|
WritableSlice<JetParameter, VariableDescriptor> VALUE_PARAMETER = Slices.<JetParameter, VariableDescriptor>sliceBuilder().build();
|
||||||
WritableSlice<PsiElement, VariableDescriptor> VARIABLE =
|
|
||||||
Slices.<PsiElement, VariableDescriptor>sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION)
|
|
||||||
.build();
|
|
||||||
WritableSlice<JetParameter, VariableDescriptor> VALUE_PARAMETER = Slices.<JetParameter, VariableDescriptor>sliceBuilder()
|
|
||||||
.setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build();
|
|
||||||
WritableSlice<JetPropertyAccessor, PropertyAccessorDescriptor> PROPERTY_ACCESSOR =
|
WritableSlice<JetPropertyAccessor, PropertyAccessorDescriptor> PROPERTY_ACCESSOR =
|
||||||
Slices.<JetPropertyAccessor, PropertyAccessorDescriptor>sliceBuilder()
|
Slices.<JetPropertyAccessor, PropertyAccessorDescriptor>sliceBuilder().build();
|
||||||
.setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build();
|
|
||||||
|
|
||||||
// normalize value to getOriginal(value)
|
|
||||||
WritableSlice<PsiElement, PropertyDescriptor> PRIMARY_CONSTRUCTOR_PARAMETER =
|
WritableSlice<PsiElement, PropertyDescriptor> PRIMARY_CONSTRUCTOR_PARAMETER =
|
||||||
Slices.<PsiElement, PropertyDescriptor>sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION)
|
Slices.<PsiElement, PropertyDescriptor>sliceBuilder().build();
|
||||||
.build();
|
|
||||||
|
|
||||||
WritableSlice[] DECLARATIONS_TO_DESCRIPTORS = new WritableSlice[] {
|
WritableSlice[] DECLARATIONS_TO_DESCRIPTORS = new WritableSlice[] {
|
||||||
CLASS, TYPE_PARAMETER, FUNCTION, CONSTRUCTOR, VARIABLE, VALUE_PARAMETER, PROPERTY_ACCESSOR,
|
CLASS, TYPE_PARAMETER, FUNCTION, CONSTRUCTOR, VARIABLE, VALUE_PARAMETER, PROPERTY_ACCESSOR,
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.intellij.openapi.util.Pair;
|
import com.intellij.openapi.util.Pair;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
@@ -30,13 +29,16 @@ import org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPacka
|
|||||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
|
||||||
|
import org.jetbrains.jet.lang.resolve.source.SourcePackage;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.JetTypeInfo;
|
import org.jetbrains.jet.lang.types.JetTypeInfo;
|
||||||
import org.jetbrains.jet.lang.types.TypeUtils;
|
import org.jetbrains.jet.lang.types.TypeUtils;
|
||||||
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
|
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
|
||||||
import org.jetbrains.jet.util.slicedmap.Slices;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
||||||
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
|
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
|
||||||
@@ -47,28 +49,6 @@ public class BindingContextUtils {
|
|||||||
private BindingContextUtils() {
|
private BindingContextUtils() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Slices.KeyNormalizer<DeclarationDescriptor> DECLARATION_DESCRIPTOR_NORMALIZER = new Slices.KeyNormalizer<DeclarationDescriptor>() {
|
|
||||||
@Override
|
|
||||||
public DeclarationDescriptor normalize(DeclarationDescriptor declarationDescriptor) {
|
|
||||||
if (declarationDescriptor instanceof CallableMemberDescriptor) {
|
|
||||||
CallableMemberDescriptor callable = (CallableMemberDescriptor) declarationDescriptor;
|
|
||||||
if (callable.getKind() != DECLARATION) {
|
|
||||||
throw new IllegalStateException("non-declaration descriptors should be filtered out earlier: " + callable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if (declarationDescriptor instanceof VariableAsFunctionDescriptor) {
|
|
||||||
// VariableAsFunctionDescriptor descriptor = (VariableAsFunctionDescriptor) declarationDescriptor;
|
|
||||||
// if (descriptor.getOriginal() != descriptor) {
|
|
||||||
// throw new IllegalStateException("original should be resolved earlier: " + descriptor);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
return declarationDescriptor.getOriginal();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*package*/ static final ReadOnlySlice<DeclarationDescriptor, PsiElement> DESCRIPTOR_TO_DECLARATION =
|
|
||||||
Slices.<DeclarationDescriptor, PsiElement>sliceBuilder().setKeyNormalizer(DECLARATION_DESCRIPTOR_NORMALIZER).setDebugName("DESCRIPTOR_TO_DECLARATION").build();
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static VariableDescriptor extractVariableDescriptorIfAny(@NotNull BindingContext bindingContext, @Nullable JetElement element, boolean onlyReference) {
|
public static VariableDescriptor extractVariableDescriptorIfAny(@NotNull BindingContext bindingContext, @Nullable JetElement element, boolean onlyReference) {
|
||||||
DeclarationDescriptor descriptor = null;
|
DeclarationDescriptor descriptor = null;
|
||||||
@@ -115,13 +95,17 @@ public class BindingContextUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static PsiElement doGetDescriptorToDeclaration(@NotNull BindingContext context, @NotNull DeclarationDescriptor descriptor) {
|
private static PsiElement doGetDescriptorToDeclaration(@NotNull DeclarationDescriptor descriptor) {
|
||||||
return context.get(DESCRIPTOR_TO_DECLARATION, descriptor);
|
DeclarationDescriptor original = descriptor.getOriginal();
|
||||||
|
if (!(original instanceof DeclarationDescriptorWithSource)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return SourcePackage.getPsi(((DeclarationDescriptorWithSource) original).getSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE this is also used by KDoc
|
// NOTE this is also used by KDoc
|
||||||
@Nullable
|
@Nullable
|
||||||
public static PsiElement descriptorToDeclaration(@NotNull BindingContext context, @NotNull DeclarationDescriptor descriptor) {
|
public static PsiElement descriptorToDeclaration(@Nullable BindingContext context, @NotNull DeclarationDescriptor descriptor) {
|
||||||
if (descriptor instanceof CallableMemberDescriptor) {
|
if (descriptor instanceof CallableMemberDescriptor) {
|
||||||
return callableDescriptorToDeclaration(context, (CallableMemberDescriptor) descriptor);
|
return callableDescriptorToDeclaration(context, (CallableMemberDescriptor) descriptor);
|
||||||
}
|
}
|
||||||
@@ -129,7 +113,7 @@ public class BindingContextUtils {
|
|||||||
return classDescriptorToDeclaration(context, (ClassDescriptor) descriptor);
|
return classDescriptorToDeclaration(context, (ClassDescriptor) descriptor);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return doGetDescriptorToDeclaration(context, descriptor);
|
return doGetDescriptorToDeclaration(descriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,28 +133,16 @@ public class BindingContextUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static PsiElement callableDescriptorToDeclaration(@NotNull BindingContext context, @NotNull CallableMemberDescriptor callable) {
|
public static PsiElement callableDescriptorToDeclaration(@Nullable BindingContext context, @NotNull CallableMemberDescriptor callable) {
|
||||||
if (callable.getKind() == SYNTHESIZED) {
|
if (callable.getKind() == DECLARATION || callable.getKind() == SYNTHESIZED) {
|
||||||
CallableMemberDescriptor original = callable.getOriginal();
|
return doGetDescriptorToDeclaration(callable);
|
||||||
if (original instanceof SynthesizedCallableMemberDescriptor<?>) {
|
|
||||||
DeclarationDescriptor base = ((SynthesizedCallableMemberDescriptor<?>) original).getBaseForSynthesized();
|
|
||||||
return descriptorToDeclaration(context, base);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
//TODO: should not use this method for fake_override and delegation
|
||||||
if (callable.getKind() == DECLARATION) {
|
|
||||||
return doGetDescriptorToDeclaration(context, callable.getOriginal());
|
|
||||||
}
|
|
||||||
|
|
||||||
Set<? extends CallableMemberDescriptor> overriddenDescriptors = callable.getOverriddenDescriptors();
|
Set<? extends CallableMemberDescriptor> overriddenDescriptors = callable.getOverriddenDescriptors();
|
||||||
if (overriddenDescriptors.size() != 1) {
|
if (overriddenDescriptors.size() == 1) {
|
||||||
throw new IllegalStateException(
|
return callableDescriptorToDeclaration(overriddenDescriptors.iterator().next());
|
||||||
"Cannot find declaration: fake descriptor " + callable + " has more than one overridden descriptor:\n" +
|
|
||||||
StringUtil.join(overriddenDescriptors, ",\n"));
|
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
return callableDescriptorToDeclaration(context, overriddenDescriptors.iterator().next());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -178,17 +150,8 @@ public class BindingContextUtils {
|
|||||||
@NotNull BindingContext context,
|
@NotNull BindingContext context,
|
||||||
@NotNull CallableMemberDescriptor callable
|
@NotNull CallableMemberDescriptor callable
|
||||||
) {
|
) {
|
||||||
if (callable.getKind() == SYNTHESIZED) {
|
if (callable.getKind() == DECLARATION || callable.getKind() == SYNTHESIZED) {
|
||||||
CallableMemberDescriptor original = callable.getOriginal();
|
PsiElement psiElement = doGetDescriptorToDeclaration(callable);
|
||||||
if (original instanceof SynthesizedCallableMemberDescriptor<?>) {
|
|
||||||
DeclarationDescriptor base = ((SynthesizedCallableMemberDescriptor<?>) original).getBaseForSynthesized();
|
|
||||||
return descriptorToDeclarations(context, base);
|
|
||||||
}
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (callable.getKind() == DECLARATION) {
|
|
||||||
PsiElement psiElement = doGetDescriptorToDeclaration(context, callable);
|
|
||||||
return psiElement != null ? Lists.newArrayList(psiElement) : Lists.<PsiElement>newArrayList();
|
return psiElement != null ? Lists.newArrayList(psiElement) : Lists.<PsiElement>newArrayList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,7 +165,7 @@ public class BindingContextUtils {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static PsiElement classDescriptorToDeclaration(@NotNull BindingContext context, @NotNull ClassDescriptor clazz) {
|
public static PsiElement classDescriptorToDeclaration(@NotNull BindingContext context, @NotNull ClassDescriptor clazz) {
|
||||||
return doGetDescriptorToDeclaration(context, clazz);
|
return doGetDescriptorToDeclaration(clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void recordFunctionDeclarationToDescriptor(@NotNull BindingTrace trace,
|
public static void recordFunctionDeclarationToDescriptor(@NotNull BindingTrace trace,
|
||||||
|
|||||||
Reference in New Issue
Block a user