From e19c6ce23c2795563c08b47443758396a5b13d94 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 3 Jan 2019 18:53:55 +0100 Subject: [PATCH] Use KotlinBuiltIns.getBuiltInsPackageScope instead of getBuiltInsPackageFragment In general case, the module where built-ins are looked up (builtInsModule) can have multiple package fragments corresponding to the package "kotlin". Remove the misleading method getBuiltInsPackageFragment along with its implementation details and use the package view's scope instead (by changing KotlinBuiltIns.getBuiltInsPackageScope), since it'll iterate over all fragments accessible in the module and its dependencies. The only difference between scopes of package fragment and package view is that the latter also contains package views for subpackages, which is why the change in BuiltInsReferenceResolverTest is necessary --- .../jetbrains/kotlin/psi2ir/KotlinUtils.kt | 6 +----- .../kotlin/builtins/KotlinBuiltIns.java | 21 +++++-------------- .../BuiltInsReferenceResolverTest.java | 14 +++++++++---- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt index 0f0fc619efe..35216aee495 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.psi2ir import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -71,9 +70,6 @@ inline fun MemberScope.findFirstFunction(name: String, predicate: (CallableMembe fun MemberScope.findSingleFunction(name: Name): FunctionDescriptor = getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).single() -fun KotlinBuiltIns.findSingleFunction(name: Name): FunctionDescriptor = - builtInsPackageScope.findSingleFunction(name) - val PsiElement?.startOffsetOrUndefined get() = this?.startOffsetSkippingComments ?: UNDEFINED_OFFSET val PsiElement?.endOffsetOrUndefined get() = this?.endOffset ?: UNDEFINED_OFFSET @@ -86,4 +82,4 @@ val PropertyDescriptor.unwrappedSetMethod: FunctionDescriptor? val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffsetSkippingComments ?: UNDEFINED_OFFSET val KtPureElement?.pureEndOffsetOrUndefined get() = this?.psiOrParent?.endOffset ?: UNDEFINED_OFFSET -fun KtElement.getChildTokenStartOffsetOrNull(tokenSet: TokenSet) = node.findChildByType(tokenSet)?.startOffset \ No newline at end of file +fun KtElement.getChildTokenStartOffsetOrNull(tokenSet: TokenSet) = node.findChildByType(tokenSet)?.startOffset diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index d4c94b0be22..c9f9c9ab750 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -83,14 +83,14 @@ public abstract class KotlinBuiltIns { PackageFragmentProvider provider = builtInsModule.getPackageFragmentProvider(); Map nameToFragment = new LinkedHashMap(); - PackageFragmentDescriptor kotlin = createPackage(provider, nameToFragment, BUILT_INS_PACKAGE_FQ_NAME); + createPackage(provider, nameToFragment, BUILT_INS_PACKAGE_FQ_NAME); createPackage(provider, null, COROUTINES_PACKAGE_FQ_NAME_RELEASE); createPackage(provider, nameToFragment, COLLECTIONS_PACKAGE_FQ_NAME); createPackage(provider, nameToFragment, RANGES_PACKAGE_FQ_NAME); createPackage(provider, nameToFragment, ANNOTATION_PACKAGE_FQ_NAME); Set allImportedByDefault = new LinkedHashSet(nameToFragment.values()); - return new PackageFragments(kotlin, allImportedByDefault); + return new PackageFragments(allImportedByDefault); } }); @@ -117,8 +117,7 @@ public abstract class KotlinBuiltIns { this.builtInClassesByName = storageManager.createMemoizedFunction(new Function1() { @Override public ClassDescriptor invoke(Name name) { - ClassifierDescriptor classifier = - getBuiltInsPackageFragment().getMemberScope().getContributedClassifier(name, NoLookupLocation.FROM_BUILTINS); + ClassifierDescriptor classifier = getBuiltInsPackageScope().getContributedClassifier(name, NoLookupLocation.FROM_BUILTINS); if (classifier == null) { throw new AssertionError("Built-in class " + BUILT_INS_PACKAGE_FQ_NAME.child(name) + " is not found"); } @@ -227,14 +226,9 @@ public abstract class KotlinBuiltIns { } private static class PackageFragments { - public final PackageFragmentDescriptor builtInsPackageFragment; public final Set allImportedByDefaultBuiltInsPackageFragments; - private PackageFragments( - @NotNull PackageFragmentDescriptor builtInsPackageFragment, - @NotNull Set allImportedByDefaultBuiltInsPackageFragments - ) { - this.builtInsPackageFragment = builtInsPackageFragment; + private PackageFragments(@NotNull Set allImportedByDefaultBuiltInsPackageFragments) { this.allImportedByDefaultBuiltInsPackageFragments = allImportedByDefaultBuiltInsPackageFragments; } } @@ -376,11 +370,6 @@ public abstract class KotlinBuiltIns { return packageFragments.invoke().allImportedByDefaultBuiltInsPackageFragments; } - @NotNull - public PackageFragmentDescriptor getBuiltInsPackageFragment() { - return packageFragments.invoke().builtInsPackageFragment; - } - /** * Checks if the given descriptor is declared in the deserialized built-in package fragment, i.e. if it was loaded as a part of * loading .kotlin_builtins definition files. @@ -410,7 +399,7 @@ public abstract class KotlinBuiltIns { @NotNull public MemberScope getBuiltInsPackageScope() { - return packageFragments.invoke().builtInsPackageFragment.getMemberScope(); + return builtInsModule.getPackage(BUILT_INS_PACKAGE_FQ_NAME).getMemberScope(); } @NotNull diff --git a/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java b/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java index 7be7080e468..ec4cb48df90 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.DefaultBuiltIns; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; +import org.jetbrains.kotlin.descriptors.PackageViewDescriptor; import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies; import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde; import org.jetbrains.kotlin.idea.navigation.GotoCheck; @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase; import org.jetbrains.kotlin.idea.test.PluginTestCaseBase; import org.jetbrains.kotlin.idea.test.ProjectDescriptorWithStdlibSources; import org.jetbrains.kotlin.resolve.DescriptorUtils; +import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.test.InTextDirectivesUtils; import java.util.ArrayList; @@ -83,11 +84,11 @@ public class BuiltInsReferenceResolverTest extends KotlinLightCodeInsightFixture } private static Collection getAllStandardDescriptors() { - final List descriptors = new ArrayList(); + List descriptors = new ArrayList<>(); - PackageFragmentDescriptor builtinsPackageFragment = DefaultBuiltIns.getInstance().getBuiltInsPackageFragment(); + MemberScope builtIns = DefaultBuiltIns.getInstance().getBuiltInsPackageScope(); - for (DeclarationDescriptor packageMember : DescriptorUtils.getAllDescriptors(builtinsPackageFragment.getMemberScope())) { + for (DeclarationDescriptor packageMember : DescriptorUtils.getAllDescriptors(builtIns)) { packageMember.acceptVoid(new DeclarationDescriptorVisitorEmptyBodies() { @Override public Void visitClassDescriptor(ClassDescriptor descriptor, Void data) { @@ -104,6 +105,11 @@ public class BuiltInsReferenceResolverTest extends KotlinLightCodeInsightFixture descriptors.add(descriptor); return null; } + + @Override + public Void visitPackageViewDescriptor(PackageViewDescriptor descriptor, Void data) { + return null; + } }); }