Display Quick Documentation for reserved words
#KT-9934 Fixed
This commit is contained in:
@@ -23,7 +23,9 @@ import com.intellij.lang.documentation.AbstractDocumentationProvider
|
|||||||
import com.intellij.lang.documentation.DocumentationMarkup.*
|
import com.intellij.lang.documentation.DocumentationMarkup.*
|
||||||
import com.intellij.lang.java.JavaDocumentationProvider
|
import com.intellij.lang.java.JavaDocumentationProvider
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.PsiWhiteSpace
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import org.jetbrains.kotlin.asJava.LightClassUtil
|
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.js.resolve.diagnostics.findPsi
|
||||||
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
|
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
|
||||||
import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection
|
import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy
|
import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy
|
||||||
@@ -131,6 +134,10 @@ class WrapValueParameterHandler(val base: DescriptorRenderer.ValueParametersHand
|
|||||||
|
|
||||||
class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
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? {
|
override fun getQuickNavigateInfo(element: PsiElement?, originalElement: PsiElement?): String? {
|
||||||
return if (element == null) null else getText(element, originalElement, true)
|
return if (element == null) null else getText(element, originalElement, true)
|
||||||
}
|
}
|
||||||
@@ -272,6 +279,11 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
} else if (element is KtLightDeclaration<*, *>) {
|
} else if (element is KtLightDeclaration<*, *>) {
|
||||||
val origin = element.kotlinOrigin ?: return null
|
val origin = element.kotlinOrigin ?: return null
|
||||||
return renderKotlinDeclaration(origin, quickNavigation)
|
return renderKotlinDeclaration(origin, quickNavigation)
|
||||||
|
} else if (element.isModifier()) {
|
||||||
|
when(element.text) {
|
||||||
|
KtTokens.LATEINIT_KEYWORD.value -> return """lateinit allows initializing a <a href="http://kotlinlang.org/docs/reference/properties.html#late-initialized-properties-and-variables">non-null property outside of a constructor</a>"""
|
||||||
|
KtTokens.TAILREC_KEYWORD.value -> return """tailrec marks a function as <a href="http://kotlinlang.org/docs/reference/functions.html#tail-recursive-functions">tail-recursive</a> (allowing the compiler to replace recursion with iteration)"""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quickNavigation) {
|
if (quickNavigation) {
|
||||||
@@ -479,5 +491,10 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun PsiElement?.isModifier() = this != null
|
||||||
|
&& parent is KtModifierList
|
||||||
|
&& KtTokens.MODIFIER_KEYWORDS_ARRAY.firstOrNull { it.value == text } != null
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class Foo {
|
||||||
|
<caret>lateinit var foo: String
|
||||||
|
}
|
||||||
|
|
||||||
|
//INFO: lateinit allows initializing a <a href="http://kotlinlang.org/docs/reference/properties.html#late-initialized-properties-and-variables">non-null property outside of a constructor</a>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class Foo {
|
||||||
|
val <caret>lateinit: String = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
//INFO: <div class='definition'><pre><a href="psi_element://Foo"><code>Foo</code></a><br>public final val <b>lateinit</b>: String</pre></div>
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<caret>tailrec fun foo() {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
//INFO: tailrec marks a function as <a href="http://kotlinlang.org/docs/reference/functions.html#tail-recursive-functions">tail-recursive</a> (allowing the compiler to replace recursion with iteration)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class Foo {
|
||||||
|
val <caret>tailrec: String = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
//INFO: <div class='definition'><pre><a href="psi_element://Foo"><code>Foo</code></a><br>public final val <b>tailrec</b>: String</pre></div>
|
||||||
+20
@@ -129,6 +129,16 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest
|
|||||||
runTest("idea/testData/editor/quickDoc/KotlinPackageClassUsedFromJava.java");
|
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")
|
@TestMetadata("MethodFromStdLib.kt")
|
||||||
public void testMethodFromStdLib() throws Exception {
|
public void testMethodFromStdLib() throws Exception {
|
||||||
runTest("idea/testData/editor/quickDoc/MethodFromStdLib.kt");
|
runTest("idea/testData/editor/quickDoc/MethodFromStdLib.kt");
|
||||||
@@ -249,6 +259,16 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest
|
|||||||
runTest("idea/testData/editor/quickDoc/Samples.kt");
|
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")
|
@TestMetadata("TopLevelMethodFromJava.java")
|
||||||
public void testTopLevelMethodFromJava() throws Exception {
|
public void testTopLevelMethodFromJava() throws Exception {
|
||||||
runTest("idea/testData/editor/quickDoc/TopLevelMethodFromJava.java");
|
runTest("idea/testData/editor/quickDoc/TopLevelMethodFromJava.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user