FIR Completion: Add simple classifiers completion

- This also fixes a few test
This commit is contained in:
Roman Golyshev
2020-09-02 14:32:06 +03:00
parent 64645c5049
commit 3d5ec8aa10
7 changed files with 18 additions and 10 deletions
@@ -1,3 +1,4 @@
// FIR_COMPARISON
annotation class SHello annotation class SHello
fun foo(@S<caret>) { } fun foo(@S<caret>) { }
@@ -1,3 +1,4 @@
// FIR_COMPARISON
fun bar() { fun bar() {
val handler = { i: <caret> } val handler = { i: <caret> }
} }
@@ -1,3 +1,4 @@
// FIR_COMPARISON
fun bar() { fun bar() {
val handler = { i: Int, s: <caret> } val handler = { i: Int, s: <caret> }
} }
@@ -1,3 +1,4 @@
// FIR_COMPARISON
fun bar() { fun bar() {
val handler = { i: List<<caret>> } val handler = { i: List<<caret>> }
} }
@@ -1,3 +1,4 @@
// FIR_COMPARISON
fun bar() { fun bar() {
val handler = { i: Map<String, <caret> } val handler = { i: Map<String, <caret> }
} }
@@ -1,3 +1,4 @@
// FIR_COMPARISON
fun bar() { fun bar() {
val handler = { i: Int, list: List<String>, s: <caret> } val handler = { i: Int, list: List<String>, s: <caret> }
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol
@@ -21,10 +22,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.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.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
class KotlinFirCompletionContributor : CompletionContributor() { class KotlinFirCompletionContributor : CompletionContributor() {
@@ -83,14 +81,19 @@ private object KotlinAvailableScopesCompletionProvider {
with(getAnalysisSessionFor(originalFile).createContextDependentCopy()) { with(getAnalysisSessionFor(originalFile).createContextDependentCopy()) {
val (implicitScopes, implicitReceivers) = originalFile.getScopeContextForPosition(nameExpression) val (implicitScopes, implicitReceivers) = originalFile.getScopeContextForPosition(nameExpression)
if (explicitReceiver != null) { when {
collectDotCompletion(result, implicitScopes, explicitReceiver) nameExpression.parent is KtUserType -> collectTypesCompletion(result, implicitScopes)
} else { explicitReceiver != null -> collectDotCompletion(result, implicitScopes, explicitReceiver)
collectDefaultCompletion(result, implicitScopes, implicitReceivers) else -> collectDefaultCompletion(result, implicitScopes, implicitReceivers)
} }
} }
} }
private fun collectTypesCompletion(result: CompletionResultSet, implicitScopes: KtScope) {
val availableClasses = implicitScopes.getClassifierSymbols()
availableClasses.forEach { result.addSymbolToCompletion(it) }
}
private fun KtAnalysisSession.collectDotCompletion( private fun KtAnalysisSession.collectDotCompletion(
result: CompletionResultSet, result: CompletionResultSet,
implicitScopes: KtCompositeScope, implicitScopes: KtCompositeScope,
@@ -127,8 +130,7 @@ private object KotlinAvailableScopesCompletionProvider {
availableNonExtensions.forEach { result.addSymbolToCompletion(it) } availableNonExtensions.forEach { result.addSymbolToCompletion(it) }
extensionsWhichCanBeCalled.forEach { result.addSymbolToCompletion(it) } extensionsWhichCanBeCalled.forEach { result.addSymbolToCompletion(it) }
val availableClasses = implicitScopes.getClassifierSymbols() collectTypesCompletion(result, implicitScopes)
availableClasses.forEach { result.addSymbolToCompletion(it) }
} }
} }