Minor refactorings related to PackagePartProvider and implementations

- Document what exactly should findPackageParts return
- Make EMPTY a named object instead of a val in the companion
- Do not use JvmPackagePartProvider in tests where Empty works fine
- Add a couple default values to arguments of setupResolverForProject
This commit is contained in:
Alexander Udalov
2016-09-29 18:51:40 +03:00
parent 97f2051a03
commit 0ed9897b03
9 changed files with 21 additions and 35 deletions
@@ -23,11 +23,9 @@ import org.jetbrains.kotlin.analyzer.ModuleContent
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.builtins.BuiltInsBinaryVersion
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
@@ -38,7 +36,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -91,10 +88,7 @@ class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) {
"builtIns source", "builtIns source",
ProjectContext(environment.project), listOf(builtInModule), ProjectContext(environment.project), listOf(builtInModule),
{ ModuleContent(files, GlobalSearchScope.EMPTY_SCOPE) }, { ModuleContent(files, GlobalSearchScope.EMPTY_SCOPE) },
JvmPlatformParameters { throw IllegalStateException() }, JvmPlatformParameters { throw IllegalStateException() }
CompilerEnvironment,
builtIns = DefaultBuiltIns.Instance,
packagePartProviderFactory = { module, content -> JvmPackagePartProvider(environment) }
) )
val moduleDescriptor = resolver.descriptorForModule(builtInModule) val moduleDescriptor = resolver.descriptorForModule(builtInModule)
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.analyzer package org.jetbrains.kotlin.analyzer
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.ComponentProvider
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.createModule import org.jetbrains.kotlin.resolve.createModule
@@ -147,10 +149,10 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
modules: Collection<M>, modules: Collection<M>,
modulesContent: (M) -> ModuleContent, modulesContent: (M) -> ModuleContent,
platformParameters: P, platformParameters: P,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment = CompilerEnvironment,
builtIns: KotlinBuiltIns, builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance,
delegateResolver: ResolverForProject<M> = EmptyResolverForProject(), delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
packagePartProviderFactory: (M, ModuleContent) -> PackagePartProvider = { module, content -> PackagePartProvider.EMPTY }, packagePartProviderFactory: (M, ModuleContent) -> PackagePartProvider = { module, content -> PackagePartProvider.Empty },
firstDependency: M? = null firstDependency: M? = null
): ResolverForProject<M> { ): ResolverForProject<M> {
val storageManager = projectContext.storageManager val storageManager = projectContext.storageManager
@@ -53,7 +53,7 @@ public class GenerationUtils {
@NotNull @NotNull
public static GenerationState compileFiles(@NotNull List<KtFile> files, @Nullable KotlinCoreEnvironment environment) { public static GenerationState compileFiles(@NotNull List<KtFile> files, @Nullable KotlinCoreEnvironment environment) {
PackagePartProvider packagePartProvider = PackagePartProvider packagePartProvider =
environment == null ? PackagePartProvider.Companion.getEMPTY() : new JvmPackagePartProvider(environment); environment == null ? PackagePartProvider.Empty.INSTANCE : new JvmPackagePartProvider(environment);
CompilerConfiguration configuration = CompilerConfiguration configuration =
environment == null ? KotlinTestUtils.newConfiguration() : environment.getConfiguration(); environment == null ? KotlinTestUtils.newConfiguration() : environment.getConfiguration();
@@ -20,12 +20,10 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleContent import org.jetbrains.kotlin.analyzer.ModuleContent
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
@@ -40,9 +38,7 @@ fun createResolveSessionForFiles(
"test", "test",
projectContext, listOf(testModule), projectContext, listOf(testModule),
{ ModuleContent(syntheticFiles, GlobalSearchScope.allScope(project)) }, { ModuleContent(syntheticFiles, GlobalSearchScope.allScope(project)) },
JvmPlatformParameters { testModule }, JvmPlatformParameters { testModule }
CompilerEnvironment,
DefaultBuiltIns.Instance
) )
return resolverForProject.resolverForModule(testModule).componentProvider.get<ResolveSession>() return resolverForProject.resolverForModule(testModule).componentProvider.get<ResolveSession>()
} }
@@ -54,7 +54,7 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
val container = createContainerForTopDownSingleModuleAnalyzerForJvm( val container = createContainerForTopDownSingleModuleAnalyzerForJvm(
moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory, moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory,
GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY GlobalSearchScope.allScope(environment.project), PackagePartProvider.Empty
) )
emptyModule.initialize(container.get<JavaDescriptorResolver>().packageFragmentProvider) emptyModule.initialize(container.get<JavaDescriptorResolver>().packageFragmentProvider)
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ResolverForProject import org.jetbrains.kotlin.analyzer.ResolverForProject
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -36,7 +35,6 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.JvmBuiltIns import org.jetbrains.kotlin.platform.JvmBuiltIns
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
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.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade
@@ -69,15 +67,13 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
val resolverForProject = JvmAnalyzerFacade.setupResolverForProject( val resolverForProject = JvmAnalyzerFacade.setupResolverForProject(
"test", "test",
projectContext, modules, projectContext, modules,
{ m -> ModuleContent(m.kotlinFiles, m.javaFilesScope) }, { module -> ModuleContent(module.kotlinFiles, module.javaFilesScope) },
JvmPlatformParameters { JvmPlatformParameters {
javaClass -> javaClass ->
val moduleName = javaClass.name.asString().toLowerCase().first().toString() val moduleName = javaClass.name.asString().toLowerCase().first().toString()
modules.first { it._name == moduleName } modules.first { it._name == moduleName }
}, },
CompilerEnvironment, builtIns = builtIns
builtIns,
packagePartProviderFactory = { a, b -> JvmPackagePartProvider(environment) }
) )
builtIns.initialize( builtIns.initialize(
@@ -113,7 +109,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
"a" -> listOf(this) "a" -> listOf(this)
"b" -> listOf(this, modules["a"]!!) "b" -> listOf(this, modules["a"]!!)
"c" -> listOf(this, modules["b"]!!, modules["a"]!!) "c" -> listOf(this, modules["b"]!!, modules["a"]!!)
else -> throw IllegalStateException("$_name") else -> throw IllegalStateException(_name)
} }
} }
} }
@@ -190,7 +186,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
assert(!ErrorUtils.isError(referencedDescriptor)) { "Error descriptor: $referencedDescriptor" } assert(!ErrorUtils.isError(referencedDescriptor)) { "Error descriptor: $referencedDescriptor" }
val descriptorName = referencedDescriptor.name.asString() val descriptorName = referencedDescriptor.name.asString()
val expectedModuleName = "<${descriptorName.toLowerCase().first().toString()}>" val expectedModuleName = "<${descriptorName.toLowerCase().first()}>"
val moduleName = referencedDescriptor.module.name.asString() val moduleName = referencedDescriptor.module.name.asString()
Assert.assertEquals( Assert.assertEquals(
"Java class $descriptorName in $context should be in module $expectedModuleName, but instead was in $moduleName", "Java class $descriptorName in $context should be in module $expectedModuleName, but instead was in $moduleName",
@@ -61,7 +61,7 @@ abstract class AbstractLocalClassProtoTest : TestCaseWithTmpdir() {
val container = createContainerForTopDownSingleModuleAnalyzerForJvm( val container = createContainerForTopDownSingleModuleAnalyzerForJvm(
moduleContext, CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(), moduleContext, CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(),
providerFactory, GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY providerFactory, GlobalSearchScope.allScope(environment.project), PackagePartProvider.Empty
) )
moduleContext.initializeModuleContents(container.get<JavaDescriptorResolver>().packageFragmentProvider) moduleContext.initializeModuleContents(container.get<JavaDescriptorResolver>().packageFragmentProvider)
@@ -62,7 +62,7 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment()
val container = createContainerForTopDownSingleModuleAnalyzerForJvm( val container = createContainerForTopDownSingleModuleAnalyzerForJvm(
moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory, moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory,
GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY GlobalSearchScope.allScope(environment.project), PackagePartProvider.Empty
) )
emptyModule.initialize(container.get<JavaDescriptorResolver>().packageFragmentProvider) emptyModule.initialize(container.get<JavaDescriptorResolver>().packageFragmentProvider)
@@ -17,17 +17,15 @@
package org.jetbrains.kotlin.descriptors package org.jetbrains.kotlin.descriptors
interface PackagePartProvider { interface PackagePartProvider {
/** /**
* return package part simple names * @return simple names of package parts existing in the package with the given FQ name.
*
* For example, if a file named foo.kt in package org.test is compiled to a library, PackagePartProvider for such library
* must return the list `["FooKt"]` for the query `"org.test"` (in case the file is not annotated with @JvmName or @JvmMultifile*)
*/ */
fun findPackageParts(packageFqName: String): List<String> fun findPackageParts(packageFqName: String): List<String>
companion object { object Empty : PackagePartProvider {
val EMPTY: PackagePartProvider = object : PackagePartProvider { override fun findPackageParts(packageFqName: String): List<String> = emptyList()
override fun findPackageParts(packageFqName: String): List<String> {
return emptyList()
}
}
} }
} }