ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IDEA插入日志插件

2022-06-19 23:36:35  阅读:156  来源: 互联网

标签:插件 intellij IDEA methodExpresionPsiEle import 日志 openapi com final


plugin.xml

<idea-plugin>
    <id>com.your.company.unique.plugin.id</id>
    <name>Insert Logs</name>
    <version>1.0</version>
    <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>

    <description><![CDATA[
      Enter short description for your plugin here.<br>
      <em>most HTML tags may be used</em>
    ]]></description>

    <change-notes><![CDATA[
      Add change notes here.<br>
      <em>most HTML tags may be used</em>
    ]]>
    </change-notes>

    <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
    <idea-version since-build="173.0"/>

    <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
         on how to target different products -->
    <depends>com.intellij.modules.java</depends>
    <depends>com.intellij.modules.platform</depends>

    <extensions defaultExtensionNs="com.intellij">
        <!-- Add your extensions here -->
    </extensions>

    <actions>
        <group id="insertLogsActionGroup" text="InsertLogs" popup="true">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
        </group>
        <!-- Add your actions here -->
        <action id="insert_logs" class="InsertLogsAction" text="前后插入日志" description="在执行方法前后插入日志">
            <add-to-group group-id="insertLogsActionGroup"/>
            <keyboard-shortcut keymap="$default" first-keystroke="alt L" second-keystroke="G"/>
        </action>
    </actions>

</idea-plugin>

InsertLogsAction.Java

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;

/**
 * @author hujiapeng3
 * @description
 * @date 2022/6/19 11:24
 */
public class InsertLogsAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent e) {
        PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
        if (!(psiFile instanceof PsiJavaFile)) {
            return;
        }
        PsiJavaFile psiJavaFile = (PsiJavaFile) psiFile;
        final Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
        //获取光标所在位置
        final int offset = editor.getCaretModel().getOffset();
        PsiElement element = psiFile.findElementAt(offset);
        final PsiElement methodCallerPsiEle = element.getParent();
        if (!(element instanceof PsiIdentifier)
                || !(methodCallerPsiEle instanceof PsiReferenceExpression)) {
            return;
        }
        final Project project = e.getProject();
        WriteCommandAction.runWriteCommandAction(project, () -> {
            final String methodExpression = methodCallerPsiEle.getParent().getText().replaceAll(" ", "").replaceAll(
                    "\n", "");
            final int left = methodExpression.indexOf("(");
            final int right = methodExpression.indexOf(")");
            if (!(left > 0 && right > 0 && (right - left) > 1)) {
                return;
            }
            String paramStr = methodExpression.substring(left + 1, right).replaceAll(" ", "");
            String[] params = paramStr.split(",");
            StringBuilder paramPosLogsSB = new StringBuilder();
            StringBuilder paramValLogsSB = new StringBuilder();
            for (String param : params) {
                if (paramPosLogsSB.length() > 0) {
                    paramPosLogsSB.append(",");
                    paramValLogsSB.append(",");
                }
                paramPosLogsSB.append("{}");
                paramValLogsSB.append("JSON.toJSONString(" + param + ")");
            }
            String preStr =
                    "log.info(\"" + methodExpression + "入参:" + paramPosLogsSB.toString() + "\"," + paramValLogsSB.toString() + ");";
            PsiLocalVariable localVarEle = null;
            PsiElement methodExpresionPsiEle = element;
            while (!(methodExpresionPsiEle.getParent() instanceof PsiCodeBlock)) {
                if (methodExpresionPsiEle instanceof PsiLocalVariable) {
                    localVarEle = (PsiLocalVariable) methodExpresionPsiEle;
                }
                methodExpresionPsiEle = methodExpresionPsiEle.getParent();
            }
            PsiElement codeBlock = methodExpresionPsiEle.getParent();
            final PsiElementFactory psiElementFactory = PsiElementFactory.getInstance(element.getProject());
            PsiElement newElement = psiElementFactory.createStatementFromText(preStr, element.getContext());
            codeBlock.addBefore(newElement, methodExpresionPsiEle);
            if (localVarEle != null) {
                final String tempExp = methodCallerPsiEle.getText().replaceAll(" ", "");
                String afterStr =
                        "log.info(\"" + tempExp + "出参:{}\",JSON.toJSONString(" + localVarEle.getName() +
                                "));";
                newElement = psiElementFactory.createStatementFromText(afterStr, element.getContext());
                codeBlock.addAfter(newElement, methodExpresionPsiEle);
            }
        });
        CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project);
        codeStyleManager.reformat(psiJavaFile);
    }
}

 

标签:插件,intellij,IDEA,methodExpresionPsiEle,import,日志,openapi,com,final
来源: https://www.cnblogs.com/hujiapeng/p/16391795.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有