[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:
committed by
Space Team
parent
3b841dcb98
commit
9ec0210c04
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+48
-25
@@ -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(
|
||||
|
||||
+30
@@ -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"
|
||||
}
|
||||
+2
-2
@@ -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
|
||||
|
||||
+2
-2
@@ -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<!>
|
||||
|
||||
+2
-2
@@ -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
@@ -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
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user