support quick doc for completion items
#KT-4346 Fixed
This commit is contained in:
+19
-19
@@ -16,30 +16,30 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.completion
|
package org.jetbrains.kotlin.idea.completion
|
||||||
|
|
||||||
import com.intellij.codeInsight.completion.CompletionResultSet
|
|
||||||
import com.intellij.codeInsight.completion.CompletionParameters
|
import com.intellij.codeInsight.completion.CompletionParameters
|
||||||
|
import com.intellij.codeInsight.completion.CompletionResultSet
|
||||||
import com.intellij.codeInsight.completion.CompletionSorter
|
import com.intellij.codeInsight.completion.CompletionSorter
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
|
||||||
import com.intellij.codeInsight.lookup.LookupElementWeigher
|
|
||||||
import com.intellij.codeInsight.lookup.LookupElement
|
|
||||||
import com.intellij.codeInsight.lookup.WeighingContext
|
|
||||||
import org.jetbrains.kotlin.idea.completion.*
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.name.isValidJavaFqName
|
|
||||||
import org.jetbrains.kotlin.resolve.ImportPath
|
|
||||||
import com.intellij.codeInsight.completion.CompletionType
|
import com.intellij.codeInsight.completion.CompletionType
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElementWeigher
|
||||||
|
import com.intellij.codeInsight.lookup.WeighingContext
|
||||||
|
import com.intellij.psi.PsiClass
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
import org.jetbrains.kotlin.idea.completion.smart.NameSimilarityWeigher
|
import org.jetbrains.kotlin.idea.completion.smart.NameSimilarityWeigher
|
||||||
import org.jetbrains.kotlin.idea.completion.smart.SMART_COMPLETION_ITEM_PRIORITY_KEY
|
import org.jetbrains.kotlin.idea.completion.smart.SMART_COMPLETION_ITEM_PRIORITY_KEY
|
||||||
import org.jetbrains.kotlin.idea.completion.smart.SmartCompletionItemPriority
|
import org.jetbrains.kotlin.idea.completion.smart.SmartCompletionItemPriority
|
||||||
import com.intellij.psi.PsiClass
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationDescriptorLookupObject
|
||||||
import java.util.HashSet
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
|
||||||
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
import org.jetbrains.kotlin.name.isValidJavaFqName
|
||||||
|
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
||||||
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.kotlin.resolve.ImportPath
|
||||||
|
import java.util.HashSet
|
||||||
|
|
||||||
public fun CompletionResultSet.addKotlinSorting(parameters: CompletionParameters): CompletionResultSet {
|
public fun CompletionResultSet.addKotlinSorting(parameters: CompletionParameters): CompletionResultSet {
|
||||||
var sorter = CompletionSorter.defaultSorter(parameters, getPrefixMatcher())!!
|
var sorter = CompletionSorter.defaultSorter(parameters, getPrefixMatcher())!!
|
||||||
@@ -89,7 +89,7 @@ private object KindWeigher : LookupElementWeigher("kotlin.kind") {
|
|||||||
val o = element.getObject()
|
val o = element.getObject()
|
||||||
|
|
||||||
return when (o) {
|
return when (o) {
|
||||||
is DeclarationDescriptorLookupObject -> {
|
is DeclarationDescriptorLookupObjectImpl -> {
|
||||||
val descriptor = o.descriptor
|
val descriptor = o.descriptor
|
||||||
when (descriptor) {
|
when (descriptor) {
|
||||||
is VariableDescriptor -> CompoundWeight(Weight.variable, element.getUserData(CALLABLE_WEIGHT_KEY))
|
is VariableDescriptor -> CompoundWeight(Weight.variable, element.getUserData(CALLABLE_WEIGHT_KEY))
|
||||||
@@ -136,7 +136,7 @@ private class JetDeclarationRemotenessWeigher(private val file: JetFile) : Looku
|
|||||||
|
|
||||||
override fun weigh(element: LookupElement): Weight {
|
override fun weigh(element: LookupElement): Weight {
|
||||||
val o = element.getObject()
|
val o = element.getObject()
|
||||||
if (o is DeclarationDescriptorLookupObject) {
|
if (o is DeclarationDescriptorLookupObjectImpl) {
|
||||||
val elementFile = o.psiElement?.getContainingFile()
|
val elementFile = o.psiElement?.getContainingFile()
|
||||||
if (elementFile is JetFile && elementFile.getOriginalFile() == file) {
|
if (elementFile is JetFile && elementFile.getOriginalFile() == file) {
|
||||||
return Weight.thisFile
|
return Weight.thisFile
|
||||||
|
|||||||
+6
-5
@@ -20,16 +20,17 @@ import com.intellij.openapi.diagnostic.Logger
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
|
||||||
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationDescriptorLookupObject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores information about resolved descriptor and position of that descriptor.
|
* Stores information about resolved descriptor and position of that descriptor.
|
||||||
* Position will be used for sorting
|
* Position will be used for sorting
|
||||||
*/
|
*/
|
||||||
public class DeclarationDescriptorLookupObject(
|
public class DeclarationDescriptorLookupObjectImpl(
|
||||||
public val descriptor: DeclarationDescriptor,
|
public override val descriptor: DeclarationDescriptor,
|
||||||
private val resolutionFacade: ResolutionFacade,
|
private val resolutionFacade: ResolutionFacade,
|
||||||
public val psiElement: PsiElement?
|
public override val psiElement: PsiElement?
|
||||||
) {
|
): DeclarationDescriptorLookupObject {
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return super.toString() + " " + descriptor
|
return super.toString() + " " + descriptor
|
||||||
}
|
}
|
||||||
@@ -42,7 +43,7 @@ public class DeclarationDescriptorLookupObject(
|
|||||||
if (this identityEquals other) return true
|
if (this identityEquals other) return true
|
||||||
if (other == null || javaClass != other.javaClass) return false
|
if (other == null || javaClass != other.javaClass) return false
|
||||||
|
|
||||||
val lookupObject = other as DeclarationDescriptorLookupObject
|
val lookupObject = other as DeclarationDescriptorLookupObjectImpl
|
||||||
|
|
||||||
if (resolutionFacade != lookupObject.resolutionFacade) {
|
if (resolutionFacade != lookupObject.resolutionFacade) {
|
||||||
LOG.warn("Descriptors from different resolve sessions")
|
LOG.warn("Descriptors from different resolve sessions")
|
||||||
+1
-1
@@ -154,7 +154,7 @@ public class LookupElementFactory(
|
|||||||
val name = nameAndIconDescriptor.getName().asString()
|
val name = nameAndIconDescriptor.getName().asString()
|
||||||
val icon = JetDescriptorIconProvider.getIcon(nameAndIconDescriptor, iconDeclaration, Iconable.ICON_FLAG_VISIBILITY)
|
val icon = JetDescriptorIconProvider.getIcon(nameAndIconDescriptor, iconDeclaration, Iconable.ICON_FLAG_VISIBILITY)
|
||||||
|
|
||||||
var element = LookupElementBuilder.create(DeclarationDescriptorLookupObject(descriptor, resolutionFacade, declaration), name)
|
var element = LookupElementBuilder.create(DeclarationDescriptorLookupObjectImpl(descriptor, resolutionFacade, declaration), name)
|
||||||
.withIcon(icon)
|
.withIcon(icon)
|
||||||
|
|
||||||
when (descriptor) {
|
when (descriptor) {
|
||||||
|
|||||||
+2
-2
@@ -17,10 +17,10 @@
|
|||||||
package org.jetbrains.kotlin.idea.completion.handlers
|
package org.jetbrains.kotlin.idea.completion.handlers
|
||||||
|
|
||||||
import com.intellij.codeInsight.completion.InsertHandler
|
import com.intellij.codeInsight.completion.InsertHandler
|
||||||
import com.intellij.codeInsight.lookup.LookupElement
|
|
||||||
import com.intellij.codeInsight.completion.InsertionContext
|
import com.intellij.codeInsight.completion.InsertionContext
|
||||||
import org.jetbrains.kotlin.idea.completion.DeclarationDescriptorLookupObject
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationDescriptorLookupObject
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
|
|
||||||
open class BaseDeclarationInsertHandler : InsertHandler<LookupElement> {
|
open class BaseDeclarationInsertHandler : InsertHandler<LookupElement> {
|
||||||
|
|||||||
+1
-1
@@ -28,8 +28,8 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
|
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.idea.completion.DeclarationDescriptorLookupObject
|
|
||||||
import org.jetbrains.kotlin.idea.completion.isAfterDot
|
import org.jetbrains.kotlin.idea.completion.isAfterDot
|
||||||
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationDescriptorLookupObject
|
||||||
import org.jetbrains.kotlin.idea.core.formatter.JetCodeStyleSettings
|
import org.jetbrains.kotlin.idea.core.formatter.JetCodeStyleSettings
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
||||||
|
|||||||
+8
-8
@@ -18,18 +18,18 @@ package org.jetbrains.kotlin.idea.completion.handlers
|
|||||||
|
|
||||||
import com.intellij.codeInsight.completion.InsertionContext
|
import com.intellij.codeInsight.completion.InsertionContext
|
||||||
import com.intellij.codeInsight.lookup.LookupElement
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
import com.intellij.psi.PsiDocumentManager
|
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
|
||||||
import org.jetbrains.kotlin.idea.util.ShortenReferences
|
|
||||||
import org.jetbrains.kotlin.idea.completion.DeclarationDescriptorLookupObject
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.PsiClass
|
||||||
import org.jetbrains.kotlin.psi.JetNameReferenceExpression
|
import com.intellij.psi.PsiDocumentManager
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||||
|
import org.jetbrains.kotlin.idea.completion.isAfterDot
|
||||||
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationDescriptorLookupObject
|
||||||
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
|
import org.jetbrains.kotlin.idea.util.ShortenReferences
|
||||||
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
|
import org.jetbrains.kotlin.psi.JetNameReferenceExpression
|
||||||
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.idea.completion.isAfterDot
|
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
|
||||||
|
|
||||||
public object KotlinClassInsertHandler : BaseDeclarationInsertHandler() {
|
public object KotlinClassInsertHandler : BaseDeclarationInsertHandler() {
|
||||||
override fun handleInsert(context: InsertionContext, item: LookupElement) {
|
override fun handleInsert(context: InsertionContext, item: LookupElement) {
|
||||||
|
|||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* 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.core.completion
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
|
||||||
|
public trait DeclarationDescriptorLookupObject {
|
||||||
|
public val psiElement: PsiElement?
|
||||||
|
public val descriptor: DeclarationDescriptor
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||||
|
import org.jetbrains.kotlin.idea.core.completion.DeclarationDescriptorLookupObject
|
||||||
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.resolveKDocLink
|
import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink
|
||||||
@@ -71,6 +72,13 @@ public class KotlinQuickDocumentationProvider : AbstractDocumentationProvider()
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getDocumentationElementForLookupItem(psiManager: PsiManager, `object`: Any?, element: PsiElement?): PsiElement? {
|
||||||
|
if (`object` is DeclarationDescriptorLookupObject) {
|
||||||
|
return `object`.psiElement
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val LOG = Logger.getInstance(javaClass<KotlinQuickDocumentationProvider>())
|
private val LOG = Logger.getInstance(javaClass<KotlinQuickDocumentationProvider>())
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
class Xyzzy {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class Xyzzy2 {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
val x = Xy<caret>
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* 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.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase
|
||||||
|
import org.jetbrains.kotlin.idea.JetFileType
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinQuickDocumentationProvider
|
||||||
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
|
import org.jetbrains.kotlin.psi.JetClass
|
||||||
|
import org.junit.Assert
|
||||||
|
|
||||||
|
public class QuickDocInCompletionTest(): LightPlatformCodeInsightFixtureTestCase() {
|
||||||
|
override fun getTestDataPath(): String {
|
||||||
|
return PluginTestCaseBase.getTestDataPathBase() + "/kdoc/inCompletion/"
|
||||||
|
}
|
||||||
|
public fun testSimple() {
|
||||||
|
myFixture.configureByFile(getTestName(true) + ".kt")
|
||||||
|
val lookupElements = myFixture.completeBasic()
|
||||||
|
val lookupObject = lookupElements.first().getObject()
|
||||||
|
val element = KotlinQuickDocumentationProvider().getDocumentationElementForLookupItem(
|
||||||
|
myFixture.getPsiManager(), lookupObject, null)
|
||||||
|
Assert.assertTrue(element is JetClass)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user