Fix exception from ::class literals on unresolved classes

This commit is contained in:
Alexander Udalov
2015-03-12 21:42:01 +03:00
parent e448f40756
commit e5d5b49ce2
7 changed files with 40 additions and 12 deletions
@@ -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
@@ -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(
@@ -1,8 +1,11 @@
fun foo() {}
class A {
class A(val prop: Any) {
fun baz() {}
}
val bar = <!REFLECTION_TYPES_NOT_LOADED!>::<!>foo
val quux = A<!REFLECTION_TYPES_NOT_LOADED!>::<!>baz
val topLevelFun = <!REFLECTION_TYPES_NOT_LOADED!>::<!>foo
val memberFun = A<!REFLECTION_TYPES_NOT_LOADED!>::<!>baz
val classLiteral = A<!REFLECTION_TYPES_NOT_LOADED!>::<!>class
val property = A<!REFLECTION_TYPES_NOT_LOADED!>::<!>prop
@@ -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
@@ -0,0 +1,2 @@
val u = <!UNRESOLVED_REFERENCE!>Unresolved<!>::class
val g = <!UNRESOLVED_REFERENCE!>UnresolvedGeneric<!><<!UNRESOLVED_REFERENCE!>UnresolvedTypeArg<!>>::class
@@ -0,0 +1,4 @@
package
internal val g: [ERROR : Unresolved class]
internal val u: [ERROR : Unresolved class]
@@ -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")