[FIR] Create special hidden override for Java signature clash due to rename

This fixes CharBuffer.get resolving to CharBuffer.charAt

#KT-61282 Fixed
This commit is contained in:
Kirill Rakhman
2023-11-10 15:59:40 +01:00
committed by Space Team
parent 528a2d3c62
commit 865b8a4175
25 changed files with 498 additions and 46 deletions
@@ -0,0 +1,105 @@
// FIR_IDENTICAL
// SCOPE_DUMP: CharBuffer:get;charAt, CharBufferX:get;charAt, NonCharSequenceBuffer:get;charAt, NonCharBuffer:get;charAt, CharBufferXAllInherited:get;charAt, CharBufferXYAllInherited:get;charAt, CharBufferXYCharAt:get;charAt
// FILE: X.java
public interface X {
char get(int index);
}
// FILE: CharBuffer.java
public abstract class CharBuffer implements CharSequence {
// Should override 'kotlin.CharSequence.get'
public final char charAt(int index) {
return get(position() + checkIndex(index, 1));
}
// The key problem here is that `get` has the same signature as kotlin.CharSequence.get but completely different semantics
// Should override nothing
public abstract char get(int index);
}
// FILE: CharBufferX.java
public abstract class CharBufferX implements CharSequence, X {
// Should override 'kotlin.CharSequence.get'
public final char charAt(int index) {
return get(position() + checkIndex(index, 1));
}
// Should override X.get
public abstract char get(int index);
}
// FILE: NonCharSequenceBuffer.java
public abstract class NonCharSequenceBuffer implements X {
// Should override nothing and be available as 'charAt', not as 'get'
public final char charAt(int index) {
return get(position() + checkIndex(index, 1));
}
// Should override 'X.get'
public abstract char get(int index);
}
// FILE: NonCharBuffer.java
public abstract class NonCharBuffer implements CharSequence {
// Not overriding charAt explicitly but inherited through kotlin.CharSequence.get
// Should override nothing
public abstract char get(int index);
}
// FILE: CharBufferXAllInherited.java
public abstract class CharBufferXAllInherited implements CharSequence, X {
}
// FILE: Y.java
public class Y {
protected abstract char get(int index);
}
// FILE: CharBufferXYAllInherited.java
public abstract class CharBufferXYAllInherited extends Y implements CharSequence, X {
}
// FILE: CharAt.java
public interface CharAt {
char charAt(int index);
}
// FILE: CharBufferXYCharAt.java
public class CharBufferXYCharAt extends Y implements CharSequence, X, CharAt {
}
// FILE: main.kt
fun test(
charBuffer: CharBuffer,
charBufferX: CharBufferX,
nonCharSequenceBuffer: NonCharSequenceBuffer,
nonCharBuffer: NonCharBuffer,
charBufferXAllInherited: CharBufferXAllInherited,
charBufferXYAllInherited: CharBufferXYAllInherited,
charBufferXYCharAt: CharBufferXYCharAt,
) {
charBuffer.get(0)
(charBuffer as CharSequence).get(0)
charBufferX.get(0)
(charBufferX as CharSequence).get(0)
nonCharSequenceBuffer.get(0)
nonCharSequenceBuffer.charAt(0)
nonCharBuffer.get(0)
(nonCharBuffer as CharSequence).get(0)
charBufferXAllInherited.get(0)
(charBufferXAllInherited as CharSequence).get(0)
charBufferXYAllInherited.get(0)
(charBufferXYAllInherited as CharSequence).get(0)
charBufferXYCharAt.get(0)
(charBufferXYCharAt as CharSequence).get(0)
(charBufferXYCharAt as CharAt).charAt(0)
}
@@ -0,0 +1,40 @@
CharBuffer:
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBuffer [id: 0]
[Enhancement]: public final operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBuffer [id: 0]
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
CharBufferX:
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferX [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 final operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferX [id: 0]
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
NonCharSequenceBuffer:
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharSequenceBuffer [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 final fun charAt(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharSequenceBuffer [id: 0]
NonCharBuffer:
[Enhancement]: 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 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]
CharBufferXAllInherited:
[Library]: 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]
CharBufferXYAllInherited:
[Library]: 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]
[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]
CharBufferXYCharAt:
[Library]: 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]
[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]