complete KDoc tag names after @, not only at line start

#KT-7139 Fixed

code review
This commit is contained in:
Dmitry Jemerov
2015-03-26 21:59:38 +01:00
parent f87dcff723
commit 6d56618d17
5 changed files with 57 additions and 24 deletions
@@ -50,7 +50,9 @@ public class KotlinCompletionContributor : CompletionContributor() {
private val AFTER_NUMBER_LITERAL = psiElement().afterLeafSkipping(psiElement().withText(""), psiElement().withElementType(elementType().oneOf(JetTokens.FLOAT_LITERAL, JetTokens.INTEGER_LITERAL)))
private val AFTER_INTEGER_LITERAL_AND_DOT = psiElement().afterLeafSkipping(psiElement().withText("."), psiElement().withElementType(elementType().oneOf(JetTokens.INTEGER_LITERAL)))
private val DEFAULT_DUMMY_IDENTIFIER = CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED + "$" // add '$' to ignore context after the caret
companion object {
public val DEFAULT_DUMMY_IDENTIFIER: String = CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED + "$" // add '$' to ignore context after the caret
}
init {
val provider = object : CompletionProvider<CompletionParameters>() {
@@ -16,31 +16,27 @@
package org.jetbrains.kotlin.idea.kdoc
import com.intellij.codeInsight.completion.CompletionContributor
import com.intellij.codeInsight.completion.CompletionType
import com.intellij.codeInsight.completion.*
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.codeInsight.lookup.LookupElementDecorator
import com.intellij.patterns.PlatformPatterns.psiElement
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
import com.intellij.codeInsight.completion.CompletionProvider
import com.intellij.codeInsight.completion.CompletionParameters
import com.intellij.patterns.StandardPatterns
import com.intellij.util.ProcessingContext
import com.intellij.codeInsight.completion.CompletionResultSet
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.kotlin.idea.completion.LookupElementFactory
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import com.intellij.codeInsight.lookup.LookupElementDecorator
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.completion.InsertionContext
import org.jetbrains.kotlin.idea.completion.KotlinCompletionContributor
import org.jetbrains.kotlin.idea.completion.LookupElementFactory
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.patterns.StandardPatterns
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
class KDocCompletionContributor(): CompletionContributor() {
init {
@@ -51,6 +47,9 @@ class KDocCompletionContributor(): CompletionContributor() {
psiElement().afterLeaf(
StandardPatterns.or(psiElement(KDocTokens.LEADING_ASTERISK), psiElement(KDocTokens.START))),
KDocTagCompletionProvider)
extend(CompletionType.BASIC,
psiElement(KDocTokens.TAG_NAME), KDocTagCompletionProvider)
}
}
@@ -103,9 +102,14 @@ object KDocNameCompletionProvider: CompletionProvider<CompletionParameters>() {
}
object KDocTagCompletionProvider: CompletionProvider<CompletionParameters>() {
override fun addCompletions(parameters: CompletionParameters?, context: ProcessingContext, result: CompletionResultSet) {
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
val prefix = if (parameters.getPosition().getNode().getElementType() == KDocTokens.TAG_NAME)
parameters.getPosition().getText().removeSuffix(KotlinCompletionContributor.DEFAULT_DUMMY_IDENTIFIER)
else
null
val resultWithPrefix = if (prefix != null) result.withPrefixMatcher(prefix) else result
KDocKnownTag.values().forEach {
result.addElement(LookupElementBuilder.create("@" + it.name().toLowerCase()))
resultWithPrefix.addElement(LookupElementBuilder.create("@" + it.name().toLowerCase()))
}
}
}
@@ -0,0 +1,8 @@
/**
* @<caret>
*/
fun f(x: Int): Int {
}
// EXIST: @param
// EXIST: @return
@@ -0,0 +1,8 @@
/**
* @r<caret>
*/
fun f(x: Int): Int {
}
// ABSENT: @param
// EXIST: @return
@@ -17,10 +17,9 @@
package org.jetbrains.kotlin.idea.kdoc;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.InnerTestClasses;
import org.jetbrains.kotlin.completion.AbstractJvmBasicCompletionTest;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
import org.jetbrains.kotlin.test.JetTestUtils;
import org.jetbrains.kotlin.completion.AbstractJvmBasicCompletionTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.runner.RunWith;
@@ -61,6 +60,18 @@ public class KDocCompletionTestGenerated extends AbstractJvmBasicCompletionTest
doTest(fileName);
}
@TestMetadata("TagNameAfterAt.kt")
public void testTagNameAfterAt() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/kdoc/completion/TagNameAfterAt.kt");
doTest(fileName);
}
@TestMetadata("TagNameMiddle.kt")
public void testTagNameMiddle() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/kdoc/completion/TagNameMiddle.kt");
doTest(fileName);
}
@TestMetadata("TagNameStart.kt")
public void testTagNameStart() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/kdoc/completion/TagNameStart.kt");