diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt index 099244dba16..39334a47711 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt @@ -40,7 +40,8 @@ public class AnnotationChecker(private val additionalCheckers: Iterable descriptor?.let { TargetList(KotlinTarget.classActualTargets(it)) } ?: TargetLists.T_CLASSIFIER + is JetMultiDeclarationEntry -> TargetLists.T_LOCAL_VARIABLE is JetProperty -> { if (annotated.isLocal) TargetLists.T_LOCAL_VARIABLE diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index 99f46456168..512dbd45b2a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -194,6 +194,15 @@ public class ModifiersChecker { ModifierCheckerCore.INSTANCE$.check(modifierListOwner, trace, descriptor); } + public void checkModifiersForMultiDeclaration(@NotNull JetMultiDeclaration multiDeclaration) { + annotationChecker.check(multiDeclaration, trace, null); + ModifierCheckerCore.INSTANCE$.check(multiDeclaration, trace, null); + for (JetMultiDeclarationEntry multiEntry: multiDeclaration.getEntries()) { + annotationChecker.check(multiEntry, trace, null); + ModifierCheckerCore.INSTANCE$.check(multiEntry, trace, null); + } + } + private void checkNestedClassAllowed(@NotNull JetModifierListOwner modifierListOwner, @NotNull DeclarationDescriptor descriptor) { if (modifierListOwner.hasModifier(INNER_KEYWORD)) return; if (modifierListOwner instanceof JetClass && !(modifierListOwner instanceof JetEnumEntry)) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 7534e6ac83e..c5957c105f7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -212,7 +212,8 @@ public object ModifierCheckerCore { } public fun check(listOwner: JetModifierListOwner, trace: BindingTrace, descriptor: DeclarationDescriptor?) { - if (listOwner is JetFunction) { + if (listOwner is JetDeclarationWithBody) { + // JetFunction or JetPropertyAccessor for (parameter in listOwner.valueParameters) { if (!parameter.hasValOrVar()) { check(parameter, trace, null) 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 7cfb67f092a..8d9e3edeb5f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java @@ -392,6 +392,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { JetParameter loopParameter = expression.getLoopParameter(); if (loopParameter != null) { VariableDescriptor variableDescriptor = createLoopParameterDescriptor(loopParameter, expectedParameterType, context); + components.modifiersChecker.withTrace(context.trace).checkModifiersForLocalDeclaration(loopParameter, variableDescriptor); loopScope.addVariableDescriptor(variableDescriptor); } @@ -404,6 +405,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { components.multiDeclarationResolver.defineLocalVariablesFromMultiDeclaration( loopScope, multiParameter, iteratorNextAsReceiver, loopRange, context ); + components.modifiersChecker.withTrace(context.trace).checkModifiersForMultiDeclaration(multiParameter); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java index 345cc4e9a4b..ff2ee0ff012 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java @@ -185,6 +185,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito return TypeInfoFactoryPackage.noTypeInfo(context); } components.multiDeclarationResolver.defineLocalVariablesFromMultiDeclaration(scope, multiDeclaration, expressionReceiver, initializer, context); + components.modifiersChecker.withTrace(context.trace).checkModifiersForMultiDeclaration(multiDeclaration); return typeInfo.replaceType(components.dataFlowAnalyzer.checkStatementType(multiDeclaration, context)); } diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.kt b/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.kt index c7526291777..1d30d760f42 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.kt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.kt @@ -1,3 +1,4 @@ +@Target(AnnotationTarget.TYPE) annotation class My fun foo() { diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.txt b/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.txt index c6e6dff30ca..909e435c2f7 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.txt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotatedLoop.txt @@ -2,7 +2,7 @@ package public fun foo(): kotlin.Unit -kotlin.annotation.annotation() public final class My : kotlin.Annotation { +kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) kotlin.annotation.annotation() public final class My : kotlin.Annotation { public constructor My() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/annotations/forParameterAnnotationResolve.kt b/compiler/testData/diagnostics/tests/annotations/forParameterAnnotationResolve.kt index 40f31b41934..c63026094b5 100644 --- a/compiler/testData/diagnostics/tests/annotations/forParameterAnnotationResolve.kt +++ b/compiler/testData/diagnostics/tests/annotations/forParameterAnnotationResolve.kt @@ -5,10 +5,10 @@ data class A(val x: Int, val y: Int) fun bar(): Array = null!! fun foo() { - for (Ann(1) i in 1..100) {} - for (Ann(2) i in 1..100) {} + for (@Ann(1) i in 1..100) {} + for (@Ann(2) i in 1..100) {} - for (Ann(3) (x, @Ann(4) y) in bar()) {} + for (@Ann(3) (x, @Ann(4) y) in bar()) {} - for (Err (x,y) in bar()) {} + for (Err (x,y) in bar()) {} } diff --git a/compiler/testData/diagnostics/tests/annotations/kt1860-negative.kt b/compiler/testData/diagnostics/tests/annotations/kt1860-negative.kt index cb5c14da0f6..881e80b43f6 100644 --- a/compiler/testData/diagnostics/tests/annotations/kt1860-negative.kt +++ b/compiler/testData/diagnostics/tests/annotations/kt1860-negative.kt @@ -1,7 +1,7 @@ fun foo(varargs f : Int) {} var bar : Int = 1 - set(varargs v) {} + set(varargs v) {} val x : (Int) -> Int = {@varargs x : Int -> x} diff --git a/compiler/testData/diagnostics/tests/annotations/kt1860-positive.kt b/compiler/testData/diagnostics/tests/annotations/kt1860-positive.kt index 2ee460f2704..98563b46f9b 100644 --- a/compiler/testData/diagnostics/tests/annotations/kt1860-positive.kt +++ b/compiler/testData/diagnostics/tests/annotations/kt1860-positive.kt @@ -4,7 +4,7 @@ annotation class test fun foo(@test f : Int) {} var bar : Int = 1 - set(test v) {} + set(@test v) {} val x : (Int) -> Int = {@test x : Int -> x} // todo fix parser annotation on lambda parameter diff --git a/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt b/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt index b9c8cf57036..a923b8f55ad 100644 --- a/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt +++ b/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt @@ -1,5 +1,5 @@ fun test(): Any? { - @ann val (a, b) = P(1, 1) + @ann val (a, b) = P(1, 1) return a + b } diff --git a/compiler/testData/diagnostics/tests/annotations/options/forParam.kt b/compiler/testData/diagnostics/tests/annotations/options/forParam.kt new file mode 100644 index 00000000000..16d49f5e068 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/forParam.kt @@ -0,0 +1,10 @@ +// See KT-9145 + +@Target(AnnotationTarget.CLASS) +annotation class Ann + +fun foo() { + for (@Ann private x in 1..100) { + if (x == 1) return + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/options/forParam.txt b/compiler/testData/diagnostics/tests/annotations/options/forParam.txt new file mode 100644 index 00000000000..abf83fb1e72 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/forParam.txt @@ -0,0 +1,10 @@ +package + +public fun foo(): kotlin.Unit + +kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class Ann : kotlin.Annotation { + public constructor Ann() + 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/testData/diagnostics/tests/annotations/options/multiDeclaration.kt b/compiler/testData/diagnostics/tests/annotations/options/multiDeclaration.kt new file mode 100644 index 00000000000..8d0b5eb7be6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/multiDeclaration.kt @@ -0,0 +1,7 @@ +@Target(AnnotationTarget.CLASS) +annotation class My +data class Pair(val a: Int, val b: Int) +fun foo(): Int { + val (@My private a, @My public b) = Pair(12, 34) + return a + b +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/options/multiDeclaration.txt b/compiler/testData/diagnostics/tests/annotations/options/multiDeclaration.txt new file mode 100644 index 00000000000..12c455ed6ac --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/multiDeclaration.txt @@ -0,0 +1,22 @@ +package + +public fun foo(): kotlin.Int + +kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class My : kotlin.Annotation { + public constructor My() + 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 +} + +kotlin.data() public final class Pair { + public constructor Pair(/*0*/ a: kotlin.Int, /*1*/ b: kotlin.Int) + public final val a: kotlin.Int + public final val b: kotlin.Int + public final /*synthesized*/ fun component1(): kotlin.Int + public final /*synthesized*/ fun component2(): kotlin.Int + public final /*synthesized*/ fun copy(/*0*/ a: kotlin.Int = ..., /*1*/ b: kotlin.Int = ...): Pair + 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/testData/diagnostics/tests/annotations/options/setterParam.kt b/compiler/testData/diagnostics/tests/annotations/options/setterParam.kt new file mode 100644 index 00000000000..9e917086f3b --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/setterParam.kt @@ -0,0 +1,8 @@ +// KT-9145 + +@Target(AnnotationTarget.CLASS) +annotation class Ann + +var x: Int + get() = 1 + set(@Ann private x) { } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/options/setterParam.txt b/compiler/testData/diagnostics/tests/annotations/options/setterParam.txt new file mode 100644 index 00000000000..34cb2365e93 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/setterParam.txt @@ -0,0 +1,10 @@ +package + +public var x: kotlin.Int + +kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class Ann : kotlin.Annotation { + public constructor Ann() + 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 67322cb46e0..91df5d10d77 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1043,6 +1043,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("forParam.kt") + public void testForParam() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/forParam.kt"); + doTest(fileName); + } + @TestMetadata("javaDocumented.kt") public void testJavaDocumented() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/javaDocumented.kt"); @@ -1061,6 +1067,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("multiDeclaration.kt") + public void testMultiDeclaration() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/multiDeclaration.kt"); + doTest(fileName); + } + @TestMetadata("repeatable.kt") public void testRepeatable() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/repeatable.kt"); @@ -1073,6 +1085,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("setterParam.kt") + public void testSetterParam() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/setterParam.kt"); + doTest(fileName); + } + @TestMetadata("target.kt") public void testTarget() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/target.kt"); diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index 5ccaaf4569e..6275019bf60 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -215,8 +215,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, if (completionKind != CompletionKind.NAMED_ARGUMENTS_ONLY) { if (smartCompletion != null) { - @suppress("UNUSED_VARIABLE") // we don't use InheritanceSearcher - val (additionalItems, inheritanceSearcher) = smartCompletion.additionalItems() + val (additionalItems, @Suppress("UNUSED_VARIABLE") inheritanceSearcher) = smartCompletion.additionalItems() // all additional items should have SMART_COMPLETION_ITEM_PRIORITY_KEY to be recognized by SmartCompletionInBasicWeigher for (item in additionalItems) {