From 22f8e7db3b9edb106a9d9a4c3543630247949cf8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 14 Sep 2016 11:37:20 +0300 Subject: [PATCH] Use independent context to type-check LHS of '::' #KT-13110 Fixed --- .../expressions/DoubleColonExpressionResolver.kt | 14 ++++++-------- .../codegen/box/classLiteral/bound/primitives.kt | 3 +-- .../tests/classLiteral/integerValueType.kt | 11 +++++++++++ .../tests/classLiteral/integerValueType.txt | 4 ++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ 5 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/classLiteral/integerValueType.kt create mode 100644 compiler/testData/diagnostics/tests/classLiteral/integerValueType.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt index 99eed86833d..2719adcc321 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt @@ -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) diff --git a/compiler/testData/codegen/box/classLiteral/bound/primitives.kt b/compiler/testData/codegen/box/classLiteral/bound/primitives.kt index 943a11203bf..c2fd3c472e9 100644 --- a/compiler/testData/codegen/box/classLiteral/bound/primitives.kt +++ b/compiler/testData/codegen/box/classLiteral/bound/primitives.kt @@ -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) diff --git a/compiler/testData/diagnostics/tests/classLiteral/integerValueType.kt b/compiler/testData/diagnostics/tests/classLiteral/integerValueType.kt new file mode 100644 index 00000000000..22c4e201359 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classLiteral/integerValueType.kt @@ -0,0 +1,11 @@ +// KT-13110 Strange type mismatch error on class literal with integer receiver expression + +import kotlin.reflect.KClass + +fun f(x: KClass) {} + +fun test() { + f(42::class) + f((40 + 2)::class) + 42::toInt +} diff --git a/compiler/testData/diagnostics/tests/classLiteral/integerValueType.txt b/compiler/testData/diagnostics/tests/classLiteral/integerValueType.txt new file mode 100644 index 00000000000..a9be99b1874 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classLiteral/integerValueType.txt @@ -0,0 +1,4 @@ +package + +public fun f(/*0*/ x: kotlin.reflect.KClass): kotlin.Unit +public fun test(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index f0b4683e96c..cade3c306b4 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -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");