From 18d6e86e60e6a1f04dfd2f62e31754eae7190609 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 12 Feb 2013 01:14:19 +0400 Subject: [PATCH] KT-3341 Prohibit val/var keywords for catch parameters #KT-3341 --- .../org/jetbrains/jet/lang/diagnostics/Errors.java | 1 + .../diagnostics/rendering/DefaultErrorMessages.java | 1 + .../jet/lang/resolve/DescriptorResolver.java | 2 +- .../expressions/ControlStructureTypingVisitor.java | 5 +++++ .../tests/controlStructures/valVarCatchParameter.kt | 13 +++++++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 6 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/controlStructures/valVarCatchParameter.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index fb8f61fe113..d91ae3d5224 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -475,6 +475,7 @@ public interface Errors { DiagnosticFactory1 VAL_OR_VAR_ON_LOOP_PARAMETER = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 VAL_OR_VAR_ON_FUN_PARAMETER = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 VAL_OR_VAR_ON_CATCH_PARAMETER = DiagnosticFactory1.create(ERROR); // Backing fields diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 882d7b478f6..d5c06f6338d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -181,6 +181,7 @@ public class DefaultErrorMessages { MAP.put(VAL_OR_VAR_ON_LOOP_PARAMETER, "''{0}'' on loop parameter is not allowed", TO_STRING); MAP.put(VAL_OR_VAR_ON_FUN_PARAMETER, "''{0}'' on function parameter is not allowed", TO_STRING); + MAP.put(VAL_OR_VAR_ON_CATCH_PARAMETER, "''{0}'' on catch parameter is not allowed", TO_STRING); MAP.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, "This property has a custom setter, so initialization using backing field required", NAME); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 215ca98f0b4..b8021b0c9e3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -712,7 +712,7 @@ public class DescriptorResolver { annotationResolver.getResolvedAnnotations(parameter.getModifierList(), trace), JetPsiUtil.safeName(parameter.getName()), type, - parameter.isMutable()); + false); trace.record(BindingContext.VALUE_PARAMETER, parameter, variableDescriptor); return variableDescriptor; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index 116cb688243..002d0ecd6cc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -432,6 +432,11 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { JetParameter catchParameter = catchClause.getCatchParameter(); JetExpression catchBody = catchClause.getCatchBody(); if (catchParameter != null) { + ASTNode valOrVarNode = catchParameter.getValOrVarNode(); + if (valOrVarNode != null) { + context.trace.report(VAL_OR_VAR_ON_CATCH_PARAMETER.on(valOrVarNode.getPsi(), ((JetKeywordToken) valOrVarNode.getElementType()))); + } + VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver().resolveLocalVariableDescriptor( context.scope.getContainingDeclaration(), context.scope, catchParameter, context.trace); JetType throwableType = KotlinBuiltIns.getInstance().getThrowable().getDefaultType(); diff --git a/compiler/testData/diagnostics/tests/controlStructures/valVarCatchParameter.kt b/compiler/testData/diagnostics/tests/controlStructures/valVarCatchParameter.kt new file mode 100644 index 00000000000..d1c07627240 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/valVarCatchParameter.kt @@ -0,0 +1,13 @@ +fun f() { + try { + } catch (val e: Exception) { + } + + try { + } catch (var e: Exception) { + } + + try { + } catch (e: Exception) { + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c1dcf158244..51cba9de7e7 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1045,6 +1045,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/controlStructures/tryReturnType.kt"); } + @TestMetadata("valVarCatchParameter.kt") + public void testValVarCatchParameter() throws Exception { + doTest("compiler/testData/diagnostics/tests/controlStructures/valVarCatchParameter.kt"); + } + @TestMetadata("valVarLoopParameter.kt") public void testValVarLoopParameter() throws Exception { doTest("compiler/testData/diagnostics/tests/controlStructures/valVarLoopParameter.kt");