simplify code, fix test, use CompletionUtil.findIdentifierPrefix()
This commit is contained in:
committed by
Dmitry Jemerov
parent
be92ad2f2d
commit
3842d71ee3
@@ -98,13 +98,6 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess
|
|||||||
protected val bindingContext: BindingContext = resolutionFacade.analyze(position.parents().firstIsInstance<JetElement>(), BodyResolveMode.PARTIAL_FOR_COMPLETION)
|
protected val bindingContext: BindingContext = resolutionFacade.analyze(position.parents().firstIsInstance<JetElement>(), BodyResolveMode.PARTIAL_FOR_COMPLETION)
|
||||||
protected val inDescriptor: DeclarationDescriptor? = expression?.let { bindingContext.get(BindingContext.RESOLUTION_SCOPE, it)?.getContainingDeclaration() }
|
protected val inDescriptor: DeclarationDescriptor? = expression?.let { bindingContext.get(BindingContext.RESOLUTION_SCOPE, it)?.getContainingDeclaration() }
|
||||||
|
|
||||||
private fun singleCharPattern(char: Char): CharPattern {
|
|
||||||
return StandardPatterns.character().with(
|
|
||||||
object : PatternCondition<Char>(char.toString()) {
|
|
||||||
override fun accepts(c: Char, context: ProcessingContext) = c == char
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private val kotlinIdentifierStartPattern: ElementPattern<Char>
|
private val kotlinIdentifierStartPattern: ElementPattern<Char>
|
||||||
private val kotlinIdentifierPartPattern: ElementPattern<Char>
|
private val kotlinIdentifierPartPattern: ElementPattern<Char>
|
||||||
|
|
||||||
@@ -115,15 +108,15 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess
|
|||||||
kotlinIdentifierPartPattern = StandardPatterns.character().javaIdentifierPart()
|
kotlinIdentifierPartPattern = StandardPatterns.character().javaIdentifierPart()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
kotlinIdentifierStartPattern = StandardPatterns.and(StandardPatterns.character().javaIdentifierStart(), StandardPatterns.not(singleCharPattern('$')))
|
kotlinIdentifierStartPattern = StandardPatterns.character().javaIdentifierStart() andNot singleCharPattern('$')
|
||||||
kotlinIdentifierPartPattern = StandardPatterns.and(StandardPatterns.character().javaIdentifierPart(), StandardPatterns.not(singleCharPattern('$')))
|
kotlinIdentifierPartPattern = StandardPatterns.character().javaIdentifierPart() andNot singleCharPattern('$')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected val prefix: String = CompletionUtil.findIdentifierPrefix(
|
protected val prefix: String = CompletionUtil.findIdentifierPrefix(
|
||||||
parameters.getPosition().getContainingFile(),
|
parameters.getPosition().getContainingFile(),
|
||||||
parameters.getOffset(),
|
parameters.getOffset(),
|
||||||
StandardPatterns.or(kotlinIdentifierPartPattern, singleCharPattern('@')),
|
kotlinIdentifierPartPattern or singleCharPattern('@'),
|
||||||
kotlinIdentifierStartPattern)
|
kotlinIdentifierStartPattern)
|
||||||
|
|
||||||
protected val resultSet: CompletionResultSet = resultSet
|
protected val resultSet: CompletionResultSet = resultSet
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import com.intellij.codeInsight.completion.*
|
|||||||
import com.intellij.codeInsight.lookup.*
|
import com.intellij.codeInsight.lookup.*
|
||||||
import com.intellij.openapi.progress.ProcessCanceledException
|
import com.intellij.openapi.progress.ProcessCanceledException
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
|
import com.intellij.patterns.ElementPattern
|
||||||
|
import com.intellij.patterns.StandardPatterns
|
||||||
import com.intellij.util.PlatformIcons
|
import com.intellij.util.PlatformIcons
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
@@ -30,15 +32,11 @@ import org.jetbrains.kotlin.idea.util.FuzzyType
|
|||||||
import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance
|
import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parents
|
import org.jetbrains.kotlin.psi.psiUtil.parents
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
|
||||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|
||||||
enum class ItemPriority {
|
enum class ItemPriority {
|
||||||
@@ -353,3 +351,9 @@ fun LookupElementFactory.createBackingFieldLookupElement(
|
|||||||
}
|
}
|
||||||
}.assignPriority(ItemPriority.BACKING_FIELD)
|
}.assignPriority(ItemPriority.BACKING_FIELD)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun <T> ElementPattern<T>.and(rhs: ElementPattern<T>) = StandardPatterns.and(this, rhs)
|
||||||
|
fun <T> ElementPattern<T>.andNot(rhs: ElementPattern<T>) = StandardPatterns.and(this, StandardPatterns.not(rhs))
|
||||||
|
fun <T> ElementPattern<T>.or(rhs: ElementPattern<T>) = StandardPatterns.or(this, rhs)
|
||||||
|
|
||||||
|
fun singleCharPattern(char: Char) = StandardPatterns.character().equalTo(char)
|
||||||
|
|||||||
+9
-11
@@ -20,15 +20,11 @@ import com.intellij.codeInsight.completion.*
|
|||||||
import com.intellij.codeInsight.lookup.LookupElement
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
||||||
|
import com.intellij.patterns.ElementPattern
|
||||||
import com.intellij.patterns.PlatformPatterns.psiElement
|
import com.intellij.patterns.PlatformPatterns.psiElement
|
||||||
import com.intellij.patterns.StandardPatterns
|
import com.intellij.patterns.StandardPatterns
|
||||||
import com.intellij.util.ProcessingContext
|
import com.intellij.util.ProcessingContext
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheService
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
|
||||||
import org.jetbrains.kotlin.idea.completion.KotlinCompletionContributor
|
|
||||||
import org.jetbrains.kotlin.idea.completion.LookupElementFactory
|
|
||||||
import org.jetbrains.kotlin.idea.kdoc.getParamDescriptors
|
import org.jetbrains.kotlin.idea.kdoc.getParamDescriptors
|
||||||
import org.jetbrains.kotlin.idea.kdoc.getResolutionScope
|
import org.jetbrains.kotlin.idea.kdoc.getResolutionScope
|
||||||
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
|
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
|
||||||
@@ -38,7 +34,6 @@ import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
|
|
||||||
|
|
||||||
class KDocCompletionContributor(): CompletionContributor() {
|
class KDocCompletionContributor(): CompletionContributor() {
|
||||||
init {
|
init {
|
||||||
@@ -102,11 +97,14 @@ class KDocNameCompletionSession(parameters: CompletionParameters,
|
|||||||
|
|
||||||
object KDocTagCompletionProvider: 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)
|
// findIdentifierPrefix() requires identifier part characters to be a superset of identifier start characters
|
||||||
parameters.getPosition().getText().removeSuffix(KotlinCompletionContributor.DEFAULT_DUMMY_IDENTIFIER)
|
val prefix = CompletionUtil.findIdentifierPrefix(
|
||||||
else
|
parameters.getPosition().getContainingFile(),
|
||||||
null
|
parameters.getOffset(),
|
||||||
val resultWithPrefix = if (prefix != null) result.withPrefixMatcher(prefix) else result
|
StandardPatterns.character().javaIdentifierPart() or singleCharPattern('@'),
|
||||||
|
StandardPatterns.character().javaIdentifierStart() or singleCharPattern('@'))
|
||||||
|
|
||||||
|
val resultWithPrefix = result.withPrefixMatcher(prefix)
|
||||||
KDocKnownTag.values().forEach {
|
KDocKnownTag.values().forEach {
|
||||||
resultWithPrefix.addElement(LookupElementBuilder.create("@" + it.name().toLowerCase()))
|
resultWithPrefix.addElement(LookupElementBuilder.create("@" + it.name().toLowerCase()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.psi.PsiDocumentManager
|
import com.intellij.psi.PsiDocumentManager
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
|
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
|
||||||
import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
|
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
@@ -58,7 +58,7 @@ public class KDocTypedHandler(): TypedHandlerDelegate() {
|
|||||||
return when (c) {
|
return when (c) {
|
||||||
']' -> {
|
']' -> {
|
||||||
// if the bracket is not part of a link, it will be part of KDOC_TEXT, not a separate RBRACKET element
|
// if the bracket is not part of a link, it will be part of KDOC_TEXT, not a separate RBRACKET element
|
||||||
element.getParentOfType<KDocLink>(false) != null
|
element.getParentOfType<KDoc>(false) != null
|
||||||
&& (elementType == JetTokens.RBRACKET || (offset > 0 && chars[offset - 1] == '['))
|
&& (elementType == JetTokens.RBRACKET || (offset > 0 && chars[offset - 1] == '['))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.idea.kdoc;
|
package org.jetbrains.kotlin.idea.kdoc;
|
||||||
|
|
||||||
import com.intellij.testFramework.TestDataPath;
|
import com.intellij.testFramework.TestDataPath;
|
||||||
import org.jetbrains.kotlin.test.InnerTestClasses;
|
|
||||||
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
||||||
import org.jetbrains.kotlin.test.JetTestUtils;
|
import org.jetbrains.kotlin.test.JetTestUtils;
|
||||||
import org.jetbrains.kotlin.test.TestMetadata;
|
import org.jetbrains.kotlin.test.TestMetadata;
|
||||||
|
|||||||
Reference in New Issue
Block a user