Filter out non-builtin package fragments from module when needed

In subsequent commits, a JVM module will be able to have up to two package
fragments for a given package FQ name. For example, for package "kotlin" in
kotlin-runtime.jar there will be a LazyJavaPackageFragment with binary
(Kotlin+Java) dependencies, and a BuiltInsPackageFragment for built-ins
metadata (which is loaded from kotlin/kotlin.kotlin_builtins)
This commit is contained in:
Alexander Udalov
2016-10-19 13:17:11 +03:00
parent 9ce211fe87
commit 4e7542b07d
5 changed files with 9 additions and 6 deletions
@@ -119,7 +119,7 @@ object BuiltinSpecialBridgesUtil {
): Boolean { ): Boolean {
if (BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(this) == null) return false if (BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(this) == null) return false
val builtin = getOverriddenBuiltinReflectingJvmDescriptor()!! val builtin = getOverriddenBuiltinReflectingJvmDescriptor() ?: error("Overridden built-in member not found: $this")
return signatureByDescriptor(this) == signatureByDescriptor(builtin) return signatureByDescriptor(this) == signatureByDescriptor(builtin)
} }
} }
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.serialization.builtins package org.jetbrains.kotlin.serialization.builtins
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns.*
import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
@@ -68,7 +69,7 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment()
val packageFragmentProvider = emptyModule.builtIns.builtInsModule.packageFragmentProvider val packageFragmentProvider = emptyModule.builtIns.builtInsModule.packageFragmentProvider
for (packageFqName in listOf<FqName>(BUILT_INS_PACKAGE_FQ_NAME, COLLECTIONS_PACKAGE_FQ_NAME, RANGES_PACKAGE_FQ_NAME)) { for (packageFqName in listOf<FqName>(BUILT_INS_PACKAGE_FQ_NAME, COLLECTIONS_PACKAGE_FQ_NAME, RANGES_PACKAGE_FQ_NAME)) {
val loaded = packageFragmentProvider.getPackageFragments(packageFqName).single() val loaded = packageFragmentProvider.getPackageFragments(packageFqName).filterIsInstance<BuiltInsPackageFragment>().single()
RecursiveDescriptorComparator.validateAndCompareDescriptorWithFile( RecursiveDescriptorComparator.validateAndCompareDescriptorWithFile(
loaded, configuration, loaded, configuration,
File("compiler/testData/builtin-classes/$builtinVersionName/" + packageFqName.asString().replace('.', '-') + ".txt")) File("compiler/testData/builtin-classes/$builtinVersionName/" + packageFqName.asString().replace('.', '-') + ".txt"))
@@ -31,7 +31,7 @@ class JvmBuiltInClassDescriptorFactory(
) : ClassDescriptorFactory { ) : ClassDescriptorFactory {
private val cloneable by storageManager.createLazyValue { private val cloneable by storageManager.createLazyValue {
ClassDescriptorImpl( ClassDescriptorImpl(
moduleDescriptor.getPackage(KOTLIN_FQ_NAME).fragments.single(), moduleDescriptor.getPackage(KOTLIN_FQ_NAME).fragments.filterIsInstance<BuiltInsPackageFragment>().single(),
CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType), CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType),
SourceElement.NO_SOURCE SourceElement.NO_SOURCE
).apply { ).apply {
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.builtins.functions package org.jetbrains.kotlin.builtins.functions
import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kind import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor.Kind
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -79,7 +80,7 @@ class BuiltInFictitiousFunctionClassFactory(
val packageFqName = classId.packageFqName val packageFqName = classId.packageFqName
val (kind, arity) = parseClassName(className, packageFqName) ?: return null val (kind, arity) = parseClassName(className, packageFqName) ?: return null
val containingPackageFragment = module.getPackage(packageFqName).fragments.single() val containingPackageFragment = module.getPackage(packageFqName).fragments.filterIsInstance<BuiltInsPackageFragment>().single()
return FunctionClassDescriptor(storageManager, containingPackageFragment, kind, arity) return FunctionClassDescriptor(storageManager, containingPackageFragment, kind, arity)
} }
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.builtins.functions package org.jetbrains.kotlin.builtins.functions
import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment
import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME import org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
@@ -129,8 +130,8 @@ class FunctionClassDescriptor(
// For KFunction{n}, add corresponding numbered Function{n} class, e.g. Function2 for KFunction2 // For KFunction{n}, add corresponding numbered Function{n} class, e.g. Function2 for KFunction2
if (functionKind == Kind.KFunction) { if (functionKind == Kind.KFunction) {
val module = containingDeclaration.containingDeclaration val packageView = containingDeclaration.containingDeclaration.getPackage(BUILT_INS_PACKAGE_FQ_NAME)
val kotlinPackageFragment = module.getPackage(BUILT_INS_PACKAGE_FQ_NAME).fragments.single() val kotlinPackageFragment = packageView.fragments.filterIsInstance<BuiltInsPackageFragment>().single()
add(kotlinPackageFragment, Kind.Function.numberedClassName(arity)) add(kotlinPackageFragment, Kind.Function.numberedClassName(arity))
} }