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 e2391565b0e..4b20cd9b87e 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 @@ class SymbolLightClassFacadeCache(private val project: Project) { ktFiles: List, 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 67259724e8f..6f7fa27c359 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.openapi.project.Project 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 @@ abstract class AbstractSymbolLightClassesFacadeTest( ) : 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 cfd5106f768..e5203337434 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.openapi.project.Project 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 @@ abstract class AbstractSymbolLightClassesLoadingTest( 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 73cf23d2a28..514fe72e88d 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.CompiledL 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 @@ abstract class AbstractSymbolLightClassesTestBase( 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 dcc0797e8e8..416a8cbec08 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 @@ import java.util.regex.Pattern; 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 @@ -84,6 +84,12 @@ public class SymbolLightClassesFacadeForLibraryTestGenerated extends AbstractSym runTest("compiler/testData/asJava/ultraLightFacades/properties.kt"); } + @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 { 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 a547ea0aa06..3bcca71bcb6 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 @@ import java.util.regex.Pattern; 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 9d90dd27bd2..e3b60a328a7 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 @@ import java.util.regex.Pattern; 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 @@ -84,6 +84,12 @@ public class SymbolLightClassesFacadeForSourceTestGenerated extends AbstractSymb runTest("compiler/testData/asJava/ultraLightFacades/properties.kt"); } + @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 { 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 ba70e5b03b8..038bc819281 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 @@ import java.util.regex.Pattern; 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 d71194e9847..3877e32384c 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 class LightClassGenerationSupport { abstract val useUltraLightClasses: Boolean + internal fun canCreateUltraLightClassForFacade( + files: Collection, + ): Boolean { + return useUltraLightClasses && files.none { it.isScript() } + } + fun createUltraLightClassForFacade( manager: PsiManager, facadeClassFqName: FqName, lightClassDataCache: CachedValue, files: Collection, ): KtUltraLightClassForFacade? { - - if (!useUltraLightClasses) return null - - if (files.any { it.isScript() }) return null + if (!canCreateUltraLightClassForFacade(files)) return null val filesToSupports: List> = 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 3b0a02c6ae2..6de8783fa2a 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 @@ open class KtLightClassForFacadeImpl constructor( 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 @@ open class KtLightClassForFacadeImpl constructor( 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 8b137891791..ff225862b52 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 00000000000..ff225862b52 --- /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 00000000000..dbb4bfd6c6f --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/script.kts @@ -0,0 +1 @@ +println("Hello, I'm in 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 c399890e90a..e2d6a166794 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 @@ import java.util.regex.Pattern 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 2b026126859..20c2646e7a5 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 @@ internal fun TestGroupSuite.generateSymbolLightClassesTests() { run { testClass { - model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT) + model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT_OR_KTS) } testClass { - model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT) + model("asJava/ultraLightClasses", pattern = TestGeneratorUtil.KT_OR_KTS) } } run { testClass { - model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT) + model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT_OR_KTS) } testClass { - model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT) + model("asJava/ultraLightFacades", pattern = TestGeneratorUtil.KT_OR_KTS) } } }