FIR/LC: filter out scripts for facade creation
^KTIJ-22016 Fixed
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt
index e239156..4b20cd9 100644
--- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt
+++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt
@@ -32,10 +32,11 @@
ktFiles: List<KtFile>,
facadeClassFqName: FqName,
): KtLightClassForFacade? {
- if (ktFiles.isEmpty()) return null
- val key = FacadeKey(facadeClassFqName, ktFiles.toSet())
+ val ktFilesWithoutScript = ktFiles.filterNot { it.isScript() }
+ if (ktFilesWithoutScript.isEmpty()) return null
+ val key = FacadeKey(facadeClassFqName, ktFilesWithoutScript.toSet())
return cache.getOrPut(key) {
- getOrCreateFirLightFacadeNoCache(ktFiles, facadeClassFqName)
+ getOrCreateFirLightFacadeNoCache(ktFilesWithoutScript, facadeClassFqName)
}
}
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesFacadeTest.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesFacadeTest.kt
index 6725972..6f7fa27 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesFacadeTest.kt
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesFacadeTest.kt
@@ -9,6 +9,7 @@
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
+import org.jetbrains.kotlin.asJava.LightClassTestCommon
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.renderClass
import org.jetbrains.kotlin.light.classes.symbol.base.service.withExtendedTypeRenderer
@@ -24,6 +25,7 @@
) : AbstractSymbolLightClassesTestBase(configurator) {
override fun getRenderResult(ktFile: KtFile, testDataFile: Path, module: TestModule, project: Project): String {
val lightClasses = getFacades(project)
+ if (lightClasses.isEmpty()) return LightClassTestCommon.NOT_GENERATED_DIRECTIVE
return withExtendedTypeRenderer((testDataFile)) {
lightClasses.joinToString("\n\n") { it.renderClass() }
}
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesLoadingTest.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesLoadingTest.kt
index cfd5106..e520333 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesLoadingTest.kt
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesLoadingTest.kt
@@ -9,6 +9,7 @@
import com.intellij.psi.SyntaxTraverser
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
+import org.jetbrains.kotlin.asJava.LightClassTestCommon
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.renderClass
import org.jetbrains.kotlin.light.classes.symbol.base.service.withExtendedTypeRenderer
@@ -25,6 +26,7 @@
override fun getRenderResult(ktFile: KtFile, testDataFile: Path, module: TestModule, project: Project): String {
val lightClasses = getLightClassesFromFile(ktFile, project)
+ if (lightClasses.isEmpty()) return LightClassTestCommon.NOT_GENERATED_DIRECTIVE
return withExtendedTypeRenderer(testDataFile) {
lightClasses.joinToString("\n\n") { it.renderClass() }
}
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt
index 73cf23d..514fe72 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesTestBase.kt
@@ -13,6 +13,7 @@
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.CompilerExecutor
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
+import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
import org.jetbrains.kotlin.light.classes.symbol.base.service.NullabilityAnnotationSourceProvider
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
@@ -54,7 +55,9 @@
if (stopIfCompilationErrorDirectivePresent && CompilerExecutor.Directives.COMPILATION_ERRORS in module.directives) {
return
}
- val testDataFile = module.files.first { it.name.endsWith(".kt") }.originalFile.toPath()
+ val testDataFile = module.files.first {
+ it.originalFile.extension in DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
+ }.originalFile.toPath()
val ktFile = ktFiles.first()
val project = ktFile.project
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesFacadeForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesFacadeForLibraryTestGenerated.java
index dcc0797..416a8cb 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesFacadeForLibraryTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesFacadeForLibraryTestGenerated.java
@@ -21,7 +21,7 @@
public class SymbolLightClassesFacadeForLibraryTestGenerated extends AbstractSymbolLightClassesFacadeForLibraryTest {
@Test
public void testAllFilesPresentInUltraLightFacades() throws Exception {
- KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightFacades"), Pattern.compile("^(.+)\\.(kt)$"), null, true);
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightFacades"), Pattern.compile("^(.+)\\.(kt|kts)$"), null, true);
}
@Test
@@ -85,6 +85,12 @@
}
@Test
+ @TestMetadata("script.kts")
+ public void testScript() throws Exception {
+ runTest("compiler/testData/asJava/ultraLightFacades/script.kts");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesLoadingForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesLoadingForLibraryTestGenerated.java
index a547ea0..3bcca71 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesLoadingForLibraryTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesLoadingForLibraryTestGenerated.java
@@ -21,7 +21,7 @@
public class SymbolLightClassesLoadingForLibraryTestGenerated extends AbstractSymbolLightClassesLoadingForLibraryTest {
@Test
public void testAllFilesPresentInUltraLightClasses() throws Exception {
- KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightClasses"), Pattern.compile("^(.+)\\.(kt)$"), null, true);
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightClasses"), Pattern.compile("^(.+)\\.(kt|kts)$"), null, true);
}
@Test
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesFacadeForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesFacadeForSourceTestGenerated.java
index 9d90dd2..e3b60a3 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesFacadeForSourceTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesFacadeForSourceTestGenerated.java
@@ -21,7 +21,7 @@
public class SymbolLightClassesFacadeForSourceTestGenerated extends AbstractSymbolLightClassesFacadeForSourceTest {
@Test
public void testAllFilesPresentInUltraLightFacades() throws Exception {
- KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightFacades"), Pattern.compile("^(.+)\\.(kt)$"), null, true);
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightFacades"), Pattern.compile("^(.+)\\.(kt|kts)$"), null, true);
}
@Test
@@ -85,6 +85,12 @@
}
@Test
+ @TestMetadata("script.kts")
+ public void testScript() throws Exception {
+ runTest("compiler/testData/asJava/ultraLightFacades/script.kts");
+ }
+
+ @Test
@TestMetadata("simpleFunctions.kt")
public void testSimpleFunctions() throws Exception {
runTest("compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt");
diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesLoadingForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesLoadingForSourceTestGenerated.java
index ba70e5b..038bc81 100644
--- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesLoadingForSourceTestGenerated.java
+++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesLoadingForSourceTestGenerated.java
@@ -21,7 +21,7 @@
public class SymbolLightClassesLoadingForSourceTestGenerated extends AbstractSymbolLightClassesLoadingForSourceTest {
@Test
public void testAllFilesPresentInUltraLightClasses() throws Exception {
- KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightClasses"), Pattern.compile("^(.+)\\.(kt)$"), null, true);
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightClasses"), Pattern.compile("^(.+)\\.(kt|kts)$"), null, true);
}
@Test
diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt
index d71194e..3877e32 100644
--- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt
+++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt
@@ -61,16 +61,19 @@
abstract val useUltraLightClasses: Boolean
+ internal fun canCreateUltraLightClassForFacade(
+ files: Collection<KtFile>,
+ ): Boolean {
+ return useUltraLightClasses && files.none { it.isScript() }
+ }
+
fun createUltraLightClassForFacade(
manager: PsiManager,
facadeClassFqName: FqName,
lightClassDataCache: CachedValue<LightClassDataHolder.ForFacade>,
files: Collection<KtFile>,
): KtUltraLightClassForFacade? {
-
- if (!useUltraLightClasses) return null
-
- if (files.any { it.isScript() }) return null
+ if (!canCreateUltraLightClassForFacade(files)) return null
val filesToSupports: List<Pair<KtFile, KtUltraLightSupport>> = files.map {
it to getUltraLightClassSupport(it)
diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt
index 3b0a02c..6de8783 100644
--- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt
+++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt
@@ -233,7 +233,7 @@
fun createForFacadeNoCache(fqName: FqName, searchScope: GlobalSearchScope, project: Project): KtLightClassForFacade? {
val sources = KotlinAsJavaSupport.getInstance(project).findFilesForFacade(fqName, searchScope)
- .filterNot { it.isCompiled }
+ .filterNot { it.isCompiled || it.isScript() }
if (sources.isEmpty()) return null
@@ -244,7 +244,7 @@
val manager = PsiManager.getInstance(project)
return LightClassGenerationSupport.getInstance(project).run {
- if (useUltraLightClasses) createUltraLightClassForFacade(manager, fqName, stubValue, sources)
+ if (canCreateUltraLightClassForFacade(sources)) createUltraLightClassForFacade(manager, fqName, stubValue, sources)
?: error("Unable to create UL class for facade: $fqName for ${sources.joinToString { it.virtualFilePath }}")
else KtLightClassForFacadeImpl(manager, fqName, stubValue, sources)
}
diff --git a/compiler/testData/asJava/ultraLightClasses/typeAliases.lib.java b/compiler/testData/asJava/ultraLightClasses/typeAliases.lib.java
index 8b13789..ff22586 100644
--- a/compiler/testData/asJava/ultraLightClasses/typeAliases.lib.java
+++ b/compiler/testData/asJava/ultraLightClasses/typeAliases.lib.java
@@ -1 +1 @@
-
+// NOT_GENERATED
\ No newline at end of file
diff --git a/compiler/testData/asJava/ultraLightFacades/script.java b/compiler/testData/asJava/ultraLightFacades/script.java
new file mode 100644
index 0000000..ff22586
--- /dev/null
+++ b/compiler/testData/asJava/ultraLightFacades/script.java
@@ -0,0 +1 @@
+// NOT_GENERATED
\ No newline at end of file
diff --git a/compiler/testData/asJava/ultraLightFacades/script.kts b/compiler/testData/asJava/ultraLightFacades/script.kts
new file mode 100644
index 0000000..dbb4bfd
--- /dev/null
+++ b/compiler/testData/asJava/ultraLightFacades/script.kts
@@ -0,0 +1 @@
+println("Hello, I'm in <root> package")
diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/LightClassTestCommon.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/LightClassTestCommon.kt
index c399890..e2d6a16 100644
--- a/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/LightClassTestCommon.kt
+++ b/compiler/tests-common/tests/org/jetbrains/kotlin/asJava/LightClassTestCommon.kt
@@ -14,7 +14,7 @@
object LightClassTestCommon {
private val SUBJECT_FQ_NAME_PATTERN = Pattern.compile("^//\\s*(.*)$", Pattern.MULTILINE)
- private const val NOT_GENERATED_DIRECTIVE = "// NOT_GENERATED"
+ const val NOT_GENERATED_DIRECTIVE = "// NOT_GENERATED"
fun getActualLightClassText(
testDataFile: File,
diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt
index 2b02612..20c2646 100644
--- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt
+++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/lightClasses.kt
@@ -38,21 +38,21 @@
run {
testClass<AbstractSymbolLightClassesLoadingForSourceTest> {
- model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT)
+ model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT_OR_KTS)
}
testClass<AbstractSymbolLightClassesLoadingForLibraryTest> {
- model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT)
+ model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT_OR_KTS)
}
}
run {
testClass<AbstractSymbolLightClassesFacadeForSourceTest> {
- model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT)
+ model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT_OR_KTS)
}
testClass<AbstractSymbolLightClassesFacadeForLibraryTest> {
- model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT)
+ model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT_OR_KTS)
}
}
}