IJ-CR-113485 IJ-CR-112205 [java-completion] IDEA-324073 Complete static methods with the first argument as qualifier

- added extension points for other languages. Experimental

GitOrigin-RevId: 6a0383f0137b7e8418b51a1336a16dc3389e9470
This commit is contained in:
Mikhail Pyltsin
2023-08-25 17:21:28 +02:00
committed by intellij-monorepo-bot
parent a08f8129d9
commit 81d3b3f897
4 changed files with 96 additions and 15 deletions

View File

@@ -17,6 +17,7 @@
<extensionPoints>
<extensionPoint qualifiedName="com.intellij.allOverridingMethodsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.java.shortNamesCache" area="IDEA_PROJECT" interface="com.intellij.psi.search.PsiShortNamesCache" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.java.staticMethodNamesCache" area="IDEA_PROJECT" interface="com.intellij.psi.search.JavaStaticMethodNameCache" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.classesWithAnnotatedMembersSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.allClassesSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.overridingMethodsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
@@ -48,6 +49,7 @@
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaAnonymousClassBaseRefOccurenceIndex"/>
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex"/>
<java.shortNamesCache implementation="com.intellij.psi.impl.PsiShortNamesCacheImpl"/>
<java.staticMethodNamesCache implementation="com.intellij.psi.impl.JavaStaticMethodNameCacheImpl" order="first"/>
<projectService serviceInterface="com.intellij.psi.search.PsiShortNamesCache"
serviceImplementation="com.intellij.psi.impl.CompositeShortNamesCache"/>
<moduleService serviceInterface="com.intellij.openapi.roots.ModulePackageIndex"

View File

@@ -0,0 +1,55 @@
// Copyright 2000-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.psi.impl;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.impl.java.stubs.index.JavaStaticMemberNameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.JavaStaticMethodNameCache;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.Processor;
import com.intellij.util.indexing.IdFilter;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.function.Predicate;
@ApiStatus.Experimental
public class JavaStaticMethodNameCacheImpl extends JavaStaticMethodNameCache {
@NotNull
private final Project myProject;
public JavaStaticMethodNameCacheImpl(@NotNull Project project) {
myProject = project;
}
@Override
public boolean processMethodsWithName(@NotNull Predicate<String> namePredicate,
@NotNull Processor<? super PsiMethod> processor,
@NotNull GlobalSearchScope scope,
@Nullable IdFilter filter) {
JavaStaticMemberNameIndex index = JavaStaticMemberNameIndex.getInstance();
Collection<String> memberNames = index.getAllKeys(myProject);
for (String memberName : memberNames) {
if (namePredicate.test(memberName)) {
Collection<PsiMember> members = index.getStaticMembers(memberName, myProject, scope);
for (PsiMember member : members) {
if (member instanceof PsiMethod method) {
if (!processor.process(method)) {
return false;
}
}
}
}
}
return true;
}
@Override
public Class<? extends PsiShortNamesCache> replaced() {
return PsiShortNamesCacheImpl.class;
}
}