From 018782f0c7888ec6048c136e0296e87f7e839446 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Thu, 3 Feb 2022 08:44:11 +0100 Subject: [PATCH] FIR CLI: use VFS for LT files loading may improve performance in some cases and is consistent with handling of PSI files --- .../cli/jvm/compiler/VfsBasedProjectEnvironment.kt | 3 +++ .../cli/jvm/compiler/pipeline/compilerPipeline.kt | 10 ++++++++-- .../src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt | 9 ++++++--- .../session/environment/AbstractProjectEnvironment.kt | 2 ++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt index f034767bb34..d5532f37e67 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt @@ -107,6 +107,9 @@ open class VfsBasedProjectEnvironment( baseModuleData: FirModuleData, fileSearchScope: AbstractProjectFileSearchScope ) = FirJavaFacade(firSession, baseModuleData, project.createJavaClassFinder(fileSearchScope.asPsiSearchScope())) + + override fun getFileText(filePath: String): String? = + localFileSystem.findFileByPath(filePath)?.inputStream?.reader(Charsets.UTF_8)?.readText() } private fun AbstractProjectFileSearchScope.asPsiSearchScope() = diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt index 6bb4f628be9..52d6d2060c1 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt @@ -311,8 +311,14 @@ fun compileModuleToAnalyzedFir( val countFilesAndLines = if (performanceManager == null) null else performanceManager::addSourcesStats // raw fir - val commonRawFir = commonSession?.buildFirViaLightTree(input.commonSources, diagnosticsReporter, countFilesAndLines) - val rawFir = session.buildFirViaLightTree(input.platformSources, diagnosticsReporter, countFilesAndLines) + val commonRawFir = commonSession?.buildFirViaLightTree( + input.commonSources, + environment.projectEnvironment, + diagnosticsReporter, + countFilesAndLines + ) + val rawFir = + session.buildFirViaLightTree(input.platformSources, environment.projectEnvironment, diagnosticsReporter, countFilesAndLines) // resolution commonSession?.apply { diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt index f6f6da4d670..650c18cb078 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt @@ -5,8 +5,7 @@ package org.jetbrains.kotlin.fir.pipeline -import com.intellij.openapi.util.io.FileUtil -import com.intellij.openapi.vfs.CharsetToolkit +import com.intellij.openapi.util.text.StringUtilRt import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.builder.PsiHandlingMode @@ -15,12 +14,15 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl +import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.sourcesToPathsMapper import org.jetbrains.kotlin.psi.KtFile import java.io.File +import java.io.FileNotFoundException fun FirSession.buildFirViaLightTree( files: Collection, + projectEnvironment: AbstractProjectEnvironment, diagnosticsReporter: DiagnosticReporter? = null, reportFilesAndLines: ((Int, Int) -> Unit)? = null ): List { @@ -30,7 +32,8 @@ fun FirSession.buildFirViaLightTree( val shouldCountLines = (reportFilesAndLines != null) var linesCount = 0 val firFiles = files.map { file -> - val code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true /* code below relies on conversion */) + val text = projectEnvironment.getFileText(file.absolutePath) ?: throw FileNotFoundException(file.path) + val code = StringUtilRt.convertLineSeparators(text) if (shouldCountLines) { linesCount += code.count { it == '\n' } // assuming converted line separators } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/environment/AbstractProjectEnvironment.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/environment/AbstractProjectEnvironment.kt index cfdea448187..5cc2be1e743 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/environment/AbstractProjectEnvironment.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/environment/AbstractProjectEnvironment.kt @@ -60,4 +60,6 @@ interface AbstractProjectEnvironment { baseModuleData: FirModuleData, fileSearchScope: AbstractProjectFileSearchScope ): FirJavaFacade + + fun getFileText(filePath: String): String? }