From 5dc28f1313be0804c20588c00c26851a8afa8883 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 9 Jul 2015 15:18:53 +0300 Subject: [PATCH] KT-7507 Check expected type for class literal expression --- .../BasicExpressionTypingVisitor.java | 4 +++- .../tests/classLiteral/classLiteralType.kt | 9 +++++++++ .../tests/classLiteral/classLiteralType.txt | 20 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/classLiteral/classLiteralType.kt create mode 100644 compiler/testData/diagnostics/tests/classLiteral/classLiteralType.txt 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 7e6679e91b2..f7c0eb0bcda 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -517,7 +517,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { public JetTypeInfo visitClassLiteralExpression(@NotNull JetClassLiteralExpression expression, ExpressionTypingContext c) { JetType type = resolveClassLiteral(expression, c); if (type != null && !type.isError()) { - return TypeInfoFactoryPackage.createTypeInfo(components.reflectionTypes.getKClassType(Annotations.EMPTY, type), c); + return TypeInfoFactoryPackage.createCheckedTypeInfo( + components.reflectionTypes.getKClassType(Annotations.EMPTY, type), c, expression + ); } return TypeInfoFactoryPackage.createTypeInfo(ErrorUtils.createErrorType("Unresolved class"), c); diff --git a/compiler/testData/diagnostics/tests/classLiteral/classLiteralType.kt b/compiler/testData/diagnostics/tests/classLiteral/classLiteralType.kt new file mode 100644 index 00000000000..1ca87eac20c --- /dev/null +++ b/compiler/testData/diagnostics/tests/classLiteral/classLiteralType.kt @@ -0,0 +1,9 @@ +import kotlin.reflect.KClass + +class A +class B + +val a1 : KClass<*> = A::class +val a2 : KClass = A::class +val a3 : KClass = A::class +val a4 : B = A::class diff --git a/compiler/testData/diagnostics/tests/classLiteral/classLiteralType.txt b/compiler/testData/diagnostics/tests/classLiteral/classLiteralType.txt new file mode 100644 index 00000000000..642f545fe46 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classLiteral/classLiteralType.txt @@ -0,0 +1,20 @@ +package + +internal val a1: kotlin.reflect.KClass<*> +internal val a2: kotlin.reflect.KClass +internal val a3: kotlin.reflect.KClass +internal val a4: B + +internal final class A { + public constructor A() + 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 +} + +internal final class B { + public constructor B() + 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 +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 075a993b04f..1558a70e534 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -2031,6 +2031,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("classLiteralType.kt") + public void testClassLiteralType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classLiteral/classLiteralType.kt"); + doTest(fileName); + } + @TestMetadata("genericClasses.kt") public void testGenericClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classLiteral/genericClasses.kt");