K2: build override structure for Java renamed builtins more precisely
#KT-65410 Fixed
This commit is contained in:
committed by
Space Team
parent
c6f5e5f297
commit
a189509353
+23
-8
@@ -714,20 +714,35 @@ class JavaClassUseSiteMemberScope(
|
|||||||
if (explicitlyDeclaredFunctionWithNaturalName != null || overriddenByNaturalName.isNotEmpty()) {
|
if (explicitlyDeclaredFunctionWithNaturalName != null || overriddenByNaturalName.isNotEmpty()) {
|
||||||
// The CharBuffer situation as example: both `get(Int):Char` and `charAt(Int):Char` are declared or inherited.
|
// The CharBuffer situation as example: both `get(Int):Char` and `charAt(Int):Char` are declared or inherited.
|
||||||
|
|
||||||
// CharBuffer.charAt is renamed to get, becomes hidden and overrides kotlin.CharSequence.charAt.
|
// In case `charAt` is declared, or inherited from base function with the same name, we need to create hidden renamed `get`
|
||||||
val hiddenRenamedFunction = createCopyWithNaturalName(explicitlyDeclaredOrInheritedFunctionWithBuiltinJvmName, isHidden = true)
|
// Otherwise we don't need it and just use `get` from Java without conflicts
|
||||||
destination += hiddenRenamedFunction
|
val hiddenRenamedFunctionNeeded = explicitlyDeclaredFunctionWithBuiltinJvmName != null ||
|
||||||
setOverrides(hiddenRenamedFunction, resultsOfIntersectionOfRenamed)
|
explicitlyDeclaredOrInheritedFunctionWithBuiltinJvmName.name == jvmName
|
||||||
|
if (hiddenRenamedFunctionNeeded) {
|
||||||
|
// CharBuffer.charAt is renamed to get, becomes hidden and overrides kotlin.CharSequence.charAt.
|
||||||
|
val hiddenRenamedFunction =
|
||||||
|
createCopyWithNaturalName(explicitlyDeclaredOrInheritedFunctionWithBuiltinJvmName, isHidden = true)
|
||||||
|
destination += hiddenRenamedFunction
|
||||||
|
setOverrides(hiddenRenamedFunction, resultsOfIntersectionOfRenamed)
|
||||||
|
}
|
||||||
|
|
||||||
val resultOfIntersectionOfNaturalName = supertypeScopeContext.convertGroupedCallablesToIntersectionResults(
|
val resultOfIntersectionOfNaturalName = supertypeScopeContext.convertGroupedCallablesToIntersectionResults(
|
||||||
overriddenByNaturalName.map { it.baseScope to listOf(it.member) }
|
overriddenByNaturalName.map { it.baseScope to listOf(it.member) }
|
||||||
)
|
)
|
||||||
|
|
||||||
if (explicitlyDeclaredFunctionWithNaturalName != null) {
|
if (explicitlyDeclaredFunctionWithNaturalName != null) {
|
||||||
// CharBuffer.get is already in destination, but we need to update its overridden declarations.
|
// `CharBuffer`.get is already in destination, but we need to update its overridden declarations.
|
||||||
// It mustn't override kotlin.CharSequence.charAt, but it can override different declarations with the same signature.
|
setOverrides(
|
||||||
// See compiler/testData/diagnostics/tests/j+k/collectionOverrides/charBuffer.kt
|
explicitlyDeclaredFunctionWithNaturalName,
|
||||||
setOverrides(explicitlyDeclaredFunctionWithNaturalName, resultOfIntersectionOfNaturalName)
|
when {
|
||||||
|
// It mustn't override `kotlin.CharSequence.get`, but it can override different declarations with the same signature.
|
||||||
|
// See compiler/testData/diagnostics/tests/j+k/collectionOverrides/charBuffer.kt
|
||||||
|
hiddenRenamedFunctionNeeded -> resultOfIntersectionOfNaturalName
|
||||||
|
// But in case there is no function named `charAt` in hierarchy,
|
||||||
|
// we can override `kotlin.CharSequence.get` safely
|
||||||
|
else -> resultsOfIntersectionOfRenamed
|
||||||
|
}
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
// CharBuffer.get is inherited (possibly a real intersection).
|
// CharBuffer.get is inherited (possibly a real intersection).
|
||||||
// Add it to destination and set overridden declarations.
|
// Add it to destination and set overridden declarations.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// IGNORE_BACKEND_K2: JVM_IR
|
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// ISSUE: KT-65410
|
// ISSUE: KT-65410
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ fun box(): String {
|
|||||||
if (NonCharSequenceBuffer.create().get(0) != 'g') return "FAIL 7"
|
if (NonCharSequenceBuffer.create().get(0) != 'g') return "FAIL 7"
|
||||||
if ((NonCharSequenceBuffer.create() as X).get(0) != 'g') return "FAIL 8"
|
if ((NonCharSequenceBuffer.create() as X).get(0) != 'g') return "FAIL 8"
|
||||||
|
|
||||||
if (CharBufferCharAtInherited.create().get(0) != 'g') return "FAIL 9"
|
if (CharBufferCharAtInherited.create().get(0) != 'c') return "FAIL 9"
|
||||||
if ((CharBufferCharAtInherited.create() as CharSequence).get(0) != 'c') return "FAIL 10"
|
if ((CharBufferCharAtInherited.create() as CharSequence).get(0) != 'c') return "FAIL 10"
|
||||||
|
|
||||||
if (CharBufferXAllInherited.create().get(0) != 'g') return "FAIL 11"
|
if (CharBufferXAllInherited.create().get(0) != 'g') return "FAIL 11"
|
||||||
|
|||||||
-8
@@ -16,25 +16,17 @@ NonCharSequenceBuffer:
|
|||||||
|
|
||||||
NonCharBuffer:
|
NonCharBuffer:
|
||||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharBuffer [id: 0]
|
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharBuffer [id: 0]
|
||||||
[Library]: /* hidden due to clash */ public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharBuffer [id: 0]
|
|
||||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||||
|
|
||||||
CharBufferXAllInherited:
|
CharBufferXAllInherited:
|
||||||
[Library]: /* hidden due to clash */ public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXAllInherited [id: 0]
|
|
||||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
|
||||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXAllInherited [id: 0]
|
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXAllInherited [id: 0]
|
||||||
|
|
||||||
CharBufferXYAllInherited:
|
CharBufferXYAllInherited:
|
||||||
[Library]: /* hidden due to clash */ public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYAllInherited [id: 0]
|
|
||||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
|
||||||
[IntersectionOverride]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYAllInherited [id: 0]
|
[IntersectionOverride]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYAllInherited [id: 0]
|
||||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
||||||
[Enhancement]: protected/*protected and package*/ abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /Y [id: 2]
|
[Enhancement]: protected/*protected and package*/ abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /Y [id: 2]
|
||||||
|
|
||||||
CharBufferXYCharAt:
|
CharBufferXYCharAt:
|
||||||
[Library]: /* hidden due to clash */ public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYCharAt [id: 0]
|
|
||||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
|
||||||
[RenamedForOverride]: public abstract fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharAt [id: 2]
|
|
||||||
[IntersectionOverride]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYCharAt [id: 0]
|
[IntersectionOverride]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYCharAt [id: 0]
|
||||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
||||||
[Enhancement]: protected/*protected and package*/ abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /Y [id: 2]
|
[Enhancement]: protected/*protected and package*/ abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /Y [id: 2]
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
// WITH_STDLIB
|
|
||||||
// SCOPE_DUMP: A:removeAt
|
|
||||||
// ISSUE: KT-65410
|
|
||||||
|
|
||||||
// FILE: Java1.java
|
|
||||||
import kotlin.collections.AbstractMutableList;
|
|
||||||
|
|
||||||
public class Java1 extends AbstractMutableList<Integer> {
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void add(int i, Integer integer) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer removeAt(int i) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer get(int index) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer set(int i, Integer integer) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FILE: 1.kt
|
|
||||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED("Class 'A'; removeAt")!>class A<!> : Java1()
|
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// SCOPE_DUMP: A:removeAt
|
// SCOPE_DUMP: A:removeAt
|
||||||
// ISSUE: KT-65410
|
// ISSUE: KT-65410
|
||||||
|
// IGNORE_DIAGNOSTIC_API
|
||||||
|
// IGNORE_REVERSED_RESOLVE
|
||||||
|
// Reason: SCOPE_DUMP uses different parameter names in AA modes
|
||||||
|
|
||||||
// FILE: Java1.java
|
// FILE: Java1.java
|
||||||
import kotlin.collections.AbstractMutableList;
|
import kotlin.collections.AbstractMutableList;
|
||||||
|
|||||||
-2
@@ -1,8 +1,6 @@
|
|||||||
A:
|
A:
|
||||||
[Enhancement]: public open fun removeAt(i: R|kotlin/Int|): R|kotlin/Int!| from Use site scope of /A [id: 0]
|
[Enhancement]: public open fun removeAt(i: R|kotlin/Int|): R|kotlin/Int!| from Use site scope of /A [id: 0]
|
||||||
[Enhancement]: public open fun removeAt(i: R|kotlin/Int|): R|kotlin/Int!| from Java enhancement scope for /Java1 [id: 0]
|
[Enhancement]: public open fun removeAt(i: R|kotlin/Int|): R|kotlin/Int!| from Java enhancement scope for /Java1 [id: 0]
|
||||||
[SubstitutionOverride(DeclarationSite)]: /* hidden due to clash */ public abstract fun removeAt(index: R|kotlin/Int|): R|kotlin/Int!| from Use site scope of /A [id: 0]
|
|
||||||
[SubstitutionOverride(DeclarationSite)]: /* hidden due to clash */ public abstract fun removeAt(index: R|kotlin/Int|): R|kotlin/Int!| from Java enhancement scope for /Java1 [id: 0]
|
|
||||||
[SubstitutionOverride(DeclarationSite)]: public abstract fun removeAt(index: R|kotlin/Int|): R|kotlin/Int!| from Substitution scope for [Use site scope of kotlin/collections/AbstractMutableList] for type Java1 [id: 1]
|
[SubstitutionOverride(DeclarationSite)]: public abstract fun removeAt(index: R|kotlin/Int|): R|kotlin/Int!| from Substitution scope for [Use site scope of kotlin/collections/AbstractMutableList] for type Java1 [id: 1]
|
||||||
[Library]: public abstract fun removeAt(index: R|kotlin/Int|): R|E| from Use site scope of kotlin/collections/AbstractMutableList [id: 2]
|
[Library]: public abstract fun removeAt(index: R|kotlin/Int|): R|E| from Use site scope of kotlin/collections/AbstractMutableList [id: 2]
|
||||||
[SubstitutionOverride(DeclarationSite)]: public abstract fun removeAt(index: R|kotlin/Int|): R|E| from Substitution scope for [Use site scope of kotlin/collections/MutableList] for type kotlin/collections/AbstractMutableList<E> [id: 3]
|
[SubstitutionOverride(DeclarationSite)]: public abstract fun removeAt(index: R|kotlin/Int|): R|E| from Substitution scope for [Use site scope of kotlin/collections/MutableList] for type kotlin/collections/AbstractMutableList<E> [id: 3]
|
||||||
Reference in New Issue
Block a user