diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 53b196c7a3a..d93fc8e8466 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -587,6 +587,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); + DiagnosticFactory1 VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER = DiagnosticFactory1.create(ERROR); // Backing fields diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 1938fba2791..9cf9b1cc4b9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -265,6 +265,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(VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER, "''{0}'' on secondary constructor 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/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index fe515029a72..b9da901ad08 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -326,8 +326,12 @@ class FunctionDescriptorResolver( } } - if (functionDescriptor !is ConstructorDescriptor) { - DescriptorResolver.checkParameterHasNoValOrVar(trace, valueParameter, VAL_OR_VAR_ON_FUN_PARAMETER) + if (functionDescriptor !is ConstructorDescriptor || !functionDescriptor.isPrimary()) { + val isConstructor = functionDescriptor is ConstructorDescriptor + DescriptorResolver.checkParameterHasNoValOrVar( + trace, valueParameter, + if (isConstructor) VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER else VAL_OR_VAR_ON_FUN_PARAMETER + ) DescriptorResolver.checkParameterHasNoModifier(trace, valueParameter) } else { diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt new file mode 100644 index 00000000000..f9a37b86104 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt @@ -0,0 +1,7 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +class A { + constructor( + val x: Int, y: Int, + var z: Int, + public a: Int) {} +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.txt new file mode 100644 index 00000000000..c148e75acb1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.txt @@ -0,0 +1,8 @@ +package + +internal final class A { + public constructor A(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int, /*2*/ z: kotlin.Int, /*3*/ a: kotlin.Int) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 011e99ebfba..e8c40e7afff 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -10749,6 +10749,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("valOrValAndModifiersInCtr.kt") + public void testValOrValAndModifiersInCtr() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/valOrValAndModifiersInCtr.kt"); + doTest(fileName); + } + @TestMetadata("varargsInDelegationCallToPrimary.kt") public void testVarargsInDelegationCallToPrimary() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/varargsInDelegationCallToPrimary.kt"); diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java index 46918d5937a..50f338bef60 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java @@ -159,6 +159,7 @@ public class QuickFixRegistrar { QuickFixes.factories.put(VAL_OR_VAR_ON_FUN_PARAMETER, removeValVarFromParameterFixFactory); QuickFixes.factories.put(VAL_OR_VAR_ON_LOOP_PARAMETER, removeValVarFromParameterFixFactory); QuickFixes.factories.put(VAL_OR_VAR_ON_CATCH_PARAMETER, removeValVarFromParameterFixFactory); + QuickFixes.factories.put(VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER, removeValVarFromParameterFixFactory); QuickFixes.factories.put(VIRTUAL_MEMBER_HIDDEN, AddOverrideToEqualsHashCodeToStringFix.createFactory()); diff --git a/idea/testData/quickfix/variables/removeValVarFromParameter/afterSecondaryConstructorParameter.kt b/idea/testData/quickfix/variables/removeValVarFromParameter/afterSecondaryConstructorParameter.kt new file mode 100644 index 00000000000..ed8ac87374e --- /dev/null +++ b/idea/testData/quickfix/variables/removeValVarFromParameter/afterSecondaryConstructorParameter.kt @@ -0,0 +1,4 @@ +// "Remove 'val' from parameter" "true" +class A { + constructor(x: Int) +} diff --git a/idea/testData/quickfix/variables/removeValVarFromParameter/beforeSecondaryConstructorParameter.kt b/idea/testData/quickfix/variables/removeValVarFromParameter/beforeSecondaryConstructorParameter.kt new file mode 100644 index 00000000000..7091b1fbc75 --- /dev/null +++ b/idea/testData/quickfix/variables/removeValVarFromParameter/beforeSecondaryConstructorParameter.kt @@ -0,0 +1,4 @@ +// "Remove 'val' from parameter" "true" +class A { + constructor(val x: Int) +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index f476df52092..d69d962232a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -5121,6 +5121,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/variables/removeValVarFromParameter/beforeParameterWithComment.kt"); doTest(fileName); } + + @TestMetadata("beforeSecondaryConstructorParameter.kt") + public void testSecondaryConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/variables/removeValVarFromParameter/beforeSecondaryConstructorParameter.kt"); + doTest(fileName); + } } }