From ecfc2236a6553fb21c03996d2f58011e69ad30cb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 1 Jun 2017 11:11:07 +0300 Subject: [PATCH] Fix script properties kind in modifier checker #KT-18234 Fixed --- .../src/org/jetbrains/kotlin/psi/KtProperty.java | 7 ++++++- .../jetbrains/kotlin/resolve/AnnotationChecker.kt | 2 +- .../testData/diagnostics/tests/script/LateInit.kts | 5 +++++ .../testData/diagnostics/tests/script/LateInit.txt | 11 +++++++++++ .../testData/diagnostics/tests/script/PrivateVal.kts | 1 + .../testData/diagnostics/tests/script/PrivateVal.txt | 10 ++++++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 12 ++++++++++++ 7 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/script/LateInit.kts create mode 100644 compiler/testData/diagnostics/tests/script/LateInit.txt create mode 100644 compiler/testData/diagnostics/tests/script/PrivateVal.kts create mode 100644 compiler/testData/diagnostics/tests/script/PrivateVal.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtProperty.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtProperty.java index 3c52b578903..f7ef979e03a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtProperty.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtProperty.java @@ -68,8 +68,13 @@ public class KtProperty extends KtTypeParameterListOwnerStub } public boolean isLocal() { + return !isTopLevel() && !isMember(); + } + + public boolean isMember() { PsiElement parent = getParent(); - return !(parent instanceof KtFile || parent instanceof KtClassBody); + return parent instanceof KtClassOrObject || parent instanceof KtClassBody || + parent instanceof KtBlockExpression && parent.getParent() instanceof KtScript; } public boolean isTopLevel() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt index fbd947c5061..a9b06b21ec1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt @@ -204,7 +204,7 @@ class AnnotationChecker(private val additionalCheckers: Iterable { if (annotated.isLocal) TargetLists.T_LOCAL_VARIABLE - else if (annotated.parent is KtClassOrObject || annotated.parent is KtClassBody) + else if (annotated.isMember) TargetLists.T_MEMBER_PROPERTY(descriptor.hasBackingField(trace), annotated.hasDelegate()) else TargetLists.T_TOP_LEVEL_PROPERTY(descriptor.hasBackingField(trace), annotated.hasDelegate()) diff --git a/compiler/testData/diagnostics/tests/script/LateInit.kts b/compiler/testData/diagnostics/tests/script/LateInit.kts new file mode 100644 index 00000000000..c39a515cc21 --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/LateInit.kts @@ -0,0 +1,5 @@ +lateinit var s: String + +fun foo() { + s = "Hello" +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/script/LateInit.txt b/compiler/testData/diagnostics/tests/script/LateInit.txt new file mode 100644 index 00000000000..736bd82bb06 --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/LateInit.txt @@ -0,0 +1,11 @@ +package + +public final class LateInit : kotlin.script.templates.standard.ScriptTemplateWithArgs { + public constructor LateInit(/*0*/ args: kotlin.Array) + public final override /*1*/ /*fake_override*/ val args: kotlin.Array + public final lateinit var s: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public 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 +} diff --git a/compiler/testData/diagnostics/tests/script/PrivateVal.kts b/compiler/testData/diagnostics/tests/script/PrivateVal.kts new file mode 100644 index 00000000000..355e8eb3cba --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/PrivateVal.kts @@ -0,0 +1 @@ +private val s = "Hello" \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/script/PrivateVal.txt b/compiler/testData/diagnostics/tests/script/PrivateVal.txt new file mode 100644 index 00000000000..89497466646 --- /dev/null +++ b/compiler/testData/diagnostics/tests/script/PrivateVal.txt @@ -0,0 +1,10 @@ +package + +public final class PrivateVal : kotlin.script.templates.standard.ScriptTemplateWithArgs { + public constructor PrivateVal(/*0*/ args: kotlin.Array) + public final override /*1*/ /*fake_override*/ val args: kotlin.Array + private final val s: kotlin.String = "Hello" + 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/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 40f5418bd05..c9ce97f54a1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -23642,12 +23642,24 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("LateInit.kts") + public void testLateInit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/script/LateInit.kts"); + doTest(fileName); + } + @TestMetadata("NestedInnerClass.kts") public void testNestedInnerClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/script/NestedInnerClass.kts"); doTest(fileName); } + @TestMetadata("PrivateVal.kts") + public void testPrivateVal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/script/PrivateVal.kts"); + doTest(fileName); + } + @TestMetadata("resolveInitializerOfDestructuringDeclarationOnce.kts") public void testResolveInitializerOfDestructuringDeclarationOnce() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/script/resolveInitializerOfDestructuringDeclarationOnce.kts");