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.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");
|
||||
|
||||
Reference in New Issue
Block a user