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
This commit is contained in:
Vladimir Rudev
2013-01-11 00:03:41 +04:00
committed by Evgeny Gerashchenko
parent dc876e8eeb
commit a930ae1b4f
@@ -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<PsiElement> 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());
}
}