使用IDEA(社区版)开发IDEA Action插件

一、环境准备:

1. IDEA确保已安装好插件Plugin DevKit

 2. 新建Plugin插件工程,选择SDK为安装IDEA包下的SDK,如果找不到就定位到IDEA安装包下找

 3. 起好工程名,直接finish,如下我创建了plugindemo插件工程

 二、开发第一个弹窗Action示例

1. 在src下右键创建一个TestMenu Action,填写配置信息,其中class name就是插件Action类名,Name就是插件功能菜单显示名称,Groups中要选择插件功能属于哪,如右键中就是EditorPopupMenu,还可以在Keyboard Shortcuts中设置快捷键,注意不要和其他快捷键冲突

 创建完后得到plugin.xml中的action如下

    <actions>
        <action id="plugin-testmenu" class="TestMenu" text="Test_Menu" description="测试">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
        </action>
    </actions>

2. 在TestMenu类的actionPerformed方法中添加代码JOptionPane.showMessageDialog(null, "Hello World");

3. debug模式启动plugin,此后IDEA会启动一个沙箱进程,开启的沙箱IDEA中,右键就可以看到自己的插件了(注意,有可能沙箱进程慢,插件菜单要等一段时间才可点击)。如果沙箱进程没有打开过项目,可以自己通过File打开一个,可以选择在当前窗口打开,需要手动在沙箱中安装插件,当然要先进行插件生成

 4. 点击插件按钮TestMenu,如果有断点可以看到进入断点,直接运行看到弹窗

5.  修改下plugin.xml中的idea-plugin节点下name,该name用于插件名称显示

 6. build下编译成jar包就可以安装了,如果依赖了其他jar包,会编译成zip包,同样可以安装。

 

 

 重启后效果

三、创建一个Action组,并将多个action放到组里

1. 再创建一个Action类,这次不用选择组

2. 修改plugin.xml中actions节点如下,group中的text就是插件组菜单的名称

    <actions>
        <group id="hjpActionGroup" text="hjpActions" popup="true">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
        </group>
        <action id="plugin-testmenu" class="TestMenu" text="Test_Menu" description="测试">
            <add-to-group group-id="hjpActionGroup"/>
        </action>
        <action id="plugin-testmenu2" class="TestMenu2" text="Test_Menu2" description="测试">
            <add-to-group group-id="hjpActionGroup"/>
        </action>
    </actions>

3. 沙箱运行,效果如下

 四、通过PsiFile操作Java代码文件

注意plugin.xml需要加入依赖

<depends>com.intellij.modules.java</depends>

1. 获取PsiJava

PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
        if (psiFile instanceof PsiJavaFile) {
            PsiJavaFile psiJavaFile = (PsiJavaFile) psiFile;

2. 获取PsiClass

PsiClass[] classes = psiJavaFile.getClasses();
        PsiClass psiClass = (PsiClass) classes[0];

3. 获取当前PsiClass的父类

PsiClass superClass = psiClass.getSuperClass();

4. 获取PsiField

PsiField[] fields = psiClass.getFields();

5. 获取字段类型的类名

String fieldType = field.getType().getPresentableText();

6. 获取字段注解内容

PsiAnnotation[] annotations = field.getAnnotations();
for (PsiAnnotation annotation : annotations) {
                final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement();
                if (nameReferenceElement != null) {
                    final String referenceName = nameReferenceElement.getReferenceName();
                    //注解完整内容,自行处理
                }
            }

7. 获取字段注释内容,docComment.getText()获取到完整内容,可自行处理

PsiDocComment docComment = field.getDocComment();

 

posted @ 2022-02-23 14:00  jiapeng  阅读(1753)  评论(0编辑  收藏  举报