IDEA插件-自定义行标记开发

1.行标记

1.1 行标记概述

IDEA源码编辑代码区域,可以编辑代码。大家肯定看到行上面有一些图标,其实我们也可以定义自己的行标记结合自己的需要弹窗修改代码或进行导航。

Halo框架所创建的应用需要管中台可视化纳管,因此当应用启动的时候会判断当前应用是否属于某个域,不属于某个域将停止启动,HaloTools提供一个快速修改编辑的功能。@Domain注解行标记修改,如下图所示:

1.2 开发一个行标记

  • 1.在plugin.xml中添加行标记扩展配置,如下代码所示:
 <extensions defaultExtensionNs="com.intellij">
    <!--如下所示添加行标记扩展 -->
    <codeInsight.lineMarkerProvider language="JAVA"
                                    implementationClass="org.xujin.idea.right.linemarker.HaloLineMarker"/>
    </extensions>
  • 2.创建HaloLineMarker.java,代码如下所示:
public class HaloLineMarker implements LineMarkerProvider {

    @Nullable
    @Override
    public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement psiElement) {
        LineMarkerInfo lineMarkerInfo= null;
        try {
            lineMarkerInfo = null;
            String anno="org.springframework.boot.autoconfigure.SpringBootApplication";
            if(!judgeHaveAnnotation(psiElement,anno)){
               return lineMarkerInfo;
            }
            PsiClassImpl field = ((PsiClassImpl) psiElement);
            PsiAnnotation psiAnnotation = field.getAnnotation(anno);
            lineMarkerInfo = new LineMarkerInfo<>(psiAnnotation, psiAnnotation.getTextRange(), IconLoader.findIcon("/icons/right/HaloBasic.png"),
                    new FunctionTooltip("快速导航"),
                    new AppMgmtNavigationHandler(),// ➊ 
                    GutterIconRenderer.Alignment.LEFT);
        } catch (Exception e) {
            e.printStackTrace(); // ➋
        }
        return lineMarkerInfo;
    }

    @Override
    public void collectSlowLineMarkers(@NotNull List<PsiElement> list, @NotNull Collection<LineMarkerInfo> collection) {
    }

    private boolean judgeHaveAnnotation(@NotNull PsiElement psiElement, String anno) {
        if (psiElement instanceof PsiClass) {
            PsiClassImpl field = ((PsiClassImpl) psiElement);
            PsiAnnotation psiAnnotation = field.getAnnotation(anno);
            if (null != psiAnnotation) {
                return true;
            }
            return false;
        }
        return false;
    }

}

➊ 添加行标记点击之后处理的Handler。

➋ ((PsiClassImpl) psiElement)会出现异常,因此进行try-catch处理,代码仅做案例演示

上述代码,仅作为代码案例展示。离实际项目还有优化空间,本案例代码:https://github.com/SoftwareKing/idea-study/tree/master/idea-study-02。

  • 3.启动IDEA插件模拟器debug,可以看到如下图所示,行标记处理成功。