diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index e727a03bf78..66029ad14c9 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -58,6 +58,7 @@ class JavaClassUseSiteMemberScope( klass.symbol.toLookupTag(), session, JavaOverrideChecker(session, klass.javaTypeParameterStack, superTypeScopes, considerReturnTypeKinds = true), + overrideCheckerForIntersection = null, superTypeScopes, klass.defaultType(), declaredMemberScope diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt index d169bd69ff9..68b359f6cec 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt @@ -15,20 +15,38 @@ import org.jetbrains.kotlin.fir.scopes.PlatformSpecificOverridabilityRules import org.jetbrains.kotlin.fir.unwrapFakeOverrides class JavaOverridabilityRules(session: FirSession) : PlatformSpecificOverridabilityRules { + // Note: return types (considerReturnTypeKinds) look not important when attempting intersection + // From the other side, they can break relevant tests like intersectionWithJavaVoidNothing.kt + // The similar case exists in bootstrap (see IrSimpleBuiltinOperatorDescriptorImpl) private val javaOverrideChecker = - JavaOverrideChecker(session, JavaTypeParameterStack.EMPTY, baseScopes = null, considerReturnTypeKinds = true) + JavaOverrideChecker(session, JavaTypeParameterStack.EMPTY, baseScopes = null, considerReturnTypeKinds = false) override fun isOverriddenFunction(overrideCandidate: FirSimpleFunction, baseDeclaration: FirSimpleFunction): Boolean? { - if (!overrideCandidate.isFromJava() || !baseDeclaration.isFromJava()) return null - - return javaOverrideChecker.isOverriddenFunction(overrideCandidate, baseDeclaration) + return if (shouldApplyJavaChecker(overrideCandidate, baseDeclaration)) { + // takeIf is questionable here (JavaOverrideChecker can forbid overriding, but it cannot allow it on own behalf) + // Known influenced tests: supertypeDifferentParameterNullability.kt became partially green without it + javaOverrideChecker.isOverriddenFunction(overrideCandidate, baseDeclaration).takeIf { !it } + } else { + null + } } override fun isOverriddenProperty(overrideCandidate: FirCallableDeclaration, baseDeclaration: FirProperty): Boolean? { - if (!overrideCandidate.isFromJava() || !baseDeclaration.isFromJava()) return null - - return javaOverrideChecker.isOverriddenProperty(overrideCandidate, baseDeclaration) + return if (shouldApplyJavaChecker(overrideCandidate, baseDeclaration)) { + javaOverrideChecker.isOverriddenProperty(overrideCandidate, baseDeclaration) + } else { + null + } } - private fun FirCallableDeclaration.isFromJava(): Boolean = unwrapFakeOverrides().origin == FirDeclarationOrigin.Enhancement + private fun shouldApplyJavaChecker(overrideCandidate: FirCallableDeclaration, baseDeclaration: FirCallableDeclaration): Boolean { + return when { + // One candidate with Java original is enough to apply Java checker, + // otherwise e.g. primitive type comparisons do not work + overrideCandidate.isOriginallyFromJava() || baseDeclaration.isOriginallyFromJava() -> true + else -> false + } + } + + private fun FirCallableDeclaration.isOriginallyFromJava(): Boolean = unwrapFakeOverrides().origin == FirDeclarationOrigin.Enhancement } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt index 3d4a2934e0f..2ccecf52103 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverrideChecker.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptorRepresentation import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.unwrapFakeOverrides import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment @@ -80,6 +81,7 @@ class JavaOverrideChecker internal constructor( substitutor: ConeSubstitutor, forceBoxCandidateType: Boolean, forceBoxBaseType: Boolean, + dontComparePrimitivity: Boolean, ): Boolean { val candidateType = candidateTypeRef.toConeKotlinTypeProbablyFlexible(session, javaTypeParameterStack) val baseType = baseTypeRef.toConeKotlinTypeProbablyFlexible(session, javaTypeParameterStack) @@ -87,7 +89,8 @@ class JavaOverrideChecker internal constructor( val candidateTypeIsPrimitive = !forceBoxCandidateType && candidateType.isPrimitiveInJava(isReturnType = false) val baseTypeIsPrimitive = !forceBoxBaseType && baseType.isPrimitiveInJava(isReturnType = false) - return candidateTypeIsPrimitive == baseTypeIsPrimitive && isEqualTypes(candidateType, baseType, substitutor) + return (dontComparePrimitivity || candidateTypeIsPrimitive == baseTypeIsPrimitive) && + isEqualTypes(candidateType, baseType, substitutor) } // In most cases checking erasure of value parameters should be enough, but in some cases there might be semi-valid Java hierarchies @@ -234,19 +237,7 @@ class JavaOverrideChecker internal constructor( overrideCandidate.lazyResolveToPhase(FirResolvePhase.TYPES) baseDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES) - // NB: overrideCandidate is from Java and has no receiver - val receiverTypeRef = baseDeclaration.receiverParameter?.typeRef - val baseParameterTypes = listOfNotNull(receiverTypeRef) + baseDeclaration.valueParameters.map { it.returnTypeRef } - - if (overrideCandidate.valueParameters.size != baseParameterTypes.size) return false - val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) - - val forceBoxOverrideParameterType = forceSingleValueParameterBoxing(overrideCandidate) - val forceBoxBaseParameterType = forceSingleValueParameterBoxing(baseDeclaration) - - if (!overrideCandidate.valueParameters.zip(baseParameterTypes).all { (paramFromJava, baseType) -> - isEqualTypes(paramFromJava.returnTypeRef, baseType, substitutor, forceBoxOverrideParameterType, forceBoxBaseParameterType) - }) { + if (!overrideCandidate.hasSameValueParameterTypes(baseDeclaration)) { return false } @@ -266,6 +257,43 @@ class JavaOverrideChecker internal constructor( return true } + private fun FirSimpleFunction.hasSameValueParameterTypes(other: FirSimpleFunction): Boolean { + // NB: 'this' is counted as a Java method that cannot have a receiver + val otherValueParameterTypes = other.collectValueParameterTypes() + val valueParameterTypes = valueParameters.map { it.returnTypeRef } + if (valueParameterTypes.size != otherValueParameterTypes.size) return false + + val substitutor = buildTypeParametersSubstitutorIfCompatible(this, other) + val forceBoxValueParameterType = forceSingleValueParameterBoxing(this) + val forceBoxOtherValueParameterType = forceSingleValueParameterBoxing(other) + val otherUnwrappedValueParameterTypes = other.unwrapFakeOverrides().collectValueParameterTypes() + val unwrappedValueParameterTypes = unwrapFakeOverrides().valueParameters.map { it.returnTypeRef } + + for (i in valueParameterTypes.indices) { + if (!isEqualTypes( + candidateTypeRef = valueParameterTypes[i], + baseTypeRef = otherValueParameterTypes[i], + substitutor = substitutor, + forceBoxCandidateType = forceBoxValueParameterType, + forceBoxBaseType = forceBoxOtherValueParameterType, + // This very hacky place is needed to match K1 logic + // See triangleWithFlexibleTypeAndSubstitution4.kt and neighbor tests + // The idea: normally in Java primitive type does not match non-primitive one + // However, if *both* types were constructed as generic substitutions, + // this check can (and should) be omitted + dontComparePrimitivity = otherUnwrappedValueParameterTypes.getOrNull(i)?.isTypeParameterDependent() == true && + unwrappedValueParameterTypes.getOrNull(i)?.isTypeParameterDependent() == true, + ) + ) return false + } + return true + } + + private fun FirSimpleFunction.collectValueParameterTypes(): List { + val receiverTypeRef = receiverParameter?.typeRef + return listOfNotNull(receiverTypeRef) + valueParameters.map { it.returnTypeRef } + } + override fun isOverriddenProperty(overrideCandidate: FirCallableDeclaration, baseDeclaration: FirProperty): Boolean { if (baseDeclaration.modality == Modality.FINAL) return false @@ -282,7 +310,8 @@ class JavaOverrideChecker internal constructor( if (overrideCandidate.valueParameters.size != 1) return false return isEqualTypes( receiverTypeRef, overrideCandidate.valueParameters.single().returnTypeRef, ConeSubstitutor.Empty, - forceBoxCandidateType = false, forceBoxBaseType = false + forceBoxCandidateType = false, forceBoxBaseType = false, + dontComparePrimitivity = false, ) } } @@ -293,7 +322,8 @@ class JavaOverrideChecker internal constructor( overrideReceiverTypeRef == null -> false else -> isEqualTypes( receiverTypeRef, overrideReceiverTypeRef, ConeSubstitutor.Empty, - forceBoxCandidateType = false, forceBoxBaseType = false + forceBoxCandidateType = false, forceBoxBaseType = false, + dontComparePrimitivity = false, ) } } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index 2aff19d2cb8..b7bcc4043cf 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -18,13 +18,18 @@ import org.jetbrains.kotlin.name.Name abstract class AbstractFirUseSiteMemberScope( val ownerClassLookupTag: ConeClassLikeLookupTag, session: FirSession, - overrideChecker: FirOverrideChecker, + overrideCheckerForBaseClass: FirOverrideChecker, + // null means "use overrideCheckerForBaseClass" + overrideCheckerForIntersection: FirOverrideChecker?, protected val superTypeScopes: List, dispatchReceiverType: ConeSimpleKotlinType, protected val declaredMemberScope: FirContainingNamesAwareScope -) : AbstractFirOverrideScope(session, overrideChecker) { - protected val supertypeScopeContext = - FirTypeIntersectionScopeContext(session, overrideChecker, superTypeScopes, dispatchReceiverType, forClassUseSiteScope = true) +) : AbstractFirOverrideScope(session, overrideCheckerForBaseClass) { + protected val supertypeScopeContext = FirTypeIntersectionScopeContext( + session, + overrideCheckerForIntersection ?: overrideCheckerForBaseClass, + superTypeScopes, dispatchReceiverType, forClassUseSiteScope = true + ) private val functions: MutableMap> = hashMapOf() diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt index 7adef0cfa04..1292d9e4b42 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope +import org.jetbrains.kotlin.fir.scopes.FirIntersectionScopeOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.firOverrideChecker import org.jetbrains.kotlin.fir.symbols.impl.* @@ -24,6 +25,11 @@ class FirClassUseSiteMemberScope( klass.symbol.toLookupTag(), session, session.firOverrideChecker, + // The checker here is used for matching supertype intersections + // If we came here from platform (e.g. Native), we use a platform override checker + // JavaClassUseSiteMemberScope also uses its own JavaOverrideChecker here + // Otherwise we should use a special intersection checker (similar one is used in FirTypeIntersectionScope) + session.firOverrideChecker.takeIf { it !is FirStandardOverrideChecker } ?: FirIntersectionScopeOverrideChecker(session), superTypeScopes, klass.defaultType(), declaredMemberScope diff --git a/compiler/testData/codegen/box/fir/primitiveDoubleJavaKotlinIntersection.kt b/compiler/testData/codegen/box/fir/primitiveDoubleJavaKotlinIntersection.kt index 61fd54c2679..36b8b307480 100644 --- a/compiler/testData/codegen/box/fir/primitiveDoubleJavaKotlinIntersection.kt +++ b/compiler/testData/codegen/box/fir/primitiveDoubleJavaKotlinIntersection.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM_IR -// IGNORE_BACKEND_K2: JVM_IR // IGNORE_LIGHT_ANALYSIS // (Unresolved reference: B supertype in C declaration) // ISSUE: KT-63242 diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.kt deleted file mode 100644 index 21294c9a4ed..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.kt +++ /dev/null @@ -1,20 +0,0 @@ -// ISSUE: KT-62554 -// FIR_DUMP -// SCOPE_DUMP: C:foo -// FILE: A.java - -public class A { - public void foo(Integer x) {} -} - -// FILE: main.kt - -interface B { - fun foo(x: Int) {} -} - -class C : A(), B - -fun main() { - C().foo(42) -} diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.overrides.txt deleted file mode 100644 index dc1e11d9954..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.overrides.txt +++ /dev/null @@ -1,4 +0,0 @@ -C: - [IntersectionOverride]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/Unit| from Use site scope of /C [id: 0] - [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/Unit| from Java enhancement scope for /A [id: 1] - [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/Unit| from Use site scope of /B [id: 2] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.txt index a2dba251a7b..a948d0f17c3 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.txt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.fir.txt @@ -11,5 +11,5 @@ FILE: main.kt } public final fun main(): R|kotlin/Unit| { - R|/C.C|().R|/A.foo|(Int(42)) + R|/C.C|().R|/B.foo|(Int(42)) } diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.kt index c4252edc76b..db22852a22a 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: C:foo diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.overrides.txt new file mode 100644 index 00000000000..80fc9643069 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleType.overrides.txt @@ -0,0 +1,6 @@ +C: + [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/Unit| from Use site scope of /C [id: 0] + [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/Unit| from Java enhancement scope for /A [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/Unit| from Use site scope of /C [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/Unit| from Use site scope of /B [id: 0] + diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.fir.kt deleted file mode 100644 index 9c60f71b716..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// ISSUE: KT-62554 -// FIR_DUMP -// SCOPE_DUMP: D:foo -// FILE: A.java - -public class A { - public T foo(Integer x) { - return "A"; - } -} - -// FILE: main.kt - -interface B { - fun foo(x: Int) = "B" -} - -open class C : A() - -class D : C(), B - -fun main() { - D().foo(42) -} diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.fir.overrides.txt deleted file mode 100644 index 9dc45a0d090..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.fir.overrides.txt +++ /dev/null @@ -1,6 +0,0 @@ -D: - [IntersectionOverride]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /C [id: 1] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 1] - [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|ft| from Java enhancement scope for /A [id: 2] - [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /B [id: 3] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.kt index d29d88a44a6..6ca406a6a60 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: D:foo diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.overrides.txt new file mode 100644 index 00000000000..9d417d74cc2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution.overrides.txt @@ -0,0 +1,7 @@ +D: + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /D [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /C [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 0] + [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|ft| from Java enhancement scope for /A [id: 1] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /B [id: 0] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.fir.kt deleted file mode 100644 index 8616b3bf4d9..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.fir.kt +++ /dev/null @@ -1,26 +0,0 @@ -// ISSUE: KT-62554 -// FIR_DUMP -// SCOPE_DUMP: D:foo -// FILE: A.java - -public class A { - public String foo(T x) { - return "A"; - } -} - -// FILE: C.java - -public class C extends A {} - -// FILE: main.kt - -interface B { - fun foo(x: Int) = "B" -} - -class D : C(), B - -fun main() { - D().foo(42) -} diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.fir.overrides.txt deleted file mode 100644 index 03ac63a8ec5..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.fir.overrides.txt +++ /dev/null @@ -1,6 +0,0 @@ -D: - [IntersectionOverride]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Java enhancement scope for /C [id: 1] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 1] - [Enhancement]: public open fun foo(x: R|ft|): R|kotlin/String!| from Java enhancement scope for /A [id: 2] - [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /B [id: 3] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.kt index 4c4afbe5811..f4e66103111 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: D:foo diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.overrides.txt new file mode 100644 index 00000000000..2920d59874c --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution2.overrides.txt @@ -0,0 +1,7 @@ +D: + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /D [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Java enhancement scope for /C [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 0] + [Enhancement]: public open fun foo(x: R|ft|): R|kotlin/String!| from Java enhancement scope for /A [id: 1] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /B [id: 0] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.fir.kt deleted file mode 100644 index 65565a2e7ef..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// ISSUE: KT-62554 -// FIR_DUMP -// SCOPE_DUMP: D:foo -// FILE: A.java - -public class A { - public String foo(T x) { - return "A"; - } -} - -// FILE: main.kt - -interface B { - fun foo(x: Int) = "B" -} - -open class C : A() - -class D : C(), B - -fun main() { - D().foo(42) -} diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.fir.overrides.txt deleted file mode 100644 index 8362c8e0a83..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.fir.overrides.txt +++ /dev/null @@ -1,6 +0,0 @@ -D: - [IntersectionOverride]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /C [id: 1] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 1] - [Enhancement]: public open fun foo(x: R|ft|): R|kotlin/String!| from Java enhancement scope for /A [id: 2] - [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /B [id: 3] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.kt index a67932ec7dd..23f4112e09f 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: D:foo diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.overrides.txt new file mode 100644 index 00000000000..c862b4b9ae3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution3.overrides.txt @@ -0,0 +1,7 @@ +D: + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /D [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /C [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 0] + [Enhancement]: public open fun foo(x: R|ft|): R|kotlin/String!| from Java enhancement scope for /A [id: 1] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /B [id: 0] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt index 6f7d5573d1f..fffdc059ad7 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt @@ -1,6 +1,8 @@ // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: E:foo +// IGNORE_REVERSED_RESOLVE +// ^ resolves to C.foo instead of D.foo for some reason, does not seem important // FILE: A.java public class A { diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.kt index 4620973f07e..0ad3bb19a39 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.kt @@ -1,6 +1,8 @@ // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: E:foo +// IGNORE_REVERSED_RESOLVE +// ^ resolves to C.foo instead of D.foo for some reason, does not seem important // FILE: A.java public class A { diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.kt deleted file mode 100644 index c0b28d50bc3..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// ISSUE: KT-62554 -// FIR_DUMP -// SCOPE_DUMP: E:foo -// FILE: A.java - -public class A { - public String foo(Integer x) { - return "A"; - } -} - -// FILE: main.kt - -interface B { - fun foo(x: T) = "B" -} - -interface D : B - -class E : A(), D - -fun main() { - E().foo(42) -} diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.txt index fbb64aa8ccb..8fb10012967 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.txt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.txt @@ -14,5 +14,5 @@ FILE: main.kt } public final fun main(): R|kotlin/Unit| { - R|/E.E|().R|/D.foo|(Int(42)) + R|/E.E|().R|SubstitutionOverride|(Int(42)) } diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.kt index 4372f47134b..17c91c3bf58 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: E:foo diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.overrides.txt similarity index 50% rename from compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.overrides.txt rename to compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.overrides.txt index dd4ae94000a..104fb33d46f 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.fir.overrides.txt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution5.overrides.txt @@ -1,6 +1,7 @@ E: - [IntersectionOverride]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /E [id: 0] - [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Java enhancement scope for /A [id: 1] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 2] - [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Substitution scope for [Use site scope of /B] for type D [id: 2] - [Source]: public open fun foo(x: R|T|): R|kotlin/String| from Use site scope of /B [id: 3] + [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /E [id: 0] + [Enhancement]: public open fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Java enhancement scope for /A [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /E [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /D [id: 0] + [SubstitutionOverride(DeclarationSite)]: public open fun foo(x: R|kotlin/Int|): R|kotlin/String| from Substitution scope for [Use site scope of /B] for type D [id: 0] + [Source]: public open fun foo(x: R|T|): R|kotlin/String| from Use site scope of /B [id: 1] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.kt deleted file mode 100644 index 50f5339d979..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -// ISSUE: KT-62554 -// FIR_DUMP -// SCOPE_DUMP: C:foo -// FILE: A.java - -import org.jetbrains.annotations.*; - -public class A { - public void foo(@NotNull Integer x) {} -} - -// FILE: main.kt - -interface B { - fun foo(x: Int) {} -} - -class C : A(), B - -fun main() { - C().foo(42) -} diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.overrides.txt deleted file mode 100644 index 159d788638d..00000000000 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.overrides.txt +++ /dev/null @@ -1,4 +0,0 @@ -C: - [IntersectionOverride]: public open fun foo(x: R|@EnhancedNullability kotlin/Int|): R|kotlin/Unit| from Use site scope of /C [id: 0] - [Enhancement]: public open fun foo(x: R|@EnhancedNullability kotlin/Int|): R|kotlin/Unit| from Java enhancement scope for /A [id: 1] - [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/Unit| from Use site scope of /B [id: 2] diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.txt index a2dba251a7b..0dbba96915a 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.txt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.fir.txt @@ -11,5 +11,5 @@ FILE: main.kt } public final fun main(): R|kotlin/Unit| { - R|/C.C|().R|/A.foo|(Int(42)) + R|/C.C|().#(Int(42)) } diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.kt index d7ee3ce6983..d29829db599 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-62554 // FIR_DUMP // SCOPE_DUMP: C:foo diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.overrides.txt new file mode 100644 index 00000000000..1c0780e10a5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithNotNullType.overrides.txt @@ -0,0 +1,6 @@ +C: + [Enhancement]: public open fun foo(x: R|@EnhancedNullability kotlin/Int|): R|kotlin/Unit| from Use site scope of /C [id: 0] + [Enhancement]: public open fun foo(x: R|@EnhancedNullability kotlin/Int|): R|kotlin/Unit| from Java enhancement scope for /A [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/Unit| from Use site scope of /C [id: 0] + [Source]: public open fun foo(x: R|kotlin/Int|): R|kotlin/Unit| from Use site scope of /B [id: 0] + diff --git a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt index 67cb673516a..a883f19e03f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt @@ -8,7 +8,7 @@ interface II { fun replace(key: Int, value: Int): Int? = null } -abstract class ZI : MyMap(), II +abstract class ZI : MyMap(), II interface IS { fun replace(key: String, value: String): String? = null