K2: Generify completion mode computation
Now, it's generated from ResolutionMode, that later allows to define more granular rules
This commit is contained in:
committed by
Space Team
parent
28ff276320
commit
df826f04a7
@@ -11,20 +11,20 @@ import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
|
||||
sealed class ResolutionMode {
|
||||
object ContextDependent : ResolutionMode() {
|
||||
sealed class ResolutionMode(val forceFullCompletion: Boolean) {
|
||||
object ContextDependent : ResolutionMode(forceFullCompletion = false) {
|
||||
override fun toString(): String = "ContextDependent"
|
||||
}
|
||||
|
||||
object ContextDependentDelegate : ResolutionMode() {
|
||||
object ContextDependentDelegate : ResolutionMode(forceFullCompletion = false) {
|
||||
override fun toString(): String = "ContextDependentDelegate"
|
||||
}
|
||||
|
||||
object ContextIndependent : ResolutionMode() {
|
||||
object ContextIndependent : ResolutionMode(forceFullCompletion = true) {
|
||||
override fun toString(): String = "ContextIndependent"
|
||||
}
|
||||
|
||||
object ReceiverResolution : ResolutionMode() {
|
||||
object ReceiverResolution : ResolutionMode(forceFullCompletion = true) {
|
||||
override fun toString(): String = "ReceiverResolution"
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ sealed class ResolutionMode {
|
||||
// In these examples we should try using the property type information while resolving the initializer,
|
||||
// but it's ok if it's not applicable
|
||||
val shouldBeStrictlyEnforced: Boolean = true,
|
||||
) : ResolutionMode() {
|
||||
) : ResolutionMode(forceFullCompletion = true) {
|
||||
override fun toString(): String {
|
||||
return "WithExpectedType: ${expectedTypeRef.prettyString()}, " +
|
||||
"mayBeCoercionToUnitApplied=${mayBeCoercionToUnitApplied}, " +
|
||||
@@ -52,13 +52,13 @@ sealed class ResolutionMode {
|
||||
}
|
||||
}
|
||||
|
||||
class WithStatus(val status: FirDeclarationStatus) : ResolutionMode() {
|
||||
class WithStatus(val status: FirDeclarationStatus) : ResolutionMode(forceFullCompletion = false) {
|
||||
override fun toString(): String {
|
||||
return "WithStatus: ${status.render()}"
|
||||
}
|
||||
}
|
||||
|
||||
class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode() {
|
||||
class LambdaResolution(val expectedReturnTypeRef: FirResolvedTypeRef?) : ResolutionMode(forceFullCompletion = false) {
|
||||
override fun toString(): String {
|
||||
return "LambdaResolution: ${expectedReturnTypeRef.prettyString()}"
|
||||
}
|
||||
@@ -75,7 +75,7 @@ sealed class ResolutionMode {
|
||||
* - assigning to a property with a setter that has a different visibility than the property
|
||||
* - assigning to a non-deprecated property with a setter that is deprecated
|
||||
*/
|
||||
class AssignmentLValue(val variableAssignment: FirVariableAssignment) : ResolutionMode() {
|
||||
class AssignmentLValue(val variableAssignment: FirVariableAssignment) : ResolutionMode(forceFullCompletion = true) {
|
||||
override fun toString(): String = "AssignmentLValue: ${variableAssignment.render()}"
|
||||
}
|
||||
|
||||
|
||||
+5
-6
@@ -5,12 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.inference
|
||||
|
||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.Candidate
|
||||
import org.jetbrains.kotlin.fir.types.ConeIntegerLiteralType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints
|
||||
@@ -21,12 +20,12 @@ import java.util.*
|
||||
|
||||
fun Candidate.computeCompletionMode(
|
||||
components: InferenceComponents,
|
||||
expectedType: FirTypeRef?,
|
||||
resolutionMode: ResolutionMode,
|
||||
currentReturnType: ConeKotlinType?
|
||||
): ConstraintSystemCompletionMode {
|
||||
return when {
|
||||
// Presence of expected type means that we are trying to complete outermost call => completion mode should be full
|
||||
expectedType != null -> ConstraintSystemCompletionMode.FULL
|
||||
// Expected type is present or call is being resolved in independent context
|
||||
resolutionMode.forceFullCompletion -> ConstraintSystemCompletionMode.FULL
|
||||
|
||||
// This is questionable as null return type can be only for error call
|
||||
currentReturnType == null -> ConstraintSystemCompletionMode.PARTIAL
|
||||
|
||||
+1
-2
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
import org.jetbrains.kotlin.fir.resolve.expectedType
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeArgumentConstraintPosition
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExpectedTypeConstraintPosition
|
||||
import org.jetbrains.kotlin.fir.resolve.initialTypeOfCandidate
|
||||
@@ -77,7 +76,7 @@ class FirCallCompleter(
|
||||
)
|
||||
|
||||
val completionMode = candidate.computeCompletionMode(
|
||||
session.inferenceComponents, resolutionMode.expectedType(components, allowFromCast = true), initialType
|
||||
session.inferenceComponents, resolutionMode, initialType
|
||||
)
|
||||
|
||||
val analyzer = createPostponedArgumentsAnalyzer(transformer.resolutionContext)
|
||||
|
||||
Reference in New Issue
Block a user