Create reference searcher for PsiRecordComponent

GitOrigin-RevId: aaf6cdc52484da5a86cbcadd0ffe121fd5ab1c5e
This commit is contained in:
Roman.Ivanov
2019-12-06 07:31:28 +00:00
committed by intellij-monorepo-bot
parent 08c93de981
commit 13bb24cdd3
2 changed files with 51 additions and 0 deletions
@@ -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>
@@ -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;
}
}
}