diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java index 36137d54713..cd4a0bb1b17 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java @@ -108,13 +108,17 @@ public class DeclarationsChecker { for (Map.Entry entry : bodiesResolveContext.getSecondaryConstructors().entrySet()) { ConstructorDescriptor constructorDescriptor = entry.getValue(); JetSecondaryConstructor declaration = entry.getKey(); - modifiersChecker.reportIllegalModalityModifiers(declaration); - reportErrorIfHasIllegalModifier(declaration); - modifiersChecker.checkModifiersForDeclaration(declaration, constructorDescriptor); + checkConstructorDeclaration(constructorDescriptor, declaration); } } + private void checkConstructorDeclaration(ConstructorDescriptor constructorDescriptor, JetDeclaration declaration) { + modifiersChecker.reportIllegalModalityModifiers(declaration); + reportErrorIfHasIllegalModifier(declaration); + modifiersChecker.checkModifiersForDeclaration(declaration, constructorDescriptor); + } + private void reportErrorIfHasIllegalModifier(JetModifierListOwner declaration) { if (declaration.hasModifier(JetTokens.ENUM_KEYWORD)) { trace.report(ILLEGAL_ENUM_ANNOTATION.on(declaration)); @@ -279,7 +283,7 @@ public class DeclarationsChecker { private void checkClass(BodiesResolveContext c, JetClass aClass, ClassDescriptorWithResolutionScopes classDescriptor) { checkOpenMembers(classDescriptor); - checkConstructorParameters(aClass); + checkPrimaryConstructor(aClass, classDescriptor); checkTypeParameters(aClass); if (aClass.isTrait()) { @@ -301,13 +305,19 @@ public class DeclarationsChecker { } } - private void checkConstructorParameters(JetClass aClass) { - for (JetParameter parameter : aClass.getPrimaryConstructorParameters()) { + private void checkPrimaryConstructor(JetClass aClass, ClassDescriptor classDescriptor) { + ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor(); + JetPrimaryConstructor declaration = aClass.getPrimaryConstructor(); + if (primaryConstructor == null || declaration == null) return; + + for (JetParameter parameter : declaration.getValueParameters()) { PropertyDescriptor propertyDescriptor = trace.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter); if (propertyDescriptor != null) { modifiersChecker.checkModifiersForDeclaration(parameter, propertyDescriptor); } } + + checkConstructorDeclaration(primaryConstructor, declaration); } private void checkTypeParameters(JetTypeParameterListOwner typeParameterListOwner) { diff --git a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt index c36563ef06b..5d4790d90d0 100644 --- a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt +++ b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt @@ -135,3 +135,20 @@ class IllegalModifiers9 { private protected constructor() {} private internal constructor(x: Int) {} } + +// Illegal modifiers on primary constructor + +class IllegalModifiers10 +abstract +enum +open +inner +annotation +override +out +in +final +vararg +reified () + +class IllegalModifiers11 private protected () diff --git a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt index 6697c7aff79..3de95611e28 100644 --- a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt +++ b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt @@ -44,6 +44,20 @@ package illegal_modifiers { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } + internal final class IllegalModifiers10 { + public constructor IllegalModifiers10() + 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 + } + + internal final class IllegalModifiers11 { + private constructor IllegalModifiers11() + 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 + } + internal final class IllegalModifiers2 { public constructor IllegalModifiers2(/*0*/ a: kotlin.Int) public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/platformName.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/platformName.kt index 51952415dd5..c92b0340c48 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/platformName.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/platformName.kt @@ -32,7 +32,7 @@ var vardef: Int = 1 set [platformName("C")] -class C [platformName("primary")]() { // TODO: modifiers check on primary constructor KT-7057 +class C [platformName("primary")]() { platformName("ctr") constructor(x: Int): this() {} [platformName("a")] fun foo() {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/constructors.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/constructors.kt index c663f7bda10..7d10497fe3a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/constructors.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/constructors.kt @@ -6,4 +6,4 @@ class A { } } -class C [platformStatic] () // TODO KT-7057 +class C [platformStatic] () diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/constructor.kt b/compiler/testData/diagnostics/testsWithStdLib/native/constructor.kt index 6a4c0314ad3..edaddc56f48 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/constructor.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/constructor.kt @@ -7,4 +7,4 @@ class A { native constructor(x: Int) } -class C [native] () // TODO KT-7057 +class C [native]() diff --git a/idea/testData/quickfix/modifiers/afterRemoveAbstractModifier.kt b/idea/testData/quickfix/modifiers/afterRemoveAbstractModifier.kt new file mode 100644 index 00000000000..f5a5719a9bf --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterRemoveAbstractModifier.kt @@ -0,0 +1,5 @@ +// "Make 'abstract()' not abstract" "true" + +class A() { + +} diff --git a/idea/testData/quickfix/modifiers/afterRemoveProtectedModifier.kt b/idea/testData/quickfix/modifiers/afterRemoveProtectedModifier.kt new file mode 100644 index 00000000000..06d1d1406c3 --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterRemoveProtectedModifier.kt @@ -0,0 +1,5 @@ +// "Remove 'protected' modifier" "true" + +class A private () { + +} diff --git a/idea/testData/quickfix/modifiers/beforeRemoveAbstractModifier.kt b/idea/testData/quickfix/modifiers/beforeRemoveAbstractModifier.kt new file mode 100644 index 00000000000..ccfcb0fa90f --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeRemoveAbstractModifier.kt @@ -0,0 +1,5 @@ +// "Make 'abstract()' not abstract" "true" + +class A abstract() { + +} diff --git a/idea/testData/quickfix/modifiers/beforeRemoveProtectedModifier.kt b/idea/testData/quickfix/modifiers/beforeRemoveProtectedModifier.kt new file mode 100644 index 00000000000..09aa27be5ae --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeRemoveProtectedModifier.kt @@ -0,0 +1,5 @@ +// "Remove 'protected' modifier" "true" + +class A private protected () { + +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 849f0bfcd11..213a3c06da4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3250,6 +3250,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeRemoveAbstractModifier.kt") + public void testRemoveAbstractModifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeRemoveAbstractModifier.kt"); + doTest(fileName); + } + @TestMetadata("beforeRemoveIncompatibleModifier.kt") public void testRemoveIncompatibleModifier() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeRemoveIncompatibleModifier.kt"); @@ -3262,6 +3268,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeRemoveProtectedModifier.kt") + public void testRemoveProtectedModifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeRemoveProtectedModifier.kt"); + doTest(fileName); + } + @TestMetadata("beforeRemoveRedundantModifier1.kt") public void testRemoveRedundantModifier1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeRemoveRedundantModifier1.kt");