Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

插件操作方式改进建议 #11

Open
tzraeq opened this issue Mar 25, 2022 · 3 comments
Open

插件操作方式改进建议 #11

tzraeq opened this issue Mar 25, 2022 · 3 comments

Comments

@tzraeq
Copy link

tzraeq commented Mar 25, 2022

第一步,复制对象的时候,能不能只复制变量名,而不复制变量的类型,插件自动分析变量类型,因为这样鼠标双击就可以选中变量,方便操作。
第二步,锚点可不可以不放置到目标类型上,而是随便一个空行上,然后插件自动从当前锚点向上搜索最近定义的一个对象。

@fuzhengwei
Copy link
Owner

  1. 暂时还没有找到复制对象时,光标位置获取的API
  2. 向上搜索的 API 也有点问题

源码如下,可调试下,如果有好的处理方案可以提供;

GenerateVo2DtoImpl

@Override
protected GetObjConfigDO getObjConfigDOByClipboardText(GenerateContext generateContext) {
    // 获取剪切板信息
    String systemClipboardText = Utils.getSystemClipboardText().trim();
    // 按照默认规则提取信息,例如:UserDto userDto
    String[] split = systemClipboardText.split("\\s");
    if (split.length < 2) {
        return new GetObjConfigDO("", null, null, new HashMap<>());
    }
    // 摘取复制对象中的类和属性,同时支持复制 cn.xxx.class
    String clazzName;
    String clazzParam = split[1].trim();
    String clazzNameImport = "";
    String clazzNameStr = split[0].trim();
    if (clazzNameStr.indexOf(".") > 0) {
        clazzName = clazzNameStr.substring(clazzNameStr.lastIndexOf(".") + 1);
        clazzNameImport = clazzNameStr;
    } else {
        clazzName = split[0].trim();
    }
    // 获取同名类集合
    PsiClass[] psiClasses = PsiShortNamesCache.getInstance(generateContext.getProject()).getClassesByName(clazzName, GlobalSearchScope.allScope(generateContext.getProject()));
    // 上下文检测,找到符合的复制类
    PsiClass psiContextClass = null;
    // 相同类名处理
    if (psiClasses.length > 1) {
        // 获取比对包文本
        List<String> importList;
        if (!"".equals(clazzNameImport)) {
            importList = Collections.singletonList(clazzNameImport);
        } else {
            importList = getImportList(generateContext.getDocument().getText());
        }
        // 循环比对,通过引入的包名与类做包名做对比
        for (PsiClass psiClass : psiClasses) {
            String qualifiedName = Objects.requireNonNull(psiClass.getQualifiedName());
            String packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf("."));
            if (importList.contains(packageName)) {
                psiContextClass = psiClass;
                break;
            }
        }
        // 同包下比对
        if (null == psiContextClass) {
            String psiFilePackageName = ((PsiJavaFileImpl) generateContext.getPsiFile()).getPackageName();
            for (PsiClass psiClass : psiClasses) {
                String qualifiedName = Objects.requireNonNull(psiClass.getQualifiedName());
                String packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf("."));
                if (psiFilePackageName.equals(packageName)) {
                    psiContextClass = psiClass;
                    break;
                }
            }
        }
    }
    if (null == psiContextClass) {
        psiContextClass = psiClasses[0];
    }
    List<PsiClass> psiClassLinkList = getPsiClassLinkList(psiContextClass);
    Map<String, String> paramMtdMap = new HashMap<>();
    Pattern getM = Pattern.compile(getRegex);
    for (PsiClass psi : psiClassLinkList) {
        List<String> methodsList = getMethods(psi, getRegex, "get");
        for (String methodName : methodsList) {
            String param = getM.matcher(methodName).replaceAll("$1").toLowerCase();
            paramMtdMap.put(param, methodName);
        }
    }
    return new GetObjConfigDO(psiContextClass.getQualifiedName(), clazzName, clazzParam, paramMtdMap);

@tzraeq
Copy link
Author

tzraeq commented Apr 5, 2022

剪贴板确实没找到好的方案,但是向上搜索,目前有一个可以尝试的方案:

  1. PsiElement element = PsiUtilBase.getElementAtCaret(e.getEditor());
  2. PsiStatement statement = PsiTreeUtil.getContextOfType(element, PsiStatement.class, false);
  3. PsiDeclarationStatement declarationStatement = PsiTreeUtil.getPrevSiblingOfType(statement, PsiDeclarationStatement.class);// 当然也需要判断当前statement的类型,可以直接省略这一步
  4. declarationStatement可以getChild之类的,然后进一步推导出类型

感谢辛苦的付出

@fuzhengwei
Copy link
Owner

很赞,对于这个也可以拉个分支提交个PR,验证试试,之后我验证通过我会发布新的版本。哈哈哈,可以一起共建。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants