~ new outer TV definition
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
index 182d6c2..114ae31 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
@@ -16516,6 +16516,12 @@
}
@Test
+ @TestMetadata("newTvFromLamdaAreNotCountedAsProper.kt")
+ public void testNewTvFromLamdaAreNotCountedAsProper() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt");
+ }
+
+ @Test
@TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt")
public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
index 70ce9a7..eb7d187 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
@@ -16516,6 +16516,12 @@
}
@Test
+ @TestMetadata("newTvFromLamdaAreNotCountedAsProper.kt")
+ public void testNewTvFromLamdaAreNotCountedAsProper() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt");
+ }
+
+ @Test
@TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt")
public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
index b4404fb..0367f1b 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
@@ -16510,6 +16510,12 @@
}
@Test
+ @TestMetadata("newTvFromLamdaAreNotCountedAsProper.kt")
+ public void testNewTvFromLamdaAreNotCountedAsProper() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt");
+ }
+
+ @Test
@TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt")
public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
index d6f66a5..73e90f7 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
@@ -16516,6 +16516,12 @@
}
@Test
+ @TestMetadata("newTvFromLamdaAreNotCountedAsProper.kt")
+ public void testNewTvFromLamdaAreNotCountedAsProper() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt");
+ }
+
+ @Test
@TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt")
public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt");
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt
index 9c4317d..5ec0c81 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConstraintSystemCompleter.kt
@@ -49,7 +49,7 @@
analyze: (PostponedResolvedAtom) -> Unit,
) = with(c) {
outerTypeVariables?.let {
- return@with withTypeVariablesThatAreNotCountedAsProperTypes(allTypeVariables.keys - it) {
+ return@with withTypeVariablesThatAreCountedAsProperTypes(it) {
runCompletion(completionMode, topLevelAtoms, candidateReturnType, context, collectVariablesFromContext, analyze)
}
}
diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt
index 11df3fe..5fccb97 100644
--- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt
+++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext.kt
@@ -122,4 +122,5 @@
* @see [org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer.fixInnerVariablesForProvideDelegateIfNeeded]
*/
abstract fun <R> withTypeVariablesThatAreNotCountedAsProperTypes(typeVariables: Set<TypeConstructorMarker>, block: () -> R): R
+ abstract fun <R> withTypeVariablesThatAreCountedAsProperTypes(typeVariables: Set<TypeConstructorMarker>, block: () -> R): R
}
diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt
index 4ef43cd..ef50ea5 100644
--- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt
+++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt
@@ -51,6 +51,7 @@
* [org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer.fixInnerVariablesForProvideDelegateIfNeeded]
*/
val typeVariablesThatAreNotCountedAsProperTypes: Set<TypeConstructorMarker>?
+ val typeVariablesThatAreCountedAsProperTypes: Set<TypeConstructorMarker>?
fun isReified(variable: TypeVariableMarker): Boolean
}
@@ -218,9 +219,11 @@
isProperTypeForFixation(type) { t -> !t.contains { isNotFixedRelevantVariable(it) } }
private fun Context.isNotFixedRelevantVariable(it: KotlinTypeMarker): Boolean {
- if (!notFixedTypeVariables.containsKey(it.typeConstructor())) return false
+ val key = it.typeConstructor()
+ if (!notFixedTypeVariables.containsKey(key)) return false
+ if (typeVariablesThatAreCountedAsProperTypes != null && typeVariablesThatAreCountedAsProperTypes!!.contains(key)) return false
if (typeVariablesThatAreNotCountedAsProperTypes == null) return true
- return typeVariablesThatAreNotCountedAsProperTypes!!.contains(it.typeConstructor())
+ return typeVariablesThatAreNotCountedAsProperTypes!!.contains(key)
}
private fun Context.isReified(variable: TypeConstructorMarker): Boolean =
diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt
index 46008a3..a46c272 100644
--- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt
+++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt
@@ -42,6 +42,7 @@
private val notProperTypesCache: MutableSet<KotlinTypeMarker> = SmartSet.create()
private val intersectionTypesCache: MutableMap<Collection<KotlinTypeMarker>, EmptyIntersectionTypeInfo?> = mutableMapOf()
override var typeVariablesThatAreNotCountedAsProperTypes: Set<TypeConstructorMarker>? = null
+ override var typeVariablesThatAreCountedAsProperTypes: Set<TypeConstructorMarker>? = null
private var couldBeResolvedWithUnrestrictedBuilderInference: Boolean = false
@@ -72,6 +73,27 @@
return result
}
+ override fun <R> withTypeVariablesThatAreCountedAsProperTypes(typeVariables: Set<TypeConstructorMarker>, block: () -> R): R {
+ checkState(State.BUILDING)
+ // Cleaning cache is necessary because temporarily we change the meaning of what does "proper type" mean
+ properTypesCache.clear()
+ notProperTypesCache.clear()
+
+ require(typeVariablesThatAreCountedAsProperTypes == null) {
+ "Currently there should be no nested withDisallowingOnlyThisTypeVariablesForProperTypes calls"
+ }
+
+ typeVariablesThatAreCountedAsProperTypes = typeVariables
+
+ val result = block()
+
+ typeVariablesThatAreCountedAsProperTypes = null
+ properTypesCache.clear()
+ notProperTypesCache.clear()
+
+ return result
+ }
+
private enum class State {
BUILDING,
TRANSACTION,
@@ -399,6 +421,10 @@
it
if (typeToCheck == null) return@contains false
+ if (typeVariablesThatAreCountedAsProperTypes != null) {
+ if (typeVariablesThatAreCountedAsProperTypes!!.contains(typeToCheck.typeConstructor())) return@contains false
+ }
+
if (typeVariablesThatAreNotCountedAsProperTypes != null) {
return@contains typeVariablesThatAreNotCountedAsProperTypes!!.contains(typeToCheck.typeConstructor())
}
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt b/compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt
new file mode 100644
index 0000000..5ac925a
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt
@@ -0,0 +1,24 @@
+// FIR_IDENTICAL
+class Controller<T> {
+ fun yield(t: T): Boolean = true
+}
+
+fun <S> generate(g: suspend Controller<S>.() -> Unit): S = TODO()
+
+class Out<out X>
+
+fun <T1> catching(body: suspend () -> T1): Out<T1> = TODO()
+fun <R2, T2 : R2> Out<T2>.getOrElse2(onFailure: () -> R2): R2 = TODO()
+
+fun <T3> myEmptyList(): List<T3> = TODO()
+
+fun main(x: List<String>) {
+
+ generate {
+ val languages = catching { x }.getOrElse2 {
+ myEmptyList()
+ }
+
+ yield(languages[0].length)
+ }
+}
\ No newline at end of file
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
index 235dda4..94574c4 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
@@ -16516,6 +16516,12 @@
}
@Test
+ @TestMetadata("newTvFromLamdaAreNotCountedAsProper.kt")
+ public void testNewTvFromLamdaAreNotCountedAsProper() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/inference/builderInference/newTvFromLamdaAreNotCountedAsProper.kt");
+ }
+
+ @Test
@TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt")
public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt");