diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt index 472860e7e50..d042618e88f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt @@ -177,7 +177,7 @@ class LazyJavaClassDescriptor( if (purelyImplementedFqName.isRoot || !purelyImplementedFqName.toUnsafe().startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME)) return null - val classDescriptor = c.module.builtIns.getBuiltInClassByNameNullable(purelyImplementedFqName.shortName()) ?: return null + val classDescriptor = c.module.builtIns.getBuiltInClassByFqNameNullable(purelyImplementedFqName) ?: return null if (classDescriptor.getTypeConstructor().getParameters().size != getParameters().size) return null diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 77b605a64c4..84d80ff9d62 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -70,6 +70,7 @@ public abstract class KotlinBuiltIns { private final Map primitiveTypeToArrayKotlinType; private final Map primitiveKotlinTypeToKotlinArrayType; private final Map kotlinArrayTypeToPrimitiveKotlinType; + private final Map packageNameToPackageFragment; public static final FqNames FQ_NAMES = new FqNames(); @@ -94,10 +95,12 @@ public abstract class KotlinBuiltIns { builtInsModule.initialize(packageFragmentProvider); builtInsModule.setDependencies(builtInsModule); - builtinsPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(BUILT_INS_PACKAGE_FQ_NAME)); - collectionsPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(COLLECTIONS_PACKAGE_FQ_NAME)); - rangesPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(RANGES_PACKAGE_FQ_NAME)); - annotationPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(ANNOTATION_PACKAGE_FQ_NAME)); + packageNameToPackageFragment = new HashMap(); + + builtinsPackageFragment = getBuiltinsPackageFragment(packageFragmentProvider, packageNameToPackageFragment, BUILT_INS_PACKAGE_FQ_NAME); + collectionsPackageFragment = getBuiltinsPackageFragment(packageFragmentProvider, packageNameToPackageFragment, COLLECTIONS_PACKAGE_FQ_NAME); + rangesPackageFragment = getBuiltinsPackageFragment(packageFragmentProvider, packageNameToPackageFragment, RANGES_PACKAGE_FQ_NAME); + annotationPackageFragment = getBuiltinsPackageFragment(packageFragmentProvider, packageNameToPackageFragment, ANNOTATION_PACKAGE_FQ_NAME); primitiveTypeToArrayKotlinType = new EnumMap(PrimitiveType.class); primitiveKotlinTypeToKotlinArrayType = new HashMap(); @@ -121,6 +124,18 @@ public abstract class KotlinBuiltIns { kotlinArrayTypeToPrimitiveKotlinType.put(arrayType, type); } + + @NotNull + private BuiltinsPackageFragment getBuiltinsPackageFragment( + PackageFragmentProvider fragmentProvider, + Map packageNameToPackageFragment, + FqName packageFqName + ) { + BuiltinsPackageFragment packageFragment = (BuiltinsPackageFragment) single(fragmentProvider.getPackageFragments(packageFqName)); + packageNameToPackageFragment.put(packageFqName, packageFragment); + return packageFragment; + } + public static class FqNames { public final FqNameUnsafe any = fqNameUnsafe("Any"); public final FqNameUnsafe nothing = fqNameUnsafe("Nothing"); @@ -288,6 +303,18 @@ public abstract class KotlinBuiltIns { return getBuiltInClassByNameNullable(simpleName, getBuiltInsPackageFragment()); } + @Nullable + public ClassDescriptor getBuiltInClassByFqNameNullable(@NotNull FqName fqName) { + if (!fqName.isRoot()) { + FqName parent = fqName.parent(); + BuiltinsPackageFragment packageFragment = packageNameToPackageFragment.get(parent); + if (packageFragment != null) { + return getBuiltInClassByNameNullable(fqName.shortName(), packageFragment); + } + } + return null; + } + @Nullable private static ClassDescriptor getBuiltInClassByNameNullable(@NotNull Name simpleName, @NotNull PackageFragmentDescriptor packageFragment) { ClassifierDescriptor classifier = packageFragment.getMemberScope().getContributedClassifier(