Changed quick doc information for references to Kotlin entities which are loaded from libraries.

#KT-1233 fixed
This commit is contained in:
Evgeny Gerashchenko
2012-05-04 15:43:17 +04:00
parent 53397d7130
commit ee43f03e0a
2 changed files with 49 additions and 17 deletions
+1
View File
@@ -137,6 +137,7 @@
<extendWordSelectionHandler implementation="org.jetbrains.jet.plugin.editor.wordSelection.JetCodeBlockSelectioner"/>
<extendWordSelectionHandler implementation="org.jetbrains.jet.plugin.editor.wordSelection.JetListSelectioner"/>
<lang.documentationProvider language="JAVA" implementationClass="org.jetbrains.jet.plugin.JetQuickDocumentationProvider" order="first"/>
<documentationProvider implementation="org.jetbrains.jet.plugin.JetQuickDocumentationProvider"/>
<configurationType implementation="org.jetbrains.jet.plugin.run.JetRunConfigurationType"/>
<configurationType implementation="org.jetbrains.jet.plugin.k2jsrun.K2JSRunConfigurationType"/>
@@ -17,23 +17,29 @@
package org.jetbrains.jet.plugin;
import com.intellij.lang.documentation.AbstractDocumentationProvider;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.compiled.ClsClassImpl;
import com.intellij.psi.impl.compiled.ClsFileImpl;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.xml.util.XmlStringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
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.resolve.DescriptorRenderer;
/**
* @author abreslav
* @author Evgeny Gerashchenko
*/
public class JetQuickDocumentationProvider extends AbstractDocumentationProvider {
@Override
public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) {
private static String getText(PsiElement element, PsiElement originalElement, boolean mergeKotlinAndJava) {
JetReferenceExpression ref;
if (originalElement instanceof JetReferenceExpression) {
ref = (JetReferenceExpression) originalElement;
@@ -46,35 +52,60 @@ public class JetQuickDocumentationProvider extends AbstractDocumentationProvider
.getBindingContext();
DeclarationDescriptor declarationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, ref);
if (declarationDescriptor != null) {
return render(declarationDescriptor);
return render(declarationDescriptor, bindingContext, element, originalElement, mergeKotlinAndJava);
}
PsiElement psiElement = BindingContextUtils.resolveToDeclarationPsiElement(bindingContext, ref);
if (psiElement != null) {
declarationDescriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, psiElement);
if (declarationDescriptor != null) {
return render(declarationDescriptor);
return render(declarationDescriptor, bindingContext, element, originalElement, mergeKotlinAndJava);
}
}
return "Unresolved";
}
return null;
}
// if (originalElement.getNode().getElementType() == JetTokens.IDENTIFIER) {
// JetDeclaration declaration = PsiTreeUtil.getParentOfType(originalElement, JetDeclaration.class);
// BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache((JetFile) element.getContainingFile(), ErrorHandler.DO_NOTHING);
// DeclarationDescriptor declarationDescriptor = bindingContext.getDeclarationDescriptor(declaration);
// if (declarationDescriptor != null) {
// return render(declarationDescriptor);
// }
// }
return "Not a reference";
@Override
public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) {
return getText(element, originalElement, true);
}
@Override
public String generateDoc(PsiElement element, PsiElement originalElement) {
return getQuickNavigateInfo(element, originalElement);
return getText(element, originalElement, false);
}
private String render(DeclarationDescriptor declarationDescriptor) {
return DescriptorRenderer.HTML.render(declarationDescriptor);
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: " + XmlStringUtil.escapeString(
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;
PsiClass delegate = clsClass.getUserData(ClsClassImpl.DELEGATE_KEY);
if (delegate != null) {
if (delegate instanceof ClsClassImpl) {
clsClass = (ClsClassImpl) delegate;
}
else {
return false;
}
}
return JetDecompiledData.isKotlinFile((ClsFileImpl) clsClass.getContainingFile());
}
}