Abandon storing BindingContext in JetFunctionPsiElementCellRenderer

#EA-61357 Fixed
This commit is contained in:
Nikolay Krasko
2014-10-08 14:45:44 +04:00
parent 1143db85f1
commit 4b197aafa4
4 changed files with 21 additions and 37 deletions
@@ -34,13 +34,12 @@ import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils;
import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -60,9 +59,7 @@ public class GotoSuperActionHandler implements CodeInsightActionHandler {
JetObjectDeclaration.class); JetObjectDeclaration.class);
if (declaration == null) return; if (declaration == null) return;
BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement(declaration); DeclarationDescriptor descriptor = ResolvePackage.getLazyResolveSession(declaration).resolveToDescriptor(declaration);
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
Collection<? extends DeclarationDescriptor> superDescriptors; Collection<? extends DeclarationDescriptor> superDescriptors;
String message; String message;
@@ -117,7 +114,7 @@ public class GotoSuperActionHandler implements CodeInsightActionHandler {
JBPopup popup = descriptor instanceof ClassDescriptor JBPopup popup = descriptor instanceof ClassDescriptor
? NavigationUtil.getPsiElementPopup(superDeclarationsArray, message) ? NavigationUtil.getPsiElementPopup(superDeclarationsArray, message)
: NavigationUtil.getPsiElementPopup(superDeclarationsArray, : NavigationUtil.getPsiElementPopup(superDeclarationsArray,
new JetFunctionPsiElementCellRenderer(bindingContext), message); new JetFunctionPsiElementCellRenderer(), message);
popup.showInBestPositionFor(editor); popup.showInBestPositionFor(editor);
} }
} }
@@ -18,25 +18,18 @@ package org.jetbrains.jet.plugin.codeInsight;
import com.intellij.ide.util.DefaultPsiElementCellRenderer; import com.intellij.ide.util.DefaultPsiElementCellRenderer;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
public class JetFunctionPsiElementCellRenderer extends DefaultPsiElementCellRenderer { public class JetFunctionPsiElementCellRenderer extends DefaultPsiElementCellRenderer {
private final BindingContext bindingContext;
public JetFunctionPsiElementCellRenderer(BindingContext bindingContext) {
this.bindingContext = bindingContext;
}
@Override @Override
public String getElementText(PsiElement element) { public String getElementText(PsiElement element) {
if (element instanceof JetNamedFunction) { if (element instanceof JetNamedFunction) {
JetNamedFunction function = (JetNamedFunction) element; JetNamedFunction function = (JetNamedFunction) element;
SimpleFunctionDescriptor fd = bindingContext.get(BindingContext.FUNCTION, function); DeclarationDescriptor descriptor = ResolvePackage.getLazyResolveSession(function).resolveToDescriptor(function);
assert fd != null; return DescriptorRenderer.SHORT_NAMES_IN_TYPES.render(descriptor);
return DescriptorRenderer.SHORT_NAMES_IN_TYPES.render(fd);
} }
return super.getElementText(element); return super.getElementText(element);
} }
@@ -190,7 +190,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
// NOTE: Don't store descriptors in line markers because line markers are not deleted while editing other files and this can prevent // NOTE: Don't store descriptors in line markers because line markers are not deleted while editing other files and this can prevent
// clearing the whole BindingTrace. // clearing the whole BindingTrace.
LineMarkerInfo<JetElement> marker = new LineMarkerInfo<JetElement>( LineMarkerInfo<JetDeclaration> marker = new LineMarkerInfo<JetDeclaration>(
declaration, declaration,
declaration.getTextOffset(), declaration.getTextOffset(),
isImplementsAndNotOverrides(resolveWithParents.getDescriptor(), resolveWithParents.getOverriddenDescriptors()) ? isImplementsAndNotOverrides(resolveWithParents.getDescriptor(), resolveWithParents.getOverriddenDescriptors()) ?
@@ -16,9 +16,6 @@
package org.jetbrains.jet.plugin.highlighter.markers package org.jetbrains.jet.plugin.highlighter.markers
import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor
import org.jetbrains.jet.lang.resolve.OverrideResolver import org.jetbrains.jet.lang.resolve.OverrideResolver
import org.jetbrains.jet.lang.descriptors.Modality import org.jetbrains.jet.lang.descriptors.Modality
@@ -37,13 +34,12 @@ import org.jetbrains.annotations.TestOnly
import com.intellij.codeInsight.daemon.GutterIconNavigationHandler import com.intellij.codeInsight.daemon.GutterIconNavigationHandler
import java.util.ArrayList import java.util.ArrayList
import com.intellij.util.Function import com.intellij.util.Function
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
import org.jetbrains.jet.lang.psi.JetDeclaration
object SuperDeclarationMarkerTooltip: Function<JetElement, String> { object SuperDeclarationMarkerTooltip: Function<JetDeclaration, String> {
override fun `fun`(param: JetElement?): String? { override fun `fun`(jetDeclaration: JetDeclaration?): String? {
val element = param!! val (elementDescriptor, overriddenDescriptors) = resolveDeclarationWithParents(jetDeclaration!!)
[suppress("UNUSED_VARIABLE")]
val (elementDescriptor, _, overriddenDescriptors) = resolveDeclarationWithParents(element)
if (overriddenDescriptors.isEmpty()) return "" if (overriddenDescriptors.isEmpty()) return ""
val isAbstract = elementDescriptor!!.getModality() == Modality.ABSTRACT val isAbstract = elementDescriptor!!.getModality() == Modality.ABSTRACT
@@ -67,7 +63,7 @@ object SuperDeclarationMarkerTooltip: Function<JetElement, String> {
} }
} }
public class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandler<JetElement> { public class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandler<JetDeclaration> {
private var testNavigableElements: List<NavigatablePsiElement>? = null private var testNavigableElements: List<NavigatablePsiElement>? = null
TestOnly TestOnly
@@ -77,10 +73,10 @@ public class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandl
return navigationResult return navigationResult
} }
override fun navigate(e: MouseEvent?, element: JetElement?) { override fun navigate(e: MouseEvent?, element: JetDeclaration?) {
if (element == null) return if (element == null) return
val (elementDescriptor, bindingContext, overriddenDescriptors) = resolveDeclarationWithParents(element) val (elementDescriptor, overriddenDescriptors) = resolveDeclarationWithParents(element)
if (overriddenDescriptors.isEmpty()) return if (overriddenDescriptors.isEmpty()) return
val superDeclarations = ArrayList<NavigatablePsiElement>() val superDeclarations = ArrayList<NavigatablePsiElement>()
@@ -101,7 +97,7 @@ public class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandl
superDeclarations.copyToArray(), superDeclarations.copyToArray(),
JetBundle.message("navigation.title.super.declaration", elementName), JetBundle.message("navigation.title.super.declaration", elementName),
JetBundle.message("navigation.findUsages.title.super.declaration", elementName), JetBundle.message("navigation.findUsages.title.super.declaration", elementName),
JetFunctionPsiElementCellRenderer(bindingContext)) JetFunctionPsiElementCellRenderer())
} }
else { else {
// Only store elements for retrieve in test // Only store elements for retrieve in test
@@ -112,15 +108,13 @@ public class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandl
public data class ResolveWithParentsResult( public data class ResolveWithParentsResult(
val descriptor: CallableMemberDescriptor?, val descriptor: CallableMemberDescriptor?,
val bindingContext: BindingContext,
val overriddenDescriptors: Collection<CallableMemberDescriptor>) val overriddenDescriptors: Collection<CallableMemberDescriptor>)
public fun resolveDeclarationWithParents(element: JetElement): ResolveWithParentsResult { public fun resolveDeclarationWithParents(element: JetDeclaration): ResolveWithParentsResult {
val bindingContext = AnalyzerFacadeWithCache.getContextForElement(element) val descriptor = element.getLazyResolveSession().resolveToDescriptor(element)
val descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element)
if (descriptor !is CallableMemberDescriptor) return ResolveWithParentsResult(null, bindingContext, listOf()) if (descriptor !is CallableMemberDescriptor) return ResolveWithParentsResult(null, listOf())
val overriddenMembers = OverrideResolver.getDirectlyOverriddenDeclarations(descriptor) val overriddenMembers = OverrideResolver.getDirectlyOverriddenDeclarations(descriptor)
return ResolveWithParentsResult(descriptor, bindingContext, overriddenMembers) return ResolveWithParentsResult(descriptor, overriddenMembers)
} }