From d3895c519ce6502380ad9e5da0fe1a20df031cfd Mon Sep 17 00:00:00 2001 From: shiraji Date: Fri, 15 Dec 2017 07:37:43 +0300 Subject: [PATCH] Display Quick Documentation for reserved words #KT-9934 Fixed --- .../idea/KotlinQuickDocumentationProvider.kt | 17 ++++++++++++++++ idea/testData/editor/quickDoc/Lateinit.kt | 5 +++++ idea/testData/editor/quickDoc/LateinitName.kt | 5 +++++ idea/testData/editor/quickDoc/Tailrec.kt | 5 +++++ idea/testData/editor/quickDoc/TailrecName.kt | 5 +++++ .../QuickDocProviderTestGenerated.java | 20 +++++++++++++++++++ 6 files changed, 57 insertions(+) create mode 100644 idea/testData/editor/quickDoc/Lateinit.kt create mode 100644 idea/testData/editor/quickDoc/LateinitName.kt create mode 100644 idea/testData/editor/quickDoc/Tailrec.kt create mode 100644 idea/testData/editor/quickDoc/TailrecName.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index fcfbdfcbc20..64bbe108eff 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -23,7 +23,9 @@ import com.intellij.lang.documentation.AbstractDocumentationProvider import com.intellij.lang.documentation.DocumentationMarkup.* import com.intellij.lang.java.JavaDocumentationProvider import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.asJava.LightClassUtil @@ -44,6 +46,7 @@ import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi import org.jetbrains.kotlin.kdoc.psi.api.KDoc import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy @@ -131,6 +134,10 @@ class WrapValueParameterHandler(val base: DescriptorRenderer.ValueParametersHand class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { + override fun getCustomDocumentationElement(editor: Editor, fil: PsiFile, contextElement: PsiElement?): PsiElement? { + return if (contextElement.isModifier()) contextElement else null + } + override fun getQuickNavigateInfo(element: PsiElement?, originalElement: PsiElement?): String? { return if (element == null) null else getText(element, originalElement, true) } @@ -272,6 +279,11 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { } else if (element is KtLightDeclaration<*, *>) { val origin = element.kotlinOrigin ?: return null return renderKotlinDeclaration(origin, quickNavigation) + } else if (element.isModifier()) { + when(element.text) { + KtTokens.LATEINIT_KEYWORD.value -> return """lateinit allows initializing a non-null property outside of a constructor""" + KtTokens.TAILREC_KEYWORD.value -> return """tailrec marks a function as tail-recursive (allowing the compiler to replace recursion with iteration)""" + } } if (quickNavigation) { @@ -479,5 +491,10 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { else -> null } } + + private fun PsiElement?.isModifier() = this != null + && parent is KtModifierList + && KtTokens.MODIFIER_KEYWORDS_ARRAY.firstOrNull { it.value == text } != null + } } diff --git a/idea/testData/editor/quickDoc/Lateinit.kt b/idea/testData/editor/quickDoc/Lateinit.kt new file mode 100644 index 00000000000..85abad875ed --- /dev/null +++ b/idea/testData/editor/quickDoc/Lateinit.kt @@ -0,0 +1,5 @@ +class Foo { + lateinit var foo: String +} + +//INFO: lateinit allows initializing a non-null property outside of a constructor \ No newline at end of file diff --git a/idea/testData/editor/quickDoc/LateinitName.kt b/idea/testData/editor/quickDoc/LateinitName.kt new file mode 100644 index 00000000000..f2d942a3865 --- /dev/null +++ b/idea/testData/editor/quickDoc/LateinitName.kt @@ -0,0 +1,5 @@ +class Foo { + val lateinit: String = "" +} + +//INFO:
Foo
public final val lateinit: String
\ No newline at end of file diff --git a/idea/testData/editor/quickDoc/Tailrec.kt b/idea/testData/editor/quickDoc/Tailrec.kt new file mode 100644 index 00000000000..c91f9f95f7f --- /dev/null +++ b/idea/testData/editor/quickDoc/Tailrec.kt @@ -0,0 +1,5 @@ +tailrec fun foo() { + foo() +} + +//INFO: tailrec marks a function as tail-recursive (allowing the compiler to replace recursion with iteration) \ No newline at end of file diff --git a/idea/testData/editor/quickDoc/TailrecName.kt b/idea/testData/editor/quickDoc/TailrecName.kt new file mode 100644 index 00000000000..b3388609fdf --- /dev/null +++ b/idea/testData/editor/quickDoc/TailrecName.kt @@ -0,0 +1,5 @@ +class Foo { + val tailrec: String = "" +} + +//INFO:
Foo
public final val tailrec: String
\ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java index eede99f4127..bc9868317ab 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java @@ -129,6 +129,16 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest runTest("idea/testData/editor/quickDoc/KotlinPackageClassUsedFromJava.java"); } + @TestMetadata("Lateinit.kt") + public void testLateinit() throws Exception { + runTest("idea/testData/editor/quickDoc/Lateinit.kt"); + } + + @TestMetadata("LateinitName.kt") + public void testLateinitName() throws Exception { + runTest("idea/testData/editor/quickDoc/LateinitName.kt"); + } + @TestMetadata("MethodFromStdLib.kt") public void testMethodFromStdLib() throws Exception { runTest("idea/testData/editor/quickDoc/MethodFromStdLib.kt"); @@ -249,6 +259,16 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest runTest("idea/testData/editor/quickDoc/Samples.kt"); } + @TestMetadata("Tailrec.kt") + public void testTailrec() throws Exception { + runTest("idea/testData/editor/quickDoc/Tailrec.kt"); + } + + @TestMetadata("TailrecName.kt") + public void testTailrecName() throws Exception { + runTest("idea/testData/editor/quickDoc/TailrecName.kt"); + } + @TestMetadata("TopLevelMethodFromJava.java") public void testTopLevelMethodFromJava() throws Exception { runTest("idea/testData/editor/quickDoc/TopLevelMethodFromJava.java");