FIR: Temporary support FE 1.0 behavior for SAM vs. generic ambiguity

^KT-48300 Relates
^KT-48938 Fixed
This commit is contained in:
Denis.Zharkov
2021-10-08 21:06:09 +03:00
committed by TeamCityServer
parent 10c5d987d7
commit 056657525e
7 changed files with 113 additions and 7 deletions
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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
}
@@ -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<!>
}
@@ -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 {