FIR: handle labeled super reference properly
This commit is contained in:
committed by
Mikhail Glukhikh
parent
260683c20e
commit
7b01cf7b04
+1
-1
@@ -1,6 +1,6 @@
|
||||
FILE: superNotAvailable.kt
|
||||
public final fun R|kotlin/String|.f(): R|kotlin/Unit| {
|
||||
super<<ERROR TYPE REF: No super type>>.<Unresolved name: compareTo>#(String())
|
||||
super<<ERROR TYPE REF: No super type>>@f#.<Unresolved name: compareTo>#(String())
|
||||
super<<ERROR TYPE REF: No super type>>.<Unresolved name: compareTo>#(String())
|
||||
}
|
||||
public final fun foo(): R|kotlin/Unit| {
|
||||
|
||||
+10
-8
@@ -20,13 +20,14 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
object FirNotASupertypeChecker : FirQualifiedAccessChecker() {
|
||||
override fun check(functionCall: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val surrounding = context.findClosestClass() ?: return
|
||||
val superReference = functionCall.calleeReference.safeAs<FirSuperReference>()
|
||||
|
||||
val targetClass = functionCall.calleeReference.safeAs<FirSuperReference>()
|
||||
val targetClass = superReference
|
||||
?.superTypeRef
|
||||
?.toRegularClass(context.session)
|
||||
?: return
|
||||
|
||||
val surrounding = context.findClosestClass(superReference.labelName) ?: return
|
||||
if (!targetClass.isSupertypeOf(surrounding)) {
|
||||
reporter.report(functionCall.source)
|
||||
}
|
||||
@@ -37,13 +38,14 @@ object FirNotASupertypeChecker : FirQualifiedAccessChecker() {
|
||||
* item like FirRegularClass or FirAnonymousObject
|
||||
* or null if no such item could be found.
|
||||
*/
|
||||
private fun CheckerContext.findClosestClass(): FirClass<*>? {
|
||||
private fun CheckerContext.findClosestClass(label: String?): FirClass<*>? {
|
||||
for (it in containingDeclarations.reversed()) {
|
||||
if (
|
||||
it is FirRegularClass ||
|
||||
it is FirAnonymousObject
|
||||
) {
|
||||
return it as FirClass<*>
|
||||
if (it is FirRegularClass || it is FirAnonymousObject) {
|
||||
val firClass = it as FirClass<*>
|
||||
val className = firClass.symbol.classId.shortClassName
|
||||
if (label == null || (!className.isSpecial && className.identifier == label)) {
|
||||
return firClass
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -96,6 +96,20 @@ class Fir2IrConversionScope {
|
||||
return irClass.thisReceiver
|
||||
}
|
||||
|
||||
fun dispatchReceiverParameter(label: String): IrValueParameter? {
|
||||
for (function in functionStack.asReversed()) {
|
||||
if (!function.name.isSpecial && function.name.identifier == label) {
|
||||
function.dispatchReceiverParameter?.let { return it }
|
||||
}
|
||||
}
|
||||
for (irClass in classStack.asReversed()) {
|
||||
if (!irClass.name.isSpecial && irClass.name.identifier == label) {
|
||||
return irClass.thisReceiver
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
fun lastDispatchReceiverParameter(): IrValueParameter? {
|
||||
// Use the dispatch receiver of the containing/enclosing functions (from the last to the first)
|
||||
for (function in functionStack.asReversed()) {
|
||||
|
||||
+5
-1
@@ -166,8 +166,12 @@ internal class CallAndReferenceGenerator(
|
||||
)
|
||||
return typeRef.convertWithOffsets { startOffset, endOffset ->
|
||||
if (qualifiedAccess.calleeReference is FirSuperReference) {
|
||||
val superReference = qualifiedAccess.calleeReference as FirSuperReference
|
||||
if (typeRef !is FirComposedSuperTypeRef) {
|
||||
val dispatchReceiver = conversionScope.lastDispatchReceiverParameter()
|
||||
val label = superReference.labelName
|
||||
val dispatchReceiver =
|
||||
if (label != null) conversionScope.dispatchReceiverParameter(label)
|
||||
else conversionScope.lastDispatchReceiverParameter()
|
||||
if (dispatchReceiver != null) {
|
||||
return@convertWithOffsets IrGetValueImpl(startOffset, endOffset, dispatchReceiver.type, dispatchReceiver.symbol)
|
||||
}
|
||||
|
||||
+2
@@ -1143,6 +1143,7 @@ class ExpressionsConverter(
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitSuperExpression
|
||||
*/
|
||||
private fun convertSuperExpression(superExpression: LighterASTNode): FirQualifiedAccessExpression {
|
||||
val label: String? = superExpression.getLabelName()
|
||||
var superTypeRef: FirTypeRef = implicitType
|
||||
superExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
@@ -1153,6 +1154,7 @@ class ExpressionsConverter(
|
||||
return buildQualifiedAccessExpression {
|
||||
source = superExpression.toFirSourceElement()
|
||||
calleeReference = buildExplicitSuperReference {
|
||||
labelName = label
|
||||
this.superTypeRef = superTypeRef
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1723,6 +1723,7 @@ class RawFirBuilder(
|
||||
this.source = source
|
||||
calleeReference = buildExplicitSuperReference {
|
||||
this.source
|
||||
labelName = expression.getLabelName()
|
||||
superTypeRef = superType.toFirOrImplicitType()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.isSuperReferenceExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
|
||||
@@ -353,7 +354,12 @@ fun <T : FirResolvable> BodyResolveComponents.typeFromCallee(access: T): FirReso
|
||||
}
|
||||
}
|
||||
is FirSuperReference -> {
|
||||
newCallee.superTypeRef as? FirResolvedTypeRef ?: buildErrorTypeRef {
|
||||
val labelName = newCallee.labelName
|
||||
val implicitReceiver = implicitReceiverStack[labelName] as? ImplicitDispatchReceiverValue
|
||||
val resolvedTypeRef =
|
||||
if (implicitReceiver != null) implicitReceiver.boundSymbol.phasedFir.superTypeRefs.singleOrNull() as? FirResolvedTypeRef
|
||||
else newCallee.superTypeRef as? FirResolvedTypeRef
|
||||
resolvedTypeRef ?: buildErrorTypeRef {
|
||||
source = newCallee.source
|
||||
diagnostic = ConeUnresolvedNameError(Name.identifier("super"))
|
||||
}
|
||||
@@ -375,7 +381,6 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: AbstractFirBasedSymbol<
|
||||
}
|
||||
}
|
||||
is FirClassifierSymbol<*> -> {
|
||||
val fir = (symbol as? AbstractFirBasedSymbol<*>)?.phasedFir
|
||||
// TODO: unhack
|
||||
buildResolvedTypeRef {
|
||||
source = null
|
||||
|
||||
+6
-1
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.references.builder.buildExplicitSuperReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitDispatchReceiverValue
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.candidate
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.*
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.InvocationKindTransformer
|
||||
@@ -89,7 +90,11 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
|
||||
qualifiedAccessExpression.resultType = callee.superTypeRef
|
||||
}
|
||||
else -> {
|
||||
val superTypeRefs = implicitReceiverStack.lastDispatchReceiver()?.boundSymbol?.phasedFir?.superTypeRefs
|
||||
val labelName = callee.labelName
|
||||
val implicitReceiver =
|
||||
if (labelName != null) implicitReceiverStack[labelName] as? ImplicitDispatchReceiverValue
|
||||
else implicitReceiverStack.lastDispatchReceiver()
|
||||
val superTypeRefs = implicitReceiver?.boundSymbol?.phasedFir?.superTypeRefs
|
||||
val resultType = when {
|
||||
superTypeRefs?.isNotEmpty() != true -> {
|
||||
buildErrorTypeRef {
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ internal class FirDelegatedConstructorCallImpl(
|
||||
override var constructedTypeRef: FirTypeRef,
|
||||
override val isThis: Boolean,
|
||||
) : FirDelegatedConstructorCall() {
|
||||
override var calleeReference: FirReference = if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, constructedTypeRef)
|
||||
override var calleeReference: FirReference = if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, null, constructedTypeRef)
|
||||
override val isSuper: Boolean get() = !isThis
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
|
||||
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
abstract class FirSuperReference : FirReference() {
|
||||
abstract override val source: FirSourceElement?
|
||||
abstract val labelName: String?
|
||||
abstract val superTypeRef: FirTypeRef
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitSuperReference(this, data)
|
||||
|
||||
+2
@@ -21,11 +21,13 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
@FirBuilderDsl
|
||||
class FirExplicitSuperReferenceBuilder {
|
||||
var source: FirSourceElement? = null
|
||||
var labelName: String? = null
|
||||
lateinit var superTypeRef: FirTypeRef
|
||||
|
||||
fun build(): FirSuperReference {
|
||||
return FirExplicitSuperReference(
|
||||
source,
|
||||
labelName,
|
||||
superTypeRef,
|
||||
)
|
||||
}
|
||||
|
||||
+1
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.visitors.*
|
||||
|
||||
internal class FirExplicitSuperReference(
|
||||
override val source: FirSourceElement?,
|
||||
override val labelName: String?,
|
||||
override var superTypeRef: FirTypeRef,
|
||||
) : FirSuperReference() {
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
|
||||
@@ -962,6 +962,9 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
||||
print("super<")
|
||||
superReference.superTypeRef.accept(this)
|
||||
print(">")
|
||||
superReference.labelName?.let {
|
||||
print("@$it#")
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) {
|
||||
|
||||
+1
-1
@@ -105,7 +105,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
impl(delegatedConstructorCall) {
|
||||
default(
|
||||
"calleeReference",
|
||||
"if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, constructedTypeRef)"
|
||||
"if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, null, constructedTypeRef)"
|
||||
)
|
||||
default("isSuper") {
|
||||
value = "!isThis"
|
||||
|
||||
+1
@@ -521,6 +521,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
}
|
||||
|
||||
superReference.configure {
|
||||
+stringField("labelName", nullable = true)
|
||||
+field("superTypeRef", typeRef, withReplace = true)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
open class A {
|
||||
open val foo: String = "OK"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
interface BK {
|
||||
fun x() : Int = 50
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
open class A {
|
||||
open fun foo2(): String = "OK"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
open class A {
|
||||
open val foo: String = "OK"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
interface ATrait {
|
||||
open fun foo2(): String = "OK"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
interface A {
|
||||
open val foo: String
|
||||
get() = "OK"
|
||||
|
||||
@@ -7,16 +7,16 @@ interface Trait {
|
||||
class Outer : Trait {
|
||||
class Nested {
|
||||
val t = this@Outer.bar()
|
||||
val s = super@Outer.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
val s = super@Outer.bar()
|
||||
|
||||
inner class NestedInner {
|
||||
val t = this@Outer.bar()
|
||||
val s = super@Outer.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
val s = super@Outer.bar()
|
||||
}
|
||||
}
|
||||
|
||||
inner class Inner {
|
||||
val t = this@Outer.bar()
|
||||
val s = super@Outer.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
val s = super@Outer.bar()
|
||||
}
|
||||
}
|
||||
@@ -13,10 +13,10 @@ class Outer : Trait {
|
||||
|
||||
inner class Inner {
|
||||
val t = this@Local
|
||||
val s = super@Local.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
val s = super@Local.bar()
|
||||
|
||||
val tt = this@Outer
|
||||
val ss = super@Outer.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
val ss = super@Outer.bar()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
-10
@@ -24,7 +24,7 @@ interface KotlinInterface : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ interface KotlinInterface : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -53,7 +53,7 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,7 +64,7 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -79,7 +79,7 @@ open class KotlinClass : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClass.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -91,7 +91,7 @@ open class KotlinClass : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClass.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -106,7 +106,7 @@ class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -118,7 +118,7 @@ class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -133,7 +133,7 @@ class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance2.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,7 @@ class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance2.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
|
||||
@@ -26,7 +26,7 @@ interface KotlinInterface : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ interface KotlinInterface : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -55,7 +55,7 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -66,7 +66,7 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -81,7 +81,7 @@ open class KotlinClass : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClass.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,7 +93,7 @@ open class KotlinClass : JavaInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClass.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -108,7 +108,7 @@ class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,7 +120,7 @@ class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -135,7 +135,7 @@ class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance2.test()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -147,7 +147,7 @@ class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance2.test()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
|
||||
+1
-1
@@ -7,6 +7,6 @@ class A {
|
||||
constructor(x: Any?)
|
||||
constructor() : this(object {
|
||||
fun bar() = <!UNRESOLVED_REFERENCE!>foo<!>() + this@A.<!UNRESOLVED_REFERENCE!>foo<!>() +
|
||||
<!INAPPLICABLE_CANDIDATE!>foobar<!>() + super@A.hashCode()
|
||||
<!INAPPLICABLE_CANDIDATE!>foobar<!>() + super@A.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class A<E>() : C(), T {
|
||||
fun test() {
|
||||
super<T>.foo();
|
||||
<!NOT_A_SUPERTYPE!>super<C><!>.bar()
|
||||
<!NOT_A_SUPERTYPE!>super<C>@A<!>.bar()
|
||||
super<C>@A.bar()
|
||||
super<T>@A.foo()
|
||||
super<T>@B.foo()
|
||||
<!NOT_A_SUPERTYPE!>super<C>@B<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
open class A {
|
||||
open fun foo() {}
|
||||
}
|
||||
|
||||
interface B {
|
||||
fun bar() {}
|
||||
}
|
||||
|
||||
interface Q {
|
||||
fun qux() {}
|
||||
}
|
||||
|
||||
class C : A(), B {
|
||||
override fun foo() {
|
||||
super@C.foo()
|
||||
}
|
||||
|
||||
override fun bar() {
|
||||
super@C.bar()
|
||||
}
|
||||
|
||||
inner class D : A(), Q {
|
||||
override fun foo() {
|
||||
super@C.foo()
|
||||
super@D.foo()
|
||||
}
|
||||
|
||||
override fun qux() {
|
||||
super@C.qux()
|
||||
super@D.qux()
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
open class A {
|
||||
open fun foo() {}
|
||||
}
|
||||
|
||||
+56
-56
@@ -33,11 +33,11 @@ interface KotlinInterface : KInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterface.test()
|
||||
super@KotlinInterface.property
|
||||
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterface.testNonDefault()
|
||||
super@KotlinInterface.propertyNonDefault
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,11 +53,11 @@ interface KotlinInterface : KInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterface.test()
|
||||
super@KotlinInterface.property
|
||||
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterface.testNonDefault()
|
||||
super@KotlinInterface.propertyNonDefault
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -72,11 +72,11 @@ interface KotlinInterface : KInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterface.test()
|
||||
super@KotlinInterface.property
|
||||
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterface.testNonDefault()
|
||||
super@KotlinInterface.propertyNonDefault
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -91,11 +91,11 @@ interface KotlinInterface : KInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterface.test()
|
||||
super@KotlinInterface.property
|
||||
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterface.testNonDefault()
|
||||
super@KotlinInterface.propertyNonDefault
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -115,11 +115,11 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
super@KotlinInterfaceIndirectInheritance.property
|
||||
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterfaceIndirectInheritance.testNonDefault()
|
||||
super@KotlinInterfaceIndirectInheritance.propertyNonDefault
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -135,11 +135,11 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
super@KotlinInterfaceIndirectInheritance.property
|
||||
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterfaceIndirectInheritance.testNonDefault()
|
||||
super@KotlinInterfaceIndirectInheritance.propertyNonDefault
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -154,11 +154,11 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
super@KotlinInterfaceIndirectInheritance.property
|
||||
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterfaceIndirectInheritance.testNonDefault()
|
||||
super@KotlinInterfaceIndirectInheritance.propertyNonDefault
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -173,11 +173,11 @@ interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinInterfaceIndirectInheritance.test()
|
||||
super@KotlinInterfaceIndirectInheritance.property
|
||||
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinInterfaceIndirectInheritance.testNonDefault()
|
||||
super@KotlinInterfaceIndirectInheritance.propertyNonDefault
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -194,11 +194,11 @@ open class KotlinClass : KInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinClass.test()
|
||||
super@KotlinClass.property
|
||||
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinClass.testNonDefault()
|
||||
super@KotlinClass.propertyNonDefault
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,11 +213,11 @@ open class KotlinClass : KInterface {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinClass.test()
|
||||
super@KotlinClass.property
|
||||
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinClass.testNonDefault()
|
||||
super@KotlinClass.propertyNonDefault
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,11 +235,11 @@ class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinClassIndirectInheritance.test()
|
||||
super@KotlinClassIndirectInheritance.property
|
||||
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinClassIndirectInheritance.testNonDefault()
|
||||
super@KotlinClassIndirectInheritance.propertyNonDefault
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,11 +255,11 @@ class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinClassIndirectInheritance.test()
|
||||
super@KotlinClassIndirectInheritance.property
|
||||
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinClassIndirectInheritance.testNonDefault()
|
||||
super@KotlinClassIndirectInheritance.propertyNonDefault
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -276,11 +276,11 @@ class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinClassIndirectInheritance2.test()
|
||||
super@KotlinClassIndirectInheritance2.property
|
||||
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinClassIndirectInheritance2.testNonDefault()
|
||||
super@KotlinClassIndirectInheritance2.propertyNonDefault
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -295,11 +295,11 @@ class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>property<!>
|
||||
super@KotlinClassIndirectInheritance2.test()
|
||||
super@KotlinClassIndirectInheritance2.property
|
||||
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>testNonDefault<!>()
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>propertyNonDefault<!>
|
||||
super@KotlinClassIndirectInheritance2.testNonDefault()
|
||||
super@KotlinClassIndirectInheritance2.propertyNonDefault
|
||||
}
|
||||
}
|
||||
return ""
|
||||
|
||||
Vendored
-162
@@ -1,162 +0,0 @@
|
||||
// !JVM_DEFAULT_MODE: enable
|
||||
// !JVM_TARGET: 1.8
|
||||
// FILE: JavaInterface.java
|
||||
|
||||
public interface JavaInterface {
|
||||
default String test() {
|
||||
return "OK";
|
||||
}
|
||||
|
||||
default String testOverride() {
|
||||
return "OK";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: 1.kt
|
||||
|
||||
interface KotlinInterface : JavaInterface {
|
||||
@JvmDefault
|
||||
fun fooo() {
|
||||
super.test()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@JvmDefault
|
||||
val propertyy: String
|
||||
get() {
|
||||
super.test()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterface.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
@JvmDefault
|
||||
override fun testOverride(): String {
|
||||
return "OK";
|
||||
}
|
||||
}
|
||||
|
||||
interface KotlinInterfaceIndirectInheritance : KotlinInterface {
|
||||
@JvmDefault
|
||||
fun foooo() {
|
||||
super.test()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@JvmDefault
|
||||
val propertyyy: String
|
||||
get() {
|
||||
super.test()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinInterfaceIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
open class KotlinClass : JavaInterface {
|
||||
fun foo() {
|
||||
super.test()
|
||||
super.testOverride()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val property: String
|
||||
get() {
|
||||
super.test()
|
||||
super.testOverride()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClass.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinClassIndirectInheritance : KotlinClass() {
|
||||
fun foo2() {
|
||||
super.test()
|
||||
super.testOverride()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val property2: String
|
||||
get() {
|
||||
super.test()
|
||||
super.testOverride()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinClassIndirectInheritance2 : KotlinInterfaceIndirectInheritance {
|
||||
fun foo() {
|
||||
super.test()
|
||||
super.testOverride()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val property: String
|
||||
get() {
|
||||
super.test()
|
||||
super.testOverride()
|
||||
|
||||
object {
|
||||
fun run () {
|
||||
super@KotlinClassIndirectInheritance2.<!UNRESOLVED_REFERENCE!>test<!>()
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
KotlinClass().foo()
|
||||
KotlinClass().property
|
||||
KotlinClassIndirectInheritance2().foo()
|
||||
KotlinClassIndirectInheritance2().property
|
||||
|
||||
KotlinClass().test()
|
||||
KotlinClass().property
|
||||
KotlinClass().testOverride()
|
||||
KotlinClassIndirectInheritance().testOverride()
|
||||
}
|
||||
Vendored
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !JVM_DEFAULT_MODE: enable
|
||||
// !JVM_TARGET: 1.8
|
||||
// FILE: JavaInterface.java
|
||||
|
||||
Reference in New Issue
Block a user