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.builtins.BuiltInSerializerProtocol
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.messages.MessageCollector
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.config.addJvmClasspathRoots
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.PackageViewDescriptor
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.JvmPlatformParameters
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -91,10 +88,7 @@ class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) {
"builtIns source",
ProjectContext(environment.project), listOf(builtInModule),
{ ModuleContent(files, GlobalSearchScope.EMPTY_SCOPE) },
JvmPlatformParameters { throw IllegalStateException() },
CompilerEnvironment,
builtIns = DefaultBuiltIns.Instance,
packagePartProviderFactory = { module, content -> JvmPackagePartProvider(environment) }
JvmPlatformParameters { throw IllegalStateException() }
)
val moduleDescriptor = resolver.descriptorForModule(builtInModule)
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.analyzer
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.container.ComponentProvider
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.Name
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.createModule
@@ -147,10 +149,10 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
modules: Collection<M>,
modulesContent: (M) -> ModuleContent,
platformParameters: P,
targetEnvironment: TargetEnvironment,
builtIns: KotlinBuiltIns,
targetEnvironment: TargetEnvironment = CompilerEnvironment,
builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance,
delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
packagePartProviderFactory: (M, ModuleContent) -> PackagePartProvider = { module, content -> PackagePartProvider.EMPTY },
packagePartProviderFactory: (M, ModuleContent) -> PackagePartProvider = { module, content -> PackagePartProvider.Empty },
firstDependency: M? = null
): ResolverForProject<M> {
val storageManager = projectContext.storageManager
@@ -53,7 +53,7 @@ public class GenerationUtils {
@NotNull
public static GenerationState compileFiles(@NotNull List<KtFile> files, @Nullable KotlinCoreEnvironment environment) {
PackagePartProvider packagePartProvider =
environment == null ? PackagePartProvider.Companion.getEMPTY() : new JvmPackagePartProvider(environment);
environment == null ? PackagePartProvider.Empty.INSTANCE : new JvmPackagePartProvider(environment);
CompilerConfiguration configuration =
environment == null ? KotlinTestUtils.newConfiguration() : environment.getConfiguration();
@@ -20,12 +20,10 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleContent
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.name.Name
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.JvmPlatformParameters
@@ -40,9 +38,7 @@ fun createResolveSessionForFiles(
"test",
projectContext, listOf(testModule),
{ ModuleContent(syntheticFiles, GlobalSearchScope.allScope(project)) },
JvmPlatformParameters { testModule },
CompilerEnvironment,
DefaultBuiltIns.Instance
JvmPlatformParameters { testModule }
)
return resolverForProject.resolverForModule(testModule).componentProvider.get<ResolveSession>()
}
@@ -54,7 +54,7 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
val container = createContainerForTopDownSingleModuleAnalyzerForJvm(
moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory,
GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY
GlobalSearchScope.allScope(environment.project), PackagePartProvider.Empty
)
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.builtins.KotlinBuiltIns
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.config.LanguageFeature
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.platform.JvmBuiltIns
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.constants.EnumValue
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade
@@ -69,15 +67,13 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
val resolverForProject = JvmAnalyzerFacade.setupResolverForProject(
"test",
projectContext, modules,
{ m -> ModuleContent(m.kotlinFiles, m.javaFilesScope) },
{ module -> ModuleContent(module.kotlinFiles, module.javaFilesScope) },
JvmPlatformParameters {
javaClass ->
val moduleName = javaClass.name.asString().toLowerCase().first().toString()
modules.first { it._name == moduleName }
},
CompilerEnvironment,
builtIns,
packagePartProviderFactory = { a, b -> JvmPackagePartProvider(environment) }
builtIns = builtIns
)
builtIns.initialize(
@@ -113,7 +109,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
"a" -> listOf(this)
"b" -> listOf(this, 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" }
val descriptorName = referencedDescriptor.name.asString()
val expectedModuleName = "<${descriptorName.toLowerCase().first().toString()}>"
val expectedModuleName = "<${descriptorName.toLowerCase().first()}>"
val moduleName = referencedDescriptor.module.name.asString()
Assert.assertEquals(
"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(
moduleContext, CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(),
providerFactory, GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY
providerFactory, GlobalSearchScope.allScope(environment.project), PackagePartProvider.Empty
)
moduleContext.initializeModuleContents(container.get<JavaDescriptorResolver>().packageFragmentProvider)
@@ -62,7 +62,7 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment()
val container = createContainerForTopDownSingleModuleAnalyzerForJvm(
moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory,
GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY
GlobalSearchScope.allScope(environment.project), PackagePartProvider.Empty
)
emptyModule.initialize(container.get<JavaDescriptorResolver>().packageFragmentProvider)
@@ -17,17 +17,15 @@
package org.jetbrains.kotlin.descriptors
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>
companion object {
val EMPTY: PackagePartProvider = object : PackagePartProvider {
override fun findPackageParts(packageFqName: String): List<String> {
return emptyList()
}
}
object Empty : PackagePartProvider {
override fun findPackageParts(packageFqName: String): List<String> = emptyList()
}
}