Add simple completion of class-like symbols
This commit is contained in:
committed by
Ilya Kirillov
parent
20c627ea47
commit
1b3a1a662f
+18
@@ -0,0 +1,18 @@
|
|||||||
|
class DefaultConstructor
|
||||||
|
|
||||||
|
class TwoConstructors(s: String) {
|
||||||
|
constructor(l: Int): this(l.toString()) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class DataClass(val a: Int)
|
||||||
|
|
||||||
|
abstract class AbstractClass
|
||||||
|
|
||||||
|
fun usage() {
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: DefaultConstructor
|
||||||
|
// EXIST: TwoConstructors
|
||||||
|
// EXIST: DataClass
|
||||||
|
// EXIST: AbstractClass
|
||||||
+5
@@ -2322,6 +2322,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
|||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/stringCompletion.kt");
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/stringCompletion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("topLevelClasses.kt")
|
||||||
|
public void testTopLevelClasses() throws Exception {
|
||||||
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/topLevelClasses.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("topLevelVariablesAndFunctions.kt")
|
@TestMetadata("topLevelVariablesAndFunctions.kt")
|
||||||
public void testTopLevelVariablesAndFunctions() throws Exception {
|
public void testTopLevelVariablesAndFunctions() throws Exception {
|
||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/topLevelVariablesAndFunctions.kt");
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/topLevelVariablesAndFunctions.kt");
|
||||||
|
|||||||
+5
@@ -2322,6 +2322,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
|||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/stringCompletion.kt");
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/stringCompletion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("topLevelClasses.kt")
|
||||||
|
public void testTopLevelClasses() throws Exception {
|
||||||
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/topLevelClasses.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("topLevelVariablesAndFunctions.kt")
|
@TestMetadata("topLevelVariablesAndFunctions.kt")
|
||||||
public void testTopLevelVariablesAndFunctions() throws Exception {
|
public void testTopLevelVariablesAndFunctions() throws Exception {
|
||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/topLevelVariablesAndFunctions.kt");
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/topLevelVariablesAndFunctions.kt");
|
||||||
|
|||||||
+6
-10
@@ -10,10 +10,7 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
|
|||||||
import com.intellij.patterns.PlatformPatterns
|
import com.intellij.patterns.PlatformPatterns
|
||||||
import com.intellij.util.ProcessingContext
|
import com.intellij.util.ProcessingContext
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor
|
import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedSymbol
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPossibleExtensionSymbol
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.isExtension
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
@@ -45,7 +42,7 @@ private object KotlinHighLevelApiContributor : CompletionProvider<CompletionPara
|
|||||||
val typeOfPossibleReceiver = possibleReceiver?.let { sessionForCompletion.getKtExpressionType(it) }
|
val typeOfPossibleReceiver = possibleReceiver?.let { sessionForCompletion.getKtExpressionType(it) }
|
||||||
val possibleReceiverScope = typeOfPossibleReceiver?.let { sessionForCompletion.scopeProvider.getScopeForType(it) }
|
val possibleReceiverScope = typeOfPossibleReceiver?.let { sessionForCompletion.scopeProvider.getScopeForType(it) }
|
||||||
|
|
||||||
fun addToCompletion(symbol: KtCallableSymbol) {
|
fun addToCompletion(symbol: KtSymbol) {
|
||||||
if (symbol !is KtNamedSymbol) return
|
if (symbol !is KtNamedSymbol) return
|
||||||
result.addElement(LookupElementBuilder.create(symbol.name.asString()))
|
result.addElement(LookupElementBuilder.create(symbol.name.asString()))
|
||||||
}
|
}
|
||||||
@@ -54,12 +51,10 @@ private object KotlinHighLevelApiContributor : CompletionProvider<CompletionPara
|
|||||||
val nonExtensionMembers = possibleReceiverScope
|
val nonExtensionMembers = possibleReceiverScope
|
||||||
.getCallableSymbols()
|
.getCallableSymbols()
|
||||||
.filterNot { it.isExtension }
|
.filterNot { it.isExtension }
|
||||||
.toList()
|
|
||||||
|
|
||||||
val extensionNonMembers = implicitScopes
|
val extensionNonMembers = implicitScopes
|
||||||
.getCallableSymbols()
|
.getCallableSymbols()
|
||||||
.filter { it.isExtension && it.canBeCalledWith(listOf(typeOfPossibleReceiver)) }
|
.filter { it.isExtension && it.canBeCalledWith(listOf(typeOfPossibleReceiver)) }
|
||||||
.toList()
|
|
||||||
|
|
||||||
nonExtensionMembers.forEach(::addToCompletion)
|
nonExtensionMembers.forEach(::addToCompletion)
|
||||||
extensionNonMembers.forEach(::addToCompletion)
|
extensionNonMembers.forEach(::addToCompletion)
|
||||||
@@ -69,15 +64,16 @@ private object KotlinHighLevelApiContributor : CompletionProvider<CompletionPara
|
|||||||
.filter { !it.isExtension || it.canBeCalledWith(implicitReceivers) }
|
.filter { !it.isExtension || it.canBeCalledWith(implicitReceivers) }
|
||||||
|
|
||||||
extensionNonMembers.forEach(::addToCompletion)
|
extensionNonMembers.forEach(::addToCompletion)
|
||||||
}
|
|
||||||
|
|
||||||
return
|
val availableClasses = implicitScopes.getClassClassLikeSymbols()
|
||||||
|
availableClasses.forEach(::addToCompletion)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KtCallableSymbol.canBeCalledWith(implicitReceivers: List<KtType>): Boolean {
|
private fun KtCallableSymbol.canBeCalledWith(implicitReceivers: List<KtType>): Boolean {
|
||||||
val requiredReceiverType = (this as? KtPossibleExtensionSymbol)?.receiverType
|
val requiredReceiverType = (this as? KtPossibleExtensionSymbol)?.receiverType
|
||||||
?: error("Extension receiver type should be present on ${this}")
|
?: error("Extension receiver type should be present on $this")
|
||||||
|
|
||||||
return implicitReceivers.any { it.isSubTypeOf(requiredReceiverType) }
|
return implicitReceivers.any { it.isSubTypeOf(requiredReceiverType) }
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user