From 8aa4e9bd946ffc156cba276a47d9404efb564095 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 17 Mar 2015 13:19:26 +0300 Subject: [PATCH] Report error for inappropriate modifiers usages --- .../kotlin/resolve/ModifiersChecker.java | 12 +++++- .../tests/modifiers/IllegalModifiers.kt | 39 +++++++++++++++++-- .../tests/modifiers/IllegalModifiers.txt | 9 +++++ 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index dea16f5c333..04963437eba 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -145,12 +145,19 @@ public class ModifiersChecker { checkDefaultModifier(modifierListOwner); checkModalityModifiers(modifierListOwner); checkVisibilityModifiers(modifierListOwner, descriptor); - checkVarianceModifiersOfTypeParameters(modifierListOwner); + checkVarianceModifiers(modifierListOwner); + checkVarargsModifiers(modifierListOwner, descriptor); } checkPlatformNameApplicability(descriptor); runDeclarationCheckers(modifierListOwner, descriptor); } + private void checkVarargsModifiers(@NotNull JetDeclaration owner, @NotNull MemberDescriptor descriptor) { + if (!(owner instanceof JetParameter)) { + reportIllegalModifiers(owner, Collections.singleton(VARARG_KEYWORD)); + } + } + public void checkModifiersForLocalDeclaration(@NotNull JetDeclaration modifierListOwner, @NotNull DeclarationDescriptor descriptor) { reportIllegalModalityModifiers(modifierListOwner); reportIllegalVisibilityModifiers(modifierListOwner); @@ -400,7 +407,8 @@ public class ModifiersChecker { } } - public void checkVarianceModifiersOfTypeParameters(@NotNull JetModifierListOwner modifierListOwner) { + public void checkVarianceModifiers(@NotNull JetModifierListOwner modifierListOwner) { + reportIllegalModifiers(modifierListOwner, Arrays.asList(IN_KEYWORD, OUT_KEYWORD, REIFIED_KEYWORD)); if (!(modifierListOwner instanceof JetTypeParameterListOwner)) return; List typeParameters = ((JetTypeParameterListOwner) modifierListOwner).getTypeParameters(); for (JetTypeParameter typeParameter : typeParameters) { diff --git a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt index 7120e0cb5a6..d36c9bc6546 100644 --- a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt +++ b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.kt @@ -30,7 +30,13 @@ annotation class annotated(val text: String = "not given") class LegalModifier(val a: Int, annotated private var b: String, annotated vararg v: Int) //Check illegal modifier in constructor parameters -class IllegalModifiers1(private a: Int) +class IllegalModifiers1( + in + out + reified + enum + private + a: Int) //Check multiple illegal modifiers in constructor class IllegalModifiers2(private abstract a: Int) @@ -57,10 +63,10 @@ abstract class IllegalModifiers5() { private fun qux() { //Check illegal modifier in catch block - try {} catch (public e: Exception) {} + try {} catch (in out reified enum public e: Exception) {} //Check multiple illegal modifiers in catch block - try {} catch (abstract public e: Exception) {} + try {} catch (in out reified enum abstract public e: Exception) {} //Check annotations with illegal modifiers try {} catch (annotated("a text") abstract public e: Exception) {} @@ -80,4 +86,29 @@ abstract class IllegalModifiers6() { public annotated init {} private IllegalModifiers6() init {} -} \ No newline at end of file +} + +// strange Check inappropriate modifiers +override +out +in +vararg +reified +class IllegalModifiers7() { + enum + inner + annotation + out + in + vararg + reified + val x = 1 + enum + inner + annotation + out + in + vararg + reified + fun foo() {} +} diff --git a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt index e262f9d3d55..2103af5027e 100644 --- a/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt +++ b/compiler/testData/diagnostics/tests/modifiers/IllegalModifiers.txt @@ -84,6 +84,15 @@ package illegal_modifiers { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } + internal open class IllegalModifiers7 { + public constructor IllegalModifiers7() + internal final val x: kotlin.Int = 1 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + internal final class LegalModifier { public constructor LegalModifier(/*0*/ a: kotlin.Int, /*1*/ illegal_modifiers.annotated() b: kotlin.String, /*2*/ illegal_modifiers.annotated() vararg v: kotlin.Int /*kotlin.IntArray*/) internal final val a: kotlin.Int