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
This commit is contained in:
@@ -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
|
||||
fun KtElement.getChildTokenStartOffsetOrNull(tokenSet: TokenSet) = node.findChildByType(tokenSet)?.startOffset
|
||||
|
||||
@@ -83,14 +83,14 @@ public abstract class KotlinBuiltIns {
|
||||
PackageFragmentProvider provider = builtInsModule.getPackageFragmentProvider();
|
||||
|
||||
Map<FqName, PackageFragmentDescriptor> nameToFragment = new LinkedHashMap<FqName, PackageFragmentDescriptor>();
|
||||
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<PackageFragmentDescriptor> allImportedByDefault = new LinkedHashSet<PackageFragmentDescriptor>(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<Name, ClassDescriptor>() {
|
||||
@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<PackageFragmentDescriptor> allImportedByDefaultBuiltInsPackageFragments;
|
||||
|
||||
private PackageFragments(
|
||||
@NotNull PackageFragmentDescriptor builtInsPackageFragment,
|
||||
@NotNull Set<PackageFragmentDescriptor> allImportedByDefaultBuiltInsPackageFragments
|
||||
) {
|
||||
this.builtInsPackageFragment = builtInsPackageFragment;
|
||||
private PackageFragments(@NotNull Set<PackageFragmentDescriptor> 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
|
||||
|
||||
@@ -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<DeclarationDescriptor> getAllStandardDescriptors() {
|
||||
final List<DeclarationDescriptor> descriptors = new ArrayList<DeclarationDescriptor>();
|
||||
List<DeclarationDescriptor> 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<Void, Void>() {
|
||||
@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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user