aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/kotlin')
-rw-r--r--core/src/main/kotlin/Analysis/AnalysisEnvironment.kt6
-rw-r--r--core/src/main/kotlin/Analysis/DokkaAnalyzerFacades.kt159
2 files changed, 162 insertions, 3 deletions
diff --git a/core/src/main/kotlin/Analysis/AnalysisEnvironment.kt b/core/src/main/kotlin/Analysis/AnalysisEnvironment.kt
index fe599eee..e6496789 100644
--- a/core/src/main/kotlin/Analysis/AnalysisEnvironment.kt
+++ b/core/src/main/kotlin/Analysis/AnalysisEnvironment.kt
@@ -42,7 +42,7 @@ import org.jetbrains.kotlin.container.tryGetService
import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
-import org.jetbrains.kotlin.idea.caches.resolve.JsAnalyzerFacade
+import org.jetbrains.dokka.Analysis.DokkaJsAnalyzerFacade
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.resolve.JsPlatform
@@ -214,8 +214,8 @@ class AnalysisEnvironment(val messageCollector: MessageCollector, val analysisPl
modulesContent = modulesContent,
modulePlatforms = { JsPlatform.multiTargetPlatform },
moduleLanguageSettingsProvider = LanguageSettingsProvider.Default /* TODO: Fix this */,
- resolverForModuleFactoryByPlatform = { JsAnalyzerFacade },
- platformParameters = { _ -> PlatformAnalysisParameters.Empty },// object : PlatformAnalysisParameters {},
+ resolverForModuleFactoryByPlatform = { DokkaJsAnalyzerFacade },
+ platformParameters = { _ -> PlatformAnalysisParameters.Empty },
targetEnvironment = CompilerEnvironment,
builtIns = JsPlatform.builtIns
)
diff --git a/core/src/main/kotlin/Analysis/DokkaAnalyzerFacades.kt b/core/src/main/kotlin/Analysis/DokkaAnalyzerFacades.kt
new file mode 100644
index 00000000..442940fd
--- /dev/null
+++ b/core/src/main/kotlin/Analysis/DokkaAnalyzerFacades.kt
@@ -0,0 +1,159 @@
+package org.jetbrains.dokka.Analysis
+
+import org.jetbrains.kotlin.analyzer.*
+import org.jetbrains.kotlin.caches.project.LibraryModuleInfo
+import org.jetbrains.kotlin.config.LanguageVersionSettings
+import org.jetbrains.kotlin.config.TargetPlatformVersion
+import org.jetbrains.kotlin.container.StorageComponentContainer
+import org.jetbrains.kotlin.container.get
+import org.jetbrains.kotlin.container.useImpl
+import org.jetbrains.kotlin.container.useInstance
+import org.jetbrains.kotlin.context.ModuleContext
+import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
+import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
+import org.jetbrains.kotlin.frontend.di.configureModule
+import org.jetbrains.kotlin.ide.konan.createPackageFragmentProviderForLibraryModule
+import org.jetbrains.kotlin.idea.caches.project.LibraryInfo
+import org.jetbrains.kotlin.incremental.components.LookupTracker
+import org.jetbrains.kotlin.js.resolve.JsPlatform
+import org.jetbrains.kotlin.resolve.*
+import org.jetbrains.kotlin.resolve.konan.platform.KonanPlatform
+import org.jetbrains.kotlin.resolve.lazy.ResolveSession
+import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
+import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService
+import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
+import org.jetbrains.kotlin.serialization.js.createKotlinJavascriptPackageFragmentProvider
+import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
+
+fun createContainerForLazyResolve(
+ moduleContext: ModuleContext,
+ declarationProviderFactory: DeclarationProviderFactory,
+ bindingTrace: BindingTrace,
+ platform: TargetPlatform,
+ targetPlatformVersion: TargetPlatformVersion,
+ targetEnvironment: TargetEnvironment,
+ languageVersionSettings: LanguageVersionSettings
+): StorageComponentContainer = createContainer("LazyResolve", platform) {
+ configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
+
+ useInstance(declarationProviderFactory)
+ useInstance(languageVersionSettings)
+
+ useImpl<AnnotationResolverImpl>()
+ useImpl<CompilerDeserializationConfiguration>()
+ targetEnvironment.configure(this)
+
+ useImpl<ResolveSession>()
+ useImpl<LazyTopDownAnalyzer>()
+}
+
+
+object DokkaJsAnalyzerFacade : ResolverForModuleFactory() {
+ override fun <M : ModuleInfo> createResolverForModule(
+ moduleDescriptor: ModuleDescriptorImpl,
+ moduleContext: ModuleContext,
+ moduleContent: ModuleContent<M>,
+ platformParameters: PlatformAnalysisParameters,
+ targetEnvironment: TargetEnvironment,
+ resolverForProject: ResolverForProject<M>,
+ languageVersionSettings: LanguageVersionSettings,
+ targetPlatformVersion: TargetPlatformVersion
+ ): ResolverForModule {
+ val (moduleInfo, syntheticFiles, moduleContentScope) = moduleContent
+ val project = moduleContext.project
+ val declarationProviderFactory = DeclarationProviderFactoryService.createDeclarationProviderFactory(
+ project,
+ moduleContext.storageManager,
+ syntheticFiles,
+ moduleContentScope,
+ moduleInfo
+ )
+
+ val container = createContainerForLazyResolve(
+ moduleContext,
+ declarationProviderFactory,
+ BindingTraceContext(),
+ JsPlatform,
+ TargetPlatformVersion.NoVersion,
+ targetEnvironment,
+ languageVersionSettings
+ )
+ var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
+
+ if (moduleInfo is LibraryModuleInfo && moduleInfo.platform == JsPlatform) {
+ val providers = moduleInfo.getLibraryRoots()
+ .flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) }
+ .filter { it.version.isCompatible() }
+ .map { metadata ->
+ val (header, packageFragmentProtos) =
+ KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body, metadata.version)
+ createKotlinJavascriptPackageFragmentProvider(
+ moduleContext.storageManager, moduleDescriptor, header, packageFragmentProtos, metadata.version,
+ container.get(), LookupTracker.DO_NOTHING
+ )
+ }
+
+ if (providers.isNotEmpty()) {
+ packageFragmentProvider = CompositePackageFragmentProvider(listOf(packageFragmentProvider) + providers)
+ }
+ }
+
+ return ResolverForModule(packageFragmentProvider, container)
+ }
+
+ override val targetPlatform: TargetPlatform
+ get() = JsPlatform
+}
+
+object DokkaNativeAnalyzerFacade : ResolverForModuleFactory() {
+ override val targetPlatform: TargetPlatform
+ get() = KonanPlatform
+
+ override fun <M : ModuleInfo> createResolverForModule(
+ moduleDescriptor: ModuleDescriptorImpl,
+ moduleContext: ModuleContext,
+ moduleContent: ModuleContent<M>,
+ platformParameters: PlatformAnalysisParameters,
+ targetEnvironment: TargetEnvironment,
+ resolverForProject: ResolverForProject<M>,
+ languageVersionSettings: LanguageVersionSettings,
+ targetPlatformVersion: TargetPlatformVersion
+ ): ResolverForModule {
+
+ val declarationProviderFactory = DeclarationProviderFactoryService.createDeclarationProviderFactory(
+ moduleContext.project,
+ moduleContext.storageManager,
+ moduleContent.syntheticFiles,
+ moduleContent.moduleContentScope,
+ moduleContent.moduleInfo
+ )
+
+ val container = createContainerForLazyResolve(
+ moduleContext,
+ declarationProviderFactory,
+ BindingTraceContext(),
+ targetPlatform,
+ TargetPlatformVersion.NoVersion,
+ targetEnvironment,
+ languageVersionSettings
+ )
+
+ val packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
+ val fragmentProviders = mutableListOf(packageFragmentProvider)
+
+ val moduleInfo = moduleContent.moduleInfo
+
+ if (moduleInfo is LibraryInfo) {
+ val libPackageFragmentProviders = moduleInfo.createPackageFragmentProviderForLibraryModule(
+ moduleContext.storageManager,
+ languageVersionSettings,
+ moduleDescriptor
+ )
+ fragmentProviders.addAll(libPackageFragmentProviders)
+ //TODO: Forward declarations?
+ }
+
+ return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container)
+ }
+}
+