Fix default type of static classes inside parametrized parents
Default type of LazySubstitutingClassDescriptor is not lazy. However, most of default types are, and there is an optimization in KotlinTypeFactory, which uses default type for simple type without type arguments and/or annotations. LazySubstitutingClassDescriptor's default type creates simple type with factory, which may therefore cause recursion. #KT-34029 Fixed
This commit is contained in:
+5
@@ -10779,6 +10779,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt3344.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt34029.kt")
|
||||
public void testKt34029() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt34029.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt34282.kt")
|
||||
public void testKt34282() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt34282.kt");
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
open class MyClass<T> {
|
||||
object MyObject : MyClass<Boolean>() { }
|
||||
}
|
||||
|
||||
val foo1 = MyClass.MyObject // it's ok
|
||||
val foo2 = <!FUNCTION_CALL_EXPECTED!>MyClass<Boolean><!>.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>MyObject<!> // here's stofl
|
||||
@@ -0,0 +1,18 @@
|
||||
package
|
||||
|
||||
public val foo1: MyClass.MyObject
|
||||
public val foo2: [ERROR : Type for MyClass<Boolean>.MyObject]
|
||||
|
||||
public open class MyClass</*0*/ T> {
|
||||
public constructor MyClass</*0*/ T>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public object MyObject : MyClass<kotlin.Boolean> {
|
||||
private constructor MyObject()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
@@ -10786,6 +10786,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt3344.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt34029.kt")
|
||||
public void testKt34029() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt34029.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt34282.kt")
|
||||
public void testKt34282() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt34282.kt");
|
||||
|
||||
Generated
+5
@@ -10781,6 +10781,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt3344.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt34029.kt")
|
||||
public void testKt34029() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt34029.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt34282.kt")
|
||||
public void testKt34282() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/inference/regressions/kt34282.kt");
|
||||
|
||||
+7
-1
@@ -141,7 +141,13 @@ public class LazySubstitutingClassDescriptor extends ModuleAwareClassDescriptor
|
||||
@Override
|
||||
public SimpleType getDefaultType() {
|
||||
List<TypeProjection> typeProjections = TypeUtils.getDefaultTypeProjections(getTypeConstructor().getParameters());
|
||||
return KotlinTypeFactory.simpleNotNullType(getAnnotations(), this, typeProjections);
|
||||
return KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(
|
||||
getAnnotations(),
|
||||
getTypeConstructor(),
|
||||
typeProjections,
|
||||
false,
|
||||
getUnsubstitutedMemberScope()
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
Reference in New Issue
Block a user