From 515e66673320b5374b783c8f052ee30c191c6d2a Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 1 Jul 2019 01:49:13 +0300 Subject: [PATCH] [NI] Fix exception on incomplete try/catch block There was an inconsistency on creating PSI call and corresponding descriptor. See variable `catchBlocks` from visitor, it's created only if PSI elements are not null, but for descriptor parameters there wasn't such check #KT-32134 Fixed #EA-139748 Fixed --- .../fir/FirDiagnosticsSmokeTestGenerated.java | 5 +++++ .../ControlStructureTypingUtils.java | 20 ++++++++++++------- .../ControlStructureTypingVisitor.java | 2 +- .../incompleteCode/incompleteTryCatchBlock.kt | 14 +++++++++++++ .../incompleteTryCatchBlock.txt | 5 +++++ .../checkers/DiagnosticsTestGenerated.java | 5 +++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++++ 7 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt create mode 100644 compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index 17a61b320dd..d94a2951c9f 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -9297,6 +9297,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok runTest("compiler/testData/diagnostics/tests/incompleteCode/incompleteEquals.kt"); } + @TestMetadata("incompleteTryCatchBlock.kt") + public void testIncompleteTryCatchBlock() throws Exception { + runTest("compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt"); + } + @TestMetadata("kt1955.kt") public void testKt1955() throws Exception { runTest("compiler/testData/diagnostics/tests/incompleteCode/kt1955.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java index 7f5cb9d0f8d..5556b16b9b1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils.java @@ -123,24 +123,30 @@ public class ControlStructureTypingUtils { /*package*/ ResolvedCall resolveTryAsCall( @NotNull Call call, - @NotNull KtTryExpression tryExpression, @NotNull List> catchedExceptions, @NotNull ExpressionTypingContext context, @Nullable MutableDataFlowInfoForArguments dataFlowInfoForArguments ) { List argumentNames = Lists.newArrayList("tryBlock"); List argumentsNullability = Lists.newArrayList(false); - for (int i = 0; i < tryExpression.getCatchClauses().size(); i++) { - argumentNames.add("catchBlock" + i); - argumentsNullability.add(false); - } - SimpleFunctionDescriptorImpl function = - createFunctionDescriptorForSpecialConstruction(ResolveConstruct.TRY, argumentNames, argumentsNullability); + + int counter = 0; for (Pair descriptorPair : catchedExceptions) { + // catchedExceptions are corresponding to PSI arguments that were used to create a call + // therefore, it's important to use only them to have consistent parameters + argumentNames.add("catchBlock" + counter); + argumentsNullability.add(false); + KtExpression catchBlock = descriptorPair.getFirst(); VariableDescriptor catchedExceptionDescriptor = descriptorPair.getSecond(); context.trace.record(BindingContext.NEW_INFERENCE_CATCH_EXCEPTION_PARAMETER, catchBlock, Ref.create(catchedExceptionDescriptor)); + + counter++; } + + SimpleFunctionDescriptorImpl function = + createFunctionDescriptorForSpecialConstruction(ResolveConstruct.TRY, argumentNames, argumentsNullability); + return resolveSpecialConstructionAsCall(call, function, ResolveConstruct.TRY, context, dataFlowInfoForArguments); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java index f51e40d4dcc..f2b933da830 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java @@ -611,7 +611,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { dataFlowInfoForArguments = createDataFlowInfoForArgumentsOfTryCall(callForTry, dataFlowInfoBeforeTry, dataFlowInfoBeforeTry); } ResolvedCall resolvedCall = components.controlStructureTypingUtils - .resolveTryAsCall(callForTry, tryExpression, catchClausesBlocksAndParameters, tryInputContext, dataFlowInfoForArguments); + .resolveTryAsCall(callForTry, catchClausesBlocksAndParameters, tryInputContext, dataFlowInfoForArguments); KotlinType resultType = resolvedCall.getResultingDescriptor().getReturnType(); BindingContext bindingContext = tryInputContext.trace.getBindingContext(); diff --git a/compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt b/compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt new file mode 100644 index 00000000000..d16b6fb28e9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt @@ -0,0 +1,14 @@ +fun test1() { + try { + + } catch () +} + +fun test2() { + try { } +} + +fun test3() { + try { + } catch ({}) {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.txt b/compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.txt new file mode 100644 index 00000000000..052283e38cc --- /dev/null +++ b/compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.txt @@ -0,0 +1,5 @@ +package + +public fun test1(): kotlin.Unit +public fun test2(): kotlin.Unit +public fun test3(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 767be9a14ad..7b08f38f184 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -9304,6 +9304,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/incompleteCode/incompleteEquals.kt"); } + @TestMetadata("incompleteTryCatchBlock.kt") + public void testIncompleteTryCatchBlock() throws Exception { + runTest("compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt"); + } + @TestMetadata("kt1955.kt") public void testKt1955() throws Exception { runTest("compiler/testData/diagnostics/tests/incompleteCode/kt1955.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 56d42ee5fbb..2adb692c6e1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -9299,6 +9299,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/incompleteCode/incompleteEquals.kt"); } + @TestMetadata("incompleteTryCatchBlock.kt") + public void testIncompleteTryCatchBlock() throws Exception { + runTest("compiler/testData/diagnostics/tests/incompleteCode/incompleteTryCatchBlock.kt"); + } + @TestMetadata("kt1955.kt") public void testKt1955() throws Exception { runTest("compiler/testData/diagnostics/tests/incompleteCode/kt1955.kt");