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