Skip to content

Commit 0f83c26

Browse files
authored
Add FIR-to-IR conversion phase to KotlinParser (#6793)
After FIR analysis, run JvmFir2IrPipelinePhase to populate the irFile field on KotlinSource, enabling future use of IR-based type mapping for improved Kotlin parsing.
1 parent 012523d commit 0f83c26

1 file changed

Lines changed: 43 additions & 0 deletions

File tree

rewrite-kotlin/src/main/java/org/openrewrite/kotlin/KotlinParser.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import lombok.AccessLevel;
2323
import lombok.RequiredArgsConstructor;
2424
import org.intellij.lang.annotations.Language;
25+
import org.jetbrains.kotlin.KtPsiSourceFile;
2526
import org.jetbrains.kotlin.KtRealPsiSourceElement;
27+
import org.jetbrains.kotlin.KtSourceFile;
2628
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments;
2729
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport;
2830
import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
@@ -32,8 +34,13 @@
3234
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
3335
import org.jetbrains.kotlin.cli.jvm.compiler.VfsBasedProjectEnvironment;
3436
import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt;
37+
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelineArtifact;
38+
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase;
39+
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFrontendPipelineArtifact;
3540
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFrontendPipelinePhase;
3641
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar;
42+
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector;
43+
import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticsCollector;
3744
import org.openrewrite.kotlin.internal.ScriptCompilerPlugin;
3845
import org.jetbrains.kotlin.com.intellij.openapi.Disposable;
3946
import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer;
@@ -51,9 +58,13 @@
5158
import org.jetbrains.kotlin.fir.FirSession;
5259
import org.jetbrains.kotlin.fir.declarations.FirFile;
5360
import org.jetbrains.kotlin.fir.pipeline.AnalyseKt;
61+
import org.jetbrains.kotlin.fir.pipeline.FirResult;
5462
import org.jetbrains.kotlin.fir.pipeline.FirUtilsKt;
63+
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput;
5564
import org.jetbrains.kotlin.fir.resolve.ScopeSession;
5665
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope;
66+
import org.jetbrains.kotlin.ir.declarations.IrFile;
67+
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment;
5768
import org.jetbrains.kotlin.idea.KotlinFileType;
5869
import org.jetbrains.kotlin.idea.KotlinLanguage;
5970
import org.jetbrains.kotlin.modules.Module;
@@ -466,7 +477,39 @@ public CompiledSource parse(List<Parser.Input> sources, Disposable disposable, E
466477
kotlinSources.get(i).setFirFile(result.getSecond().get(i));
467478
}
468479

480+
// FIR-to-IR conversion
481+
try {
482+
ModuleCompilerAnalyzedOutput moduleOutput = new ModuleCompilerAnalyzedOutput(
483+
firSession, result.getFirst(), result.getSecond());
484+
FirResult firResult = new FirResult(singletonList(moduleOutput));
485+
486+
List<KtSourceFile> sourceFiles = new ArrayList<>(ktFiles.size());
487+
for (KtFile ktFile : ktFiles) {
488+
sourceFiles.add(new KtPsiSourceFile(ktFile));
489+
}
490+
491+
JvmFrontendPipelineArtifact frontendArtifact = new JvmFrontendPipelineArtifact(
492+
firResult, compilerConfiguration, projectEnvironment,
493+
new SimpleDiagnosticsCollector(BaseDiagnosticsCollector.RawReporter.Companion.getDO_NOTHING()),
494+
sourceFiles);
495+
496+
JvmFir2IrPipelineArtifact fir2IrArtifact =
497+
JvmFir2IrPipelinePhase.INSTANCE.executePhase(frontendArtifact);
498+
499+
IrModuleFragment irModule = fir2IrArtifact.getResult().getIrModuleFragment();
500+
Map<String, IrFile> irFilesByName = new HashMap<>();
501+
for (IrFile irFile : irModule.getFiles()) {
502+
irFilesByName.put(irFile.getFileEntry().getName(), irFile);
503+
}
504+
for (KotlinSource kotlinSource : kotlinSources) {
505+
kotlinSource.setIrFile(irFilesByName.get(kotlinSource.getKtFile().getName()));
506+
}
507+
} catch (Throwable ignored) {
508+
// FIR-to-IR conversion is best-effort; irFile will remain null
509+
}
510+
469511
return new CompiledSource(firSession, kotlinSources);
512+
470513
}
471514

472515
private Module buildModule(CompilerConfiguration compilerConfiguration) {

0 commit comments

Comments
 (0)