show "defined in" for declarations in quick doc popup

#KT-7320 Fixed
This commit is contained in:
Dmitry Jemerov
2015-04-15 20:43:31 +02:00
parent 0c6cd3b422
commit eeb2728b7e
15 changed files with 29 additions and 27 deletions
@@ -19,33 +19,28 @@ package org.jetbrains.kotlin.idea
import com.intellij.lang.documentation.AbstractDocumentationProvider import com.intellij.lang.documentation.AbstractDocumentationProvider
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.project.Project
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.KotlinLightMethod import org.jetbrains.kotlin.asJava.KotlinLightMethod
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
import org.jetbrains.kotlin.idea.caches.resolve.*
import org.jetbrains.kotlin.idea.kdoc.KDocFinder import org.jetbrains.kotlin.idea.kdoc.KDocFinder
import org.jetbrains.kotlin.idea.kdoc.KDocRenderer import org.jetbrains.kotlin.idea.kdoc.KDocRenderer
import org.jetbrains.kotlin.idea.kdoc.* import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink
import org.jetbrains.kotlin.idea.project.ResolveSessionForBodies
import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag
import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.JetElement
import org.jetbrains.kotlin.psi.JetPsiUtil import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetReferenceExpression import org.jetbrains.kotlin.psi.JetReferenceExpression
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.DescriptorRendererBuilder
import org.jetbrains.kotlin.renderer.NameShortness
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import java.util.Collections
public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
@@ -79,6 +74,14 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider()
companion object { companion object {
private val LOG = Logger.getInstance(javaClass<KotlinQuickDocumentationProvider>()) private val LOG = Logger.getInstance(javaClass<KotlinQuickDocumentationProvider>())
val quickDocNameFormat = DescriptorRendererBuilder()
.setWithDefinedIn(true)
.setNameShortness(NameShortness.SHORT)
.setRenderCompanionObjectName(true)
.setTextFormat(DescriptorRenderer.TextFormat.HTML)
.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) { if (element is JetDeclaration) {
return renderKotlinDeclaration(element, quickNavigation) return renderKotlinDeclaration(element, quickNavigation)
@@ -115,11 +118,10 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider()
return "No documentation available" return "No documentation available"
} }
var renderedDecl = DescriptorRenderer.HTML_NAMES_WITH_SHORT_TYPES.render(declarationDescriptor) var renderedDecl = quickDocNameFormat.render(declarationDescriptor)
if (!quickNavigation) { if (!quickNavigation) {
renderedDecl = "<pre>" + DescriptorRenderer.HTML_NAMES_WITH_SHORT_TYPES.render(declarationDescriptor) + "</pre>" renderedDecl = "<pre>" + renderedDecl + "</pre>"
} }
val comment = KDocFinder.findKDoc(declarationDescriptor) val comment = KDocFinder.findKDoc(declarationDescriptor)
if (comment != null) { if (comment != null) {
renderedDecl = renderedDecl + "<br/>" + KDocRenderer.renderKDoc(comment) renderedDecl = renderedDecl + "<br/>" + KDocRenderer.renderKDoc(comment)
@@ -1,3 +1,3 @@
fun some(<caret>f: (Int) -> String) : String? = null fun some(<caret>f: (Int) -> String) : String? = null
// INFO: <b>value-parameter</b> <b>val</b> f: (Int) &rarr; String //INFO: <b>value-parameter</b> <b>val</b> f: (Int) &rarr; String <i>defined in</i> some
@@ -2,4 +2,4 @@ trait Base
class Some<<caret>T: Base> class Some<<caret>T: Base>
// INFO: &lt;T : Base&gt; //INFO: &lt;T : Base&gt; <i>defined in</i> Some
@@ -5,4 +5,4 @@ fun test() {
} }
// INFO: <b>val</b> test: String? //INFO: <b>val</b> test: String? <i>defined in</i> test
@@ -2,5 +2,5 @@ fun test() {
listOf(1, 2, 4).<caret>filter { it > 0 } listOf(1, 2, 4).<caret>filter { it > 0 }
} }
//INFO: inline <b>public</b> <b>fun</b> &lt;T&gt; Iterable&lt;T&gt;.filter(predicate: (T) &rarr; Boolean): List&lt;T&gt;<br/><p>Returns a list containing all elements matching the given <a href="psi_element://predicate">predicate</a> //INFO: inline <b>public</b> <b>fun</b> &lt;T&gt; Iterable&lt;T&gt;.filter(predicate: (T) &rarr; Boolean): List&lt;T&gt; <i>defined in</i> kotlin<br/><p>Returns a list containing all elements matching the given <a href="psi_element://predicate">predicate</a>
//INFO: </p> //INFO: </p>
@@ -3,5 +3,5 @@
*/ */
class <caret>Some class <caret>Some
//INFO: <b>internal</b> <b>final</b> <b>class</b> Some<br/><p>Usefull comment //INFO: <b>internal</b> <b>final</b> <b>class</b> Some <i>defined in</i> root package<br/><p>Usefull comment
//INFO: </p> //INFO: </p>
@@ -12,6 +12,6 @@ package test
*/ */
fun <caret>testFun(first: String, second: Int) = 12 fun <caret>testFun(first: String, second: Int) = 12
//INFO: <b>internal</b> <b>fun</b> testFun(first: String, second: Int): Int<br/><p>Test function //INFO: <b>internal</b> <b>fun</b> testFun(first: String, second: Int): Int <i>defined in</i> test<br/><p>Test function
//INFO: <dl><dt><b>Parameters:</b></dt><dd><code>first</code> - Some</dd><dd><code>second</code> - Other</dd></dl> //INFO: <dl><dt><b>Parameters:</b></dt><dd><code>first</code> - Some</dd><dd><code>second</code> - Other</dd></dl>
//INFO: </p> //INFO: </p>
@@ -14,5 +14,5 @@ fun test() {
D().f<caret>oo() D().f<caret>oo()
} }
//INFO: <b>internal</b> <b>open</b> <b>fun</b> foo(): Int<br/><p>This method returns zero. //INFO: <b>internal</b> <b>open</b> <b>fun</b> foo(): Int <i>defined in</i> D<br/><p>This method returns zero.
//INFO: </p> //INFO: </p>
@@ -14,5 +14,5 @@ fun test() {
D().f<caret>oo D().f<caret>oo
} }
//INFO: <b>internal</b> <b>open</b> <b>val</b> foo: Int<br/><p>This property returns zero. //INFO: <b>internal</b> <b>open</b> <b>val</b> foo: Int <i>defined in</i> D<br/><p>This property returns zero.
//INFO: </p> //INFO: </p>
@@ -12,6 +12,6 @@ fun test() {
<caret>testMethod(1, "value") <caret>testMethod(1, "value")
} }
//INFO: <b>internal</b> <b>fun</b> testMethod(a: Int, b: String): Unit<br/><p>Some documentation //INFO: <b>internal</b> <b>fun</b> testMethod(a: Int, b: String): Unit <i>defined in</i> root package<br/><p>Some documentation
//INFO: <dl><dt><b>Parameters:</b></dt><dd><code>a</code> - Some int</dd><dd><code>b</code> - String</dd></dl> //INFO: <dl><dt><b>Parameters:</b></dt><dd><code>a</code> - Some int</dd><dd><code>b</code> - String</dd></dl>
//INFO: </p> //INFO: </p>
@@ -12,6 +12,6 @@ fun test() {
<caret>testMethod(1, "value") <caret>testMethod(1, "value")
} }
//INFO: <b>internal</b> <b>fun</b> testMethod(a: Int, b: String): Unit<br/><p>Some documentation //INFO: <b>internal</b> <b>fun</b> testMethod(a: Int, b: String): Unit <i>defined in</i> root package<br/><p>Some documentation
//INFO: <dl><dt><b>Parameters:</b></dt><dd><code>a</code> - Some int</dd><dd><code>b</code> - String</dd></dl> //INFO: <dl><dt><b>Parameters:</b></dt><dd><code>a</code> - Some int</dd><dd><code>b</code> - String</dd></dl>
//INFO: </p> //INFO: </p>
@@ -18,7 +18,7 @@ fun test() {
<caret>testMethod(1, "value") <caret>testMethod(1, "value")
} }
//INFO: <b>internal</b> <b>fun</b> testMethod(): Unit<br/><p><p>Some documentation. <strong>Bold</strong> <em>underline</em> <code>code</code> foo: bar (baz) <a href="psi_element://quux">quux</a> </p> //INFO: <b>internal</b> <b>fun</b> testMethod(): Unit <i>defined in</i> root package<br/><p><p>Some documentation. <strong>Bold</strong> <em>underline</em> <code>code</code> foo: bar (baz) <a href="psi_element://quux">quux</a> </p>
//INFO: <p>a href="http://www.kotlinlang.org">Kotlin</a></p> //INFO: <p>a href="http://www.kotlinlang.org">Kotlin</a></p>
//INFO: <p><a href="psi_element://C">C</a></p> //INFO: <p><a href="psi_element://C">C</a></p>
//INFO: <p><a href="psi_element://C">See this class</a></p> //INFO: <p><a href="psi_element://C">See this class</a></p>
@@ -14,7 +14,7 @@ fun test() {
<caret>testMethod(1, "value") <caret>testMethod(1, "value")
} }
//INFO: <b>internal</b> <b>fun</b> testMethod(a: Int, b: String): Unit<br/><p>Some documentation //INFO: <b>internal</b> <b>fun</b> testMethod(a: Int, b: String): Unit <i>defined in</i> root package<br/><p>Some documentation
//INFO: <dl><dt><b>Parameters:</b></dt><dd><code>a</code> - Some int</dd><dd><code>b</code> - String</dd></dl> //INFO: <dl><dt><b>Parameters:</b></dt><dd><code>a</code> - Some int</dd><dd><code>b</code> - String</dd></dl>
//INFO: <dl><dt><b>Returns:</b></dt><dd>Return value</dd></dl> //INFO: <dl><dt><b>Returns:</b></dt><dd>Return value</dd></dl>
//INFO: <dl><dt><b>Throws:</b></dt><dd><code>IllegalArgumentException</code> - if the weather is bad</dd></dl> //INFO: <dl><dt><b>Throws:</b></dt><dd><code>IllegalArgumentException</code> - if the weather is bad</dd></dl>
@@ -16,5 +16,5 @@ fun test() {
<caret>testMethod(1, "value") <caret>testMethod(1, "value")
} }
//INFO: <b>internal</b> <b>fun</b> testMethod(): Unit<br/><p> //INFO: <b>internal</b> <b>fun</b> testMethod(): Unit <i>defined in</i> root package<br/><p>
//INFO: <DD><DL><DT><b>See Also:</b><DD><a href="psi_element://C"><code>C</code></a>, <a href="psi_element://D"><code>D</code></a></DD></DL></DD></p> //INFO: <DD><DL><DT><b>See Also:</b><DD><a href="psi_element://C"><code>C</code></a>, <a href="psi_element://D"><code>D</code></a></DD></DL></DD></p>
@@ -8,5 +8,5 @@ class Testing {
} }
} }
//INFO: <b>internal</b> <b>fun</b> foo(bar: Int): Unit<br/><p>KDoc foo //INFO: <b>internal</b> <b>fun</b> foo(bar: Int): Unit <i>defined in</i> some<br/><p>KDoc foo
//INFO: </p> //INFO: </p>