[FIR] KT-58065: Support LT in K2JsIrCompiler
This commit is contained in:
committed by
Space Team
parent
bbb36ce501
commit
d72a50b3f5
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.cli.js
|
||||
import com.intellij.openapi.Disposable
|
||||
import com.intellij.openapi.util.Disposer
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import org.jetbrains.kotlin.KtSourceFile
|
||||
import org.jetbrains.kotlin.backend.common.CompilationException
|
||||
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
||||
import org.jetbrains.kotlin.backend.wasm.compileToLoweredIr
|
||||
@@ -31,10 +32,7 @@ import org.jetbrains.kotlin.cli.js.klib.*
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.Services
|
||||
import org.jetbrains.kotlin.config.getModuleNameForSource
|
||||
import org.jetbrains.kotlin.config.*
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
|
||||
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
|
||||
@@ -494,16 +492,37 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
|
||||
val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING
|
||||
|
||||
val outputs = compileModuleToAnalyzedFir(
|
||||
moduleStructure = moduleStructure,
|
||||
ktFiles = environmentForJS.getSourceFiles(),
|
||||
libraries = libraries,
|
||||
friendLibraries = friendLibraries,
|
||||
messageCollector = messageCollector,
|
||||
diagnosticsReporter = diagnosticsReporter,
|
||||
incrementalDataProvider = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER],
|
||||
lookupTracker = lookupTracker,
|
||||
) ?: return null
|
||||
val outputs = if (
|
||||
configuration.getBoolean(CommonConfigurationKeys.USE_FIR) && configuration.getBoolean(CommonConfigurationKeys.USE_LIGHT_TREE)
|
||||
) {
|
||||
val groupedSources = collectSources(configuration, environmentForJS.project, messageCollector)
|
||||
|
||||
compileModulesToAnalyzedFirWithLightTree(
|
||||
moduleStructure = moduleStructure,
|
||||
groupedSources = groupedSources,
|
||||
// TODO: Only pass groupedSources, because
|
||||
// we will need to have them separated again
|
||||
// in createSessionsForLegacyMppProject anyway
|
||||
ktSourceFiles = groupedSources.commonSources + groupedSources.platformSources,
|
||||
libraries = libraries,
|
||||
friendLibraries = friendLibraries,
|
||||
messageCollector = messageCollector,
|
||||
diagnosticsReporter = diagnosticsReporter,
|
||||
incrementalDataProvider = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER],
|
||||
lookupTracker = lookupTracker,
|
||||
) ?: return null
|
||||
} else {
|
||||
compileModuleToAnalyzedFirWithPsi(
|
||||
moduleStructure = moduleStructure,
|
||||
ktFiles = environmentForJS.getSourceFiles(),
|
||||
libraries = libraries,
|
||||
friendLibraries = friendLibraries,
|
||||
messageCollector = messageCollector,
|
||||
diagnosticsReporter = diagnosticsReporter,
|
||||
incrementalDataProvider = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER],
|
||||
lookupTracker = lookupTracker,
|
||||
) ?: return null
|
||||
}
|
||||
|
||||
// FIR2IR
|
||||
val fir2IrActualizedResult = transformFirToIr(moduleStructure, outputs, diagnosticsReporter)
|
||||
|
||||
@@ -9,13 +9,10 @@ import org.jetbrains.kotlin.KtSourceFile
|
||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||
import org.jetbrains.kotlin.cli.common.fileBelongsToModuleForPsi
|
||||
import org.jetbrains.kotlin.cli.common.*
|
||||
import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter
|
||||
import org.jetbrains.kotlin.cli.common.isCommonSourceForPsi
|
||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
import org.jetbrains.kotlin.cli.common.prepareJsSessions
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
@@ -54,15 +51,19 @@ import org.jetbrains.kotlin.utils.metadataVersion
|
||||
import java.io.File
|
||||
import java.nio.file.Paths
|
||||
|
||||
fun compileModuleToAnalyzedFir(
|
||||
inline fun <F> compileModuleToAnalyzedFir(
|
||||
moduleStructure: ModulesStructure,
|
||||
ktFiles: List<KtFile>,
|
||||
files: List<F>,
|
||||
libraries: List<String>,
|
||||
friendLibraries: List<String>,
|
||||
messageCollector: MessageCollector,
|
||||
diagnosticsReporter: BaseDiagnosticsCollector,
|
||||
incrementalDataProvider: IncrementalDataProvider?,
|
||||
lookupTracker: LookupTracker?,
|
||||
fileHasSyntaxErrors: (F) -> Boolean,
|
||||
noinline isCommonSource: (F) -> Boolean,
|
||||
noinline fileBelongsToModule: (F, String) -> Boolean,
|
||||
buildResolveAndCheckFir: (FirSession, List<F>) -> ModuleCompilerAnalyzedOutput,
|
||||
): List<ModuleCompilerAnalyzedOutput>? {
|
||||
val renderDiagnosticNames = moduleStructure.compilerConfiguration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME)
|
||||
|
||||
@@ -72,8 +73,8 @@ fun compileModuleToAnalyzedFir(
|
||||
val mainModuleName = moduleStructure.compilerConfiguration.get(CommonConfigurationKeys.MODULE_NAME)!!
|
||||
val escapedMainModuleName = Name.special("<$mainModuleName>")
|
||||
|
||||
val syntaxErrors = ktFiles.fold(false) { errorsFound, ktFile ->
|
||||
AnalyzerWithCompilerReport.reportSyntaxErrors(ktFile, messageCollector).isHasErrors or errorsFound
|
||||
val syntaxErrors = files.fold(false) { errorsFound, file ->
|
||||
fileHasSyntaxErrors(file) or errorsFound
|
||||
}
|
||||
|
||||
val binaryModuleData = BinaryModuleData.initialize(escapedMainModuleName, JsPlatforms.defaultJsPlatform, JsPlatformAnalyzerServices)
|
||||
@@ -84,15 +85,17 @@ fun compileModuleToAnalyzedFir(
|
||||
}
|
||||
|
||||
val resolvedLibraries = moduleStructure.allDependencies
|
||||
|
||||
val sessionsWithSources = prepareJsSessions(
|
||||
ktFiles, moduleStructure.compilerConfiguration, escapedMainModuleName,
|
||||
resolvedLibraries, dependencyList, extensionRegistrars, isCommonSourceForPsi, fileBelongsToModuleForPsi,
|
||||
lookupTracker, icData = incrementalDataProvider?.let { KlibIcData(it) }
|
||||
files, moduleStructure.compilerConfiguration, escapedMainModuleName,
|
||||
resolvedLibraries, dependencyList, extensionRegistrars,
|
||||
isCommonSource = isCommonSource,
|
||||
fileBelongsToModule = fileBelongsToModule,
|
||||
lookupTracker,
|
||||
icData = incrementalDataProvider?.let(::KlibIcData),
|
||||
)
|
||||
|
||||
val outputs = sessionsWithSources.map {
|
||||
buildResolveAndCheckFir(it.session, it.files, diagnosticsReporter)
|
||||
buildResolveAndCheckFir(it.session, it.files)
|
||||
}
|
||||
|
||||
if (syntaxErrors || diagnosticsReporter.hasErrors) {
|
||||
@@ -103,6 +106,63 @@ fun compileModuleToAnalyzedFir(
|
||||
return outputs
|
||||
}
|
||||
|
||||
fun compileModuleToAnalyzedFirWithPsi(
|
||||
moduleStructure: ModulesStructure,
|
||||
ktFiles: List<KtFile>,
|
||||
libraries: List<String>,
|
||||
friendLibraries: List<String>,
|
||||
messageCollector: MessageCollector,
|
||||
diagnosticsReporter: BaseDiagnosticsCollector,
|
||||
incrementalDataProvider: IncrementalDataProvider?,
|
||||
lookupTracker: LookupTracker?,
|
||||
): List<ModuleCompilerAnalyzedOutput>? {
|
||||
return compileModuleToAnalyzedFir(
|
||||
moduleStructure,
|
||||
ktFiles,
|
||||
libraries,
|
||||
friendLibraries,
|
||||
messageCollector,
|
||||
diagnosticsReporter,
|
||||
incrementalDataProvider,
|
||||
lookupTracker,
|
||||
fileHasSyntaxErrors = { AnalyzerWithCompilerReport.reportSyntaxErrors(it, messageCollector).isHasErrors },
|
||||
isCommonSource = isCommonSourceForPsi,
|
||||
fileBelongsToModule = fileBelongsToModuleForPsi,
|
||||
buildResolveAndCheckFir = { session, files ->
|
||||
buildResolveAndCheckFir(session, files, diagnosticsReporter)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fun compileModulesToAnalyzedFirWithLightTree(
|
||||
moduleStructure: ModulesStructure,
|
||||
groupedSources: GroupedKtSources,
|
||||
ktSourceFiles: List<KtSourceFile>,
|
||||
libraries: List<String>,
|
||||
friendLibraries: List<String>,
|
||||
messageCollector: MessageCollector,
|
||||
diagnosticsReporter: BaseDiagnosticsCollector,
|
||||
incrementalDataProvider: IncrementalDataProvider?,
|
||||
lookupTracker: LookupTracker?,
|
||||
): List<ModuleCompilerAnalyzedOutput>? {
|
||||
return compileModuleToAnalyzedFir(
|
||||
moduleStructure,
|
||||
ktSourceFiles,
|
||||
libraries,
|
||||
friendLibraries,
|
||||
messageCollector,
|
||||
diagnosticsReporter,
|
||||
incrementalDataProvider,
|
||||
lookupTracker,
|
||||
fileHasSyntaxErrors = { false },
|
||||
isCommonSource = { groupedSources.isCommonSourceForLt(it) },
|
||||
fileBelongsToModule = { file, it -> groupedSources.fileBelongsToModuleForLt(file, it) },
|
||||
buildResolveAndCheckFir = { session, files ->
|
||||
buildResolveAndCheckFir(session, files, diagnosticsReporter, null)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fun transformFirToIr(
|
||||
moduleStructure: ModulesStructure,
|
||||
firOutputs: List<ModuleCompilerAnalyzedOutput>,
|
||||
|
||||
Reference in New Issue
Block a user