From a930ae1b4f8ffceb98ed03c131defd4f2831a32c Mon Sep 17 00:00:00 2001 From: Vladimir Rudev Date: Fri, 11 Jan 2013 00:03:41 +0400 Subject: [PATCH] KT-2601 Don't display "Original: null" in quick info Added resolving within libraries if BindingContext didn't provide declaration. If text for 'Original' is null then second row will not be displayed. #KT-2601 In Progress --- .../plugin/JetQuickDocumentationProvider.java | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/JetQuickDocumentationProvider.java b/idea/src/org/jetbrains/jet/plugin/JetQuickDocumentationProvider.java index a33dcd0633c..177f0934333 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetQuickDocumentationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/JetQuickDocumentationProvider.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.plugin; import com.intellij.lang.documentation.AbstractDocumentationProvider; import com.intellij.lang.java.JavaDocumentationProvider; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.compiled.ClsClassImpl; import com.intellij.psi.impl.compiled.ClsFileImpl; @@ -31,8 +32,11 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.plugin.libraries.JetDecompiledData; import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; +import org.jetbrains.jet.plugin.references.StandardLibraryReferenceResolver; import org.jetbrains.jet.renderer.DescriptorRenderer; +import java.util.Collection; + public class JetQuickDocumentationProvider extends AbstractDocumentationProvider { private static String getText(PsiElement element, PsiElement originalElement, boolean mergeKotlinAndJava) { JetReferenceExpression ref; @@ -69,6 +73,38 @@ public class JetQuickDocumentationProvider extends AbstractDocumentationProvider return null; } + private static String render(@NotNull DeclarationDescriptor declarationDescriptor, @NotNull BindingContext bindingContext, + PsiElement element, PsiElement originalElement, boolean mergeKotlinAndJava) { + String renderedDecl = DescriptorRenderer.HTML.render(declarationDescriptor); + if (isKotlinDeclaration(declarationDescriptor, bindingContext, originalElement.getProject())) { + return renderedDecl; + } + else if (mergeKotlinAndJava) { + final String originalInfo = new JavaDocumentationProvider().getQuickNavigateInfo(element, originalElement); + if (originalInfo != null) { + return renderedDecl + "\nOriginal: " + originalInfo; + } + return renderedDecl; + } + return null; + } + + private static boolean isKotlinDeclaration(DeclarationDescriptor descriptor, BindingContext bindingContext, Project project) { + PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); + if (declaration == null) { + StandardLibraryReferenceResolver libraryReferenceResolver = project + .getComponent(StandardLibraryReferenceResolver.class); + final Collection elements = libraryReferenceResolver.resolveStandardLibrarySymbol(descriptor); + if (elements.isEmpty()) return false; + declaration = elements.iterator().next(); + } + if (declaration == null) return false; + if (JetLanguage.INSTANCE == declaration.getLanguage()) return true; + ClsClassImpl clsClass = PsiTreeUtil.getParentOfType(declaration, ClsClassImpl.class); + if (clsClass == null) return false; + return JetDecompiledData.isKotlinFile((ClsFileImpl) clsClass.getContainingFile()); + } + @Override public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) { return getText(element, originalElement, true); @@ -78,27 +114,4 @@ public class JetQuickDocumentationProvider extends AbstractDocumentationProvider public String generateDoc(PsiElement element, PsiElement originalElement) { return getText(element, originalElement, false); } - - private static String render(@NotNull DeclarationDescriptor declarationDescriptor, @NotNull BindingContext bindingContext, - PsiElement element, PsiElement originalElement, boolean mergeKotlinAndJava) { - String renderedDecl = DescriptorRenderer.HTML.render(declarationDescriptor); - if (isKotlinDeclaration(declarationDescriptor, bindingContext)) { - return renderedDecl; - } else { - if (mergeKotlinAndJava) { - return renderedDecl + "\nOriginal: " + new JavaDocumentationProvider().getQuickNavigateInfo(element, originalElement); - } else { - return null; - } - } - } - - private static boolean isKotlinDeclaration(DeclarationDescriptor descriptor, BindingContext bindingContext) { - PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); - if (declaration == null) return false; - if (JetLanguage.INSTANCE == declaration.getLanguage()) return true; - ClsClassImpl clsClass = PsiTreeUtil.getParentOfType(declaration, ClsClassImpl.class); - if (clsClass == null) return false; - return JetDecompiledData.isKotlinFile((ClsFileImpl) clsClass.getContainingFile()); - } }