[Resolve] Make ResolversForModule less static

As consequence, remove IdePlatformKindTooling.resolverForModule, because
it became more than just field, and it duplicates similar API in
IdePlatformKindResolution anyways
This commit is contained in:
Dmitry Savvinov
2019-06-03 10:19:19 +03:00
parent 0f56d243cb
commit b48218e722
18 changed files with 133 additions and 88 deletions
@@ -55,14 +55,33 @@ class CommonAnalysisParameters(
* A facade that is used to analyze common (platform-independent) modules in multi-platform projects. * A facade that is used to analyze common (platform-independent) modules in multi-platform projects.
* See [CommonPlatform] * See [CommonPlatform]
*/ */
class CommonResolverForModuleFactory(private val shouldCheckExpectActual: Boolean) : ResolverForModuleFactory() { class CommonResolverForModuleFactory(
private val platformParameters: CommonAnalysisParameters,
private val targetEnvironment: TargetEnvironment,
private val targetPlatform: TargetPlatform,
private val shouldCheckExpectActual: Boolean
) : ResolverForModuleFactory() {
private class SourceModuleInfo(
override val name: Name,
override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>,
private val dependOnOldBuiltIns: Boolean
) : ModuleInfo {
override fun dependencies() = listOf(this)
override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns =
if (dependOnOldBuiltIns) ModuleInfo.DependencyOnBuiltIns.LAST else ModuleInfo.DependencyOnBuiltIns.NONE
override val platform: TargetPlatform
get() = CommonPlatforms.defaultCommonPlatform
override val analyzerServices: PlatformDependentAnalyzerServices
get() = CommonPlatformAnalyzerServices
}
override fun <M : ModuleInfo> createResolverForModule( override fun <M : ModuleInfo> createResolverForModule(
moduleDescriptor: ModuleDescriptorImpl, moduleDescriptor: ModuleDescriptorImpl,
moduleContext: ModuleContext, moduleContext: ModuleContext,
moduleContent: ModuleContent<M>, moduleContent: ModuleContent<M>,
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): ResolverForModule { ): ResolverForModule {
@@ -90,27 +109,9 @@ class CommonResolverForModuleFactory(private val shouldCheckExpectActual: Boolea
} }
companion object { companion object {
private class SourceModuleInfo(
override val name: Name,
override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>,
private val dependOnOldBuiltIns: Boolean
) : ModuleInfo {
override fun dependencies() = listOf(this)
override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns =
if (dependOnOldBuiltIns) ModuleInfo.DependencyOnBuiltIns.LAST else ModuleInfo.DependencyOnBuiltIns.NONE
override val platform: TargetPlatform
get() = CommonPlatforms.defaultCommonPlatform
override val analyzerServices: PlatformDependentAnalyzerServices
get() = CommonPlatformAnalyzerServices
}
fun analyzeFiles( fun analyzeFiles(
files: Collection<KtFile>, moduleName: Name, dependOnBuiltIns: Boolean, languageVersionSettings: LanguageVersionSettings, files: Collection<KtFile>, moduleName: Name, dependOnBuiltIns: Boolean, languageVersionSettings: LanguageVersionSettings,
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap(), capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap(),
shouldCheckExpectActual: Boolean = false,
metadataPartProviderFactory: (ModuleContent<ModuleInfo>) -> MetadataPartProvider metadataPartProviderFactory: (ModuleContent<ModuleInfo>) -> MetadataPartProvider
): AnalysisResult { ): AnalysisResult {
val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns) val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns)
@@ -141,8 +142,14 @@ class CommonResolverForModuleFactory(private val shouldCheckExpectActual: Boolea
project: Project project: Project
) = TargetPlatformVersion.NoVersion ) = TargetPlatformVersion.NoVersion
}, },
resolverForModuleFactoryByPlatform = { CommonResolverForModuleFactory(shouldCheckExpectActual) }, resolverForModuleFactoryByPlatform = {
platformParameters = { _ -> CommonAnalysisParameters(metadataPartProviderFactory) } CommonResolverForModuleFactory(
CommonAnalysisParameters(metadataPartProviderFactory),
CompilerEnvironment,
CommonPlatforms.defaultCommonPlatform,
shouldCheckExpectActual = false
)
}
) )
val moduleDescriptor = resolver.descriptorForModule(moduleInfo) val moduleDescriptor = resolver.descriptorForModule(moduleInfo)
@@ -29,7 +29,9 @@ import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtension import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtension
import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.ResolveSession
@@ -41,13 +43,15 @@ class JvmPlatformParameters(
) : PlatformAnalysisParameters ) : PlatformAnalysisParameters
object JvmResolverForModuleFactory : ResolverForModuleFactory() { class JvmResolverForModuleFactory(
private val platformParameters: JvmPlatformParameters,
private val targetEnvironment: TargetEnvironment,
private val platform: TargetPlatform
) : ResolverForModuleFactory() {
override fun <M : ModuleInfo> createResolverForModule( override fun <M : ModuleInfo> createResolverForModule(
moduleDescriptor: ModuleDescriptorImpl, moduleDescriptor: ModuleDescriptorImpl,
moduleContext: ModuleContext, moduleContext: ModuleContext,
moduleContent: ModuleContent<M>, moduleContent: ModuleContent<M>,
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): ResolverForModule { ): ResolverForModule {
@@ -93,9 +93,7 @@ class ResolverForProjectImpl<M : ModuleInfo>(
private val modulesContent: (M) -> ModuleContent<M>, private val modulesContent: (M) -> ModuleContent<M>,
private val moduleLanguageSettingsProvider: LanguageSettingsProvider, private val moduleLanguageSettingsProvider: LanguageSettingsProvider,
private val resolverForModuleFactoryByPlatform: (TargetPlatform?) -> ResolverForModuleFactory, private val resolverForModuleFactoryByPlatform: (TargetPlatform?) -> ResolverForModuleFactory,
private val platformParameters: (TargetPlatform) -> PlatformAnalysisParameters,
private val invalidateOnOOCB: Boolean, private val invalidateOnOOCB: Boolean,
private val targetEnvironment: TargetEnvironment = CompilerEnvironment,
override val builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance, override val builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance,
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(), private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
private val firstDependency: M? = null, private val firstDependency: M? = null,
@@ -194,8 +192,6 @@ class ResolverForProjectImpl<M : ModuleInfo>(
descriptor as ModuleDescriptorImpl, descriptor as ModuleDescriptorImpl,
projectContext.withModule(descriptor), projectContext.withModule(descriptor),
moduleContent, moduleContent,
platformParameters(module.platform),
targetEnvironment,
this@ResolverForProjectImpl, this@ResolverForProjectImpl,
languageVersionSettings languageVersionSettings
) )
@@ -308,8 +304,6 @@ abstract class ResolverForModuleFactory {
moduleDescriptor: ModuleDescriptorImpl, moduleDescriptor: ModuleDescriptorImpl,
moduleContext: ModuleContext, moduleContext: ModuleContext,
moduleContent: ModuleContent<M>, moduleContent: ModuleContent<M>,
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): ResolverForModule ): ResolverForModule
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
import org.jetbrains.kotlin.resolve.jvm.JvmResolverForModuleFactory import org.jetbrains.kotlin.resolve.jvm.JvmResolverForModuleFactory
@@ -38,19 +39,20 @@ fun createResolveSessionForFiles(
addBuiltIns: Boolean addBuiltIns: Boolean
): ResolveSession { ): ResolveSession {
val projectContext = ProjectContext(project, "lazy resolve test utils") val projectContext = ProjectContext(project, "lazy resolve test utils")
val testModule = TestModule(project, addBuiltIns) val testModule =
TestModule(project, addBuiltIns)
val platformParameters = JvmPlatformParameters(
packagePartProviderFactory = { PackagePartProvider.Empty },
moduleByJavaClass = { testModule }
)
val resolverForProject = ResolverForProjectImpl( val resolverForProject = ResolverForProjectImpl(
"test", "test",
projectContext, listOf(testModule), projectContext, listOf(testModule),
{ ModuleContent(it, syntheticFiles, GlobalSearchScope.allScope(project)) }, { ModuleContent(it, syntheticFiles, GlobalSearchScope.allScope(project)) },
invalidateOnOOCB = false, invalidateOnOOCB = false,
moduleLanguageSettingsProvider = LanguageSettingsProvider.Default, moduleLanguageSettingsProvider = LanguageSettingsProvider.Default,
resolverForModuleFactoryByPlatform = { JvmResolverForModuleFactory }, resolverForModuleFactoryByPlatform = {
platformParameters = { _ -> JvmResolverForModuleFactory(platformParameters, CompilerEnvironment, JvmPlatforms.defaultJvmPlatform)
JvmPlatformParameters(
packagePartProviderFactory = { PackagePartProvider.Empty },
moduleByJavaClass = { testModule }
)
} }
) )
return resolverForProject.resolverForModule(testModule).componentProvider.get<ResolveSession>() return resolverForProject.resolverForModule(testModule).componentProvider.get<ResolveSession>()
@@ -61,10 +63,11 @@ private class TestModule(val project: Project, val dependsOnBuiltIns: Boolean) :
override fun dependencies() = listOf(this) override fun dependencies() = listOf(this)
override fun dependencyOnBuiltIns() = override fun dependencyOnBuiltIns() =
if (dependsOnBuiltIns) if (dependsOnBuiltIns)
ModuleInfo.DependencyOnBuiltIns.LAST ModuleInfo.DependencyOnBuiltIns.LAST
else else
ModuleInfo.DependencyOnBuiltIns.NONE ModuleInfo.DependencyOnBuiltIns.NONE
override val platform: TargetPlatform override val platform: TargetPlatform
get() = JvmPlatforms.unspecifiedJvmPlatform get() = JvmPlatforms.unspecifiedJvmPlatform
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.constants.EnumValue
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
@@ -79,21 +80,21 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
val modules = setupModules(environment, moduleDirs) val modules = setupModules(environment, moduleDirs)
val projectContext = ProjectContext(environment.project, "MultiModuleJavaAnalysisTest") val projectContext = ProjectContext(environment.project, "MultiModuleJavaAnalysisTest")
val builtIns = JvmBuiltIns(projectContext.storageManager, JvmBuiltIns.Kind.FROM_CLASS_LOADER) val builtIns = JvmBuiltIns(projectContext.storageManager, JvmBuiltIns.Kind.FROM_CLASS_LOADER)
val platformParameters = JvmPlatformParameters(
packagePartProviderFactory = { PackagePartProvider.Empty },
moduleByJavaClass = { javaClass ->
val moduleName = javaClass.name.asString().toLowerCase().first().toString()
modules.first { it._name == moduleName }
}
)
val resolverForProject = ResolverForProjectImpl( val resolverForProject = ResolverForProjectImpl(
"test", "test",
projectContext, modules, projectContext, modules,
invalidateOnOOCB = false, invalidateOnOOCB = false,
modulesContent = { module -> ModuleContent(module, module.kotlinFiles, module.javaFilesScope) }, modulesContent = { module -> ModuleContent(module, module.kotlinFiles, module.javaFilesScope) },
moduleLanguageSettingsProvider = LanguageSettingsProvider.Default, moduleLanguageSettingsProvider = LanguageSettingsProvider.Default,
resolverForModuleFactoryByPlatform = { JvmResolverForModuleFactory }, resolverForModuleFactoryByPlatform = {
platformParameters = { _ -> JvmResolverForModuleFactory(platformParameters, CompilerEnvironment, JvmPlatforms.defaultJvmPlatform)
JvmPlatformParameters(
packagePartProviderFactory = { PackagePartProvider.Empty },
moduleByJavaClass = { javaClass ->
val moduleName = javaClass.name.asString().toLowerCase().first().toString()
modules.first { it._name == moduleName }
}
)
}, },
builtIns = builtIns builtIns = builtIns
) )
@@ -7,7 +7,9 @@ package org.jetbrains.kotlin.caches.resolve
import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analyzer.PlatformAnalysisParameters
import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory
import org.jetbrains.kotlin.analyzer.common.CommonAnalysisParameters
import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
@@ -15,6 +17,8 @@ import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.idea.framework.CommonLibraryKind
import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind
import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment
class CommonPlatformKindResolution : IdePlatformKindResolution { class CommonPlatformKindResolution : IdePlatformKindResolution {
@@ -27,10 +31,20 @@ class CommonPlatformKindResolution : IdePlatformKindResolution {
override val kind get() = CommonIdePlatformKind override val kind get() = CommonIdePlatformKind
override val resolverForModuleFactory: ResolverForModuleFactory
get() = CommonResolverForModuleFactory(shouldCheckExpectActual = true)
override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns { override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns {
return DefaultBuiltIns.Instance return DefaultBuiltIns.Instance
} }
override fun createResolverForModuleFactory(
settings: PlatformAnalysisParameters,
environment: TargetEnvironment,
platform: TargetPlatform
): ResolverForModuleFactory {
return CommonResolverForModuleFactory(
settings as CommonAnalysisParameters,
environment,
platform,
shouldCheckExpectActual = true
)
}
} }
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analyzer.PlatformAnalysisParameters
import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
@@ -27,14 +28,20 @@ import org.jetbrains.kotlin.extensions.ApplicationExtensionDescriptor
import org.jetbrains.kotlin.idea.caches.project.LibraryInfo import org.jetbrains.kotlin.idea.caches.project.LibraryInfo
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
import org.jetbrains.kotlin.platform.IdePlatformKind import org.jetbrains.kotlin.platform.IdePlatformKind
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.resolve.TargetEnvironment
interface IdePlatformKindResolution { interface IdePlatformKindResolution {
val kind: IdePlatformKind<*> val kind: IdePlatformKind<*>
val resolverForModuleFactory: ResolverForModuleFactory
fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns
fun createResolverForModuleFactory(
settings: PlatformAnalysisParameters,
environment: TargetEnvironment,
platform: TargetPlatform
): ResolverForModuleFactory
fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean
val libraryKind: PersistentLibraryKind<*>? val libraryKind: PersistentLibraryKind<*>?
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.caches.resolve
import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analyzer.PlatformAnalysisParameters
import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
@@ -15,6 +16,8 @@ import org.jetbrains.kotlin.idea.framework.JSLibraryKind
import org.jetbrains.kotlin.js.resolve.JsResolverForModuleFactory import org.jetbrains.kotlin.js.resolve.JsResolverForModuleFactory
import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices
import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind
import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.platform.TargetPlatform
class JsPlatformKindResolution : IdePlatformKindResolution { class JsPlatformKindResolution : IdePlatformKindResolution {
override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean { override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean {
@@ -26,10 +29,13 @@ class JsPlatformKindResolution : IdePlatformKindResolution {
override val kind get() = JsIdePlatformKind override val kind get() = JsIdePlatformKind
override val resolverForModuleFactory: ResolverForModuleFactory
get() = JsResolverForModuleFactory
override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns { override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns {
return JsPlatformAnalyzerServices.builtIns return JsPlatformAnalyzerServices.builtIns
} }
override fun createResolverForModuleFactory(
settings: PlatformAnalysisParameters,
environment: TargetEnvironment,
platform: TargetPlatform
): ResolverForModuleFactory = JsResolverForModuleFactory(environment)
} }
@@ -7,13 +7,17 @@ package org.jetbrains.kotlin.caches.resolve
import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analyzer.PlatformAnalysisParameters
import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory import org.jetbrains.kotlin.analyzer.ResolverForModuleFactory
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
import org.jetbrains.kotlin.resolve.jvm.JvmResolverForModuleFactory import org.jetbrains.kotlin.resolve.jvm.JvmResolverForModuleFactory
class JvmPlatformKindResolution : IdePlatformKindResolution { class JvmPlatformKindResolution : IdePlatformKindResolution {
@@ -21,14 +25,19 @@ class JvmPlatformKindResolution : IdePlatformKindResolution {
return false // TODO: No library kind for JVM return false // TODO: No library kind for JVM
} }
override fun createResolverForModuleFactory(
settings: PlatformAnalysisParameters,
environment: TargetEnvironment,
platform: TargetPlatform
): ResolverForModuleFactory {
return JvmResolverForModuleFactory(settings as JvmPlatformParameters, environment, platform)
}
override val libraryKind: PersistentLibraryKind<*>? override val libraryKind: PersistentLibraryKind<*>?
get() = null get() = null
override val kind get() = JvmIdePlatformKind override val kind get() = JvmIdePlatformKind
override val resolverForModuleFactory: ResolverForModuleFactory
get() = JvmResolverForModuleFactory
override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns = override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns =
if (settings.sdk != null) if (settings.sdk != null)
JvmBuiltIns(projectContext.storageManager, JvmBuiltIns.Kind.FROM_CLASS_LOADER) JvmBuiltIns(projectContext.storageManager, JvmBuiltIns.Kind.FROM_CLASS_LOADER)
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompositeBindingContext import org.jetbrains.kotlin.resolve.CompositeBindingContext
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
import org.jetbrains.kotlin.platform.DefaultIdeTargetPlatformKindProvider
internal class ProjectResolutionFacade( internal class ProjectResolutionFacade(
private val debugString: String, private val debugString: String,
@@ -141,17 +142,15 @@ internal class ProjectResolutionFacade(
modulesContentFactory, modulesContentFactory,
moduleLanguageSettingsProvider = IDELanguageSettingsProvider, moduleLanguageSettingsProvider = IDELanguageSettingsProvider,
resolverForModuleFactoryByPlatform = { modulePlatform -> resolverForModuleFactoryByPlatform = { modulePlatform ->
val platform = modulePlatform ?: settings.platform val platform = modulePlatform ?: DefaultIdeTargetPlatformKindProvider.defaultPlatform
platform.idePlatformKind.resolution.resolverForModuleFactory val parameters = when {
},
platformParameters = { platform ->
when {
platform.isJvm() -> jvmPlatformParameters platform.isJvm() -> jvmPlatformParameters
platform.isCommon() -> commonPlatformParameters platform.isCommon() -> commonPlatformParameters
else -> PlatformAnalysisParameters.Empty else -> PlatformAnalysisParameters.Empty
} }
platform.idePlatformKind.resolution.createResolverForModuleFactory(parameters, IdeaEnvironment, platform)
}, },
targetEnvironment = IdeaEnvironment,
builtIns = builtIns, builtIns = builtIns,
delegateResolver = delegateResolverForProject, delegateResolver = delegateResolverForProject,
firstDependency = settings.sdk?.let { SdkInfo(project, it) }, firstDependency = settings.sdk?.let { SdkInfo(project, it) },
@@ -215,7 +214,9 @@ internal class ProjectResolutionFacade(
private companion object { private companion object {
private fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns { private fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext): KotlinBuiltIns {
return settings.platform.idePlatformKind.resolution.createBuiltIns(settings, projectContext) // return settings.platform.idePlatformKind.resolution.createBuiltIns(settings, projectContext)
// TODO: what we do about built-ins?
return JvmPlatforms.defaultJvmPlatform.idePlatformKind.resolution.createBuiltIns(settings, projectContext)
} }
} }
} }
@@ -34,8 +34,6 @@ object CommonIdePlatformKindTooling : IdePlatformKindTooling() {
override fun compilerArgumentsForProject(project: Project): CommonCompilerArguments? = null override fun compilerArgumentsForProject(project: Project): CommonCompilerArguments? = null
override val resolverForModuleFactory = CommonResolverForModuleFactory(true)
override val mavenLibraryIds = listOf(MAVEN_COMMON_STDLIB_ID) override val mavenLibraryIds = listOf(MAVEN_COMMON_STDLIB_ID)
override val gradlePluginId = "kotlin-platform-common" override val gradlePluginId = "kotlin-platform-common"
override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.COMMON) override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.COMMON)
@@ -49,8 +49,6 @@ class JsIdePlatformKindTooling : IdePlatformKindTooling() {
override fun compilerArgumentsForProject(project: Project) = Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings override fun compilerArgumentsForProject(project: Project) = Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings
override val resolverForModuleFactory = JsResolverForModuleFactory
override val mavenLibraryIds = listOf(PathUtil.JS_LIB_NAME, MAVEN_OLD_JS_STDLIB_ID) override val mavenLibraryIds = listOf(PathUtil.JS_LIB_NAME, MAVEN_OLD_JS_STDLIB_ID)
override val gradlePluginId = "kotlin-platform-js" override val gradlePluginId = "kotlin-platform-js"
override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.JS) override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.JS)
@@ -33,8 +33,6 @@ class JvmIdePlatformKindTooling : IdePlatformKindTooling() {
override fun compilerArgumentsForProject(project: Project) = Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings override fun compilerArgumentsForProject(project: Project) = Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings
override val resolverForModuleFactory = JvmResolverForModuleFactory
override val mavenLibraryIds = listOf( override val mavenLibraryIds = listOf(
PathUtil.KOTLIN_JAVA_STDLIB_NAME, PathUtil.KOTLIN_JAVA_STDLIB_NAME,
PathUtil.KOTLIN_JAVA_RUNTIME_JRE7_NAME, PathUtil.KOTLIN_JAVA_RUNTIME_JRE7_NAME,
@@ -29,8 +29,6 @@ class NativeIdePlatformKindTooling : IdePlatformKindTooling() {
override fun compilerArgumentsForProject(project: Project): CommonCompilerArguments? = null override fun compilerArgumentsForProject(project: Project): CommonCompilerArguments? = null
override val resolverForModuleFactory get() = NativeResolverForModuleFactory
override val mavenLibraryIds: List<String> get() = emptyList() override val mavenLibraryIds: List<String> get() = emptyList()
override val gradlePluginId: String get() = "" override val gradlePluginId: String get() = ""
override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.NATIVE) override val gradlePlatformIds: List<KotlinPlatform> get() = listOf(KotlinPlatform.NATIVE)
@@ -64,13 +64,19 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
} }
} }
override fun createResolverForModuleFactory(
settings: PlatformAnalysisParameters,
environment: TargetEnvironment,
platform: TargetPlatform
): ResolverForModuleFactory {
return NativeResolverForModuleFactory(settings, environment, platform)
}
override val libraryKind: PersistentLibraryKind<*>? override val libraryKind: PersistentLibraryKind<*>?
get() = NativeLibraryKind get() = NativeLibraryKind
override val kind get() = NativeIdePlatformKind override val kind get() = NativeIdePlatformKind
override val resolverForModuleFactory get() = NativeResolverForModuleFactory
override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext) = override fun createBuiltIns(settings: PlatformAnalysisSettings, projectContext: ProjectContext) =
createKotlinNativeBuiltIns(settings, projectContext) createKotlinNativeBuiltIns(settings, projectContext)
} }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.createContainerForLazyResolve import org.jetbrains.kotlin.frontend.di.createContainerForLazyResolve
import org.jetbrains.kotlin.ide.konan.NativeLibraryInfo import org.jetbrains.kotlin.ide.konan.NativeLibraryInfo
import org.jetbrains.kotlin.ide.konan.createPackageFragmentProvider import org.jetbrains.kotlin.ide.konan.createPackageFragmentProvider
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.konan.KonanPlatforms import org.jetbrains.kotlin.platform.konan.KonanPlatforms
import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer
import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.TargetEnvironment
@@ -21,13 +22,15 @@ import org.jetbrains.kotlin.resolve.konan.platform.NativePlatformAnalyzerService
import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService.Companion.createDeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService.Companion.createDeclarationProviderFactory
object NativeResolverForModuleFactory : ResolverForModuleFactory() { class NativeResolverForModuleFactory(
private val platformAnalysisParameters: PlatformAnalysisParameters,
private val targetEnvironment: TargetEnvironment,
private val targetPlatform: TargetPlatform
) : ResolverForModuleFactory() {
override fun <M : ModuleInfo> createResolverForModule( override fun <M : ModuleInfo> createResolverForModule(
moduleDescriptor: ModuleDescriptorImpl, moduleDescriptor: ModuleDescriptorImpl,
moduleContext: ModuleContext, moduleContext: ModuleContext,
moduleContent: ModuleContent<M>, moduleContent: ModuleContent<M>,
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): ResolverForModule { ): ResolverForModule {
@@ -24,8 +24,6 @@ abstract class IdePlatformKindTooling {
abstract fun compilerArgumentsForProject(project: Project): CommonCompilerArguments? abstract fun compilerArgumentsForProject(project: Project): CommonCompilerArguments?
abstract val resolverForModuleFactory: ResolverForModuleFactory
abstract val mavenLibraryIds: List<String> abstract val mavenLibraryIds: List<String>
abstract val gradlePluginId: String abstract val gradlePluginId: String
@@ -21,13 +21,13 @@ import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
import org.jetbrains.kotlin.serialization.js.createKotlinJavascriptPackageFragmentProvider import org.jetbrains.kotlin.serialization.js.createKotlinJavascriptPackageFragmentProvider
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
object JsResolverForModuleFactory : ResolverForModuleFactory() { class JsResolverForModuleFactory(
private val targetEnvironment: TargetEnvironment
) : ResolverForModuleFactory() {
override fun <M : ModuleInfo> createResolverForModule( override fun <M : ModuleInfo> createResolverForModule(
moduleDescriptor: ModuleDescriptorImpl, moduleDescriptor: ModuleDescriptorImpl,
moduleContext: ModuleContext, moduleContext: ModuleContext,
moduleContent: ModuleContent<M>, moduleContent: ModuleContent<M>,
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): ResolverForModule { ): ResolverForModule {