FIR: Temporary support FE 1.0 behavior for SAM vs. generic ambiguity
^KT-48300 Relates ^KT-48938 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
10c5d987d7
commit
056657525e
+12
@@ -25249,6 +25249,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samConversionsWithSmartCasts.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGeneric.kt")
|
||||
public void testSamPriorityVsGeneric() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGenericCompatibilityDisabled.kt")
|
||||
public void testSamPriorityVsGenericCompatibilityDisabled() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt")
|
||||
public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception {
|
||||
|
||||
+12
@@ -25249,6 +25249,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samConversionsWithSmartCasts.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGeneric.kt")
|
||||
public void testSamPriorityVsGeneric() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGenericCompatibilityDisabled.kt")
|
||||
public void testSamPriorityVsGenericCompatibilityDisabled() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt")
|
||||
public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception {
|
||||
|
||||
+12
@@ -25249,6 +25249,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samConversionsWithSmartCasts.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGeneric.kt")
|
||||
public void testSamPriorityVsGeneric() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGenericCompatibilityDisabled.kt")
|
||||
public void testSamPriorityVsGenericCompatibilityDisabled() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt")
|
||||
public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception {
|
||||
|
||||
+38
-7
@@ -5,26 +5,27 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirVisibilityChecker
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.matchingParameterFunctionType
|
||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||
import org.jetbrains.kotlin.fir.resolve.directExpansionType
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.*
|
||||
import org.jetbrains.kotlin.fir.resolve.isTypeMismatchDueToNullability
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirUnstableSmartcastTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
|
||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||
import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -351,12 +352,42 @@ internal object CheckArguments : CheckerStage() {
|
||||
context = context
|
||||
)
|
||||
}
|
||||
if (candidate.system.hasContradiction && callInfo.arguments.isNotEmpty()) {
|
||||
sink.yieldDiagnostic(InapplicableCandidate)
|
||||
|
||||
when {
|
||||
candidate.system.hasContradiction && callInfo.arguments.isNotEmpty() -> {
|
||||
sink.yieldDiagnostic(InapplicableCandidate)
|
||||
}
|
||||
candidate.usesSAM && !candidate.isJavaApplicableCandidate() -> {
|
||||
sink.markCandidateForCompatibilityResolve(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Candidate.isJavaApplicableCandidate(): Boolean {
|
||||
val symbol = symbol as? FirNamedFunctionSymbol ?: return false
|
||||
if (symbol.origin == FirDeclarationOrigin.Enhancement) return true
|
||||
if (originScope !is FirTypeScope) return false
|
||||
|
||||
var result = false
|
||||
|
||||
originScope.processOverriddenFunctions(symbol) {
|
||||
if (it.origin == FirDeclarationOrigin.Enhancement) {
|
||||
result = true
|
||||
ProcessorAction.STOP
|
||||
} else {
|
||||
ProcessorAction.NEXT
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private fun CheckerSink.markCandidateForCompatibilityResolve(context: ResolutionContext) {
|
||||
if (context.session.languageVersionSettings.supportsFeature(LanguageFeature.DisableCompatibilityModeForNewInference)) return
|
||||
reportDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
|
||||
}
|
||||
|
||||
internal object EagerResolveOfCallableReferences : CheckerStage() {
|
||||
override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) {
|
||||
if (candidate.postponedAtoms.isEmpty()) return
|
||||
@@ -368,7 +399,7 @@ internal object EagerResolveOfCallableReferences : CheckerStage() {
|
||||
sink.yieldDiagnostic(InapplicableCandidate)
|
||||
} else when (applicability) {
|
||||
CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY ->
|
||||
candidate.addDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
|
||||
sink.reportDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// SKIP_TXT
|
||||
// FIR_IDENTICAL
|
||||
// FULL_JDK
|
||||
|
||||
fun <T> bar(action: () -> T): T = action()
|
||||
fun bar(action: java.lang.Runnable) { }
|
||||
|
||||
fun foo(): String = ""
|
||||
|
||||
fun main() {
|
||||
val x = bar() { foo() } // OK with default current 1.5/1.6, Error with DisableCompatibilityModeForNewInference enabled
|
||||
x.length
|
||||
}
|
||||
Vendored
+14
@@ -0,0 +1,14 @@
|
||||
// !LANGUAGE: +DisableCompatibilityModeForNewInference
|
||||
// SKIP_TXT
|
||||
// FIR_IDENTICAL
|
||||
// FULL_JDK
|
||||
|
||||
fun <T> bar(action: () -> T): T = action()
|
||||
fun bar(action: java.lang.Runnable) { }
|
||||
|
||||
fun foo(): String = ""
|
||||
|
||||
fun main() {
|
||||
val x = bar() { foo() } // OK with default current 1.5/1.6, Error with DisableCompatibilityModeForNewInference enabled
|
||||
x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
Generated
+12
@@ -25261,6 +25261,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samConversionsWithSmartCasts.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGeneric.kt")
|
||||
public void testSamPriorityVsGeneric() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGeneric.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("samPriorityVsGenericCompatibilityDisabled.kt")
|
||||
public void testSamPriorityVsGenericCompatibilityDisabled() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/samConversions/samPriorityVsGenericCompatibilityDisabled.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("sameCandidatesFromKotlinAndJavaInOneScope.kt")
|
||||
public void testSameCandidatesFromKotlinAndJavaInOneScope() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user