Refactoring code in completion
This commit is contained in:
+10
-13
@@ -29,20 +29,19 @@ 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
|
||||||
|
|
||||||
public class JetCompletionResultSet(public val result: CompletionResultSet,
|
class CompletionResultSetWrapper(public val resultSet: CompletionResultSet,
|
||||||
public val resolveSession: ResolveSessionForBodies,
|
private val resolveSession: ResolveSessionForBodies,
|
||||||
public val bindingContext: BindingContext,
|
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 fun addAllElements(descriptors: Iterable<DeclarationDescriptor>) {
|
public fun addDescriptorElements(descriptors: Iterable<DeclarationDescriptor>) {
|
||||||
for (descriptor in descriptors) {
|
for (descriptor in descriptors) {
|
||||||
addElement(descriptor)
|
addDescriptorElements(descriptor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun addElement(descriptor: DeclarationDescriptor) {
|
public fun addDescriptorElements(descriptor: DeclarationDescriptor) {
|
||||||
if (!descriptorFilter(descriptor)) return
|
if (!descriptorFilter(descriptor)) return
|
||||||
|
|
||||||
addElement(DescriptorLookupConverter.createLookupElement(resolveSession, descriptor))
|
addElement(DescriptorLookupConverter.createLookupElement(resolveSession, descriptor))
|
||||||
@@ -73,11 +72,9 @@ public class JetCompletionResultSet(public val result: CompletionResultSet,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public fun addElement(element: LookupElement) {
|
public fun addElement(element: LookupElement) {
|
||||||
if (!result.getPrefixMatcher().prefixMatches(element)) return
|
if (resultSet.getPrefixMatcher().prefixMatches(element)) {
|
||||||
|
resultSet.addElement(element)
|
||||||
result.addElement(element)
|
isSomethingAdded = true
|
||||||
isSomethingAdded = true
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public val shortNameFilter: (String) -> Boolean = { result.getPrefixMatcher().prefixMatches(it) }
|
|
||||||
}
|
}
|
||||||
@@ -36,23 +36,21 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
resultSet: CompletionResultSet,
|
resultSet: CompletionResultSet,
|
||||||
private val jetReference: JetSimpleNameReference,
|
private val jetReference: JetSimpleNameReference,
|
||||||
position: PsiElement) {
|
position: PsiElement) {
|
||||||
private val inDescriptor: DeclarationDescriptor?
|
|
||||||
public val jetResult: JetCompletionResultSet
|
|
||||||
|
|
||||||
private val resolveSession = (position.getContainingFile() as JetFile).getLazyResolveSession()
|
private val resolveSession = (position.getContainingFile() as JetFile).getLazyResolveSession()
|
||||||
private val bindingContext = resolveSession.resolveToElement(jetReference.expression)
|
private val bindingContext = resolveSession.resolveToElement(jetReference.expression)
|
||||||
private val position = parameters.getPosition()
|
private val position = parameters.getPosition()
|
||||||
|
|
||||||
;{
|
private val inDescriptor: DeclarationDescriptor? = bindingContext.get(BindingContext.RESOLUTION_SCOPE, jetReference.expression)?.getContainingDeclaration()
|
||||||
inDescriptor = bindingContext.get<JetExpression, JetScope>(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
|
||||||
var result = resultSet.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters))
|
var result = resultSet.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters))
|
||||||
|
|
||||||
result = result.addKotlinSorting(parameters)
|
result = result.addKotlinSorting(parameters)
|
||||||
|
|
||||||
this.jetResult = JetCompletionResultSet(result, resolveSession, bindingContext, { isVisibleDescriptor(it) })
|
CompletionResultSetWrapper(result, resolveSession, { isVisibleDescriptor(it) })
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun completeForReference() {
|
public fun completeForReference() {
|
||||||
@@ -62,11 +60,11 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
|
|
||||||
if (shouldRunOnlyTypeCompletion()) {
|
if (shouldRunOnlyTypeCompletion()) {
|
||||||
if (parameters.getInvocationCount() >= 2) {
|
if (parameters.getInvocationCount() >= 2) {
|
||||||
JetTypesCompletionHelper.addJetTypes(parameters, jetResult)
|
TypesCompletion(parameters, resolveSession).addAllTypes(result)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
addReferenceVariants { isPartOfTypeDeclaration(it) }
|
addReferenceVariants { isPartOfTypeDeclaration(it) }
|
||||||
JavaCompletionContributor.advertiseSecondCompletion(parameters.getPosition().getProject(), jetResult.result)
|
JavaCompletionContributor.advertiseSecondCompletion(parameters.getPosition().getProject(), result.resultSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -74,7 +72,7 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
|
|
||||||
addReferenceVariants { true }
|
addReferenceVariants { true }
|
||||||
|
|
||||||
val prefix = jetResult.result.getPrefixMatcher().getPrefix()
|
val prefix = result.resultSet.getPrefixMatcher().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()) {
|
||||||
@@ -84,7 +82,7 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (shouldRunTopLevelCompletion()) {
|
if (shouldRunTopLevelCompletion()) {
|
||||||
JetTypesCompletionHelper.addJetTypes(parameters, jetResult)
|
TypesCompletion(parameters, resolveSession).addAllTypes(result)
|
||||||
addJetTopLevelFunctions()
|
addJetTopLevelFunctions()
|
||||||
addJetTopLevelObjects()
|
addJetTopLevelObjects()
|
||||||
}
|
}
|
||||||
@@ -97,9 +95,9 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
public fun completeSmart() {
|
public fun completeSmart() {
|
||||||
assert(parameters.getCompletionType() == CompletionType.SMART)
|
assert(parameters.getCompletionType() == CompletionType.SMART)
|
||||||
|
|
||||||
val descriptors = TipsManager.getReferenceVariants(jetReference.expression, jetResult.bindingContext)
|
val descriptors = TipsManager.getReferenceVariants(jetReference.expression, bindingContext)
|
||||||
val completion = SmartCompletion(jetReference.expression, resolveSession, { isVisibleDescriptor(it) }, parameters.getOriginalFile() as JetFile)
|
val completion = SmartCompletion(jetReference.expression, resolveSession, { isVisibleDescriptor(it) }, parameters.getOriginalFile() as JetFile)
|
||||||
completion.buildLookupElements(descriptors)?.forEach { jetResult.addElement(it) }
|
completion.buildLookupElements(descriptors)?.forEach { result.addElement(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isOnlyKeywordCompletion(position: PsiElement)
|
private fun isOnlyKeywordCompletion(position: PsiElement)
|
||||||
@@ -108,7 +106,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)
|
||||||
jetResult.addAllElements(namesCache.getJetCallableExtensions({ jetResult.shortNameFilter(it!!) }, jetReference.expression, resolveSession, GlobalSearchScope.allScope(project)))
|
result.addDescriptorElements(namesCache.getJetCallableExtensions({ result.resultSet.getPrefixMatcher().prefixMatches(it!!) }, jetReference.expression, resolveSession, GlobalSearchScope.allScope(project)))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isPartOfTypeDeclaration(descriptor: DeclarationDescriptor): Boolean {
|
private fun isPartOfTypeDeclaration(descriptor: DeclarationDescriptor): Boolean {
|
||||||
@@ -126,7 +124,7 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun addJetTopLevelFunctions() {
|
private fun addJetTopLevelFunctions() {
|
||||||
val actualPrefix = jetResult.result.getPrefixMatcher().getPrefix()
|
val actualPrefix = result.resultSet.getPrefixMatcher().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)
|
||||||
@@ -135,7 +133,7 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
// TODO: Fix complete extension not only on contains
|
// TODO: Fix complete extension not only on contains
|
||||||
for (name in functionNames) {
|
for (name in functionNames) {
|
||||||
if (name.contains(actualPrefix)) {
|
if (name.contains(actualPrefix)) {
|
||||||
jetResult.addAllElements(namesCache.getTopLevelFunctionDescriptorsByName(name, jetReference.expression, resolveSession, scope))
|
result.addDescriptorElements(namesCache.getTopLevelFunctionDescriptorsByName(name, jetReference.expression, resolveSession, scope))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -147,8 +145,8 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
val objectNames = namesCache.getAllTopLevelObjectNames()
|
val objectNames = namesCache.getAllTopLevelObjectNames()
|
||||||
|
|
||||||
for (name in objectNames) {
|
for (name in objectNames) {
|
||||||
if (jetResult.result.getPrefixMatcher().prefixMatches(name)) {
|
if (result.resultSet.getPrefixMatcher().prefixMatches(name)) {
|
||||||
jetResult.addAllElements(namesCache.getTopLevelObjectsByName(name, jetReference.expression, resolveSession, scope))
|
result.addDescriptorElements(namesCache.getTopLevelObjectsByName(name, jetReference.expression, resolveSession, scope))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,7 +156,7 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
// expression we are at first of it
|
// expression we are at first of it
|
||||||
val typeReference = PsiTreeUtil.getParentOfType(position, javaClass<JetTypeReference>())
|
val typeReference = PsiTreeUtil.getParentOfType(position, javaClass<JetTypeReference>())
|
||||||
if (typeReference != null) {
|
if (typeReference != null) {
|
||||||
val firstPartReference = PsiTreeUtil.findChildOfType<JetSimpleNameExpression>(typeReference, javaClass<JetSimpleNameExpression>())
|
val firstPartReference = PsiTreeUtil.findChildOfType(typeReference, javaClass<JetSimpleNameExpression>())
|
||||||
return firstPartReference == jetReference.expression
|
return firstPartReference == jetReference.expression
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,12 +177,12 @@ class CompletionSession(public val parameters: CompletionParameters,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun shouldRunExtensionsCompletion(): Boolean {
|
private fun shouldRunExtensionsCompletion(): Boolean {
|
||||||
return parameters.getInvocationCount() > 1 || jetResult.result.getPrefixMatcher().getPrefix().length >= 3
|
return parameters.getInvocationCount() > 1 || result.resultSet.getPrefixMatcher().getPrefix().length >= 3
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean) {
|
private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean) {
|
||||||
val descriptors = TipsManager.getReferenceVariants(jetReference.expression, jetResult.bindingContext)
|
val descriptors = TipsManager.getReferenceVariants(jetReference.expression, bindingContext)
|
||||||
jetResult.addAllElements(descriptors.filter { filterCondition(it) })
|
result.addDescriptorElements(descriptors.filter { filterCondition(it) })
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean {
|
private fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean {
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ public class JetCompletionContributor : CompletionContributor() {
|
|||||||
if (parameters.getCompletionType() == CompletionType.BASIC) {
|
if (parameters.getCompletionType() == CompletionType.BASIC) {
|
||||||
session.completeForReference()
|
session.completeForReference()
|
||||||
|
|
||||||
if (!session.jetResult.isSomethingAdded && session.parameters.getInvocationCount() < 2) {
|
if (!session.result.isSomethingAdded && session.parameters.getInvocationCount() < 2) {
|
||||||
// Rerun completion if nothing was found
|
// Rerun completion if nothing was found
|
||||||
session = CompletionSession(parameters.withInvocationCount(2), result, jetReference, position)
|
session = CompletionSession(parameters.withInvocationCount(2), result, jetReference, position)
|
||||||
session.completeForReference()
|
session.completeForReference()
|
||||||
|
|||||||
+12
-13
@@ -33,34 +33,33 @@ import org.jetbrains.jet.plugin.caches.JetFromJavaDescriptorHelper
|
|||||||
import org.jetbrains.jet.plugin.caches.JetShortNamesCache
|
import org.jetbrains.jet.plugin.caches.JetShortNamesCache
|
||||||
import org.jetbrains.jet.plugin.completion.handlers.JetJavaClassInsertHandler
|
import org.jetbrains.jet.plugin.completion.handlers.JetJavaClassInsertHandler
|
||||||
import org.jetbrains.jet.plugin.project.ProjectStructureUtil
|
import org.jetbrains.jet.plugin.project.ProjectStructureUtil
|
||||||
|
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies
|
||||||
|
|
||||||
object JetTypesCompletionHelper {
|
class TypesCompletion(val parameters: CompletionParameters, val resolveSession: ResolveSessionForBodies) {
|
||||||
fun addJetTypes(parameters: CompletionParameters, jetCompletionResult: JetCompletionResultSet) {
|
fun addAllTypes(result: CompletionResultSetWrapper) {
|
||||||
assert(parameters.getInvocationCount() >= 2, "Method should be used only for force completion. In other case complete classes from scope")
|
result.addDescriptorElements(KotlinBuiltIns.getInstance().getNonPhysicalClasses())
|
||||||
|
|
||||||
jetCompletionResult.addAllElements(KotlinBuiltIns.getInstance().getNonPhysicalClasses())
|
|
||||||
|
|
||||||
val project = parameters.getOriginalFile().getProject()
|
val project = parameters.getOriginalFile().getProject()
|
||||||
val namesCache = JetShortNamesCache.getKotlinInstance(project)
|
val namesCache = JetShortNamesCache.getKotlinInstance(project)
|
||||||
jetCompletionResult.addAllElements(namesCache.getJetClassesDescriptors({ jetCompletionResult.shortNameFilter(it!!) }, jetCompletionResult.resolveSession, GlobalSearchScope.allScope(project)))
|
result.addDescriptorElements(namesCache.getJetClassesDescriptors({ result.resultSet.getPrefixMatcher().prefixMatches(it!!) }, resolveSession, GlobalSearchScope.allScope(project)))
|
||||||
|
|
||||||
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
|
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
|
||||||
addAdaptedJavaCompletion(parameters, jetCompletionResult)
|
addAdaptedJavaCompletion(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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(parameters: CompletionParameters, jetCompletionResult: JetCompletionResultSet) {
|
private fun addAdaptedJavaCompletion(result: CompletionResultSetWrapper) {
|
||||||
JavaClassNameCompletionContributor.addAllClasses(parameters, false, JavaCompletionSorting.addJavaSorting(parameters, jetCompletionResult.result).getPrefixMatcher(), object : Consumer<LookupElement> {
|
JavaClassNameCompletionContributor.addAllClasses(parameters, false, JavaCompletionSorting.addJavaSorting(parameters, result.resultSet).getPrefixMatcher(), 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()
|
||||||
|
|
||||||
if (addJavaClassAsJetLookupElement(psiClass, jetCompletionResult)) return
|
if (addJavaClassAsJetLookupElement(psiClass, result)) return
|
||||||
|
|
||||||
jetCompletionResult.addElement(object : LookupElementDecorator<LookupElement>(lookupElement) {
|
result.addElement(object : LookupElementDecorator<LookupElement>(lookupElement) {
|
||||||
override fun handleInsert(context: InsertionContext) {
|
override fun handleInsert(context: InsertionContext) {
|
||||||
JetJavaClassInsertHandler.handleInsert(context, lookupElement)
|
JetJavaClassInsertHandler.handleInsert(context, lookupElement)
|
||||||
}
|
}
|
||||||
@@ -70,7 +69,7 @@ object JetTypesCompletionHelper {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addJavaClassAsJetLookupElement(aClass: PsiClass, jetCompletionResult: JetCompletionResultSet): Boolean {
|
private fun addJavaClassAsJetLookupElement(aClass: PsiClass, result: CompletionResultSetWrapper): Boolean {
|
||||||
if (aClass is KotlinLightClass) {
|
if (aClass is KotlinLightClass) {
|
||||||
// Do nothing. Kotlin not-compiled class should have already been added as kotlin element before.
|
// Do nothing. Kotlin not-compiled class should have already been added as kotlin element before.
|
||||||
return true
|
return true
|
||||||
@@ -80,7 +79,7 @@ object JetTypesCompletionHelper {
|
|||||||
if (JetFromJavaDescriptorHelper.getCompiledClassKind(aClass) != ClassKind.CLASS_OBJECT) {
|
if (JetFromJavaDescriptorHelper.getCompiledClassKind(aClass) != ClassKind.CLASS_OBJECT) {
|
||||||
val qualifiedName = aClass.getQualifiedName()
|
val qualifiedName = aClass.getQualifiedName()
|
||||||
if (qualifiedName != null) {
|
if (qualifiedName != null) {
|
||||||
jetCompletionResult.addAllElements(ResolveSessionUtils.getClassDescriptorsByFqName(jetCompletionResult.resolveSession, FqName(qualifiedName)))
|
result.addDescriptorElements(ResolveSessionUtils.getClassDescriptorsByFqName(resolveSession, FqName(qualifiedName)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user