IDEA插入日志插件
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); } }