From 3842d71ee3d118527e2129eea0c5490c05925176 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 10 Apr 2015 13:02:36 +0300 Subject: [PATCH] simplify code, fix test, use CompletionUtil.findIdentifierPrefix() --- .../idea/completion/CompletionSession.kt | 13 +++--------- .../kotlin/idea/completion/CompletionUtils.kt | 12 +++++++---- .../completion/KDocCompletionContributor.kt | 20 +++++++++---------- .../kotlin/idea/kdoc/KDocTypedHandler.kt | 4 ++-- .../idea/kdoc/KDocTypingTestGenerated.java | 1 - 5 files changed, 22 insertions(+), 28 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 49ecedfef8e..4f926870501 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -98,13 +98,6 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess protected val bindingContext: BindingContext = resolutionFacade.analyze(position.parents().firstIsInstance(), BodyResolveMode.PARTIAL_FOR_COMPLETION) 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.toString()) { - override fun accepts(c: Char, context: ProcessingContext) = c == char - }) - } - private val kotlinIdentifierStartPattern: ElementPattern private val kotlinIdentifierPartPattern: ElementPattern @@ -115,15 +108,15 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess kotlinIdentifierPartPattern = StandardPatterns.character().javaIdentifierPart() } else { - kotlinIdentifierStartPattern = StandardPatterns.and(StandardPatterns.character().javaIdentifierStart(), StandardPatterns.not(singleCharPattern('$'))) - kotlinIdentifierPartPattern = StandardPatterns.and(StandardPatterns.character().javaIdentifierPart(), StandardPatterns.not(singleCharPattern('$'))) + kotlinIdentifierStartPattern = StandardPatterns.character().javaIdentifierStart() andNot singleCharPattern('$') + kotlinIdentifierPartPattern = StandardPatterns.character().javaIdentifierPart() andNot singleCharPattern('$') } } protected val prefix: String = CompletionUtil.findIdentifierPrefix( parameters.getPosition().getContainingFile(), parameters.getOffset(), - StandardPatterns.or(kotlinIdentifierPartPattern, singleCharPattern('@')), + kotlinIdentifierPartPattern or singleCharPattern('@'), kotlinIdentifierStartPattern) protected val resultSet: CompletionResultSet = resultSet diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt index cf0f2022dae..070c01eceb0 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt @@ -20,6 +20,8 @@ import com.intellij.codeInsight.completion.* import com.intellij.codeInsight.lookup.* import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.util.Key +import com.intellij.patterns.ElementPattern +import com.intellij.patterns.StandardPatterns import com.intellij.util.PlatformIcons import org.jetbrains.kotlin.builtins.KotlinBuiltIns 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.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils 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 enum class ItemPriority { @@ -353,3 +351,9 @@ fun LookupElementFactory.createBackingFieldLookupElement( } }.assignPriority(ItemPriority.BACKING_FIELD) } + +fun ElementPattern.and(rhs: ElementPattern) = StandardPatterns.and(this, rhs) +fun ElementPattern.andNot(rhs: ElementPattern) = StandardPatterns.and(this, StandardPatterns.not(rhs)) +fun ElementPattern.or(rhs: ElementPattern) = StandardPatterns.or(this, rhs) + +fun singleCharPattern(char: Char) = StandardPatterns.character().equalTo(char) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KDocCompletionContributor.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KDocCompletionContributor.kt index e0351568b7e..a8317d70900 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KDocCompletionContributor.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KDocCompletionContributor.kt @@ -20,15 +20,11 @@ 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.ElementPattern import com.intellij.patterns.PlatformPatterns.psiElement import com.intellij.patterns.StandardPatterns import com.intellij.util.ProcessingContext 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.getResolutionScope 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.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer class KDocCompletionContributor(): CompletionContributor() { init { @@ -102,11 +97,14 @@ class KDocNameCompletionSession(parameters: CompletionParameters, object KDocTagCompletionProvider: CompletionProvider() { 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 + // findIdentifierPrefix() requires identifier part characters to be a superset of identifier start characters + val prefix = CompletionUtil.findIdentifierPrefix( + parameters.getPosition().getContainingFile(), + parameters.getOffset(), + StandardPatterns.character().javaIdentifierPart() or singleCharPattern('@'), + StandardPatterns.character().javaIdentifierStart() or singleCharPattern('@')) + + val resultWithPrefix = result.withPrefixMatcher(prefix) KDocKnownTag.values().forEach { resultWithPrefix.addElement(LookupElementBuilder.create("@" + it.name().toLowerCase())) } diff --git a/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocTypedHandler.kt b/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocTypedHandler.kt index ae1fab75448..0c15b17645b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocTypedHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocTypedHandler.kt @@ -25,7 +25,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile 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.psi.JetFile import org.jetbrains.kotlin.psi.psiUtil.getParentOfType @@ -58,7 +58,7 @@ public class KDocTypedHandler(): TypedHandlerDelegate() { return when (c) { ']' -> { // if the bracket is not part of a link, it will be part of KDOC_TEXT, not a separate RBRACKET element - element.getParentOfType(false) != null + element.getParentOfType(false) != null && (elementType == JetTokens.RBRACKET || (offset > 0 && chars[offset - 1] == '[')) } diff --git a/idea/tests/org/jetbrains/kotlin/idea/kdoc/KDocTypingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/kdoc/KDocTypingTestGenerated.java index d6b82f52c62..2199b9feafc 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/kdoc/KDocTypingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/kdoc/KDocTypingTestGenerated.java @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.kdoc; import com.intellij.testFramework.TestDataPath; -import org.jetbrains.kotlin.test.InnerTestClasses; import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.TestMetadata;