
com.yiwowang.intellij.finding.MainAction Maven / Gradle / Ivy
The newest version!
package com.yiwowang.intellij.finding;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.impl.source.tree.java.ClassElement;
import com.intellij.psi.impl.source.tree.java.FieldElement;
import com.intellij.psi.impl.source.tree.java.MethodElement;
import com.intellij.psi.impl.source.tree.java.PsiIdentifierImpl;
import com.intellij.psi.util.PsiTreeUtil;
import com.yiwowang.intellij.finding.base.bean.FindUsagesParams;
import com.yiwowang.intellij.finding.util.UIUtils;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class MainAction extends AnAction {
long size = 0;
static SearchForm searchForm;
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getProject();
FindUsagesParams params = parseCaret(e);
if (searchForm != null && searchForm.isShowing()
&& StringUtils.equals(searchForm.getProject().getProjectFilePath(), e.getProject().getProjectFilePath())) {
searchForm.show(project, params);
} else {
if (searchForm != null) {
searchForm.close();
}
searchForm = new SearchForm();
searchForm.show(project, params);
}
}
/**
* in class:
* field(constant)/method/class
* ref class:
* field(constant)/method/class
*
* @param event event
* @return parse result
*/
public FindUsagesParams parseCaret(AnActionEvent event) {
if (event == null || !StringUtils.containsIgnoreCase(event.getPlace(), "popup")) {
return null;
}
PsiFile psiFile = event.getData(LangDataKeys.PSI_FILE);
Editor editor = event.getData(PlatformDataKeys.EDITOR);
if (psiFile == null || editor == null) {
return null;
}
int offset = 0;
try {
offset = editor.getCaretModel().getOffset();
} catch (Throwable e) {
e.printStackTrace();
}
if (offset <= 0) {
return null;
}
PsiElement element = psiFile.findElementAt(offset);
PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (psiClass == null) {
return null;
}
String classFullName = UIUtils.getClassFullName(psiClass);
FindUsagesParams params = new FindUsagesParams();
if (element instanceof PsiIdentifierImpl) {
TreeElement parent = ((PsiIdentifierImpl) element).getTreeParent();
// inner class parent.getTreeParent().getElementType() is CLASS;
// FILE outer class
String type = parent.getElementType().toString();
System.out.println("parseUserSelect find type:" + type);
if (parent instanceof ClassElement) {
params.searchType = FindUsagesParams.TYPE_CLASS;
params.className = classFullName;
} else if (parent instanceof MethodElement) {
PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class);
if (method == null) {
return null;
}
System.out.println("parseUserSelect find method:" + method.getName());
fillMethod(method, params);
} else if (parent instanceof FieldElement) {
PsiField field = PsiTreeUtil.getParentOfType(element, PsiField.class);
System.out.println("parseUserSelect find fieldName:" + field.getName() + " fieldType:" + field.getType().getCanonicalText());
fillField(field, params);
} else if (parent instanceof PsiJavaCodeReferenceElement) {
// TODO ref method or field?
PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement) parent;
PsiElement member = ref.resolve();
if (member instanceof PsiClass) {
// HttpDnsManager manager = new HttpDnsManager()
// ^ ^
params.className = UIUtils.getClassFullName((PsiClass) member);
params.searchType = FindUsagesParams.TYPE_CLASS;
} else if (member instanceof PsiField) {
// manager.value
// ^
PsiField field = ((PsiField) member);
fillField(field, params);
return params;
} else if (member instanceof PsiMethod) {
// manager.setHost("")
// ^
PsiMethod method = ((PsiMethod) member);
fillMethod(method, params);
return params;
} else if (member instanceof PsiParameter) {
// void setBean(Bean bean){
// bean.value=1
// ^
PsiParameter parameter = (PsiParameter) member;
final PsiClass c = UIUtils.getPsiClass(parameter.getType());
params.className = UIUtils.getClassFullName(c);
params.searchType = FindUsagesParams.TYPE_CLASS;
}
} else if (parent instanceof PsiLocalVariable) {
// manager.value
// ^
PsiLocalVariable localVariable = (PsiLocalVariable) parent;
final PsiClass c = UIUtils.getPsiClass(localVariable.getType());
params.className = UIUtils.getClassFullName(c);
params.searchType = FindUsagesParams.TYPE_CLASS;
}
}
return params;
}
public static void fillField(PsiField field, FindUsagesParams params) {
if (field == null) {
return;
}
Object constant = null;
if (field.hasModifierProperty(PsiModifier.FINAL)) {
constant = field.computeConstantValue();
}
PsiClass containingClass = field.getContainingClass();
params.className = UIUtils.getClassFullName(containingClass);
// TODO not suppot Number, such as ConstantLong
if (constant instanceof String) {
params.constant = constant + "";
params.searchType = FindUsagesParams.TYPE_CONSTANTS;
} else {
params.fieldName = field.getName();
params.searchType = FindUsagesParams.TYPE_FIELD;
}
}
public static void fillMethod(PsiMethod method, FindUsagesParams params) {
List methodParamsTypeList = new ArrayList<>();
PsiParameterList psiParameterList = method.getParameterList();
PsiParameter[] psiParameters = psiParameterList.getParameters();
for (PsiParameter parameter : psiParameters) {
if (parameter.getType() instanceof PsiPrimitiveType) {
methodParamsTypeList.add(parameter.getType().getCanonicalText());
} else if (parameter.getType() instanceof PsiClassType) {
final PsiClass c = UIUtils.getPsiClass(parameter.getType());
methodParamsTypeList.add(UIUtils.getClassFullName(c));
} else {
System.out.println("参数解析错误,未识别类型 " + parameter.getType());
}
}
params.searchType = FindUsagesParams.TYPE_METHOD;
PsiClass containingClass = method.getContainingClass();
if (containingClass != null) {
params.className = UIUtils.getClassFullName(containingClass);
}
params.methodName = method.getName();
params.methodParamType = "(" + StringUtils.join(methodParamsTypeList, ",") + ")";
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy