All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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