From 723b3d75c9ab2796fee5fe7197bcb40437cfa6ac Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 7 Jul 2014 22:01:56 +0400 Subject: [PATCH] Rewrite BindingContextUtils.descriptorToDeclaration utilities family to use SourceElement for getting PSI Remove DESCRIPTOR_TO_DECLARATION context key --- .../jet/lang/resolve/BindingContext.java | 34 +++----- .../jet/lang/resolve/BindingContextUtils.java | 83 +++++-------------- 2 files changed, 33 insertions(+), 84 deletions(-) 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 e98be854a9b..0ca7c314434 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -158,7 +158,7 @@ public interface BindingContext { backingFieldRequired = valueNotFound ? false : backingFieldRequired; assert backingFieldRequired != null; // TODO: user BindingContextAccessors - PsiElement declarationPsiElement = map.get(BindingContextUtils.DESCRIPTOR_TO_DECLARATION, propertyDescriptor); + PsiElement declarationPsiElement = BindingContextUtils.descriptorToDeclaration(null, propertyDescriptor); if (declarationPsiElement instanceof JetParameter) { JetParameter jetParameter = (JetParameter) declarationPsiElement; return jetParameter.hasValOrVarNode() || @@ -193,35 +193,21 @@ public interface BindingContext { } }; - WritableSlice CLASS = - Slices.sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION) - .build(); - WritableSlice SCRIPT = - Slices.sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION) - .build(); + WritableSlice CLASS = Slices.sliceBuilder().build(); + WritableSlice SCRIPT = Slices.sliceBuilder().build(); WritableSlice TYPE_PARAMETER = - Slices.sliceBuilder() - .setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build(); + Slices.sliceBuilder().build(); /** * @see BindingContextUtils#recordFunctionDeclarationToDescriptor(BindingTrace, PsiElement, SimpleFunctionDescriptor)} */ - WritableSlice FUNCTION = Slices.sliceBuilder() - .setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build(); - WritableSlice CONSTRUCTOR = Slices.sliceBuilder() - .setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build(); - WritableSlice VARIABLE = - Slices.sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION) - .build(); - WritableSlice VALUE_PARAMETER = Slices.sliceBuilder() - .setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build(); + WritableSlice FUNCTION = Slices.sliceBuilder().build(); + WritableSlice CONSTRUCTOR = Slices.sliceBuilder().build(); + WritableSlice VARIABLE = Slices.sliceBuilder().build(); + WritableSlice VALUE_PARAMETER = Slices.sliceBuilder().build(); WritableSlice PROPERTY_ACCESSOR = - Slices.sliceBuilder() - .setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION).build(); - - // normalize value to getOriginal(value) + Slices.sliceBuilder().build(); WritableSlice PRIMARY_CONSTRUCTOR_PARAMETER = - Slices.sliceBuilder().setOpposite((WritableSlice) BindingContextUtils.DESCRIPTOR_TO_DECLARATION) - .build(); + Slices.sliceBuilder().build(); WritableSlice[] DECLARATIONS_TO_DESCRIPTORS = new WritableSlice[] { CLASS, TYPE_PARAMETER, FUNCTION, CONSTRUCTOR, VARIABLE, VALUE_PARAMETER, PROPERTY_ACCESSOR, 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 d68b957dd9e..f0126f8bff7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Lists; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; 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.model.ResolvedCall; 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.JetTypeInfo; import org.jetbrains.jet.lang.types.TypeUtils; 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.SYNTHESIZED; @@ -47,28 +49,6 @@ public class BindingContextUtils { private BindingContextUtils() { } - private static final Slices.KeyNormalizer DECLARATION_DESCRIPTOR_NORMALIZER = new Slices.KeyNormalizer() { - @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 DESCRIPTOR_TO_DECLARATION = - Slices.sliceBuilder().setKeyNormalizer(DECLARATION_DESCRIPTOR_NORMALIZER).setDebugName("DESCRIPTOR_TO_DECLARATION").build(); - @Nullable public static VariableDescriptor extractVariableDescriptorIfAny(@NotNull BindingContext bindingContext, @Nullable JetElement element, boolean onlyReference) { DeclarationDescriptor descriptor = null; @@ -115,13 +95,17 @@ public class BindingContextUtils { } @Nullable - private static PsiElement doGetDescriptorToDeclaration(@NotNull BindingContext context, @NotNull DeclarationDescriptor descriptor) { - return context.get(DESCRIPTOR_TO_DECLARATION, descriptor); + private static PsiElement doGetDescriptorToDeclaration(@NotNull DeclarationDescriptor descriptor) { + DeclarationDescriptor original = descriptor.getOriginal(); + if (!(original instanceof DeclarationDescriptorWithSource)) { + return null; + } + return SourcePackage.getPsi(((DeclarationDescriptorWithSource) original).getSource()); } // NOTE this is also used by KDoc @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) { return callableDescriptorToDeclaration(context, (CallableMemberDescriptor) descriptor); } @@ -129,7 +113,7 @@ public class BindingContextUtils { return classDescriptorToDeclaration(context, (ClassDescriptor) descriptor); } else { - return doGetDescriptorToDeclaration(context, descriptor); + return doGetDescriptorToDeclaration(descriptor); } } @@ -149,28 +133,16 @@ public class BindingContextUtils { } @Nullable - public static PsiElement callableDescriptorToDeclaration(@NotNull BindingContext context, @NotNull CallableMemberDescriptor callable) { - if (callable.getKind() == SYNTHESIZED) { - CallableMemberDescriptor original = callable.getOriginal(); - if (original instanceof SynthesizedCallableMemberDescriptor) { - DeclarationDescriptor base = ((SynthesizedCallableMemberDescriptor) original).getBaseForSynthesized(); - return descriptorToDeclaration(context, base); - } - return null; + public static PsiElement callableDescriptorToDeclaration(@Nullable BindingContext context, @NotNull CallableMemberDescriptor callable) { + if (callable.getKind() == DECLARATION || callable.getKind() == SYNTHESIZED) { + return doGetDescriptorToDeclaration(callable); } - - if (callable.getKind() == DECLARATION) { - return doGetDescriptorToDeclaration(context, callable.getOriginal()); - } - + //TODO: should not use this method for fake_override and delegation Set overriddenDescriptors = callable.getOverriddenDescriptors(); - if (overriddenDescriptors.size() != 1) { - throw new IllegalStateException( - "Cannot find declaration: fake descriptor " + callable + " has more than one overridden descriptor:\n" + - StringUtil.join(overriddenDescriptors, ",\n")); + if (overriddenDescriptors.size() == 1) { + return callableDescriptorToDeclaration(overriddenDescriptors.iterator().next()); } - - return callableDescriptorToDeclaration(context, overriddenDescriptors.iterator().next()); + return null; } @NotNull @@ -178,17 +150,8 @@ public class BindingContextUtils { @NotNull BindingContext context, @NotNull CallableMemberDescriptor callable ) { - if (callable.getKind() == SYNTHESIZED) { - CallableMemberDescriptor original = callable.getOriginal(); - 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); + if (callable.getKind() == DECLARATION || callable.getKind() == SYNTHESIZED) { + PsiElement psiElement = doGetDescriptorToDeclaration(callable); return psiElement != null ? Lists.newArrayList(psiElement) : Lists.newArrayList(); } @@ -202,7 +165,7 @@ public class BindingContextUtils { @Nullable public static PsiElement classDescriptorToDeclaration(@NotNull BindingContext context, @NotNull ClassDescriptor clazz) { - return doGetDescriptorToDeclaration(context, clazz); + return doGetDescriptorToDeclaration(clazz); } public static void recordFunctionDeclarationToDescriptor(@NotNull BindingTrace trace,