FIR/LC: filter out scripts for facade creation
^KTIJ-22016 Fixed
This commit is contained in:
committed by
Ilya Kirillov
parent
cd80bddfcd
commit
b18999be82
+4
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
@@ -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() }
|
||||
}
|
||||
|
||||
+2
@@ -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() }
|
||||
}
|
||||
|
||||
+4
-1
@@ -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
|
||||
|
||||
+7
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+7
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+7
-4
@@ -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)
|
||||
|
||||
+2
-2
@@ -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
|
||||
@@ -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,
|
||||
|
||||
+4
-4
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user