FIR/LC: filter out scripts for facade creation

^KTIJ-22016 Fixed
This commit is contained in:
Jinseong Jeon
2022-06-15 12:50:20 -07:00
committed by Ilya Kirillov
parent cd80bddfcd
commit b18999be82
15 changed files with 45 additions and 20 deletions
@@ -32,10 +32,11 @@ class SymbolLightClassFacadeCache(private val project: Project) {
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)
}
}
@@ -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() }
}
@@ -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() }
}
@@ -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
@@ -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 {
@@ -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
@@ -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 {
@@ -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
@@ -61,16 +61,19 @@ abstract class LightClassGenerationSupport {
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)
@@ -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)
}
@@ -1 +1 @@
// NOT_GENERATED
@@ -0,0 +1 @@
// NOT_GENERATED
+1
View File
@@ -0,0 +1 @@
println("Hello, I'm in <root> package")
@@ -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,
@@ -38,21 +38,21 @@ internal fun TestGroupSuite.generateSymbolLightClassesTests() {
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)
}
}
}