[FIR] KT-58065: Support LT in K2JsIrCompiler
This commit is contained in:
committed by
Space Team
parent
bbb36ce501
commit
d72a50b3f5
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.cli.common
|
||||
|
||||
import org.jetbrains.kotlin.KtSourceFile
|
||||
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.GroupedKtSources
|
||||
import org.jetbrains.kotlin.config.*
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.cli.common
|
||||
|
||||
import com.intellij.ide.highlighter.JavaFileType
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.KtSourceFile
|
||||
import org.jetbrains.kotlin.KtVirtualFileSourceFile
|
||||
import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots
|
||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.VfsBasedProjectEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.forAllFiles
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
|
||||
private const val kotlinFileExtensionWithDot = ".${KotlinFileType.EXTENSION}"
|
||||
private const val javaFileExtensionWithDot = ".${JavaFileType.DEFAULT_EXTENSION}"
|
||||
|
||||
data class GroupedKtSources(
|
||||
val platformSources: Collection<KtSourceFile>,
|
||||
val commonSources: Collection<KtSourceFile>,
|
||||
val sourcesByModuleName: Map<String, Set<KtSourceFile>>,
|
||||
)
|
||||
|
||||
fun collectSources(
|
||||
compilerConfiguration: CompilerConfiguration,
|
||||
projectEnvironment: VfsBasedProjectEnvironment,
|
||||
messageCollector: MessageCollector
|
||||
): GroupedKtSources {
|
||||
return collectSources(compilerConfiguration, projectEnvironment.project, messageCollector)
|
||||
}
|
||||
|
||||
fun collectSources(
|
||||
compilerConfiguration: CompilerConfiguration,
|
||||
project: Project,
|
||||
messageCollector: MessageCollector
|
||||
): GroupedKtSources {
|
||||
val platformSources = linkedSetOf<KtSourceFile>()
|
||||
val commonSources = linkedSetOf<KtSourceFile>()
|
||||
val sourcesByModuleName = mutableMapOf<String, MutableSet<KtSourceFile>>()
|
||||
|
||||
// TODO: the scripts checking should be part of the scripting plugin functionality, as it is implemented now in ScriptingProcessSourcesBeforeCompilingExtension
|
||||
// TODO: implement in the next round of K2 scripting support (https://youtrack.jetbrains.com/issue/KT-55728)
|
||||
val skipScriptsInLtMode = compilerConfiguration.getBoolean(CommonConfigurationKeys.USE_FIR) &&
|
||||
compilerConfiguration.getBoolean(CommonConfigurationKeys.USE_LIGHT_TREE)
|
||||
var skipScriptsInLtModeWarning = false
|
||||
|
||||
compilerConfiguration.kotlinSourceRoots.forAllFiles(
|
||||
compilerConfiguration,
|
||||
project
|
||||
) { virtualFile, isCommon, moduleName ->
|
||||
val file = KtVirtualFileSourceFile(virtualFile)
|
||||
when {
|
||||
file.path.endsWith(javaFileExtensionWithDot) -> {}
|
||||
file.path.endsWith(kotlinFileExtensionWithDot) || !skipScriptsInLtMode -> {
|
||||
if (isCommon) commonSources.add(file)
|
||||
else platformSources.add(file)
|
||||
|
||||
if (moduleName != null) {
|
||||
sourcesByModuleName.getOrPut(moduleName) { mutableSetOf() }.add(file)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
// temporarily assume it is a script, see the TODO above
|
||||
skipScriptsInLtModeWarning = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (skipScriptsInLtModeWarning) {
|
||||
// TODO: remove then Scripts are supported in LT (probably different K2 extension should be written for handling the case properly)
|
||||
messageCollector.report(
|
||||
CompilerMessageSeverity.STRONG_WARNING,
|
||||
"Scripts are not yet supported with K2 in LightTree mode, consider using K1 or disable LightTree mode with -Xuse-fir-lt=false"
|
||||
)
|
||||
}
|
||||
return GroupedKtSources(platformSources, commonSources, sourcesByModuleName)
|
||||
}
|
||||
@@ -45,7 +45,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
|
||||
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
|
||||
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
|
||||
@@ -56,7 +55,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
|
||||
import org.jetbrains.kotlin.javac.JavacWrapper
|
||||
import org.jetbrains.kotlin.load.kotlin.MetadataFinderFactory
|
||||
@@ -73,10 +71,6 @@ import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStat
|
||||
import org.jetbrains.kotlin.resolve.ModuleAnnotationsResolver
|
||||
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
|
||||
import java.io.File
|
||||
import kotlin.reflect.KFunction2
|
||||
|
||||
private const val kotlinFileExtensionWithDot = ".${KotlinFileType.EXTENSION}"
|
||||
private const val javaFileExtensionWithDot = ".${JavaFileType.DEFAULT_EXTENSION}"
|
||||
|
||||
fun compileModulesUsingFrontendIrAndLightTree(
|
||||
projectEnvironment: AbstractProjectEnvironment,
|
||||
@@ -166,59 +160,6 @@ fun compileModulesUsingFrontendIrAndLightTree(
|
||||
)
|
||||
}
|
||||
|
||||
data class GroupedKtSources(
|
||||
val platformSources: Collection<KtSourceFile>,
|
||||
val commonSources: Collection<KtSourceFile>,
|
||||
val sourcesByModuleName: Map<String, Set<KtSourceFile>>,
|
||||
)
|
||||
|
||||
fun collectSources(
|
||||
compilerConfiguration: CompilerConfiguration,
|
||||
projectEnvironment: VfsBasedProjectEnvironment,
|
||||
messageCollector: MessageCollector
|
||||
): GroupedKtSources {
|
||||
val platformSources = linkedSetOf<KtSourceFile>()
|
||||
val commonSources = linkedSetOf<KtSourceFile>()
|
||||
val sourcesByModuleName = mutableMapOf<String, MutableSet<KtSourceFile>>()
|
||||
|
||||
// TODO: the scripts checking should be part of the scripting plugin functionality, as it is implemented now in ScriptingProcessSourcesBeforeCompilingExtension
|
||||
// TODO: implement in the next round of K2 scripting support (https://youtrack.jetbrains.com/issue/KT-55728)
|
||||
val skipScriptsInLtMode = compilerConfiguration.getBoolean(CommonConfigurationKeys.USE_FIR) &&
|
||||
compilerConfiguration.getBoolean(CommonConfigurationKeys.USE_LIGHT_TREE)
|
||||
var skipScriptsInLtModeWarning = false
|
||||
|
||||
compilerConfiguration.kotlinSourceRoots.forAllFiles(
|
||||
compilerConfiguration,
|
||||
projectEnvironment.project
|
||||
) { virtualFile, isCommon, moduleName ->
|
||||
val file = KtVirtualFileSourceFile(virtualFile)
|
||||
when {
|
||||
file.path.endsWith(javaFileExtensionWithDot) -> {}
|
||||
file.path.endsWith(kotlinFileExtensionWithDot) || !skipScriptsInLtMode -> {
|
||||
if (isCommon) commonSources.add(file)
|
||||
else platformSources.add(file)
|
||||
|
||||
if (moduleName != null) {
|
||||
sourcesByModuleName.getOrPut(moduleName) { mutableSetOf() }.add(file)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
// temporarily assume it is a script, see the TODO above
|
||||
skipScriptsInLtModeWarning = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (skipScriptsInLtModeWarning) {
|
||||
// TODO: remove then Scripts are supported in LT (probably different K2 extension should be written for handling the case properly)
|
||||
messageCollector.report(
|
||||
CompilerMessageSeverity.STRONG_WARNING,
|
||||
"Scripts are not yet supported with K2 in LightTree mode, consider using K1 or disable LightTree mode with -Xuse-fir-lt=false"
|
||||
)
|
||||
}
|
||||
return GroupedKtSources(platformSources, commonSources, sourcesByModuleName)
|
||||
}
|
||||
|
||||
fun convertAnalyzedFirToIr(
|
||||
input: ModuleCompilerInput,
|
||||
analysisResults: FirResult,
|
||||
@@ -361,16 +302,6 @@ fun compileModuleToAnalyzedFir(
|
||||
return FirResult(outputs)
|
||||
}
|
||||
|
||||
private fun buildResolveAndCheckFir(
|
||||
session: FirSession,
|
||||
ktFiles: Collection<KtSourceFile>,
|
||||
diagnosticsReporter: DiagnosticReporter,
|
||||
countFilesAndLines: KFunction2<Int, Int, Unit>?
|
||||
): ModuleCompilerAnalyzedOutput {
|
||||
val firFiles = session.buildFirViaLightTree(ktFiles, diagnosticsReporter, countFilesAndLines)
|
||||
return resolveAndCheckFir(session, firFiles, diagnosticsReporter)
|
||||
}
|
||||
|
||||
fun writeOutputs(
|
||||
projectEnvironment: AbstractProjectEnvironment,
|
||||
configuration: CompilerConfiguration,
|
||||
|
||||
+1
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.cli.jvm.compiler.pipeline
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult
|
||||
import org.jetbrains.kotlin.cli.common.GroupedKtSources
|
||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
|
||||
|
||||
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.VfsBasedProjectEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.createContextForIncrementalCompilation
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.collectSources
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.createContextForIncrementalCompilation
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.createIncrementalCompilationScope
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.toAbstractProjectEnvironment
|
||||
|
||||
Reference in New Issue
Block a user