[FIR] Support enhancing intersection overrides

When a type annotated with @PurelyImplements (explicitly or implicitly)
inherited some methods from a java supertype and the purely implemented
Kotlin supertype, it was inconsistent which of the signatures the
intersection override would have (with or without flexible types).
This commit adds support for the enhancement of intersection overrides.
If one of the overridden methods has non-flexible types, the enhanced
method will have non-flexible types.
This fixes some false negative nullability type mismatches.

#KT-59921 Fixed
This commit is contained in:
Kirill Rakhman
2024-01-17 10:14:44 +01:00
committed by Space Team
parent 3b841dcb98
commit 9ec0210c04
19 changed files with 159 additions and 47 deletions
@@ -19298,6 +19298,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -19298,6 +19298,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -19287,6 +19287,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -19287,6 +19287,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -19287,6 +19287,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -162,26 +162,18 @@ class FirSignatureEnhancement(
is FirSyntheticProperty -> {
val accessorSymbol = firElement.symbol
val getterDelegate = firElement.getter.delegate
val enhancedGetterSymbol = if (getterDelegate.isJava) {
enhancementsCache.enhancedFunctions.getValue(getterDelegate.symbol, this to getterDelegate.name)
} else {
getterDelegate.symbol
}
val enhancedGetterSymbol = getterDelegate.enhanceAccessorOrNull()
val setterDelegate = firElement.setter?.delegate
val enhancedSetterSymbol = if (setterDelegate?.isJava == true) {
enhancementsCache.enhancedFunctions.getValue(setterDelegate.symbol, this to setterDelegate.name)
} else {
setterDelegate?.symbol
}
if (!getterDelegate.isJava && setterDelegate?.isJava != true) {
val enhancedSetterSymbol = setterDelegate?.enhanceAccessorOrNull()
if (enhancedGetterSymbol == null && enhancedSetterSymbol == null) {
return original
}
return buildSyntheticProperty {
moduleData = this@FirSignatureEnhancement.moduleData
this.name = name
symbol = FirJavaOverriddenSyntheticPropertySymbol(accessorSymbol.callableId, accessorSymbol.getterId)
delegateGetter = enhancedGetterSymbol.fir as FirSimpleFunction
delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction?
delegateGetter = enhancedGetterSymbol?.fir as FirSimpleFunction? ?: getterDelegate
delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction? ?: setterDelegate
status = firElement.status
deprecationsProvider = getDeprecationsProviderFromAccessors(session, delegateGetter, delegateSetter)
}.symbol
@@ -195,19 +187,43 @@ class FirSignatureEnhancement(
}
}
private fun FirSimpleFunction.enhanceAccessorOrNull(): FirFunctionSymbol<*>? {
if (!symbol.isEnhanceable()) return null
return enhancedFunction(symbol, name)
}
@PrivateForInline
internal fun enhance(
original: FirFunctionSymbol<*>,
name: Name?
name: Name?,
): FirFunctionSymbol<*> {
val firMethod = original.fir
if (!firMethod.isJava) {
if (!original.isEnhanceable()) {
return original
}
val firMethod = original.fir
val enhancedParameters = enhanceTypeParameterBoundsForMethod(firMethod)
return enhanceMethod(firMethod, original.callableId, name, enhancedParameters)
return enhanceMethod(firMethod, original.callableId, name, enhancedParameters, original is FirIntersectionOverrideFunctionSymbol)
}
private fun FirCallableSymbol<*>.isEnhanceable(): Boolean {
return origin is FirDeclarationOrigin.Java || isEnhanceableIntersection()
}
/**
* Intersection overrides with Java and Kotlin overridden symbols need to be enhanced so that we get non-flexible types
* in the signature.
* This is required for @PurelyImplements to work properly.
*
* We only enhance intersection overrides if their dispatch receiver is equal to [owner], i.e. we don't enhance inherited
* intersection overrides.
*
* See compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt.
*/
private fun FirCallableSymbol<*>.isEnhanceableIntersection(): Boolean {
return this is FirIntersectionCallableSymbol &&
dispatchReceiverClassLookupTagOrNull() == owner.symbol.toLookupTag() &&
unwrapFakeOverrides<FirCallableSymbol<*>>().origin is FirDeclarationOrigin.Enhancement
}
/**
@@ -219,6 +235,7 @@ class FirSignatureEnhancement(
methodId: CallableId,
name: Name?,
enhancedTypeParameters: List<FirTypeParameterRef>?,
isIntersectionOverride: Boolean,
): FirFunctionSymbol<*> {
val predefinedEnhancementInfo =
SignatureBuildingComponents.signature(
@@ -253,7 +270,7 @@ class FirSignatureEnhancement(
if (hasReceiver && index == 0) continue
enhancedValueParameterTypes += enhanceValueParameterType(
firMethod, overriddenMembers, hasReceiver,
defaultQualifiers, predefinedEnhancementInfo, valueParameter as FirJavaValueParameter,
defaultQualifiers, predefinedEnhancementInfo, valueParameter,
if (hasReceiver) index - 1 else index
)
}
@@ -263,6 +280,8 @@ class FirSignatureEnhancement(
val typeParameterSubstitutionMap = mutableMapOf<FirTypeParameterSymbol, ConeKotlinType>()
var typeParameterSubstitutor: ConeSubstitutorByMap? = null
val declarationOrigin =
if (isIntersectionOverride) FirDeclarationOrigin.IntersectionOverride else FirDeclarationOrigin.Enhancement
val function = when (firMethod) {
is FirConstructor -> {
@@ -300,7 +319,7 @@ class FirSignatureEnhancement(
source = firMethod.source
moduleData = this@FirSignatureEnhancement.moduleData
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = FirDeclarationOrigin.Enhancement
origin = declarationOrigin
// TODO: we should set a new origin / containing declaration to type parameters (KT-60440)
this.typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters)
}
@@ -310,11 +329,15 @@ class FirSignatureEnhancement(
FirSimpleFunctionBuilder().apply {
source = firMethod.source
moduleData = this@FirSignatureEnhancement.moduleData
origin = FirDeclarationOrigin.Enhancement
origin = declarationOrigin
this.name = name!!
status = firMethod.status
symbol = FirNamedFunctionSymbol(methodId).also { functionSymbol = it }
symbol = if (isIntersectionOverride) {
FirIntersectionOverrideFunctionSymbol(methodId, overriddenMembers.map { it.symbol })
} else {
FirNamedFunctionSymbol(methodId)
}.also { functionSymbol = it }
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
typeParameters += (enhancedTypeParameters ?: firMethod.typeParameters).map { typeParameter ->
// FirJavaMethod contains only FirTypeParameter so [enhancedTypeParameters] must have the same type
@@ -324,7 +347,7 @@ class FirSignatureEnhancement(
// TODO: we probably shouldn't build a copy second time. See performFirstRoundOfBoundsResolution (KT-60446)
val newTypeParameter = buildTypeParameterCopy(typeParameter) {
origin = FirDeclarationOrigin.Enhancement
origin = declarationOrigin
symbol = FirTypeParameterSymbol()
containingDeclarationSymbol = functionSymbol
}
@@ -372,7 +395,7 @@ class FirSignatureEnhancement(
source = valueParameter.source
containingFunctionSymbol = functionSymbol
moduleData = this@FirSignatureEnhancement.moduleData
origin = FirDeclarationOrigin.Enhancement
origin = declarationOrigin
returnTypeRef = enhancedReturnType.withReplacedConeType(
typeParameterSubstitutor?.substituteOrNull(enhancedReturnType.coneType)
)
@@ -590,7 +613,7 @@ class FirSignatureEnhancement(
hasReceiver: Boolean,
defaultQualifiers: JavaTypeQualifiersByElementType?,
predefinedEnhancementInfo: PredefinedFunctionEnhancementInfo?,
ownerParameter: FirJavaValueParameter,
ownerParameter: FirValueParameter,
index: Int
): FirResolvedTypeRef {
return ownerFunction.enhanceValueParameter(
@@ -0,0 +1,30 @@
// TARGET_BACKEND: JVM
// MODULE: lib
// FILE: KtWhenExpression.java
public class KtWhenExpression extends KtExpressionImpl {}
// FILE: KtExpressionImpl.kt
abstract class KtExpressionImpl : PsiElementBase(), PsiElement {}
// FILE: PsiElementBase.java
public abstract class PsiElementBase implements PsiElement {
@Override
public String getProject() { return ""; }
}
// FILE: PsiElement.java
public interface PsiElement {
String getProject();
}
// MODULE: box(lib)
// FILE: box.kt
private fun test(expression: KtWhenExpression) {
expression.project
}
fun box(): String {
test(KtWhenExpression())
return "OK"
}
@@ -23,8 +23,8 @@ fun bar(): String? = null
fun foo() {
var x = A<String>()
x.add(null)
x.add(bar())
x.add(<!NULL_FOR_NONNULL_TYPE!>null<!>)
x.add(<!ARGUMENT_TYPE_MISMATCH!>bar()<!>)
x.add("")
val b1: Collection<String?> = x
@@ -23,8 +23,8 @@ fun bar(): String? = null
fun foo() {
var x = A<String>()
x.add(null)
x.add(bar())
x.add(<!NULL_FOR_NONNULL_TYPE!>null<!>)
x.add(<!ARGUMENT_TYPE_MISMATCH!>bar()<!>)
x.add("")
x[0] = <!NULL_FOR_NONNULL_TYPE!>null<!>
@@ -35,8 +35,8 @@ fun fooTreeSet() {
fun fooLinkedHashSet() {
var x = LinkedHashSet<String>()
x.add(null)
x.add(bar())
x.add(<!NULL_FOR_NONNULL_TYPE!>null<!>)
x.add(<!ARGUMENT_TYPE_MISMATCH!>bar()<!>)
x.add("")
val b1: MutableSet<String?> = <!INITIALIZER_TYPE_MISMATCH!>x<!>
@@ -166,11 +166,11 @@ FILE fqName:<root> fileName:/ArrayListOverrides.kt
overridden:
public open fun hashCode (): kotlin.Int declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractList<@[FlexibleNullability] kotlin.String?>
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>) returnType:kotlin.Boolean [fake_override]
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>) returnType:kotlin.Boolean [fake_override]
overridden:
public open fun containsAll (p0: kotlin.collections.Collection<@[FlexibleNullability] E of java.util.ArrayList?>): kotlin.Boolean declared in java.util.ArrayList
public open fun containsAll (p0: kotlin.collections.Collection<@[EnhancedNullability] E of java.util.ArrayList>): kotlin.Boolean declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>) returnType:@[EnhancedNullability] kotlin.String [fake_override]
overridden:
public open fun toString (): @[EnhancedNullability] kotlin.String declared in java.util.ArrayList
@@ -358,11 +358,11 @@ FILE fqName:<root> fileName:/ArrayListOverrides.kt
overridden:
public open fun hashCode (): kotlin.Int declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractList<@[FlexibleNullability] kotlin.String?>
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>) returnType:kotlin.Boolean [fake_override]
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>, p0:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>) returnType:kotlin.Boolean [fake_override]
overridden:
public open fun containsAll (p0: kotlin.collections.Collection<@[FlexibleNullability] E of java.util.ArrayList?>): kotlin.Boolean declared in java.util.ArrayList
public open fun containsAll (p0: kotlin.collections.Collection<@[EnhancedNullability] E of java.util.ArrayList>): kotlin.Boolean declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[FlexibleNullability] kotlin.String?>
VALUE_PARAMETER name:p0 index:0 type:kotlin.collections.Collection<@[EnhancedNullability] kotlin.String>
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:java.util.AbstractCollection<@[FlexibleNullability] kotlin.String?>) returnType:@[EnhancedNullability] kotlin.String [fake_override]
overridden:
public open fun toString (): @[EnhancedNullability] kotlin.String declared in java.util.ArrayList
@@ -51,10 +51,10 @@ class A1 : ArrayList<String> {
/* fake */ override operator fun contains(p0: @EnhancedNullability String): Boolean
// CHECK JVM_IR:
// Mangled name: A1#containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
// Public signature: /A1.containsAll|1049727718390523309[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<String?>): Boolean
// Mangled name: A1#containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
// Public signature: /A1.containsAll|3856626117350599597[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<@EnhancedNullability String>): Boolean
// CHECK:
// Mangled name: A1#ensureCapacity(kotlin.Int){}
@@ -290,10 +290,10 @@ class A2 : ArrayList<String> {
/* fake */ override operator fun contains(p0: @EnhancedNullability String): Boolean
// CHECK JVM_IR:
// Mangled name: A2#containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
// Public signature: /A2.containsAll|1049727718390523309[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String?>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<String?>): Boolean
// Mangled name: A2#containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
// Public signature: /A2.containsAll|3856626117350599597[0]
// Public signature debug description: containsAll(kotlin.collections.Collection<kotlin.String{EnhancedNullability}>){}kotlin.Boolean
/* fake */ override fun containsAll(p0: Collection<@EnhancedNullability String>): Boolean
// CHECK:
// Mangled name: A2#ensureCapacity(kotlin.Int){}
@@ -205,7 +205,7 @@ FILE fqName:<root> fileName:/MultiList.kt
FUN FAKE_OVERRIDE name:containsAll visibility:public modality:OPEN <> ($this:kotlin.collections.List<<root>.Some<T of <root>.SomeList>>, elements:kotlin.collections.Collection<<root>.Some<T of <root>.SomeList>>) returnType:kotlin.Boolean [fake_override]
overridden:
public abstract fun containsAll (elements: kotlin.collections.Collection<<root>.Some<T of <root>.MyList>>): kotlin.Boolean declared in <root>.MyList
public open fun containsAll (p0: kotlin.collections.Collection<@[FlexibleNullability] E of java.util.ArrayList?>): kotlin.Boolean declared in java.util.ArrayList
public open fun containsAll (p0: kotlin.collections.Collection<@[EnhancedNullability] E of java.util.ArrayList>): kotlin.Boolean declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.List<<root>.Some<T of <root>.SomeList>>
VALUE_PARAMETER name:elements index:0 type:kotlin.collections.Collection<<root>.Some<T of <root>.SomeList>>
FUN FAKE_OVERRIDE name:get visibility:public modality:OPEN <> ($this:kotlin.collections.List<<root>.Some<T of <root>.SomeList>>, index:kotlin.Int) returnType:<root>.Some<T of <root>.SomeList> [fake_override,operator]
+1 -1
View File
@@ -27,7 +27,7 @@ FILE fqName:<root> fileName:/builtinMap.kt
$receiver: VALUE_PARAMETER name:$this$apply type:java.util.LinkedHashMap<@[FlexibleNullability] K1 of <root>.plus?, @[FlexibleNullability] V1 of <root>.plus?>
BLOCK_BODY
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
CALL 'public open fun put (p0: @[FlexibleNullability] K of java.util.LinkedHashMap?, p1: @[FlexibleNullability] V of java.util.LinkedHashMap?): V of java.util.LinkedHashMap? declared in java.util.LinkedHashMap' type=V1 of <root>.plus? origin=null
CALL 'public open fun put (p0: @[EnhancedNullability] K of java.util.LinkedHashMap, p1: @[EnhancedNullability] V of java.util.LinkedHashMap): V of java.util.LinkedHashMap? declared in java.util.LinkedHashMap' type=V1 of <root>.plus? origin=null
$this: GET_VAR '$this$apply: java.util.LinkedHashMap<@[FlexibleNullability] K1 of <root>.plus?, @[FlexibleNullability] V1 of <root>.plus?> declared in <root>.plus.<anonymous>' type=java.util.LinkedHashMap<@[FlexibleNullability] K1 of <root>.plus?, @[FlexibleNullability] V1 of <root>.plus?> origin=null
p0: CALL 'public final fun <get-first> (): A of kotlin.Pair declared in kotlin.Pair' type=K1 of <root>.plus origin=GET_PROPERTY
$this: GET_VAR 'pair: kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> declared in <root>.plus' type=kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> origin=null
@@ -19287,6 +19287,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -18453,6 +18453,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kt49371.kt")
public void testKt49371() throws Exception {
@@ -19287,6 +19287,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -19287,6 +19287,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@Test
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@Test
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
@@ -16069,6 +16069,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/fakeOverride/intersectionOverrideBetweenValAndVar.kt");
}
@TestMetadata("javaInheritsKotlinIntersectionOverride.kt")
public void testJavaInheritsKotlinIntersectionOverride() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/javaInheritsKotlinIntersectionOverride.kt");
}
@TestMetadata("kjkWithPackagePrivate.kt")
public void testKjkWithPackagePrivate() throws Exception {
runTest("compiler/testData/codegen/box/fakeOverride/kjkWithPackagePrivate.kt");