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

com.yiwowang.intellij.finding.base.bean.MemberBean Maven / Gradle / Ivy

The newest version!
package com.yiwowang.intellij.finding.base.bean;

import org.apache.commons.lang3.StringUtils;

public class MemberBean {
    public static final int TYPE_METHOD = 1;
    public static final int TYPE_FIELD = 2;
    public int type;
    public ClassBean clazz;
    /**
     * bytecode sign
     */
    public String sign;
    public String name;
    private String displayName;
    private String inputFormatName;


    public String getInputFormatName() {
        if (inputFormatName != null) {
            return inputFormatName;
        }
        switch (type) {
            case TYPE_METHOD:
                inputFormatName = name + parseMethodSignature2(sign);
                break;
            case TYPE_FIELD:
                inputFormatName = name;
                break;
        }
        return inputFormatName;
    }

    public String getDisplayName() {
        if (displayName != null) {
            return displayName;
        }
        switch (type) {
            case TYPE_METHOD:
                displayName = name + parseMethodSignature(sign);
                break;
            case TYPE_FIELD:
                displayName = name;
                break;
        }
        return displayName;
    }

    public static String parseMethodSignature(String sign) {
        // delete return value
        int typeEnd = sign.lastIndexOf(")");
        if (typeEnd <= 1) {
            return "()";
        }
        String paramsStr = sign.substring(1, typeEnd - 1);
        // 基本类型+引用类型
        StringBuilder builder = new StringBuilder(" (");
        int defaultLength = builder.length();
        String[] paramsArr = paramsStr.split(";");
        for (int i = 0; i < paramsArr.length; i++) {
            String param = paramsArr[i];
            if (param == null || param.length() == 0) {
                continue;
            }
            int arrNum = 0;
            char[] chars = param.toCharArray();
            for (int k = 0; k < chars.length; k++) {
                char c = chars[k];
                if (c == '[') {
                    arrNum++;
                    continue;
                }
                String baseType = getBaseType(c);
                if (baseType != null) {
                    // 参数之间分隔
                    if (builder.length() > defaultLength) {
                        builder.append(", ");
                    }
                    // 数组类型
                    builder.append(baseType);
                    appendArrNum(builder, arrNum);
                } else if (c == 'L') {
                    String refClass = param.substring(k);
                    String className = getClassName(refClass);
                    if (className.length() > 0) {
                        // 参数之间分隔
                        if (builder.length() > defaultLength) {
                            builder.append(", ");
                        }
                        builder.append(className);
                        appendArrNum(builder, arrNum);
                    }
                    break;
                }
                arrNum = 0;
            }
        }
        builder.append(")");
        return builder.toString();
    }

    public static String parseMethodSignature2(String sign) {
        // delete return value
        int typeEnd = sign.lastIndexOf(")");
        if (typeEnd <= 1) {
            return "()";
        }
        String paramsStr = sign.substring(1, typeEnd - 1);
        // 基本类型+引用类型
        StringBuilder builder = new StringBuilder(" (");
        int defaultLength = builder.length();
        String[] paramsArr = paramsStr.split(";");
        for (int i = 0; i < paramsArr.length; i++) {
            String param = paramsArr[i];
            if (param == null || param.length() == 0) {
                continue;
            }
            int arrNum = 0;
            char[] chars = param.toCharArray();
            for (int k = 0; k < chars.length; k++) {
                char c = chars[k];
                if (c == '[') {
                    arrNum++;
                    continue;
                }
                String baseType = getBaseType(c);
                if (baseType != null) {
                    // 参数之间分隔
                    if (builder.length() > defaultLength) {
                        builder.append(", ");
                    }
                    // 数组类型
                    builder.append(baseType);
                    appendArrNum(builder, arrNum);
                } else if (c == 'L') {
                    String refClass = param.substring(k);
                    if (refClass.length() > 0) {
                        // 参数之间分隔
                        if (builder.length() > defaultLength) {
                            builder.append(", ");
                        }
                        builder.append(refClass.substring(1).replace("/", "."));
                        appendArrNum(builder, arrNum);
                    }
                    break;
                }
                arrNum = 0;
            }
        }
        builder.append(")");
        return builder.toString();
    }

    /**
     * @param refClass Ljava/lang/Object
     * @return
     */
    private static String getClassName(String refClass) {
        if (refClass == null || refClass.length() < 2) {
            return "";
        }
        int pos = refClass.lastIndexOf("/");
        if (pos < 0) {
            pos = 1;
        }
        return refClass.substring(pos + 1);
    }

    private static void appendArrNum(StringBuilder builder, int arrNum) {
        // 数组维数
        if (arrNum > 0) {
            for (int j = 0; j < arrNum; j++) {
                builder.append("[]");
            }
        }
    }

    private static String getBaseType(char c) {
        switch (c) {
            case 'C':
                return "char";
            case 'Z':
                return "bool";
            case 'S':
                return "short";
            case 'I':
                return "int";
            case 'J':
                return "long";
            case 'F':
                return "float";
            case 'D':
                return "double";
            case 'V':
                return "void";
        }
        return null;
    }

    public static String getSignFromInput(String paramsType) {
        String[] types = StringUtils.substringBetween(paramsType, "(", ")").split(",");
        StringBuilder builder = new StringBuilder("(");
        for (String type : types) {
            builder.append(typeAsSignature(type));
        }
        builder.append(")");
        return builder.toString();
    }

    public static String typeAsSignature(String type) {
        if (StringUtils.isEmpty(type)) {
            return "";
        }
        StringBuilder builder = new StringBuilder();
        // 数组转换
        int arrayStart = type.indexOf("[");
        if (arrayStart > 0) {
            String arrayType = type.substring(arrayStart).replace("]", "");
            builder.append(arrayType);
            type = type.substring(0, arrayStart);
        }

        switch (type) {
            case "char":
                builder.append("C");
                break;
            case "bool":
            case "boolean":
                builder.append("Z");
                break;
            case "short":
                builder.append("S");
                break;
            case "int":
                builder.append("I");
                break;
            case "long":
                builder.append("J");
                break;
            case "float":
                builder.append("F");
                break;
            case "double":
                builder.append("D");
                break;
            case "void":
                builder.append("V");
                break;
            default:
                if (type.contains(".")) {
                    builder.append("L")
                            .append(type.replace(".", "/"))
                            .append(";");
                } else {
                    builder.append("Ljava/lang/Object;");
                }
                break;
        }
        return builder.toString();
    }

    @Override
    public String toString() {
        return getDisplayName();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy