KotlinReferencesSearcher: J2K
This commit is contained in:
+88
-116
@@ -14,136 +14,108 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.search.ideaExtensions;
|
package org.jetbrains.kotlin.idea.search.ideaExtensions
|
||||||
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.application.QueryExecutorBase;
|
import com.intellij.openapi.application.QueryExecutorBase
|
||||||
import com.intellij.openapi.util.Computable;
|
import com.intellij.openapi.util.Computable
|
||||||
import com.intellij.psi.*;
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
import com.intellij.psi.search.searches.ReferencesSearch
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import com.intellij.util.Processor;
|
import com.intellij.util.Processor
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.kotlin.asJava.*
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.kotlin.idea.search.usagesSearch.*
|
||||||
import org.jetbrains.kotlin.asJava.*;
|
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.*;
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil;
|
|
||||||
import org.jetbrains.kotlin.psi.*;
|
|
||||||
|
|
||||||
public class KotlinReferencesSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> {
|
public class KotlinReferencesSearcher : QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters>() {
|
||||||
public static void processJetClassOrObject(
|
|
||||||
final @NotNull JetClassOrObject element, @NotNull ReferencesSearch.SearchParameters queryParameters
|
|
||||||
) {
|
|
||||||
String className = element.getName();
|
|
||||||
if (className != null) {
|
|
||||||
PsiClass lightClass = ApplicationManager.getApplication().runReadAction(new Computable<PsiClass>() {
|
|
||||||
@Override
|
|
||||||
public PsiClass compute() {
|
|
||||||
return LightClassUtil.getPsiClass(element);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (lightClass != null) {
|
|
||||||
searchNamedElement(queryParameters, lightClass, className);
|
|
||||||
|
|
||||||
if (element instanceof JetObjectDeclaration && ((JetObjectDeclaration) element).isCompanion()) {
|
override fun processQuery(queryParameters: ReferencesSearch.SearchParameters, consumer: Processor<PsiReference>) {
|
||||||
PsiField fieldForCompanionObject = ApplicationManager.getApplication().runReadAction(new Computable<PsiField>() {
|
val element = queryParameters.getElementToSearch()
|
||||||
@Override
|
|
||||||
public PsiField compute() {
|
val unwrappedElement = element.namedUnwrappedElement
|
||||||
return LightClassUtil.getLightFieldForCompanionObject(element);
|
if (unwrappedElement == null || !ProjectRootsUtil.isInProjectOrLibSource(unwrappedElement)) return
|
||||||
|
|
||||||
|
ApplicationManager.getApplication().runReadAction(object : Runnable {
|
||||||
|
override fun run() {
|
||||||
|
val searchHelper = KotlinPsiSearchHelper(queryParameters.getElementToSearch().getProject())
|
||||||
|
val searchTarget = UsagesSearchTarget(unwrappedElement, queryParameters.getEffectiveSearchScope(), UsagesSearchLocation.EVERYWHERE, false)
|
||||||
|
val requestItem = UsagesSearchRequestItem(searchTarget, unwrappedElement.getSpecialNamesToSearch(), isTargetUsage, null)
|
||||||
|
searchHelper.processFilesWithText(requestItem, consumer)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
searchLightElements(queryParameters, element)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
public fun processJetClassOrObject(element: JetClassOrObject, queryParameters: ReferencesSearch.SearchParameters) {
|
||||||
|
val className = element.getName()
|
||||||
|
if (className != null) {
|
||||||
|
val lightClass = ApplicationManager.getApplication().runReadAction<PsiClass>(object : Computable<PsiClass?> {
|
||||||
|
override fun compute(): PsiClass? {
|
||||||
|
return LightClassUtil.getPsiClass(element)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (lightClass != null) {
|
||||||
|
searchNamedElement(queryParameters, lightClass, className)
|
||||||
|
|
||||||
|
if (element is JetObjectDeclaration && element.isCompanion()) {
|
||||||
|
val fieldForCompanionObject = ApplicationManager.getApplication().runReadAction<PsiField>(object : Computable<PsiField?> {
|
||||||
|
override fun compute(): PsiField? {
|
||||||
|
return LightClassUtil.getLightFieldForCompanionObject(element)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (fieldForCompanionObject != null) {
|
||||||
|
searchNamedElement(queryParameters, fieldForCompanionObject)
|
||||||
}
|
}
|
||||||
});
|
|
||||||
if (fieldForCompanionObject != null) {
|
|
||||||
searchNamedElement(queryParameters, fieldForCompanionObject);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
private fun searchLightElements(queryParameters: ReferencesSearch.SearchParameters, element: PsiElement) {
|
||||||
public void processQuery(
|
if (element is JetClassOrObject) {
|
||||||
@NotNull final ReferencesSearch.SearchParameters queryParameters,
|
processJetClassOrObject(element, queryParameters)
|
||||||
@NotNull final Processor<PsiReference> consumer
|
}
|
||||||
) {
|
else if (element is JetNamedFunction || element is JetSecondaryConstructor) {
|
||||||
PsiElement element = queryParameters.getElementToSearch();
|
val function = element as JetFunction
|
||||||
|
val name = function.getName()
|
||||||
final PsiNamedElement unwrappedElement = AsJavaPackage.getNamedUnwrappedElement(element);
|
if (name != null) {
|
||||||
if (unwrappedElement == null || !ProjectRootsUtil.isInProjectOrLibSource(unwrappedElement)) return;
|
val method = ApplicationManager.getApplication().runReadAction<PsiMethod>(object : Computable<PsiMethod?> {
|
||||||
|
override fun compute(): PsiMethod? {
|
||||||
ApplicationManager.getApplication().runReadAction(
|
return LightClassUtil.getLightClassMethod(function)
|
||||||
new Runnable() {
|
}
|
||||||
@Override
|
})
|
||||||
public void run() {
|
searchNamedElement(queryParameters, method)
|
||||||
KotlinPsiSearchHelper searchHelper = new KotlinPsiSearchHelper(queryParameters.getElementToSearch().getProject());
|
|
||||||
UsagesSearchTarget<PsiNamedElement> searchTarget = new UsagesSearchTarget<PsiNamedElement>(
|
|
||||||
unwrappedElement,
|
|
||||||
queryParameters.getEffectiveSearchScope(),
|
|
||||||
UsagesSearchLocation.EVERYWHERE,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
UsagesSearchRequestItem requestItem = new UsagesSearchRequestItem(
|
|
||||||
searchTarget,
|
|
||||||
UsagesSearchPackage.getSpecialNamesToSearch(unwrappedElement),
|
|
||||||
UsagesSearchPackage.getIsTargetUsage(),
|
|
||||||
null
|
|
||||||
);
|
|
||||||
searchHelper.processFilesWithText(requestItem, consumer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
}
|
||||||
|
else if (element is JetProperty) {
|
||||||
|
val propertyMethods = ApplicationManager.getApplication().runReadAction<LightClassUtil.PropertyAccessorsPsiMethods>(object : Computable<LightClassUtil.PropertyAccessorsPsiMethods> {
|
||||||
|
override fun compute(): LightClassUtil.PropertyAccessorsPsiMethods {
|
||||||
|
return LightClassUtil.getLightClassPropertyMethods(element)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
searchLightElements(queryParameters, element);
|
searchNamedElement(queryParameters, propertyMethods.getGetter())
|
||||||
}
|
searchNamedElement(queryParameters, propertyMethods.getSetter())
|
||||||
|
}
|
||||||
private static void searchLightElements(ReferencesSearch.SearchParameters queryParameters, PsiElement element) {
|
else if (element is KotlinLightMethod) {
|
||||||
if (element instanceof JetClassOrObject) {
|
val declaration = element.getOrigin()
|
||||||
processJetClassOrObject((JetClassOrObject) element, queryParameters);
|
if (declaration is JetProperty || (declaration is JetParameter && declaration.hasValOrVar())) {
|
||||||
|
searchNamedElement(queryParameters, declaration as PsiNamedElement)
|
||||||
|
}
|
||||||
|
else if (declaration is JetPropertyAccessor) {
|
||||||
|
searchNamedElement(queryParameters, PsiTreeUtil.getParentOfType<JetProperty>(declaration, javaClass<JetProperty>()))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (element instanceof JetNamedFunction || element instanceof JetSecondaryConstructor) {
|
|
||||||
final JetFunction function = (JetFunction) element;
|
private fun searchNamedElement(queryParameters: ReferencesSearch.SearchParameters, element: PsiNamedElement,
|
||||||
String name = function.getName();
|
name: String? = element.getName()) {
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
PsiMethod method = ApplicationManager.getApplication().runReadAction(new Computable<PsiMethod>() {
|
queryParameters.getOptimizer().searchWord(name, queryParameters.getEffectiveSearchScope(), true, element)
|
||||||
@Override
|
|
||||||
public PsiMethod compute() {
|
|
||||||
return LightClassUtil.getLightClassMethod(function);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
searchNamedElement(queryParameters, method);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (element instanceof JetProperty) {
|
|
||||||
final JetProperty property = (JetProperty) element;
|
|
||||||
LightClassUtil.PropertyAccessorsPsiMethods propertyMethods =
|
|
||||||
ApplicationManager.getApplication().runReadAction(new Computable<LightClassUtil.PropertyAccessorsPsiMethods>() {
|
|
||||||
@Override
|
|
||||||
public LightClassUtil.PropertyAccessorsPsiMethods compute() {
|
|
||||||
return LightClassUtil.getLightClassPropertyMethods(property);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
searchNamedElement(queryParameters, propertyMethods.getGetter());
|
|
||||||
searchNamedElement(queryParameters, propertyMethods.getSetter());
|
|
||||||
}
|
|
||||||
else if (element instanceof KotlinLightMethod) {
|
|
||||||
JetDeclaration declaration = ((KotlinLightMethod) element).getOrigin();
|
|
||||||
if (declaration instanceof JetProperty
|
|
||||||
|| (declaration instanceof JetParameter && ((JetParameter) declaration).hasValOrVar())) {
|
|
||||||
searchNamedElement(queryParameters, (PsiNamedElement) declaration);
|
|
||||||
}
|
|
||||||
else if (declaration instanceof JetPropertyAccessor) {
|
|
||||||
searchNamedElement(queryParameters, PsiTreeUtil.getParentOfType(declaration, JetProperty.class));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void searchNamedElement(ReferencesSearch.SearchParameters queryParameters, PsiNamedElement element) {
|
|
||||||
searchNamedElement(queryParameters, element, element != null ? element.getName() : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void searchNamedElement(ReferencesSearch.SearchParameters queryParameters, PsiNamedElement element, @Nullable String name) {
|
|
||||||
if (name != null) {
|
|
||||||
queryParameters.getOptimizer().searchWord(name, queryParameters.getEffectiveSearchScope(), true, element);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user