mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Create reference searcher for PsiRecordComponent
GitOrigin-RevId: aaf6cdc52484da5a86cbcadd0ffe121fd5ab1c5e
This commit is contained in:
committed by
intellij-monorepo-bot
parent
08c93de981
commit
13bb24cdd3
@@ -79,6 +79,7 @@
|
||||
<referencesSearch implementation="com.intellij.psi.impl.search.SPIReferencesSearcher"/>
|
||||
<referencesSearch implementation="com.intellij.psi.impl.search.ConstructorReferencesSearcher"/>
|
||||
<referencesSearch implementation="com.intellij.psi.impl.search.PsiAnnotationMethodReferencesSearcher"/>
|
||||
<referencesSearch implementation="com.intellij.psi.impl.search.JavaRecordComponentSearcher"/>
|
||||
<fileBasedIndex implementation="com.intellij.psi.impl.java.JavaBinaryPlusExpressionIndex"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
// Copyright 2000-2019 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.search;
|
||||
|
||||
import com.intellij.openapi.application.QueryExecutorBase;
|
||||
import com.intellij.openapi.application.ReadAction;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.UsageSearchContext;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.util.Processor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class JavaRecordComponentSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> {
|
||||
@Override
|
||||
public void processQuery(@NotNull ReferencesSearch.SearchParameters queryParameters, @NotNull Processor<? super PsiReference> consumer) {
|
||||
PsiElement element = queryParameters.getElementToSearch();
|
||||
if (element instanceof PsiRecordComponent) {
|
||||
RecordMethodNavigationInfo info = findNavigationInfo((PsiRecordComponent)element);
|
||||
if (info != null) {
|
||||
queryParameters.getOptimizer().searchWord(info.myName,
|
||||
queryParameters.getEffectiveSearchScope(),
|
||||
UsageSearchContext.IN_CODE,
|
||||
false,
|
||||
info.myLightMethod);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static RecordMethodNavigationInfo findNavigationInfo(PsiRecordComponent recordComponent) {
|
||||
return ReadAction.compute(() -> {
|
||||
String name = recordComponent.getName();
|
||||
if (name == null) return null;
|
||||
PsiClass containingClass = recordComponent.getContainingClass();
|
||||
if (containingClass == null) return null;
|
||||
PsiMethod[] methods = containingClass.findMethodsByName(name, false);
|
||||
if (methods.length != 1) return null;
|
||||
PsiMethod method = methods[0];
|
||||
return new RecordMethodNavigationInfo(method, name);
|
||||
});
|
||||
}
|
||||
|
||||
private static class RecordMethodNavigationInfo {
|
||||
@NotNull final PsiMethod myLightMethod;
|
||||
@NotNull final String myName;
|
||||
|
||||
private RecordMethodNavigationInfo(@NotNull PsiMethod lightMethod, @NotNull String name) {
|
||||
myLightMethod = lightMethod;
|
||||
myName = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user