From b34a91eeaa0cae3494ee05dd970c44e2538429b6 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 20 Jan 2016 15:42:55 +0300 Subject: [PATCH] Changes inside init blocks should be considered out of block modifications --- .../asJava/KotlinCodeBlockModificationListener.kt | 2 ++ .../codeInsight/outOfBlock/FunInInitBlock.kt | 9 +++++++++ idea/testData/codeInsight/outOfBlock/InitBlock.kt | 7 +++++++ .../OutOfBlockModificationTestGenerated.java | 12 ++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 idea/testData/codeInsight/outOfBlock/FunInInitBlock.kt create mode 100644 idea/testData/codeInsight/outOfBlock/InitBlock.kt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinCodeBlockModificationListener.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinCodeBlockModificationListener.kt index 670e2fd580b..90c2e46668d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinCodeBlockModificationListener.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinCodeBlockModificationListener.kt @@ -28,6 +28,7 @@ import com.intellij.psi.impl.PsiTreeChangePreprocessor import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isAncestor +import org.jetbrains.kotlin.psi.psiUtil.parents /** * Tested in OutOfBlockModificationTestGenerated @@ -112,6 +113,7 @@ class KotlinCodeBlockModificationListener(modificationTracker: PsiModificationTr //TODO: other types val blockDeclaration = KtPsiUtil.getTopmostParentOfTypes(element, *BLOCK_DECLARATION_TYPES) ?: return false + if (blockDeclaration.parents.any { it !is KtClassBody && it !is KtClassOrObject && it !is KtFile }) return false // should not be local declaration when (blockDeclaration) { is KtNamedFunction -> { diff --git a/idea/testData/codeInsight/outOfBlock/FunInInitBlock.kt b/idea/testData/codeInsight/outOfBlock/FunInInitBlock.kt new file mode 100644 index 00000000000..422a2d508ec --- /dev/null +++ b/idea/testData/codeInsight/outOfBlock/FunInInitBlock.kt @@ -0,0 +1,9 @@ +// TRUE + +class A { + init { + fun f() { + + } + } +} \ No newline at end of file diff --git a/idea/testData/codeInsight/outOfBlock/InitBlock.kt b/idea/testData/codeInsight/outOfBlock/InitBlock.kt new file mode 100644 index 00000000000..5d88e2fd15a --- /dev/null +++ b/idea/testData/codeInsight/outOfBlock/InitBlock.kt @@ -0,0 +1,7 @@ +// TRUE + +class A { + init { + + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OutOfBlockModificationTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OutOfBlockModificationTestGenerated.java index 996cd1fa3d8..5d2504cdd52 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OutOfBlockModificationTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OutOfBlockModificationTestGenerated.java @@ -53,6 +53,12 @@ public class OutOfBlockModificationTestGenerated extends AbstractOutOfBlockModif doTest(fileName); } + @TestMetadata("FunInInitBlock.kt") + public void testFunInInitBlock() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/outOfBlock/FunInInitBlock.kt"); + doTest(fileName); + } + @TestMetadata("FunNoBody.kt") public void testFunNoBody() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/outOfBlock/FunNoBody.kt"); @@ -185,6 +191,12 @@ public class OutOfBlockModificationTestGenerated extends AbstractOutOfBlockModif doTest(fileName); } + @TestMetadata("InitBlock.kt") + public void testInitBlock() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/outOfBlock/InitBlock.kt"); + doTest(fileName); + } + @TestMetadata("Object_FunNoType_Block.kt") public void testObject_FunNoType_Block() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/outOfBlock/Object_FunNoType_Block.kt");