diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java index 93707be5b21..433a5c9f4c1 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java @@ -85,6 +85,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerate runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt"); } + @Test + @TestMetadata("commonContext.kt") + public void testCommonContext() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.kt"); + } + @Test @TestMetadata("customName.kt") public void testCustomName() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java index 3ffdbe59be1..282ce91fa63 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java @@ -85,6 +85,12 @@ public class FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated exten runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt"); } + @Test + @TestMetadata("commonContext.kt") + public void testCommonContext() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.kt"); + } + @Test @TestMetadata("customName.kt") public void testCustomName() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java index 117a1c5e10c..f138cd7138a 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/diagnosticProvider/FirIdeNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java @@ -46,6 +46,18 @@ public class FirIdeNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestG KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("evalJvm.kt") + public void testEvalJvm() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.kt"); + } + + @Test + @TestMetadata("evalJvmJs.kt") + public void testEvalJvmJs() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.kt"); + } + @Test @TestMetadata("localClass.kt") public void testLocalClass() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java index 3085604fe35..eb27738979b 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/diagnosticProvider/FirStandaloneNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.java @@ -46,6 +46,18 @@ public class FirStandaloneNormalAnalysisSourceModuleCodeFragmentCollectDiagnosti KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("evalJvm.kt") + public void testEvalJvm() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.kt"); + } + + @Test + @TestMetadata("evalJvmJs.kt") + public void testEvalJvmJs() throws Exception { + runTest("analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.kt"); + } + @Test @TestMetadata("localClass.kt") public void testLocalClass() throws Exception { diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.fragment.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.fragment.kt new file mode 100644 index 00000000000..a5f6d5dcbab --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.fragment.kt @@ -0,0 +1 @@ +foo.call() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.ir.txt new file mode 100644 index 00000000000..bed6dbd494d --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.ir.txt @@ -0,0 +1,13 @@ +MODULE_FRAGMENT + FILE fqName: fileName:fragment.kt + CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CodeFragment + CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + FUN name:run visibility:public modality:FINAL <> (p0:test.Foo) returnType:kotlin.Unit + VALUE_PARAMETER name:p0 index:0 type:test.Foo + EXPRESSION_BODY + BLOCK type=kotlin.Unit origin=null + CALL 'public final fun call (): kotlin.Unit [expect] declared in test.Foo' type=kotlin.Unit origin=null + $this: GET_VAR 'p0: test.Foo declared in .CodeFragment.run' type=test.Foo origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.kt new file mode 100644 index 00000000000..96631577510 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +MultiPlatformProjects + +// MODULE: common +// TARGET_PLATFORM: Common +// FILE: Common.kt +package test + +fun test(foo: Foo) { + foo.call() +} + +expect class Foo { + fun call() +} + +// MODULE: main()()(common) +// TARGET_PLATFORM: JVM +// FILE: Jvm.kt +package test + +actual class Foo { + fun call() {} +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.txt new file mode 100644 index 00000000000..83e7cb9e200 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/commonContext.txt @@ -0,0 +1,5 @@ +public final class CodeFragment { + // source: 'fragment.kt' + public method (): void + public final static method run(p0: test.Foo): void +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.fragment.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.fragment.kt new file mode 100644 index 00000000000..978c14a8ec7 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.fragment.kt @@ -0,0 +1 @@ +eval("node") \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.kt new file mode 100644 index 00000000000..3b884ff2e59 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.kt @@ -0,0 +1,6 @@ +// WITH_STDLIB +// TARGET_PLATFORM: JVM + +fun foo(node: kotlinx.dom.Node) { + check(node.isElement) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.txt b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.txt new file mode 100644 index 00000000000..642e26a12f1 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvm.txt @@ -0,0 +1,4 @@ +Diagnostics from elements: + for PSI element of type KtNameReferenceExpression at (1,1-5) + UNRESOLVED_REFERENCE text ranges: [(0,4)] + PSI: KtNameReferenceExpression at (1,1-5) diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.fragment.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.fragment.kt new file mode 100644 index 00000000000..978c14a8ec7 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.fragment.kt @@ -0,0 +1 @@ +eval("node") \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.kt b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.kt new file mode 100644 index 00000000000..d0646cc9d7b --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.kt @@ -0,0 +1,6 @@ +// WITH_STDLIB +// TARGET_PLATFORM: JVM, JS + +fun foo(node: kotlinx.dom.Node) { + check(node.isElement) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.txt b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.txt new file mode 100644 index 00000000000..642e26a12f1 --- /dev/null +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/codeFragmentDiagnostics/evalJvmJs.txt @@ -0,0 +1,4 @@ +Diagnostics from elements: + for PSI element of type KtNameReferenceExpression at (1,1-5) + UNRESOLVED_REFERENCE text ranges: [(0,4)] + PSI: KtNameReferenceExpression at (1,1-5) diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtLibrarySourceModuleFactory.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtLibrarySourceModuleFactory.kt index e00bde9990a..3d1698e48f9 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtLibrarySourceModuleFactory.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtLibrarySourceModuleFactory.kt @@ -14,6 +14,8 @@ import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.platform.isMultiPlatform +import org.junit.Assume import java.nio.file.Path /** @@ -21,6 +23,8 @@ import java.nio.file.Path */ object KtLibrarySourceModuleFactory : KtModuleFactory { override fun createModule(testModule: TestModule, testServices: TestServices, project: Project): KtModuleWithFiles { + Assume.assumeFalse("Compilation of multi-platform libraries is not supported", testModule.targetPlatform.isMultiPlatform()) + val (libraryJar, librarySourcesJar) = testServices.compiledLibraryProvider.compileToLibrary(testModule) require(librarySourcesJar != null) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt index 5c4cca973f7..b608cbba518 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt @@ -461,10 +461,14 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje } } - fun createCodeFragmentSession(module: KtCodeFragmentModule, contextSession: LLFirSession): LLFirSession { - val platform = module.platform - require(platform.has()) + abstract fun createCodeFragmentSession(module: KtCodeFragmentModule, contextSession: LLFirSession): LLFirSession + protected fun doCreateCodeFragmentSession( + module: KtCodeFragmentModule, + contextSession: LLFirSession, + additionalSessionConfiguration: context(CodeFragmentSessionCreationContext) LLFirCodeFragmentSession.() -> Unit, + ): LLFirSession { + val platform = module.platform val builtinsSession = LLFirBuiltinsSessionFactory.getInstance(project).getBuiltinsSession(platform) val languageVersionSettings = wrapLanguageVersionSettings(contextSession.languageVersionSettings) val scopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped) @@ -515,34 +519,33 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje extensionService.additionalCheckers.forEach(session.checkersComponent::register) - register(FirPredicateBasedProvider::class, FirEmptyPredicateBasedProvider) - register(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotationsImpl(this)) - - registerJavaComponents(JavaModuleResolver.getInstance(project)) - - val javaSymbolProvider = LLFirJavaSymbolProvider(this, moduleData, project, firProvider.searchScope) - register(JavaSymbolProvider::class, javaSymbolProvider) + //TODO: remove, replace with plugin loading + run { + register(FirPredicateBasedProvider::class, FirEmptyPredicateBasedProvider) + register(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotationsImpl(this)) + } val syntheticFunctionInterfaceProvider = FirExtensionSyntheticFunctionInterfaceProvider .createIfNeeded(this, moduleData, scopeProvider) - register( - FirSymbolProvider::class, - LLFirModuleWithDependenciesSymbolProvider( - this, - providers = listOfNotNull( - firProvider.symbolProvider, - syntheticFunctionInterfaceProvider, - javaSymbolProvider - ), - dependencyProvider - ) + val context = CodeFragmentSessionCreationContext( + moduleData, + firProvider, + dependencyProvider, + syntheticFunctionInterfaceProvider ) - register(FirJvmTypeMapper::class, FirJvmTypeMapper(this)) + additionalSessionConfiguration(context, this) } } + protected class CodeFragmentSessionCreationContext( + val moduleData: LLFirModuleData, + val firProvider: LLFirProvider, + val dependencyProvider: LLFirDependenciesSymbolProvider, + val syntheticFunctionInterfaceProvider: FirExtensionSyntheticFunctionInterfaceProvider? + ) + private fun wrapLanguageVersionSettings(original: LanguageVersionSettings): LanguageVersionSettings { return object : LanguageVersionSettings by original { override fun getFeatureSupport(feature: LanguageFeature): LanguageFeature.State { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt index f2b6d5ff743..847d1332a86 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLi import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule +import org.jetbrains.kotlin.analysis.project.structure.KtCodeFragmentModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.providers.createPackagePartProvider @@ -73,6 +74,25 @@ internal class LLFirCommonSessionFactory(project: Project) : LLFirAbstractSessio } } + override fun createCodeFragmentSession(module: KtCodeFragmentModule, contextSession: LLFirSession): LLFirSession { + return doCreateCodeFragmentSession(module, contextSession) { + registerDefaultComponents() + + register( + FirSymbolProvider::class, + LLFirModuleWithDependenciesSymbolProvider( + this, + providers = listOf( + firProvider.symbolProvider, + ), + dependencyProvider, + ) + ) + + registerPlatformSpecificComponentsIfAny(module) + } + } + override fun createProjectLibraryProvidersForScope( session: LLFirSession, moduleData: LLFirModuleData, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt index 4264e709caf..a7e536fd08e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLi import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule +import org.jetbrains.kotlin.analysis.project.structure.KtCodeFragmentModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.fir.BuiltinTypes @@ -74,6 +75,25 @@ internal class LLFirJsSessionFactory(project: Project) : LLFirAbstractSessionFac } } + override fun createCodeFragmentSession(module: KtCodeFragmentModule, contextSession: LLFirSession): LLFirSession { + return doCreateCodeFragmentSession(module, contextSession) { + registerDefaultComponents() + registerModuleIndependentJsComponents() + + register( + FirSymbolProvider::class, + LLFirModuleWithDependenciesSymbolProvider( + this, + providers = listOfNotNull( + firProvider.symbolProvider, + syntheticFunctionInterfaceProvider, + ), + dependencyProvider, + ) + ) + } + } + override fun createProjectLibraryProvidersForScope( session: LLFirSession, moduleData: LLFirModuleData, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt index 1f38262f46f..8517187529c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.utils.addIfNotNull @OptIn(SessionConfiguration::class) internal class LLFirJvmSessionFactory(project: Project) : LLFirAbstractSessionFactory(project) { - override fun createSourcesSession(module: KtSourceModule): LLFirSourcesSession { return doCreateSourcesSession(module, FirKotlinScopeProvider(::wrapScopeWithJvmMapped)) { context -> registerJavaComponents(JavaModuleResolver.getInstance(project)) @@ -79,6 +78,30 @@ internal class LLFirJvmSessionFactory(project: Project) : LLFirAbstractSessionFa } } + override fun createCodeFragmentSession(module: KtCodeFragmentModule, contextSession: LLFirSession): LLFirSession { + return doCreateCodeFragmentSession(module, contextSession) { + registerJavaComponents(JavaModuleResolver.getInstance(project)) + + val javaSymbolProvider = LLFirJavaSymbolProvider(this, moduleData, project, firProvider.searchScope) + register(JavaSymbolProvider::class, javaSymbolProvider) + + register( + FirSymbolProvider::class, + LLFirModuleWithDependenciesSymbolProvider( + this, + providers = listOfNotNull( + firProvider.symbolProvider, + syntheticFunctionInterfaceProvider, + javaSymbolProvider + ), + dependencyProvider + ) + ) + + register(FirJvmTypeMapper::class, FirJvmTypeMapper(this)) + } + } + override fun createProjectLibraryProvidersForScope( session: LLFirSession, moduleData: LLFirModuleData, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt index 7a41b7088b9..d723ea78864 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLi import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule +import org.jetbrains.kotlin.analysis.project.structure.KtCodeFragmentModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.providers.createPackagePartProvider @@ -71,6 +72,24 @@ internal class LLFirNativeSessionFactory(project: Project) : LLFirAbstractSessio } } + override fun createCodeFragmentSession(module: KtCodeFragmentModule, contextSession: LLFirSession): LLFirSession { + return doCreateCodeFragmentSession(module, contextSession) { + registerModuleIndependentNativeComponents() + + register( + FirSymbolProvider::class, + LLFirModuleWithDependenciesSymbolProvider( + this, + providers = listOfNotNull( + firProvider.symbolProvider, + syntheticFunctionInterfaceProvider, + ), + dependencyProvider, + ) + ) + } + } + override fun createProjectLibraryProvidersForScope( session: LLFirSession, moduleData: LLFirModuleData,