[Test] Reuse buildFir... methods from firUtils.kt

This commit is contained in:
Ivan Kylchik
2023-07-14 16:12:52 +02:00
committed by Space Team
parent 34f8228441
commit 3c9eb87c8d
3 changed files with 11 additions and 52 deletions
@@ -10,14 +10,10 @@ import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.KtInMemoryTextSourceFile import org.jetbrains.kotlin.KtInMemoryTextSourceFile
import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.fir.lightTree.LightTreeParsingErrorListener
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.sourceFiles.LightTreeFile
import org.jetbrains.kotlin.test.model.TestFile import org.jetbrains.kotlin.test.model.TestFile
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.util.KtTestUtil import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.toSourceLinesMapping
import java.io.File import java.io.File
abstract class SourceFilePreprocessor(val testServices: TestServices) { abstract class SourceFilePreprocessor(val testServices: TestServices) {
@@ -112,26 +108,16 @@ fun SourceFileProvider.getKtFilesForSourceFiles(testFiles: Collection<TestFile>,
}.toMap() }.toMap()
} }
fun SourceFileProvider.getLightTreeKtFileForSourceFile(
testFile: TestFile,
errorListener: (KtSourceFile) -> LightTreeParsingErrorListener?
): LightTreeFile {
val shortName = testFile.toLightTreeShortName()
val sourceFile = KtInMemoryTextSourceFile(shortName, "/$shortName", getContentOfSourceFile(testFile))
val linesMapping = sourceFile.text.toSourceLinesMapping()
val lightTree = LightTree2Fir.buildLightTree(sourceFile.text, errorListener(sourceFile))
return LightTreeFile(lightTree, sourceFile, linesMapping)
}
fun TestFile.toLightTreeShortName() = name.substringAfterLast('/').substringAfterLast('\\') fun TestFile.toLightTreeShortName() = name.substringAfterLast('/').substringAfterLast('\\')
fun SourceFileProvider.getLightTreeFilesForSourceFiles( fun SourceFileProvider.getKtSourceFilesForSourceFiles(
testFiles: Collection<TestFile>, testFiles: Collection<TestFile>,
errorListener: (KtSourceFile) -> LightTreeParsingErrorListener? ): Map<TestFile, KtSourceFile> {
): Map<TestFile, LightTreeFile> {
return testFiles.mapNotNull { return testFiles.mapNotNull {
if (!it.isKtFile) return@mapNotNull null if (!it.isKtFile) return@mapNotNull null
it to getLightTreeKtFileForSourceFile(it, errorListener) val shortName = it.toLightTreeShortName()
val ktSourceFile = KtInMemoryTextSourceFile(shortName, "/$shortName", getContentOfSourceFile(it))
it to ktSourceFile
}.toMap() }.toMap()
} }
@@ -28,7 +28,6 @@ import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.lightTree.toKotlinParsingErrorListener
import org.jetbrains.kotlin.fir.session.FirCommonSessionFactory import org.jetbrains.kotlin.fir.session.FirCommonSessionFactory
import org.jetbrains.kotlin.fir.session.FirJvmSessionFactory import org.jetbrains.kotlin.fir.session.FirJvmSessionFactory
import org.jetbrains.kotlin.fir.session.FirNativeSessionFactory import org.jetbrains.kotlin.fir.session.FirNativeSessionFactory
@@ -279,12 +278,7 @@ open class FirFrontendFacade(
val (ktFiles, lightTreeFiles) = when (parser) { val (ktFiles, lightTreeFiles) = when (parser) {
FirParser.LightTree -> { FirParser.LightTree -> {
emptyList<KtFile>() to testServices.sourceFileProvider.getLightTreeFilesForSourceFiles(module.files) { emptyList<KtFile>() to testServices.sourceFileProvider.getKtSourceFilesForSourceFiles(module.files).values
testServices.lightTreeSyntaxDiagnosticsReporterHolder?.reporter?.toKotlinParsingErrorListener(
it,
module.languageVersionSettings
)
}.values
} }
FirParser.Psi -> testServices.sourceFileProvider.getKtFilesForSourceFiles(module.files, project).values to emptyList() FirParser.Psi -> testServices.sourceFileProvider.getKtFilesForSourceFiles(module.files, project).values to emptyList()
} }
@@ -5,24 +5,18 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.builder.PsiRawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.pipeline.*
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput
import org.jetbrains.kotlin.fir.pipeline.runCheckers
import org.jetbrains.kotlin.fir.pipeline.runResolution
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.sourceFiles.LightTreeFile
import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.FirParser
abstract class AbstractFirAnalyzerFacade { abstract class AbstractFirAnalyzerFacade {
@@ -42,7 +36,7 @@ class FirAnalyzerFacade(
val session: FirSession, val session: FirSession,
val fir2IrConfiguration: Fir2IrConfiguration, val fir2IrConfiguration: Fir2IrConfiguration,
val ktFiles: Collection<KtFile> = emptyList(), // may be empty if light tree mode enabled val ktFiles: Collection<KtFile> = emptyList(), // may be empty if light tree mode enabled
val lightTreeFiles: Collection<LightTreeFile> = emptyList(), // may be empty if light tree mode disabled val lightTreeFiles: Collection<KtSourceFile> = emptyList(), // may be empty if light tree mode disabled
val parser: FirParser, val parser: FirParser,
val diagnosticReporterForLightTree: DiagnosticReporter? = null val diagnosticReporterForLightTree: DiagnosticReporter? = null
) : AbstractFirAnalyzerFacade() { ) : AbstractFirAnalyzerFacade() {
@@ -55,24 +49,9 @@ class FirAnalyzerFacade(
private fun buildRawFir() { private fun buildRawFir() {
if (firFiles != null) return if (firFiles != null) return
val firProvider = (session.firProvider as FirProviderImpl)
firFiles = when (parser) { firFiles = when (parser) {
FirParser.LightTree -> { FirParser.LightTree -> session.buildFirViaLightTree(lightTreeFiles, diagnosticReporterForLightTree)
val builder = LightTree2Fir(session, firProvider.kotlinScopeProvider, diagnosticReporterForLightTree) FirParser.Psi -> session.buildFirFromKtFiles(ktFiles)
lightTreeFiles.map {
builder.buildFirFile(it.lightTree, it.sourceFile, it.linesMapping).also { firFile ->
firProvider.recordFile(firFile)
}
}
}
FirParser.Psi -> {
val builder = PsiRawFirBuilder(session, firProvider.kotlinScopeProvider)
ktFiles.map {
builder.buildFirFile(it).also { firFile ->
firProvider.recordFile(firFile)
}
}
}
} }
} }