~ use new source file representation in the new pipeline
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 125e1eb6..0afedde 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
@@ -7,12 +7,17 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.StandardFileSystems +import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.VirtualFileSystem import com.intellij.psi.PsiElementFinder import com.intellij.psi.PsiFile import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.ProjectScope +import org.jetbrains.kotlin.KtIoFileSourceFile +import org.jetbrains.kotlin.KtPsiSourceFile +import org.jetbrains.kotlin.KtSourceFile +import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSession @@ -65,16 +70,33 @@ psiFinderExtensionPoint.registerExtension(FirJavaElementFinder(firSession, project), project) } + private fun List<VirtualFile>.toSearchScope(allowOutOfProjectRoots: Boolean) = + takeIf { it.isNotEmpty() } + ?.let { + if (allowOutOfProjectRoots) GlobalSearchScope.filesWithLibrariesScope(project, it) + else GlobalSearchScope.filesWithoutLibrariesScope(project, it) + } + ?: GlobalSearchScope.EMPTY_SCOPE + override fun getSearchScopeByIoFiles(files: Iterable<File>, allowOutOfProjectRoots: Boolean): AbstractProjectFileSearchScope = PsiBasedProjectFileSearchScope( files .mapNotNull { localFileSystem.findFileByPath(it.absolutePath) } - .toList() - .takeIf { it.isNotEmpty() } - ?.let { - if (allowOutOfProjectRoots) GlobalSearchScope.filesWithLibrariesScope(project, it) - else GlobalSearchScope.filesWithoutLibrariesScope(project, it) - } ?: GlobalSearchScope.EMPTY_SCOPE + .toSearchScope(allowOutOfProjectRoots) + ) + + override fun getSearchScopeBySourceFiles(files: Iterable<KtSourceFile>, allowOutOfProjectRoots: Boolean): AbstractProjectFileSearchScope = + PsiBasedProjectFileSearchScope( + files + .mapNotNull { + when (it) { + is KtPsiSourceFile -> it.psiFile.virtualFile + is KtVirtualFileSourceFile -> it.virtualFile + is KtIoFileSourceFile -> localFileSystem.findFileByPath(it.file.absolutePath) + else -> null // TODO: find out whether other use cases should be supported + } + } + .toSearchScope(allowOutOfProjectRoots) ) override fun getSearchScopeByDirectories(directories: Iterable<File>): AbstractProjectFileSearchScope =
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 2da0cbc..2e348f0 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
@@ -17,6 +17,8 @@ import com.intellij.psi.PsiManager import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.io.URLUtil +import org.jetbrains.kotlin.KtSourceFile +import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl @@ -103,13 +105,12 @@ for (module in chunk) { val moduleConfiguration = compilerConfiguration.applyModuleProperties(module, buildFile) - val platformSources = linkedSetOf<File>() - val commonSources = linkedSetOf<File>() + val platformSources = linkedSetOf<KtSourceFile>() + val commonSources = linkedSetOf<KtSourceFile>() // !! compilerConfiguration.kotlinSourceRoots.forAllFiles(compilerConfiguration, projectEnvironment.project) { virtualFile, isCommon -> - val file = File(virtualFile.canonicalPath ?: virtualFile.path) - if (!file.isFile) error("TODO: better error: file not found $virtualFile") + val file = KtVirtualFileSourceFile(virtualFile) if (isCommon) commonSources.add(file) else platformSources.add(file) } @@ -259,14 +260,14 @@ diagnosticsReporter: DiagnosticReporter, performanceManager: CommonCompilerPerformanceManager? ): ModuleCompilerAnalyzedOutput { - var sourcesScope = environment.projectEnvironment.getSearchScopeByIoFiles(input.platformSources) //!! + var sourcesScope = environment.projectEnvironment.getSearchScopeBySourceFiles(input.platformSources) val sessionProvider = FirProjectSessionProvider() val extendedAnalysisMode = input.configuration.getBoolean(CommonConfigurationKeys.USE_FIR_EXTENDED_CHECKERS) val commonSession = runIf( input.commonSources.isNotEmpty() && input.configuration.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects) ) { - val commonSourcesScope = environment.projectEnvironment.getSearchScopeByIoFiles(input.commonSources) //!! + val commonSourcesScope = environment.projectEnvironment.getSearchScopeBySourceFiles(input.commonSources) sourcesScope -= commonSourcesScope createSession( "${input.targetId.name}-common",
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipelineData.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipelineData.kt index 4935561..9262543 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipelineData.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipelineData.kt
@@ -5,6 +5,7 @@ package org.jetbrains.kotlin.cli.jvm.compiler.pipeline +import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.config.CompilerConfiguration @@ -27,9 +28,9 @@ data class ModuleCompilerInput( val targetId: TargetId, val commonPlatform: TargetPlatform, - val commonSources: Collection<File>, + val commonSources: Collection<KtSourceFile>, val platform: TargetPlatform, - val platformSources: Collection<File>, + val platformSources: Collection<KtSourceFile>, val configuration: CompilerConfiguration, val friendFirModules: Collection<FirModuleData> = emptyList() )
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 63b09de..45bbdd1 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,7 +5,7 @@ package org.jetbrains.kotlin.fir.pipeline -import org.jetbrains.kotlin.KtIoFileSourceFile +import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.builder.PsiHandlingMode @@ -17,10 +17,9 @@ import org.jetbrains.kotlin.fir.session.sourcesToPathsMapper import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.readSourceFileWithMapping -import java.io.File fun FirSession.buildFirViaLightTree( - files: Collection<File>, + files: Collection<KtSourceFile>, diagnosticsReporter: DiagnosticReporter? = null, reportFilesAndLines: ((Int, Int) -> Unit)? = null ): List<FirFile> { @@ -30,16 +29,15 @@ val shouldCountLines = (reportFilesAndLines != null) var linesCount = 0 val firFiles = files.map { file -> - val sourceFile = KtIoFileSourceFile(file) - val (code, linesMapping) = with(file.inputStream().reader(Charsets.UTF_8)) { + val (code, linesMapping) = with(file.getContentsAsStream().reader(Charsets.UTF_8)) { this.readSourceFileWithMapping() } if (shouldCountLines) { linesCount += linesMapping.lastOffset } - builder.buildFirFile(code, sourceFile, linesMapping).also { firFile -> + builder.buildFirFile(code, file, linesMapping).also { firFile -> firProvider.recordFile(firFile) - sourcesToPathsMapper.registerFileSource(firFile.source!!, file.path) + sourcesToPathsMapper.registerFileSource(firFile.source!!, file.path ?: file.name) } } reportFilesAndLines?.invoke(files.count(), linesCount)
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 cfdea44..517e381 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
@@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.session.environment +import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.java.FirJavaFacade @@ -49,6 +50,8 @@ fun getSearchScopeByIoFiles(files: Iterable<File>, allowOutOfProjectRoots: Boolean = false): AbstractProjectFileSearchScope + fun getSearchScopeBySourceFiles(files: Iterable<KtSourceFile>, allowOutOfProjectRoots: Boolean = false): AbstractProjectFileSearchScope + fun getSearchScopeByDirectories(directories: Iterable<File>): AbstractProjectFileSearchScope fun getSearchScopeForProjectLibraries(): AbstractProjectFileSearchScope
diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt index 71c8c31..ed00a90 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt
@@ -8,6 +8,8 @@ import com.intellij.ide.highlighter.JavaFileType import com.intellij.openapi.util.Disposer import com.intellij.psi.PsiJavaModule +import org.jetbrains.kotlin.KtSourceFile +import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor @@ -175,12 +177,11 @@ createProjectEnvironment(configuration, rootDisposable, EnvironmentConfigFiles.JVM_CONFIG_FILES, messageCollector) // -sources - val allPlatformSourceFiles = linkedSetOf<File>() // TODO: get from caller - val allCommonSourceFiles = linkedSetOf<File>() + val allPlatformSourceFiles = linkedSetOf<KtSourceFile>() // TODO: get from caller + val allCommonSourceFiles = linkedSetOf<KtSourceFile>() configuration.kotlinSourceRoots.forAllFiles(configuration, projectEnvironment.project) { virtualFile, isCommon -> - val file = File(virtualFile.canonicalPath ?: virtualFile.path) - if (!file.isFile) error("TODO: better error: file not found $virtualFile") + val file = KtVirtualFileSourceFile(virtualFile) if (isCommon) allCommonSourceFiles.add(file) else allPlatformSourceFiles.add(file) } @@ -203,8 +204,8 @@ val compilerInput = ModuleCompilerInput( targetId, - CommonPlatforms.defaultCommonPlatform, dirtySources.filter { it in allCommonSourceFiles }, - JvmPlatforms.unspecifiedJvmPlatform, dirtySources.filter { it in allPlatformSourceFiles }, + CommonPlatforms.defaultCommonPlatform, allCommonSourceFiles.filter { dirtySources.any { df -> df.path == it.path } }, + JvmPlatforms.unspecifiedJvmPlatform, allPlatformSourceFiles.filter { dirtySources.any { df -> df.path == it.path } }, configuration )