Completion refactoring: no result set exposed in wrapper

This commit is contained in:
Valentin Kipyatkov
2014-07-30 18:37:50 +04:00
parent 58482066c4
commit 61cb360762
3 changed files with 19 additions and 20 deletions
@@ -21,20 +21,21 @@ import com.intellij.codeInsight.completion.InsertionContext
import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.LookupElementDecorator import com.intellij.codeInsight.lookup.LookupElementDecorator
import com.intellij.codeInsight.lookup.LookupElementPresentation 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.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor 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.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.plugin.completion.handlers.* import org.jetbrains.jet.plugin.completion.handlers.*
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies 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 resolveSession: ResolveSessionForBodies,
private val descriptorFilter: (DeclarationDescriptor) -> Boolean) { private val descriptorFilter: (DeclarationDescriptor) -> Boolean) {
public var isSomethingAdded: Boolean = false public var isSomethingAdded: Boolean = false
private set private set
public val prefixMatcher: PrefixMatcher = resultSet.getPrefixMatcher()
public fun addDescriptorElements(descriptors: Iterable<DeclarationDescriptor>) { public fun addDescriptorElements(descriptors: Iterable<DeclarationDescriptor>) {
for (descriptor in descriptors) { for (descriptor in descriptors) {
addDescriptorElements(descriptor) addDescriptorElements(descriptor)
@@ -72,7 +73,7 @@ class CompletionResultSetWrapper(public val resultSet: CompletionResultSet,
} }
public fun addElement(element: LookupElement) { public fun addElement(element: LookupElement) {
if (resultSet.getPrefixMatcher().prefixMatches(element)) { if (prefixMatcher.prefixMatches(element)) {
resultSet.addElement(element) resultSet.addElement(element)
isSomethingAdded = true isSomethingAdded = true
} }
@@ -43,15 +43,13 @@ class CompletionSession(public val parameters: CompletionParameters,
private val inDescriptor: DeclarationDescriptor? = bindingContext.get(BindingContext.RESOLUTION_SCOPE, jetReference.expression)?.getContainingDeclaration() 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()
// set prefix matcher here to override default one which relies on CompletionUtil.findReferencePrefix() // which sometimes works incorrectly for Kotlin
// which sometimes works incorrectly for Kotlin private val resultSet = resultSet
var result = resultSet.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters)) .withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters))
.addKotlinSorting(parameters)
result = result.addKotlinSorting(parameters) public val result: CompletionResultSetWrapper = CompletionResultSetWrapper(this.resultSet, resolveSession, { isVisibleDescriptor(it) })
CompletionResultSetWrapper(result, resolveSession, { isVisibleDescriptor(it) })
}
public fun completeForReference() { public fun completeForReference() {
assert(parameters.getCompletionType() == CompletionType.BASIC) assert(parameters.getCompletionType() == CompletionType.BASIC)
@@ -64,7 +62,7 @@ class CompletionSession(public val parameters: CompletionParameters,
} }
else { else {
addReferenceVariants { isPartOfTypeDeclaration(it) } addReferenceVariants { isPartOfTypeDeclaration(it) }
JavaCompletionContributor.advertiseSecondCompletion(parameters.getPosition().getProject(), result.resultSet) JavaCompletionContributor.advertiseSecondCompletion(parameters.getPosition().getProject(), resultSet)
} }
return return
@@ -72,7 +70,7 @@ class CompletionSession(public val parameters: CompletionParameters,
addReferenceVariants { true } addReferenceVariants { true }
val prefix = result.resultSet.getPrefixMatcher().getPrefix() val prefix = result.prefixMatcher.getPrefix()
// Try to avoid computing not-imported descriptors for empty prefix // Try to avoid computing not-imported descriptors for empty prefix
if (prefix.isEmpty()) { if (prefix.isEmpty()) {
@@ -106,7 +104,7 @@ class CompletionSession(public val parameters: CompletionParameters,
private fun addJetExtensions() { private fun addJetExtensions() {
val project = position.getProject() val project = position.getProject()
val namesCache = JetShortNamesCache.getKotlinInstance(project) 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 { private fun isPartOfTypeDeclaration(descriptor: DeclarationDescriptor): Boolean {
@@ -124,7 +122,7 @@ class CompletionSession(public val parameters: CompletionParameters,
} }
private fun addJetTopLevelFunctions() { private fun addJetTopLevelFunctions() {
val actualPrefix = result.resultSet.getPrefixMatcher().getPrefix() val actualPrefix = result.prefixMatcher.getPrefix()
val project = position.getProject() val project = position.getProject()
val namesCache = JetShortNamesCache.getKotlinInstance(project) val namesCache = JetShortNamesCache.getKotlinInstance(project)
val scope = GlobalSearchScope.allScope(project) val scope = GlobalSearchScope.allScope(project)
@@ -145,7 +143,7 @@ class CompletionSession(public val parameters: CompletionParameters,
val objectNames = namesCache.getAllTopLevelObjectNames() val objectNames = namesCache.getAllTopLevelObjectNames()
for (name in objectNames) { for (name in objectNames) {
if (result.resultSet.getPrefixMatcher().prefixMatches(name)) { if (result.prefixMatcher.prefixMatches(name)) {
result.addDescriptorElements(namesCache.getTopLevelObjectsByName(name, jetReference.expression, resolveSession, scope)) result.addDescriptorElements(namesCache.getTopLevelObjectsByName(name, jetReference.expression, resolveSession, scope))
} }
} }
@@ -177,7 +175,7 @@ class CompletionSession(public val parameters: CompletionParameters,
} }
private fun shouldRunExtensionsCompletion(): Boolean { 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) { private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean) {
@@ -41,7 +41,7 @@ class TypesCompletion(val parameters: CompletionParameters, val resolveSession:
val project = parameters.getOriginalFile().getProject() val project = parameters.getOriginalFile().getProject()
val namesCache = JetShortNamesCache.getKotlinInstance(project) 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)) { if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
addAdaptedJavaCompletion(result) addAdaptedJavaCompletion(result)
@@ -52,7 +52,7 @@ class TypesCompletion(val parameters: CompletionParameters, val resolveSession:
* Add java elements with performing conversion to kotlin elements if necessary. * Add java elements with performing conversion to kotlin elements if necessary.
*/ */
private fun addAdaptedJavaCompletion(result: CompletionResultSetWrapper) { private fun addAdaptedJavaCompletion(result: CompletionResultSetWrapper) {
JavaClassNameCompletionContributor.addAllClasses(parameters, false, result.resultSet.getPrefixMatcher(), object : Consumer<LookupElement> { JavaClassNameCompletionContributor.addAllClasses(parameters, false, result.prefixMatcher, object : Consumer<LookupElement> {
override fun consume(lookupElement: LookupElement?) { override fun consume(lookupElement: LookupElement?) {
if (lookupElement is JavaPsiClassReferenceElement) { if (lookupElement is JavaPsiClassReferenceElement) {
val psiClass = lookupElement.getObject() val psiClass = lookupElement.getObject()