diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index a9d9a33efd1..a88559c8358 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -452,11 +452,15 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @Override public JetTypeInfo visitClassLiteralExpression(@NotNull JetClassLiteralExpression expression, ExpressionTypingContext c) { ClassDescriptor descriptor = resolveClassLiteral(expression, c); - JetType type = descriptor == null - ? ErrorUtils.createErrorType("Unresolved class") - : components.reflectionTypes.getKClassType(Annotations.EMPTY, descriptor); + if (descriptor != null && !ErrorUtils.isError(descriptor)) { + JetType type = components.reflectionTypes.getKClassType(Annotations.EMPTY, descriptor); + if (!type.isError()) { + return JetTypeInfo.create(type, c.dataFlowInfo); + } + c.trace.report(REFLECTION_TYPES_NOT_LOADED.on(expression.getDoubleColonTokenReference())); + } - return JetTypeInfo.create(type, c.dataFlowInfo); + return JetTypeInfo.create(ErrorUtils.createErrorType("Unresolved class"), c.dataFlowInfo); } @Nullable diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/reflect/ReflectionTypes.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/reflect/ReflectionTypes.kt index 1bb02d50da1..763f0538ac4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/reflect/ReflectionTypes.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/reflect/ReflectionTypes.kt @@ -60,13 +60,19 @@ public class ReflectionTypes(private val module: ModuleDescriptor) { public val kMutableTopLevelExtensionProperty: ClassDescriptor by ClassLookup public fun getKClassType(annotations: Annotations, classDescriptor: ClassDescriptor): JetType { + val kClassDescriptor = kClass + if (ErrorUtils.isError(kClassDescriptor)) { + return kClassDescriptor.getDefaultType() + } + val typeConstructor = classDescriptor.getTypeConstructor() val arguments = typeConstructor.getParameters().map(TypeUtils::makeStarProjection) val kClassArguments = listOf(TypeProjectionImpl( Variance.INVARIANT, JetTypeImpl(Annotations.EMPTY, typeConstructor, false, arguments, classDescriptor.getMemberScope(arguments)) )) - return JetTypeImpl(annotations, kClass.getTypeConstructor(), false, kClassArguments, kClass.getMemberScope(kClassArguments)) + return JetTypeImpl(annotations, kClassDescriptor.getTypeConstructor(), false, kClassArguments, + kClassDescriptor.getMemberScope(kClassArguments)) } public fun getKFunctionType( diff --git a/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.kt b/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.kt index b91603d14ea..d3d32bb1a27 100644 --- a/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.kt +++ b/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.kt @@ -1,8 +1,11 @@ fun foo() {} -class A { +class A(val prop: Any) { fun baz() {} } -val bar = ::foo -val quux = A::baz +val topLevelFun = ::foo +val memberFun = A::baz + +val classLiteral = A::class +val property = A::prop diff --git a/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.txt b/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.txt index 80e81669ecb..a125d91f8ec 100644 --- a/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.txt +++ b/compiler/testData/diagnostics/tests/ReflectionTypesNotLoaded.txt @@ -1,11 +1,14 @@ -package +package -internal val bar: [ERROR : Type for ::foo] -internal val quux: [ERROR : Type for A::baz] +internal val classLiteral: [ERROR : Unresolved class] +internal val memberFun: [ERROR : Type for A::baz] +internal val property: [ERROR : Type for A::prop] +internal val topLevelFun: [ERROR : Type for ::foo] internal fun foo(): kotlin.Unit internal final class A { - public constructor A() + public constructor A(/*0*/ prop: kotlin.Any) + internal final val prop: kotlin.Any internal final fun baz(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.kt b/compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.kt new file mode 100644 index 00000000000..bd769c15913 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.kt @@ -0,0 +1,2 @@ +val u = Unresolved::class +val g = UnresolvedGeneric<UnresolvedTypeArg>::class diff --git a/compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.txt b/compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.txt new file mode 100644 index 00000000000..c5e516f6f00 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.txt @@ -0,0 +1,4 @@ +package + +internal val g: [ERROR : Unresolved class] +internal val u: [ERROR : Unresolved class] diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 6d519b84964..650dfe86fc1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -630,6 +630,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/classLiteral/simpleClassLiteral.kt"); doTest(fileName); } + + @TestMetadata("unresolvedClass.kt") + public void testUnresolvedClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/classLiteral/unresolvedClass.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature")