Use independent context to type-check LHS of '::'

#KT-13110 Fixed
This commit is contained in:
Alexander Udalov
2016-09-14 11:37:20 +03:00
parent 84aa82e73c
commit 22f8e7db3b
5 changed files with 28 additions and 10 deletions
@@ -33,10 +33,7 @@ import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.calls.CallResolver
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.ResolveArgumentsMode
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
import org.jetbrains.kotlin.resolve.calls.context.TemporaryTraceAndCache
import org.jetbrains.kotlin.resolve.calls.context.*
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
@@ -51,8 +48,6 @@ import org.jetbrains.kotlin.resolve.source.toSourceElement
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
import org.jetbrains.kotlin.types.typeUtil.isTypeParameter
import java.lang.UnsupportedOperationException
import javax.inject.Inject
sealed class DoubleColonLHS(val type: KotlinType) {
@@ -92,7 +87,7 @@ class DoubleColonExpressionResolver(
val result = resolveDoubleColonLHS(expression, c)
val type = result?.type
if (type != null && !type.isError) {
checkClassLiteral(c, expression, result!!)
checkClassLiteral(c, expression, result)
val kClassType = reflectionTypes.getKClassType(Annotations.EMPTY, type)
val dataFlowInfo = (result as? DoubleColonLHS.Expression)?.dataFlowInfo ?: c.dataFlowInfo
return dataFlowAnalyzer.checkType(createTypeInfo(kClassType, dataFlowInfo), expression, c)
@@ -231,7 +226,10 @@ class DoubleColonExpressionResolver(
if (!criterion(doubleColonExpression)) return null
val traceAndCache = TemporaryTraceAndCache.create(context, "resolve '::' LHS", doubleColonExpression)
val c = context.replaceTraceAndCache(traceAndCache).replaceExpectedType(NO_EXPECTED_TYPE)
val c = context
.replaceTraceAndCache(traceAndCache)
.replaceExpectedType(NO_EXPECTED_TYPE)
.replaceContextDependency(ContextDependency.INDEPENDENT)
val lhs = resolve(expression, c)
return LHSResolutionResult(lhs, expression, traceAndCache)
@@ -8,8 +8,7 @@ fun box(): String {
assertEquals('z'::class, Char::class)
assertEquals(3.14::class, Double::class)
assertEquals(2.72f::class, Float::class)
// TODO: KT-13110
// assertEquals(42::class, Int::class)
assertEquals(42::class, Int::class)
assertEquals(42L::class, Long::class)
assertEquals(42.toShort()::class, Short::class)
@@ -0,0 +1,11 @@
// KT-13110 Strange type mismatch error on class literal with integer receiver expression
import kotlin.reflect.KClass
fun f(<!UNUSED_PARAMETER!>x<!>: KClass<Int>) {}
fun test() {
f(42::class)
f((40 + 2)::class)
42::toInt
}
@@ -0,0 +1,4 @@
package
public fun f(/*0*/ x: kotlin.reflect.KClass<kotlin.Int>): kotlin.Unit
public fun test(): kotlin.Unit
@@ -2961,6 +2961,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("integerValueType.kt")
public void testIntegerValueType() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classLiteral/integerValueType.kt");
doTest(fileName);
}
@TestMetadata("nonClassesOnLHS.kt")
public void testNonClassesOnLHS() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt");