From 661ac711c08de8e69c9a1d27d5c74b4b915c8957 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 25 Dec 2018 12:32:28 +0300 Subject: [PATCH] Fix light class generation for local classes in scripts Before this commit, we used script context for all classes defined in script. However, for local classes in scripts it's mistake, and now we generate them as usual, despite of the fact we are in script. #KT-28997 Fixed --- .../asJava/classes/KtLightClassForSourceDeclaration.kt | 9 +++++++-- .../findUsages/kotlin/script/anonymousObject.0.kts | 5 +++++ .../findUsages/kotlin/script/anonymousObject.results.txt | 1 + .../kotlin/findUsages/FindUsagesTestGenerated.java | 5 +++++ 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 idea/testData/findUsages/kotlin/script/anonymousObject.0.kts create mode 100644 idea/testData/findUsages/kotlin/script/anonymousObject.results.txt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 2c2f0d84793..f29adac5bb9 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -362,8 +362,13 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC return InvalidLightClassDataHolder } - return classOrObject.containingKtFile.script?.let { KtLightClassForScript.getLightClassCachedValue(it).value } - ?: getLightClassCachedValue(classOrObject).value + val containingScript = classOrObject.containingKtFile.script + return when { + !classOrObject.isLocal && containingScript != null -> + KtLightClassForScript.getLightClassCachedValue(containingScript).value + else -> + getLightClassCachedValue(classOrObject).value + } } private fun getLightClassCachedValue(classOrObject: KtClassOrObject): CachedValue { diff --git a/idea/testData/findUsages/kotlin/script/anonymousObject.0.kts b/idea/testData/findUsages/kotlin/script/anonymousObject.0.kts new file mode 100644 index 00000000000..64983590751 --- /dev/null +++ b/idea/testData/findUsages/kotlin/script/anonymousObject.0.kts @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtObjectDeclaration +// OPTIONS: usages +object: Any() { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/script/anonymousObject.results.txt b/idea/testData/findUsages/kotlin/script/anonymousObject.results.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/idea/testData/findUsages/kotlin/script/anonymousObject.results.txt @@ -0,0 +1 @@ + diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index 8a01ea9ebf8..cfb9c726d80 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -1379,6 +1379,11 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/script"), Pattern.compile("^(.+)\\.0\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("anonymousObject.0.kts") + public void testAnonymousObject() throws Exception { + runTest("idea/testData/findUsages/kotlin/script/anonymousObject.0.kts"); + } + @TestMetadata("dummy.0.kts") public void testDummy() throws Exception { runTest("idea/testData/findUsages/kotlin/script/dummy.0.kts");