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(