Optimized checking if reference to builtin.

It was slowing up usages search for back-references to standard library (not builtins, but in "kotlin" package)
This commit is contained in:
Evgeny Gerashchenko
2015-01-15 21:08:19 +03:00
parent 4cede47c70
commit b91053da0b
@@ -199,6 +199,8 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
return findCurrentDescriptorForMember(unwrapFakeOverride((CallableMemberDescriptor) originalDescriptor).getOriginal()); return findCurrentDescriptorForMember(unwrapFakeOverride((CallableMemberDescriptor) originalDescriptor).getOriginal());
} }
if (!isFromBuiltinModule(originalDescriptor)) return null;
DeclarationDescriptor containingDeclaration = findCurrentDescriptor(originalDescriptor.getContainingDeclaration()); DeclarationDescriptor containingDeclaration = findCurrentDescriptor(originalDescriptor.getContainingDeclaration());
JetScope memberScope = getMemberScope(containingDeclaration); JetScope memberScope = getMemberScope(containingDeclaration);
if (memberScope == null) return null; if (memberScope == null) return null;
@@ -222,10 +224,12 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
@Nullable @Nullable
private DeclarationDescriptor findCurrentDescriptor(@NotNull DeclarationDescriptor originalDescriptor) { private DeclarationDescriptor findCurrentDescriptor(@NotNull DeclarationDescriptor originalDescriptor) {
if (originalDescriptor instanceof ClassDescriptor) { if (originalDescriptor instanceof ClassDescriptor) {
if (!isFromBuiltinModule(originalDescriptor)) return null;
return findCurrentDescriptorForClass((ClassDescriptor) originalDescriptor); return findCurrentDescriptorForClass((ClassDescriptor) originalDescriptor);
} }
else if (originalDescriptor instanceof PackageFragmentDescriptor) { else if (originalDescriptor instanceof PackageFragmentDescriptor) {
return KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.equals(((PackageFragmentDescriptor) originalDescriptor).getFqName()) return isFromBuiltinModule(originalDescriptor)
&& KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.equals(((PackageFragmentDescriptor) originalDescriptor).getFqName())
? builtinsPackageFragment ? builtinsPackageFragment
: null; : null;
} }
@@ -237,6 +241,12 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
} }
} }
private static boolean isFromBuiltinModule(@NotNull DeclarationDescriptor originalDescriptor) {
// TODO This is optimization only
// It should be rewritten by checking declarationDescriptor.getSource(), when the latter returns something non-trivial for builtins.
return KotlinBuiltIns.getInstance().getBuiltInsModule() == DescriptorUtils.getContainingModule(originalDescriptor);
}
@NotNull @NotNull
public Collection<PsiElement> resolveBuiltInSymbol(@NotNull DeclarationDescriptor declarationDescriptor) { public Collection<PsiElement> resolveBuiltInSymbol(@NotNull DeclarationDescriptor declarationDescriptor) {
if (bindingContext == null) { if (bindingContext == null) {