diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionResultSetWrapper.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionResultSetWrapper.kt index 2451edced6f..90f47818677 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionResultSetWrapper.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionResultSetWrapper.kt @@ -21,20 +21,21 @@ import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementDecorator import com.intellij.codeInsight.lookup.LookupElementPresentation -import com.intellij.openapi.util.Condition import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.FunctionDescriptor -import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.plugin.completion.handlers.* import org.jetbrains.jet.plugin.project.ResolveSessionForBodies +import com.intellij.codeInsight.completion.PrefixMatcher -class CompletionResultSetWrapper(public val resultSet: CompletionResultSet, +class CompletionResultSetWrapper(private val resultSet: CompletionResultSet, private val resolveSession: ResolveSessionForBodies, private val descriptorFilter: (DeclarationDescriptor) -> Boolean) { public var isSomethingAdded: Boolean = false private set + public val prefixMatcher: PrefixMatcher = resultSet.getPrefixMatcher() + public fun addDescriptorElements(descriptors: Iterable) { for (descriptor in descriptors) { addDescriptorElements(descriptor) @@ -72,7 +73,7 @@ class CompletionResultSetWrapper(public val resultSet: CompletionResultSet, } public fun addElement(element: LookupElement) { - if (resultSet.getPrefixMatcher().prefixMatches(element)) { + if (prefixMatcher.prefixMatches(element)) { resultSet.addElement(element) isSomethingAdded = true } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt index 47e2017473c..05a65b05a2f 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt @@ -43,15 +43,13 @@ class CompletionSession(public val parameters: CompletionParameters, private val inDescriptor: DeclarationDescriptor? = bindingContext.get(BindingContext.RESOLUTION_SCOPE, jetReference.expression)?.getContainingDeclaration() - public val result: CompletionResultSetWrapper = run { - // set prefix matcher here to override default one which relies on CompletionUtil.findReferencePrefix() - // which sometimes works incorrectly for Kotlin - var result = resultSet.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters)) + // set prefix matcher here to override default one which relies on CompletionUtil.findReferencePrefix() + // which sometimes works incorrectly for Kotlin + private val resultSet = resultSet + .withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters)) + .addKotlinSorting(parameters) - result = result.addKotlinSorting(parameters) - - CompletionResultSetWrapper(result, resolveSession, { isVisibleDescriptor(it) }) - } + public val result: CompletionResultSetWrapper = CompletionResultSetWrapper(this.resultSet, resolveSession, { isVisibleDescriptor(it) }) public fun completeForReference() { assert(parameters.getCompletionType() == CompletionType.BASIC) @@ -64,7 +62,7 @@ class CompletionSession(public val parameters: CompletionParameters, } else { addReferenceVariants { isPartOfTypeDeclaration(it) } - JavaCompletionContributor.advertiseSecondCompletion(parameters.getPosition().getProject(), result.resultSet) + JavaCompletionContributor.advertiseSecondCompletion(parameters.getPosition().getProject(), resultSet) } return @@ -72,7 +70,7 @@ class CompletionSession(public val parameters: CompletionParameters, addReferenceVariants { true } - val prefix = result.resultSet.getPrefixMatcher().getPrefix() + val prefix = result.prefixMatcher.getPrefix() // Try to avoid computing not-imported descriptors for empty prefix if (prefix.isEmpty()) { @@ -106,7 +104,7 @@ class CompletionSession(public val parameters: CompletionParameters, private fun addJetExtensions() { val project = position.getProject() val namesCache = JetShortNamesCache.getKotlinInstance(project) - result.addDescriptorElements(namesCache.getJetCallableExtensions({ result.resultSet.getPrefixMatcher().prefixMatches(it!!) }, jetReference.expression, resolveSession, GlobalSearchScope.allScope(project))) + result.addDescriptorElements(namesCache.getJetCallableExtensions({ result.prefixMatcher.prefixMatches(it!!) }, jetReference.expression, resolveSession, GlobalSearchScope.allScope(project))) } private fun isPartOfTypeDeclaration(descriptor: DeclarationDescriptor): Boolean { @@ -124,7 +122,7 @@ class CompletionSession(public val parameters: CompletionParameters, } private fun addJetTopLevelFunctions() { - val actualPrefix = result.resultSet.getPrefixMatcher().getPrefix() + val actualPrefix = result.prefixMatcher.getPrefix() val project = position.getProject() val namesCache = JetShortNamesCache.getKotlinInstance(project) val scope = GlobalSearchScope.allScope(project) @@ -145,7 +143,7 @@ class CompletionSession(public val parameters: CompletionParameters, val objectNames = namesCache.getAllTopLevelObjectNames() for (name in objectNames) { - if (result.resultSet.getPrefixMatcher().prefixMatches(name)) { + if (result.prefixMatcher.prefixMatches(name)) { result.addDescriptorElements(namesCache.getTopLevelObjectsByName(name, jetReference.expression, resolveSession, scope)) } } @@ -177,7 +175,7 @@ class CompletionSession(public val parameters: CompletionParameters, } private fun shouldRunExtensionsCompletion(): Boolean { - return parameters.getInvocationCount() > 1 || result.resultSet.getPrefixMatcher().getPrefix().length >= 3 + return parameters.getInvocationCount() > 1 || result.prefixMatcher.getPrefix().length >= 3 } private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean) { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt index 63c582565d1..1c78845c85d 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt @@ -41,7 +41,7 @@ class TypesCompletion(val parameters: CompletionParameters, val resolveSession: val project = parameters.getOriginalFile().getProject() val namesCache = JetShortNamesCache.getKotlinInstance(project) - result.addDescriptorElements(namesCache.getJetClassesDescriptors({ result.resultSet.getPrefixMatcher().prefixMatches(it!!) }, resolveSession, GlobalSearchScope.allScope(project))) + result.addDescriptorElements(namesCache.getJetClassesDescriptors({ result.prefixMatcher.prefixMatches(it!!) }, resolveSession, GlobalSearchScope.allScope(project))) if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) { addAdaptedJavaCompletion(result) @@ -52,7 +52,7 @@ class TypesCompletion(val parameters: CompletionParameters, val resolveSession: * Add java elements with performing conversion to kotlin elements if necessary. */ private fun addAdaptedJavaCompletion(result: CompletionResultSetWrapper) { - JavaClassNameCompletionContributor.addAllClasses(parameters, false, result.resultSet.getPrefixMatcher(), object : Consumer { + JavaClassNameCompletionContributor.addAllClasses(parameters, false, result.prefixMatcher, object : Consumer { override fun consume(lookupElement: LookupElement?) { if (lookupElement is JavaPsiClassReferenceElement) { val psiClass = lookupElement.getObject()