From 0d4d576fed910d18e06b07117beca55fa1e8f109 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 16 Oct 2012 17:28:24 +0400 Subject: [PATCH] fixed exception in renderer for type inference error --- .../lang/diagnostics/rendering/Renderers.java | 7 ++++--- .../checker/rendering/TypeInferenceError.kt | 11 +++++++++++ .../jet/checkers/AbstractJetPsiCheckerTest.java | 1 + .../jet/checkers/JetPsiCheckerTestGenerated.java | 16 +++++++++++++++- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 idea/testData/checker/rendering/TypeInferenceError.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java index 7da1e0c7579..f0c34883a03 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java @@ -196,9 +196,10 @@ public class Renderers { JetType receiverType = substitutedDescriptor.getReceiverParameter().exists() ? substitutedDescriptor.getReceiverParameter().getType() : null; final Collection errorPositions = Sets.newHashSet(); - List valueArgumentTypes = Lists.newArrayList(); + List parameterTypes = Lists.newArrayList(); for (ValueParameterDescriptor valueParameterDescriptor : substitutedDescriptor.getValueParameters()) { - valueArgumentTypes.add(valueParameterDescriptor.getType()); + parameterTypes.add(valueParameterDescriptor.getType()); + if (valueParameterDescriptor.getIndex() >= inferenceErrorData.valueArgumentsTypes.size()) continue; JetType actualType = inferenceErrorData.valueArgumentsTypes.get(valueParameterDescriptor.getIndex()); if (!JetTypeChecker.INSTANCE.isSubtypeOf(actualType, valueParameterDescriptor.getType())) { errorPositions.add(ConstraintPosition.getValueParameterPosition(valueParameterDescriptor.getIndex())); @@ -216,7 +217,7 @@ public class Renderers { return errorPositions.contains(constraintPosition); } }; - table.functionArgumentTypeList(receiverType, valueArgumentTypes, isErrorPosition); + table.functionArgumentTypeList(receiverType, parameterTypes, isErrorPosition); } table.text("can be applied to") diff --git a/idea/testData/checker/rendering/TypeInferenceError.kt b/idea/testData/checker/rendering/TypeInferenceError.kt new file mode 100644 index 00000000000..c2795de4653 --- /dev/null +++ b/idea/testData/checker/rendering/TypeInferenceError.kt @@ -0,0 +1,11 @@ +fun testMutableMapEntry(map: MutableMap, k1: K, v: V) { +} + +fun foo() { + testMutableMapEntry(hashMap(1 to 'a'), 'b') +} + +//extract from library +fun hashMap(p: Pair): MutableMap {} +fun K.to(v: V): Pair {} +data class Pair {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/checkers/AbstractJetPsiCheckerTest.java b/idea/tests/org/jetbrains/jet/checkers/AbstractJetPsiCheckerTest.java index c9cf3dc8492..abd9f3e44df 100644 --- a/idea/tests/org/jetbrains/jet/checkers/AbstractJetPsiCheckerTest.java +++ b/idea/tests/org/jetbrains/jet/checkers/AbstractJetPsiCheckerTest.java @@ -60,6 +60,7 @@ public abstract class AbstractJetPsiCheckerTest extends LightDaemonAnalyzerTestC Arrays.asList( new SimpleTestClassModel(new File("idea/testData/checker"), false, "jet", "doTest"), new SimpleTestClassModel(new File("idea/testData/checker/regression"), true, "jet", "doTest"), + new SimpleTestClassModel(new File("idea/testData/checker/rendering"), true, "kt", "doTest"), new SimpleTestClassModel(new File("idea/testData/checker/infos"), true, "jet", "doTestWithInfos") ), thisClass diff --git a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java index 0641103c32c..0faca8fe233 100644 --- a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java @@ -27,7 +27,7 @@ import org.jetbrains.jet.test.TestMetadata; import org.jetbrains.jet.checkers.AbstractJetPsiCheckerTest; /** This class is generated by {@link org.jetbrains.jet.checkers.AbstractJetPsiCheckerTest}. DO NOT MODIFY MANUALLY */ -@InnerTestClasses({JetPsiCheckerTestGenerated.Checker.class, JetPsiCheckerTestGenerated.Regression.class, JetPsiCheckerTestGenerated.Infos.class}) +@InnerTestClasses({JetPsiCheckerTestGenerated.Checker.class, JetPsiCheckerTestGenerated.Regression.class, JetPsiCheckerTestGenerated.Rendering.class, JetPsiCheckerTestGenerated.Infos.class}) public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { @TestMetadata("idea/testData/checker") public static class Checker extends AbstractJetPsiCheckerTest { @@ -385,6 +385,19 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { } + @TestMetadata("idea/testData/checker/rendering") + public static class Rendering extends AbstractJetPsiCheckerTest { + public void testAllFilesPresentInRendering() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.checkers.AbstractJetPsiCheckerTest", new File("idea/testData/checker/rendering"), "kt", true); + } + + @TestMetadata("TypeInferenceError.kt") + public void testTypeInferenceError() throws Exception { + doTest("idea/testData/checker/rendering/TypeInferenceError.kt"); + } + + } + @TestMetadata("idea/testData/checker/infos") public static class Infos extends AbstractJetPsiCheckerTest { public void testAllFilesPresentInInfos() throws Exception { @@ -412,6 +425,7 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { TestSuite suite = new TestSuite("JetPsiCheckerTestGenerated"); suite.addTestSuite(Checker.class); suite.addTestSuite(Regression.class); + suite.addTestSuite(Rendering.class); suite.addTestSuite(Infos.class); return suite; }