Use independent context to type-check LHS of '::'
#KT-13110 Fixed
This commit is contained in:
+6
-8
@@ -33,10 +33,7 @@ import org.jetbrains.kotlin.resolve.*
|
|||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.ResolveArgumentsMode
|
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.ResolveArgumentsMode
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.*
|
||||||
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.results.OverloadResolutionResults
|
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil
|
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
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.*
|
||||||
import org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE
|
import org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE
|
||||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isTypeParameter
|
|
||||||
import java.lang.UnsupportedOperationException
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
sealed class DoubleColonLHS(val type: KotlinType) {
|
sealed class DoubleColonLHS(val type: KotlinType) {
|
||||||
@@ -92,7 +87,7 @@ class DoubleColonExpressionResolver(
|
|||||||
val result = resolveDoubleColonLHS(expression, c)
|
val result = resolveDoubleColonLHS(expression, c)
|
||||||
val type = result?.type
|
val type = result?.type
|
||||||
if (type != null && !type.isError) {
|
if (type != null && !type.isError) {
|
||||||
checkClassLiteral(c, expression, result!!)
|
checkClassLiteral(c, expression, result)
|
||||||
val kClassType = reflectionTypes.getKClassType(Annotations.EMPTY, type)
|
val kClassType = reflectionTypes.getKClassType(Annotations.EMPTY, type)
|
||||||
val dataFlowInfo = (result as? DoubleColonLHS.Expression)?.dataFlowInfo ?: c.dataFlowInfo
|
val dataFlowInfo = (result as? DoubleColonLHS.Expression)?.dataFlowInfo ?: c.dataFlowInfo
|
||||||
return dataFlowAnalyzer.checkType(createTypeInfo(kClassType, dataFlowInfo), expression, c)
|
return dataFlowAnalyzer.checkType(createTypeInfo(kClassType, dataFlowInfo), expression, c)
|
||||||
@@ -231,7 +226,10 @@ class DoubleColonExpressionResolver(
|
|||||||
if (!criterion(doubleColonExpression)) return null
|
if (!criterion(doubleColonExpression)) return null
|
||||||
|
|
||||||
val traceAndCache = TemporaryTraceAndCache.create(context, "resolve '::' LHS", doubleColonExpression)
|
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)
|
val lhs = resolve(expression, c)
|
||||||
return LHSResolutionResult(lhs, expression, traceAndCache)
|
return LHSResolutionResult(lhs, expression, traceAndCache)
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ fun box(): String {
|
|||||||
assertEquals('z'::class, Char::class)
|
assertEquals('z'::class, Char::class)
|
||||||
assertEquals(3.14::class, Double::class)
|
assertEquals(3.14::class, Double::class)
|
||||||
assertEquals(2.72f::class, Float::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(42L::class, Long::class)
|
||||||
assertEquals(42.toShort()::class, Short::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);
|
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")
|
@TestMetadata("nonClassesOnLHS.kt")
|
||||||
public void testNonClassesOnLHS() throws Exception {
|
public void testNonClassesOnLHS() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user