Completion refactoring: no result set exposed in wrapper
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user