Update typing rules for class literal expressions.

C::class : KClass<C>
expr: T => expr::class : KClass<out T>

NB: this means Obj::class : KClass<out Obj> for object Obj.
This commit is contained in:
Dmitry Petrov
2016-12-15 18:25:14 +03:00
parent 9fc3d0838e
commit 33ed98a0d3
16 changed files with 110 additions and 26 deletions
@@ -92,7 +92,8 @@ class DoubleColonExpressionResolver(
val type = result?.type
if (type != null && !type.isError) {
checkClassLiteral(c, expression, result)
val kClassType = reflectionTypes.getKClassType(Annotations.EMPTY, type)
val variance = if (result is DoubleColonLHS.Expression && !result.isObject) Variance.OUT_VARIANCE else Variance.INVARIANT
val kClassType = reflectionTypes.getKClassType(Annotations.EMPTY, type, variance)
val dataFlowInfo = (result as? DoubleColonLHS.Expression)?.dataFlowInfo ?: c.dataFlowInfo
return dataFlowAnalyzer.checkType(createTypeInfo(kClassType, dataFlowInfo), expression, c)
}