K2: fix property VS field resolve in anonymous class case

Related to KT-55017, KT-50082
This commit is contained in:
Mikhail Glukhikh
2023-01-11 19:56:29 +01:00
committed by teamcity
parent 6a6308bef2
commit f20e5daa92
7 changed files with 79 additions and 1 deletions
@@ -3589,6 +3589,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/fieldPropertyShadow.kt");
}
@Test
@TestMetadata("javaFieldAndKotlinPropertyReferenceFromInner.kt")
public void testJavaFieldAndKotlinPropertyReferenceFromInner() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/javaFieldAndKotlinPropertyReferenceFromInner.kt");
}
@Test
@TestMetadata("propertyAndTwoFields.kt")
public void testPropertyAndTwoFields() throws Exception {
@@ -3166,6 +3166,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/fieldPropertyShadow.kt");
}
@TestMetadata("javaFieldAndKotlinPropertyReferenceFromInner.kt")
public void testJavaFieldAndKotlinPropertyReferenceFromInner() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/javaFieldAndKotlinPropertyReferenceFromInner.kt");
}
@TestMetadata("propertyAndTwoFields.kt")
public void testPropertyAndTwoFields() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/propertyAndTwoFields.kt");
@@ -0,0 +1,29 @@
FILE: test.kt
public final fun box(): R|kotlin/String| {
lval x: R|<anonymous>| = object : R|base/Jaba| {
private constructor(): R|<anonymous>| {
super<R|base/Jaba|>()
}
private final val a: R|kotlin/String| = String(OK)
private get(): R|kotlin/String|
local final inner class S : R|kotlin/Any| {
public <anonymous>.constructor(): R|<anonymous>.S| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/String| {
^foo this@R|/<anonymous>|.R|/<anonymous>.a|
}
}
public final fun bar(): R|kotlin/String| {
^bar this@R|/<anonymous>|.R|/<anonymous>.S.S|().R|<local>/foo|()
}
}
^box R|<local>/x|.R|/<anonymous>.bar|()
}
@@ -0,0 +1,25 @@
// FILE: Jaba.java
package base;
public class Jaba {
protected String a = "FAIL";
}
// FILE: test.kt
import base.Jaba
fun box(): String {
val x = object : Jaba() {
private val a: String = "OK"
inner class S {
// Should be resolved to a property
fun foo() = a
}
fun bar() = S().foo()
}
return x.bar()
}
@@ -3589,6 +3589,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest {
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/fieldPropertyShadow.kt");
}
@Test
@TestMetadata("javaFieldAndKotlinPropertyReferenceFromInner.kt")
public void testJavaFieldAndKotlinPropertyReferenceFromInner() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/javaFieldAndKotlinPropertyReferenceFromInner.kt");
}
@Test
@TestMetadata("propertyAndTwoFields.kt")
public void testPropertyAndTwoFields() throws Exception {
@@ -3589,6 +3589,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/fieldPropertyShadow.kt");
}
@Test
@TestMetadata("javaFieldAndKotlinPropertyReferenceFromInner.kt")
public void testJavaFieldAndKotlinPropertyReferenceFromInner() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/propertyVsField/javaFieldAndKotlinPropertyReferenceFromInner.kt");
}
@Test
@TestMetadata("propertyAndTwoFields.kt")
public void testPropertyAndTwoFields() throws Exception {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls.jvm
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.languageVersionSettings
@@ -84,7 +85,7 @@ class JvmPlatformOverloadsConflictResolver(
private fun ConeClassLikeLookupTag.strictlyDerivedFrom(other: ConeClassLikeLookupTag): Boolean {
if (this == other) return false
val session = inferenceComponents.session
val thisClass = this.toFirRegularClassSymbol(session)?.fir ?: return false
val thisClass = this.toSymbol(session)?.fir as? FirClass ?: return false
return thisClass.isSubclassOf(other, session, isStrict = true)
}