From 54b1859aa763ee99a4f479d9fecdade613d16c02 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 8 Jun 2015 18:25:31 +0300 Subject: [PATCH] KotlinQuickDocumentationProvider: fix quick doc for elements from type hierarchy Fix quick doc for light classes #KT-7964 Fixed --- .../idea/KotlinQuickDocumentationProvider.kt | 15 +++-- .../quickDoc/KotlinClassUsedFromJava.java | 3 +- idea/testData/kdoc/inTypeHierarchy/simple.kt | 8 +++ .../quickDoc/QuickDocInHierarchyTest.kt | 57 +++++++++++++++++++ 4 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 idea/testData/kdoc/inTypeHierarchy/simple.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocInHierarchyTest.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index d026f0f118f..1b03631993e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -22,6 +22,7 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiElement import com.intellij.psi.PsiManager +import org.jetbrains.kotlin.asJava.KotlinLightElement import org.jetbrains.kotlin.asJava.KotlinLightMethod import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource @@ -33,7 +34,6 @@ import org.jetbrains.kotlin.idea.kdoc.KDocRenderer import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetElement -import org.jetbrains.kotlin.psi.JetPsiUtil import org.jetbrains.kotlin.psi.JetReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType @@ -50,7 +50,7 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() return getText(element, originalElement, true) } - override fun generateDoc(element: PsiElement, originalElement: PsiElement): String? { + override fun generateDoc(element: PsiElement, originalElement: PsiElement?): String? { return getText(element, originalElement, false) } @@ -91,18 +91,17 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() .build() - private fun getText(element: PsiElement, originalElement: PsiElement, quickNavigation: Boolean): String? { + private fun getText(element: PsiElement, originalElement: PsiElement?, quickNavigation: Boolean): String? { if (element is JetDeclaration) { return renderKotlinDeclaration(element, quickNavigation) } - else if (element is KotlinLightMethod) { - val origin = element.getOrigin() - if (origin == null) return null + else if (element is KotlinLightElement<*, *>) { + val origin = element.getOrigin() ?: return null return renderKotlinDeclaration(origin, quickNavigation) } if (quickNavigation) { - val referenceExpression = originalElement.getNonStrictParentOfType() + val referenceExpression = originalElement?.getNonStrictParentOfType() if (referenceExpression != null) { val context = referenceExpression.analyze(BodyResolveMode.PARTIAL) val declarationDescriptor = context[BindingContext.REFERENCE_TARGET, referenceExpression] @@ -139,7 +138,7 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() return renderedDecl } - private fun mixKotlinToJava(declarationDescriptor: DeclarationDescriptor, element: PsiElement, originalElement: PsiElement): String? { + private fun mixKotlinToJava(declarationDescriptor: DeclarationDescriptor, element: PsiElement, originalElement: PsiElement?): String? { val originalInfo = JavaDocumentationProvider().getQuickNavigateInfo(element, originalElement) if (originalInfo != null) { val renderedDecl = DescriptorRenderer.HTML_NAMES_WITH_SHORT_TYPES.render(declarationDescriptor) diff --git a/idea/testData/editor/quickDoc/KotlinClassUsedFromJava.java b/idea/testData/editor/quickDoc/KotlinClassUsedFromJava.java index 3b24eae968f..0316a3cfa76 100644 --- a/idea/testData/editor/quickDoc/KotlinClassUsedFromJava.java +++ b/idea/testData/editor/quickDoc/KotlinClassUsedFromJava.java @@ -6,4 +6,5 @@ class KotlinClassUsedFromJava { } } -//INFO: [light_idea_test_case] testing... \ No newline at end of file +//INFO: internal final class Test defined in testing

Some comment +//INFO:

diff --git a/idea/testData/kdoc/inTypeHierarchy/simple.kt b/idea/testData/kdoc/inTypeHierarchy/simple.kt new file mode 100644 index 00000000000..2943ec86d27 --- /dev/null +++ b/idea/testData/kdoc/inTypeHierarchy/simple.kt @@ -0,0 +1,8 @@ +package a.b.c + +/** + * Very special class + */ +class A { + +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocInHierarchyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocInHierarchyTest.kt new file mode 100644 index 00000000000..a41fdd067a2 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocInHierarchyTest.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.editor.quickDoc + +import com.intellij.codeInsight.CodeInsightTestCase +import com.intellij.ide.hierarchy.HierarchyBrowserBaseEx +import com.intellij.ide.hierarchy.LanguageTypeHierarchy +import com.intellij.ide.hierarchy.type.TypeHierarchyNodeDescriptor +import com.intellij.ide.hierarchy.type.TypeHierarchyTreeStructure +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement +import com.intellij.testFramework.MapDataContext +import junit.framework.TestCase +import org.jetbrains.kotlin.idea.JetLanguage +import org.jetbrains.kotlin.idea.KotlinQuickDocumentationProvider +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase + +public class QuickDocInHierarchyTest() : CodeInsightTestCase() { + override fun getTestDataPath(): String { + return PluginTestCaseBase.getTestDataPathBase() + "/kdoc/inTypeHierarchy/" + } + + public fun testSimple() { + configureByFile(getTestName(true) + ".kt") + + val context = MapDataContext() + context.put(CommonDataKeys.PROJECT, getProject()) + context.put(CommonDataKeys.EDITOR, getEditor()) + + val hierarchyTreeStructure = TypeHierarchyTreeStructure( + getProject(), + LanguageTypeHierarchy.INSTANCE.forLanguage(JetLanguage.INSTANCE).getTarget(context) as PsiClass?, + HierarchyBrowserBaseEx.SCOPE_PROJECT + ) + val hierarchyNodeDescriptor = hierarchyTreeStructure.getBaseDescriptor() as TypeHierarchyNodeDescriptor + val doc = KotlinQuickDocumentationProvider().generateDoc(hierarchyNodeDescriptor.getPsiClass() as PsiElement, null)!! + + TestCase.assertTrue("Invalid doc\n: $doc", doc.contains("Very special class")) + } +} \ No newline at end of file