【idea】idea插件编写教程,博主idea插件已上架idea插件市场 欢迎下载

这篇具有很好参考价值的文章主要介绍了【idea】idea插件编写教程,博主idea插件已上架idea插件市场 欢迎下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参, 例如日常开发中 我们使用Objects.equals去比较 status(入参),statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() ,再比如 我们比较一个订单code时 orderCode(入参),orderDTO(其它业务对象) 很容易忘记orderDTO.getCode() 因为Objects.equals()两个参数都是Object类型,idea默认不会提示告警, 如果经常使用该方法 你一定很清楚的明白我在说什么。

针对以上痛点,博主编写了一个idea插件: Equals Inspection , 插件代码本身很简单,极其轻量级。难得的是 在目前暂没发现有人做了这件事时,而博主想到了可以通过IDE告警方式去解决问题,并且实际行动了。此外,知道该用什么API本身是件不容易的事,而阅读代码时,已经处于一个上帝视角,则会显得非常简单。

下载一(推荐):
idea插件市场搜索: Equals Inspection 

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

下载二:
github :  https://github.com/qiuhuanhen/objects-equals-inspect/releases    


安装方式:1.idea内插件下载会自动安装  2. github下载直接将jar包拖进idea,重启idea

Q:为什么是IDE插件层面,而不是在java项目中重写一个工具类 针对类型判断呢?
A:
1.效率问题:java项目代码判断 说明要执行到该方法时才能校验,很多时候我们编写完,在测试环节被提了bug,我们自己断点执行一遍,才能发现传错了参,插件层面在我们编写时即可提醒,节省了大量时间.

2.设计问题: 很重要的一点,java项目层面的提示,要怎么提示?throw new RuntimeExection? 显然不太合理吧,例如在设计一些框架/通用代码时,类型就是可以不一致 难道抛一个异常阻止程序运行吗?插件尽管会提示报错,但它归根结底都只是一个样式,并不会阻止程序运行。

使用前后效果对比:

使用前没有告警
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

使用后示例:

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
vo.getStatus(Integer类型)与枚举比较时,能直接提示我们类型不一致
(正确写法是StatusEnum.AWAIT.getValue() 与枚举类型的值进行比较)
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

以下就以博主编写的插件为例 ,写一篇如何编写idea插件的教程

注:本文由csdn博主 孟秋与你 编写,如您在其它地方看到本文,很可能是被其它博主爬虫/复制过来的,文章可能会持续更新,强烈建议您搜索:孟秋与你csdn 找到原文查看

第一步:创建插件项目
tips:
1.需要jdk11
2.以idea2021.1版本为例,不同idea版本可能有所差异

new project ->IntelliJ Platform Plugin-> Project SDK (需要jdk11)

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

第二步:修改plugin.xml文件内容及创建java代码

其中plugin.xml的description节点,需要40个字符以上,否则插件上传时会报错。

编写插件的核心难点在于,我们不知道idea的api是什么,什么情况用什么api。
以下是可以参考的几点:

  1. idea官方文档 https://plugins.jetbrains.com/docs/intellij/welcome.html
  2. github idea 示例项目:https://github.com/JetBrains/intellij-sdk-code-samples
<idea-plugin>
  <id>csdn-mengqiuyuni</id>
  <name>Equals参数类型检查</name>
  <version>0.1.0</version>
  <vendor email="1005738053@qq.com" url="https://blog.csdn.net/qq_36268103"> </vendor>

  <description><![CDATA[
      <li>check java.lang.Objects equals method params type ,if not match,idea will show the error line</li><br>
      <li>could reduce Objects.equals(a,b) error params type by mistake</li><br>
      <li>notice:this plugin can only inspect your code,it's just reminder java developers,but don't impact code execution,and never change or fix your code.</li>
    ]]></description>

  <change-notes><![CDATA[
      <li>github:qiuhuanhen,project name :objects-equals-inspect</li><br>
      <li>beta version.csdn:孟秋与你</li><br>
      <li>the first beta version,welcome,update date:2024.01.09</li>
    ]]>
  </change-notes>

  <vendor>qiuhuanhen</vendor>

  <!-- please see https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html for description -->
  <idea-version since-build="173.0"/>

  <!-- please see https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html
       on how to target different products -->
  <depends>com.intellij.modules.platform</depends>
  <depends>com.intellij.java</depends>
  <depends>com.intellij.modules.java</depends>

  <extensions defaultExtensionNs="com.intellij">
    <localInspection
            language="JAVA"
            displayName="Title"
            groupPath="Java"
            groupBundle="messages.InspectionsBundle"
            groupKey="group.names.probable.bugs"
            enabledByDefault="true"
            level="ERROR"
            implementationClass="com.qiuhuanhen.ObjectsEqualsInspection"/><!--java类所在路径-->
  </extensions>

</idea-plugin>

package com.qiuhuanhen;

import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;


/**
 * @author qiuhuanhen
 */
public class ObjectsEqualsInspection extends LocalInspectionTool {

    @NotNull
    @Override
    public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
        return new MyVisitor(holder);
    }

    private static class MyVisitor extends JavaElementVisitor {
        private final ProblemsHolder holder;

        public MyVisitor(ProblemsHolder holder) {
            this.holder = holder;
        }

        @Override
        public void visitMethodCallExpression(PsiMethodCallExpression expression) {
            super.visitMethodCallExpression(expression);

            String methodName = expression.getMethodExpression().getReferenceName();

            if ("equals".equals(methodName)) {

                PsiExpressionList argumentList = expression.getArgumentList();
                PsiExpression[] expressions = argumentList.getExpressions();


                if (expressions.length == 2) {
                    PsiType arg1Type = expressions[0].getType();
                    PsiType arg2Type = expressions[1].getType();

                    // 都为空 不做提示  注:即使idea会提示 type不为空 ,为防止插件报NPE 还是有大量的非空判断
                    if (null == arg1Type && null == arg2Type) {
                        return;
                    }

                    // 其一为空 给出错误提示
                    if (null == arg1Type || null == arg2Type) {
                        holder.registerProblem(expression, "Objects.equals parameters are not of the same type.", ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
                        return;
                    }
                    // 这是忽视某些通用类,框架 用于比较反射class类型的情况
                    if (arg1Type.getCanonicalText().contains("Class") && arg2Type.getCanonicalText().contains("Class")) {
                        return;
                    }

                    if (isByte(arg1Type) && isByte(arg2Type)) {
                        return;
                    }
                    if (isShort(arg1Type) && isShort(arg2Type)) {
                        return;
                    }
                    if (isInt(arg1Type) && isInt(arg2Type)) {
                        return;
                    }
                    if (isLong(arg1Type) && isLong(arg2Type)) {
                        return;
                    }
                    if (isFloat(arg1Type) && isFloat(arg2Type)) {
                        return;
                    }
                    if (isDouble(arg1Type) && isDouble(arg2Type)) {
                        return;
                    }
                    if (isChar(arg1Type) && isChar(arg2Type)) {
                        return;
                    }
                    if (isBoolean(arg1Type) && isBoolean(arg2Type)) {
                        return;
                    }


                    if (!arg1Type.equals(arg2Type)) {

                        holder.registerProblem(expression, "Objects.equals parameters are not of the same type.", ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
                    }
                }
            }
        }

        private boolean isInt(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.INT.equals(unboxedType)) {
                // 是 int 类型
                return true;
            }

            return PsiType.INT.equals(type) || "java.lang.Integer".equals(type.getCanonicalText());
        }

        private boolean isLong(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.LONG.equals(unboxedType)) {
                // 是 long 类型
                return true;
            }

            return PsiType.LONG.equals(type) || "java.lang.Long".equals(type.getCanonicalText());
        }

        private boolean isDouble(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.DOUBLE.equals(unboxedType)) {
                return true;
            }

            return PsiType.DOUBLE.equals(type) || "java.lang.Double".equals(type.getCanonicalText());
        }

        private boolean isFloat(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.FLOAT.equals(unboxedType)) {
                return true;
            }

            return PsiType.FLOAT.equals(type) || "java.lang.Float".equals(type.getCanonicalText());
        }

        private boolean isBoolean(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.BOOLEAN.equals(unboxedType)) {
                return true;
            }

            return PsiType.BOOLEAN.equals(type) || "java.lang.Boolean".equals(type.getCanonicalText());
        }

        private boolean isByte(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.BYTE.equals(unboxedType)) {
                return true;
            }

            return PsiType.BYTE.equals(type) || "java.lang.Byte".equals(type.getCanonicalText());
        }

        private boolean isChar(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.CHAR.equals(unboxedType)) {
                return true;
            }

            return PsiType.CHAR.equals(type) || "java.lang.Char".equals(type.getCanonicalText());
        }

        private boolean isShort(PsiType type) {
            PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type);
            if (PsiType.SHORT.equals(unboxedType)) {
                return true;
            }

            return PsiType.SHORT.equals(type) || "java.lang.Short".equals(type.getCanonicalText());
        }

    }
}


第三步:打成jar包
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
没有main方法则不用选择main class
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

第四步:发布插件
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

发布插件没有什么难点,唯一值得注意的是description非常严格,必须要40个字符以上,且不能有非拉丁字符,博主在反复修改后发现不能有任何中文,最后把description里面的中文都改成了英文。

插件项目源码地址:https://github.com/qiuhuanhen/objects-equals-inspect

打开项目方式:
在github下载博主的项目,idea打开后 默认是常规项目,这时我们需要稍作处理
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide
最后一步:
【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载,intellij-idea,java,ide

最后: 原创不易 ,欢迎各位在idea插件商店下载 Equals Inspection , 给github项目点上star 非常感谢各位文章来源地址https://www.toymoban.com/news/detail-798098.html

到了这里,关于【idea】idea插件编写教程,博主idea插件已上架idea插件市场 欢迎下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 5个IntelliJ IDEA插件,高效编写代码

    本文介绍5个由AI驱动的Intellij IDEA插件,助你提高生产力! 微信搜索关注《Java学研大本营》 人工智能AI是当前广受认可的未来趋势和发展方向。虽然有些人担心AI可能会取代所有的工作,但实际上只会取代那些重复性高、产出低的工作。因此,我们应该学会更加聪明地工作,

    2024年01月24日
    浏览(19)
  • 【工具】国内苹果市场已上架 新一代社交产品 damus

    2月1日,Twitter 联合创始人 Jack Dorsey 发布推文表示,基于分布式社交媒体协议 Nostr 的社交产品 Damus 和 Amethyst 正式在苹果 App Store 和谷歌 Google Play Store 上线。 目前为止,Damus 在国内苹果应用市场是可以直接下载的,搜索\\\"damus\\\"即可找到,或者复制这个链接到浏览器即可自动跳转

    2024年02月02日
    浏览(15)
  • uniapp项目 插件市场下载pdd-date-picker【年月日选择器】路径不对的问题

    **发现这个插件用起来很多问题 所以不建议大家用哈 换一个插件 ** 给大家推荐uniapp自带的日期插件 也超级好用 uniapp自带的日期插件 如果想修改路径的可以参考这个 从HBuilder插件市场下载pdd-date-picker年月日插件之后 按照t它的官方问的进行引入你会发现路径不对,我们需要再

    2024年01月16日
    浏览(24)
  • idea下载插件方法

    idea下载插件方法: 有了插件能够更好的开发~ 点击文件(对应未汉化的是file) 点击设置(对应未汉化的是settings) 搜索下载安装 然后重启idea即可

    2024年02月12日
    浏览(18)
  • idea如何下载插件

    大家好,今天给大家分享在idea中如何下载插件 文章目录 一、idea内下载 二、插件市场 总结 第一种方式就是在idea内直接下载,适合在联网环境下进行下载,在这我们拿chinese中文翻译插件为例子,操作步骤如下: 首先点击设置(settings)  然后点击插件(plugins),在搜索栏搜

    2024年04月28日
    浏览(16)
  • 如何下载IDEA主题插件Material Theme UI?

    1、打开IDEA插件官网:点击这里,选择IDEA对应的版本下载。我的IDEA版本是2021.3,即我应下载对应的版本6.16.2 2、分别点击IDEA左上角 File - Settings - Plugins - 设置 - install Plugin from Disk… ,从你的电脑里导入刚下载的压缩包Material_Theme_UI-6.16.2 3、( 注意 :路径不能有中文)我的路

    2024年04月26日
    浏览(24)
  • IDEA下载vue.js插件,IDEA搜索不到vue.js该怎么安装

    一、在IDEA插件库下载Vue.js插件 1.在File--Settings--Plugins下载 2.搜索下载,点击Apply之后再重启 二、从磁盘安装Vue.js插件 IDEA搜索不到vue.js该怎么安装,这时需要从vue.js官网去下载对应jar包进行,再进行安装 注意:安装的Vus.js版本需要于IDEA版本对应,有版本兼容问题 1.查看IDEA版

    2024年02月04日
    浏览(20)
  • IDEA插件之mybatisx 插件使用教程

           MybatisX 是一款基于 IDEA 的快速开发插件,方便在使用mybatis以及mybatis-plus开发时简化繁琐的重复操作,提高开发速率。         MybatisX的作用就是帮助我们自动化建立mybatis的相关文件,免去手动建立的繁琐! 一、安装MybatisX插件 二、引用相关的依赖 三、连接MySQL 四、

    2024年02月06日
    浏览(20)
  • 2023版IDEA的下载、安装、配置、快捷键、模板、插件与使用

    🎉 为什么会有这篇教程: 熟悉 IDEA 并能灵活熟练使用 IDEA 能极大提高您的开发效率!!! 📍 本文教程基于当前 idea 的最新版本 2023.2.2 。 📍 本文教程的所有操作图片均是实操测试截图或 gif 动态演示,合计 314 张图片,呈现的截图使用的 IDEA 的 Dark 主题。 📍 您的任何设

    2024年02月08日
    浏览(87)
  • 【Gazebo入门教程】第五讲 控制器插件的编写与配置(上)

    前言 : 在先前的博客中,我们不仅完成了对机器人模型的建立和仿真,并且创建了机器人的工作空间,即仿真环境的设置,那么想要通过控制机器人传感器来完成对于机器人的控制就需要进一步研究,学会如何使用 控制插件 ,通过编写代码在Gazebo中加载C++库完成对于机器人

    2023年04月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包