~ Fix KT-78832

^KT-78832 Fixed
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/LanguageVersionUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/LanguageVersionUtils.kt
index 2b1699c..4281f49 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/LanguageVersionUtils.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/LanguageVersionUtils.kt
@@ -9,5 +9,9 @@
 
 context(c: SessionHolder)
 fun LanguageFeature.isEnabled(): Boolean {
-    return c.session.languageVersionSettings.supportsFeature(this)
+    return this.isEnabled(c.session)
+}
+
+fun LanguageFeature.isEnabled(session: FirSession): Boolean {
+    return session.languageVersionSettings.supportsFeature(this)
 }
\ No newline at end of file
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/stages/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/stages/ResolutionStages.kt
index a7c3733..a87c679 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/stages/ResolutionStages.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/stages/ResolutionStages.kt
@@ -22,9 +22,7 @@
 import org.jetbrains.kotlin.fir.references.symbol
 import org.jetbrains.kotlin.fir.resolve.*
 import org.jetbrains.kotlin.fir.resolve.calls.*
-import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
 import org.jetbrains.kotlin.fir.resolve.calls.candidate.*
-import org.jetbrains.kotlin.fir.resolve.calls.candidate.CheckerSink
 import org.jetbrains.kotlin.fir.resolve.inference.csBuilder
 import org.jetbrains.kotlin.fir.resolve.inference.isAnyOfDelegateOperators
 import org.jetbrains.kotlin.fir.resolve.inference.model.ConeExplicitTypeParameterConstraintPosition
@@ -753,6 +751,8 @@
 
 internal fun Candidate.shouldHaveLowPriorityDueToSAM(bodyResolveComponents: BodyResolveComponents): Boolean {
     if (!usesSamConversion || isJavaApplicableCandidate()) return false
+    if (LanguageFeature.NoLowerPriorityForSamConversionOnJavaInterfaces.isEnabled(callInfo.session)) return false
+
     return argumentMapping.values.any {
         val coneType = it.returnTypeRef.coneType
         bodyResolveComponents.samResolver.isSamType(coneType) &&
diff --git a/compiler/testData/diagnostics/tests/j+k/sam/compatibilityResolveToOuterScopeForKotlinFunctions.fir.kt b/compiler/testData/diagnostics/tests/j+k/sam/compatibilityResolveToOuterScopeForKotlinFunctions.fir.kt
index 423d51c..a5e66e7 100644
--- a/compiler/testData/diagnostics/tests/j+k/sam/compatibilityResolveToOuterScopeForKotlinFunctions.fir.kt
+++ b/compiler/testData/diagnostics/tests/j+k/sam/compatibilityResolveToOuterScopeForKotlinFunctions.fir.kt
@@ -42,7 +42,7 @@
 
     fun test(f: () -> Unit) {
         val result = foo(1, f)
-        <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>result<!>
+        <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>result<!>
     }
 }
 
@@ -54,7 +54,7 @@
 
     fun test() {
         val result = foo(1, ::bar)
-        <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>result<!>
+        <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>result<!>
     }
 }
 
diff --git a/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.fir.kt b/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.fir.kt
new file mode 100644
index 0000000..75325d9
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.fir.kt
@@ -0,0 +1,24 @@
+// RUN_PIPELINE_TILL: FRONTEND
+// ISSUE: KT-48323
+
+// FILE: Jerry.java
+public interface Jerry {
+    void call(int i);
+}
+
+// FILE: Tom.kt
+fun interface Tom {
+    fun tom(i: Int)
+}
+
+fun foo(m: Tom) = 1
+fun foo(j: Jerry) = "2"
+fun test() {
+    val result = <!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!> { <!CANNOT_INFER_VALUE_PARAMETER_TYPE!>i<!> ->
+        val j = i + 1
+    }
+    <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Ambiguity: foo, [/foo, /foo]")!>result<!>
+}
+
+/* GENERATED_FIR_TAGS: additiveExpression, funInterface, functionDeclaration, integerLiteral, interfaceDeclaration,
+javaType, lambdaLiteral, localProperty, propertyDeclaration, samConversion, stringLiteral */
diff --git a/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.kt b/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.kt
index 0e38e21..2d64041 100644
--- a/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.kt
+++ b/compiler/testData/diagnostics/tests/j+k/sam/javaKotlinSamConflict.kt
@@ -1,5 +1,4 @@
-// RUN_PIPELINE_TILL: BACKEND
-// FIR_IDENTICAL
+// RUN_PIPELINE_TILL: FRONTEND
 // ISSUE: KT-48323
 
 // FILE: Jerry.java
diff --git a/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.fir.kt b/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.fir.kt
deleted file mode 100644
index 61cde3e..0000000
--- a/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.fir.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-// LANGUAGE: +DisableCompatibilityModeForNewInference
-// RUN_PIPELINE_TILL: FRONTEND
-// ISSUE: KT-78832
-// FILE: JavaTransformer.java
-
-public interface JavaTransformer<OUT, IN> {
-    OUT foo(IN i);
-}
-
-// FILE: main.kt
-fun interface Transformer<OUT, IN> {
-    fun foo(i: IN): OUT
-}
-
-class MyProvider<T>
-
-fun <T> bar(value: T): MyProvider<T> = null!! // (1)
-fun <T> bar(valueTransformer: Transformer<MyProvider<out T>, Any>): MyProvider<T> = null!! // (2)
-
-fun <T> baz(value: T): MyProvider<T> = null!! // (3)
-fun <T> baz(valueTransformer: JavaTransformer<MyProvider<out T>, Any>): MyProvider<T> = null!! // (4)
-
-fun boo(hoo: MyProvider<String>) {}
-
-fun foo(x: MyProvider<String>) {
-    val barRes = bar { x } // resolved to (2) both in K1 & K2
-    boo(barRes)
-
-    val bazRes = baz { x } // resolved to (3) in K2 and to (4) in K1 with +DisableCompatibilityModeForNewInference
-    boo(<!ARGUMENT_TYPE_MISMATCH!>bazRes<!>) // Error only in K2
-}
-
-/* GENERATED_FIR_TAGS: checkNotNullCall, classDeclaration, funInterface, functionDeclaration, interfaceDeclaration,
-javaType, lambdaLiteral, localProperty, nullableType, outProjection, propertyDeclaration, samConversion, typeParameter */
diff --git a/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.kt b/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.kt
index a664346..c20adb0 100644
--- a/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.kt
+++ b/compiler/testData/diagnostics/tests/j+k/sam/samVsGenericOverloads.kt
@@ -1,5 +1,6 @@
+// FIR_IDENTICAL
 // LANGUAGE: +DisableCompatibilityModeForNewInference
-// RUN_PIPELINE_TILL: FRONTEND
+// RUN_PIPELINE_TILL: BACKEND
 // ISSUE: KT-78832
 // FILE: JavaTransformer.java
 
diff --git a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.fir.kt b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.fir.kt
similarity index 81%
rename from compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.fir.kt
rename to compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.fir.kt
index d0d6b6d..b003a76 100644
--- a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.fir.kt
+++ b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.fir.kt
@@ -1,5 +1,4 @@
-// RUN_PIPELINE_TILL: BACKEND
-// LANGUAGE: +DisableCompatibilityModeForNewInference
+// RUN_PIPELINE_TILL: FRONTEND
 // SKIP_TXT
 // FULL_JDK
 
@@ -10,7 +9,7 @@
 
 fun main() {
     val x = bar() { foo() } // OK with default current 1.5/1.6, Error with DisableCompatibilityModeForNewInference enabled, Ok in K2
-    x.length
+    x.<!UNRESOLVED_REFERENCE!>length<!>
 }
 
 /* GENERATED_FIR_TAGS: functionDeclaration, functionalType, lambdaLiteral, localProperty, nullableType,
diff --git a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt
index 7c41497..b7d521d 100644
--- a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt
+++ b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt
@@ -1,5 +1,4 @@
-// RUN_PIPELINE_TILL: BACKEND
-// FIR_IDENTICAL
+// RUN_PIPELINE_TILL: FRONTEND
 // SKIP_TXT
 // FULL_JDK
 
diff --git a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt
index 8a5207f..852087e 100644
--- a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt
+++ b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt
@@ -1,4 +1,5 @@
-// RUN_PIPELINE_TILL: BACKEND
+// FIR_IDENTICAL
+// RUN_PIPELINE_TILL: FRONTEND
 // LANGUAGE: +DisableCompatibilityModeForNewInference
 // SKIP_TXT
 // FULL_JDK
diff --git a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.fir.kt b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.fir.kt
similarity index 77%
copy from compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.fir.kt
copy to compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.fir.kt
index d0d6b6d..f76b31a 100644
--- a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.fir.kt
+++ b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.fir.kt
@@ -1,5 +1,5 @@
-// RUN_PIPELINE_TILL: BACKEND
-// LANGUAGE: +DisableCompatibilityModeForNewInference
+// RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: -DisableCompatibilityModeForNewInference
 // SKIP_TXT
 // FULL_JDK
 
@@ -10,7 +10,7 @@
 
 fun main() {
     val x = bar() { foo() } // OK with default current 1.5/1.6, Error with DisableCompatibilityModeForNewInference enabled, Ok in K2
-    x.length
+    x.<!UNRESOLVED_REFERENCE!>length<!>
 }
 
 /* GENERATED_FIR_TAGS: functionDeclaration, functionalType, lambdaLiteral, localProperty, nullableType,
diff --git a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.kt b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.kt
index 5498a8c..6f3b0fb 100644
--- a/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.kt
+++ b/compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityEnabled.kt
@@ -1,5 +1,4 @@
-// RUN_PIPELINE_TILL: BACKEND
-// FIR_IDENTICAL
+// RUN_PIPELINE_TILL: FRONTEND
 // LANGUAGE: -DisableCompatibilityModeForNewInference
 // SKIP_TXT
 // FULL_JDK
diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
index 58c762f..653e451 100644
--- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
+++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
@@ -412,6 +412,8 @@
     // Even though this LF is not expected to be necessarily released via 2.2.x.
     CapturedTypeApproximationReworked(KOTLIN_2_2, "KT-79451"),
 
+    NoLowerPriorityForSamConversionOnJavaInterfaces(KOTLIN_2_2, "KT-78832"),
+
     // 2.3
 
     ForbidCompanionInLocalInnerClass(KOTLIN_2_3, enabledInProgressiveMode = true, "KT-47289"),