[FIR] Allow smartcasts on member properties for classes from dependsOn dependencies
This commit is contained in:
committed by
teamcity
parent
aeb68f956c
commit
851305f981
+6
@@ -20060,6 +20060,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("smartcastOnMemberPropertyFromCommonClass.kt")
|
||||||
|
public void testSmartcastOnMemberPropertyFromCommonClass() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+6
@@ -20060,6 +20060,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("smartcastOnMemberPropertyFromCommonClass.kt")
|
||||||
|
public void testSmartcastOnMemberPropertyFromCommonClass() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+6
@@ -20060,6 +20060,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("smartcastOnMemberPropertyFromCommonClass.kt")
|
||||||
|
public void testSmartcastOnMemberPropertyFromCommonClass() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+9
-2
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isFinal
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
import org.jetbrains.kotlin.fir.originalOrSelf
|
import org.jetbrains.kotlin.fir.originalOrSelf
|
||||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
@@ -190,7 +191,6 @@ class VariableStorageImpl(private val session: FirSession) : VariableStorage() {
|
|||||||
property.isVar -> PropertyStability.MUTABLE_PROPERTY
|
property.isVar -> PropertyStability.MUTABLE_PROPERTY
|
||||||
property.receiverTypeRef != null -> PropertyStability.PROPERTY_WITH_GETTER
|
property.receiverTypeRef != null -> PropertyStability.PROPERTY_WITH_GETTER
|
||||||
property.getter.let { it != null && it !is FirDefaultPropertyAccessor } -> PropertyStability.PROPERTY_WITH_GETTER
|
property.getter.let { it != null && it !is FirDefaultPropertyAccessor } -> PropertyStability.PROPERTY_WITH_GETTER
|
||||||
property.originalOrSelf().moduleData.session != session -> PropertyStability.ALIEN_PUBLIC_PROPERTY
|
|
||||||
property.modality != Modality.FINAL -> {
|
property.modality != Modality.FINAL -> {
|
||||||
val dispatchReceiver = (originalFir.unwrapElement() as? FirQualifiedAccess)?.dispatchReceiver ?: return null
|
val dispatchReceiver = (originalFir.unwrapElement() as? FirQualifiedAccess)?.dispatchReceiver ?: return null
|
||||||
val receiverType = dispatchReceiver.typeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session) ?: return null
|
val receiverType = dispatchReceiver.typeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session) ?: return null
|
||||||
@@ -201,7 +201,14 @@ class VariableStorageImpl(private val session: FirSession) : VariableStorage() {
|
|||||||
else -> throw IllegalStateException("Should not be here: $receiverFir")
|
else -> throw IllegalStateException("Should not be here: $receiverFir")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> PropertyStability.STABLE_VALUE
|
else -> {
|
||||||
|
val propertyModuleData = property.originalOrSelf().moduleData
|
||||||
|
val currentModuleData = session.moduleData
|
||||||
|
when (propertyModuleData) {
|
||||||
|
currentModuleData, in currentModuleData.dependsOnDependencies -> PropertyStability.STABLE_VALUE
|
||||||
|
else -> PropertyStability.ALIEN_PUBLIC_PROPERTY
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// MODULE: common
|
||||||
|
class Some {
|
||||||
|
val e: SomeEnum? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class SomeEnum {
|
||||||
|
A, B
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: main()()(common)
|
||||||
|
fun Some.test() {
|
||||||
|
if (e == null) return
|
||||||
|
val x = when (e) {
|
||||||
|
SomeEnum.A -> "a"
|
||||||
|
SomeEnum.B -> "B"
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// MODULE: common
|
||||||
|
class Some {
|
||||||
|
val e: SomeEnum? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class SomeEnum {
|
||||||
|
A, B
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: main()()(common)
|
||||||
|
fun Some.test() {
|
||||||
|
if (e == null) return
|
||||||
|
val x = when (<!DEBUG_INFO_SMARTCAST!>e<!>) {
|
||||||
|
SomeEnum.A -> "a"
|
||||||
|
SomeEnum.B -> "B"
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+65
@@ -0,0 +1,65 @@
|
|||||||
|
// -- Module: <common> --
|
||||||
|
package
|
||||||
|
|
||||||
|
public final class Some {
|
||||||
|
public constructor Some()
|
||||||
|
public final val e: SomeEnum? = null
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final enum class SomeEnum : kotlin.Enum<SomeEnum> {
|
||||||
|
enum entry A
|
||||||
|
|
||||||
|
enum entry B
|
||||||
|
|
||||||
|
private constructor SomeEnum()
|
||||||
|
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||||
|
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||||
|
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||||
|
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: SomeEnum): kotlin.Int
|
||||||
|
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
|
||||||
|
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<SomeEnum!>!
|
||||||
|
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|
||||||
|
// Static members
|
||||||
|
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): SomeEnum
|
||||||
|
public final /*synthesized*/ fun values(): kotlin.Array<SomeEnum>
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Module: <main> --
|
||||||
|
package
|
||||||
|
|
||||||
|
public fun Some.test(): kotlin.Unit
|
||||||
|
|
||||||
|
public final class Some {
|
||||||
|
public constructor Some()
|
||||||
|
public final val e: SomeEnum? = null
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final enum class SomeEnum : kotlin.Enum<SomeEnum> {
|
||||||
|
enum entry A
|
||||||
|
|
||||||
|
enum entry B
|
||||||
|
|
||||||
|
private constructor SomeEnum()
|
||||||
|
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||||
|
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||||
|
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||||
|
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: SomeEnum): kotlin.Int
|
||||||
|
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
|
||||||
|
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<SomeEnum!>!
|
||||||
|
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|
||||||
|
// Static members
|
||||||
|
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): SomeEnum
|
||||||
|
public final /*synthesized*/ fun values(): kotlin.Array<SomeEnum>
|
||||||
|
}
|
||||||
Generated
+6
@@ -20066,6 +20066,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/sealedTypeAliasTopLevel.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("smartcastOnMemberPropertyFromCommonClass.kt")
|
||||||
|
public void testSmartcastOnMemberPropertyFromCommonClass() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
Reference in New Issue
Block a user