KT-14071 Type alias cannot be used as a qualifier for super
Use corresponding class for type alias in super qualifier resolution.
This commit is contained in:
+4
@@ -451,6 +451,10 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
supertype = components.typeResolver.resolveType(context.scope, superTypeQualifier, context.trace, true);
|
supertype = components.typeResolver.resolveType(context.scope, superTypeQualifier, context.trace, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (classifierCandidate instanceof TypeAliasDescriptor) {
|
||||||
|
classifierCandidate = ((TypeAliasDescriptor) classifierCandidate).getClassDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
if (supertype != null) {
|
if (supertype != null) {
|
||||||
if (supertypes.contains(supertype)) {
|
if (supertypes.contains(supertype)) {
|
||||||
result = supertype;
|
result = supertype;
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
open class Base {
|
||||||
|
open fun foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class GenericBase<T> {
|
||||||
|
open fun foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Unrelated {
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
typealias B = Base
|
||||||
|
typealias U = Unrelated
|
||||||
|
typealias GB<T> = GenericBase<T>
|
||||||
|
|
||||||
|
class TestSuperForBase : B() {
|
||||||
|
typealias MyBase = B
|
||||||
|
|
||||||
|
override fun foo() {
|
||||||
|
super<Base>.foo()
|
||||||
|
super<B>.foo()
|
||||||
|
super<MyBase>.foo()
|
||||||
|
super<<!NOT_A_SUPERTYPE!>U<!>>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestSuperForGenericBase<T> : GB<T>() {
|
||||||
|
typealias MyBase = GB<T>
|
||||||
|
typealias MyBaseInt = GB<Int>
|
||||||
|
|
||||||
|
override fun foo() {
|
||||||
|
super<GenericBase>.foo()
|
||||||
|
super<GB>.foo()
|
||||||
|
super<MyBase>.foo()
|
||||||
|
super<MyBaseInt>.foo() // Type arguments don't matter here
|
||||||
|
super<<!NOT_A_SUPERTYPE!>U<!>>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!>()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public open class Base {
|
||||||
|
public constructor Base()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open fun foo(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public open class GenericBase</*0*/ T> {
|
||||||
|
public constructor GenericBase</*0*/ T>()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open fun foo(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class TestSuperForBase : B /* = Base */ {
|
||||||
|
public constructor TestSuperForBase()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ fun foo(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
public typealias MyBase = B
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class TestSuperForGenericBase</*0*/ T> : GB<T> /* = GenericBase<T> */ {
|
||||||
|
public constructor TestSuperForGenericBase</*0*/ T>()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ fun foo(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
public typealias MyBase /*captured type parameters: /*0*/ T*/ = GB<T>
|
||||||
|
public typealias MyBaseInt /*captured type parameters: /*0*/ T*/ = GB<kotlin.Int>
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Unrelated {
|
||||||
|
public constructor Unrelated()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public final fun foo(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
public typealias B = Base
|
||||||
|
public typealias GB</*0*/ T> = GenericBase<T>
|
||||||
|
public typealias U = Unrelated
|
||||||
@@ -20604,6 +20604,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typeAliasAsSuperQualifier.kt")
|
||||||
|
public void testTypeAliasAsSuperQualifier() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasAsSuperQualifier.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typeAliasConstructor.kt")
|
@TestMetadata("typeAliasConstructor.kt")
|
||||||
public void testTypeAliasConstructor() throws Exception {
|
public void testTypeAliasConstructor() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user