IntelliJ Platform-Plugins-获取鼠标选中字段或方法(PsiElement抽象)

news2024/12/27 11:54:02

PsiElement接口是文件中光标所在的那个字段,或者光标所在的那个方法的抽象,例如下图中,PsiElement就是private String name
在这里插入图片描述
而下图中PsiElement就是public String getName()
在这里插入图片描述

下面的代码会演示:光标在方法上,就打印方法名字,光标在字段上,就打印字段名字,但是我们在写代码之前还要做一些其他工作,由于IntelliJ平台的变化,导致不在默认加载PsiMethodImplPsiFieldImpl两个类所在的jar包,而我们恰好要用到这两个类,所以需要手动依赖这两个类,我们在plugin.xml增加如下依赖

// 下面这1行是项目创建的时候就自带的
<depends>com.intellij.modules.platform</depends>
// 下面这2行是我们刚刚添加的,我们需要的两个类就在下面的jar包下
<depends>com.intellij.modules.lang</depends>
<depends>com.intellij.modules.java</depends>

官网说明在这个地址
代码示例

import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.source.PsiFieldImpl;
import com.intellij.psi.impl.source.PsiMethodImpl;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.keyFMap.KeyFMap;
import org.jetbrains.annotations.NotNull;

public class MyAction extends AnAction {
	@Override
    public void actionPerformed(@NotNull AnActionEvent e) {
        PsiElement psiElement = e.getData(PlatformDataKeys.PSI_ELEMENT);
        if (psiElement != null) {
            PsiManager manager = psiElement.getManager();
            IElementType elementType = psiElement.getNode().getElementType();
            // 如果光标所在位置是一个方法
            if ("METHOD".equals(elementType.toString())) {
                PsiMethodImpl m = (PsiMethodImpl) psiElement;
                System.out.println(m.getName());
            }
            // 如果光标所在位置是一个字段
            if ("FIELD".equals(elementType.toString())) {
                PsiFieldImpl f = (PsiFieldImpl) psiElement;
                System.out.println(f.getName());
            }
        }
    }
}

部分方法总结,前提示例代码如下:

public class UserEntity {

   /**
	* 怀念二抱
	* 想念三抱
	**/
    private String name;

    public String getName() {
        return name;
    }
}

获取name字段的偏移量(光标必须在name上)

PsiElement psiElement = e.getData(PlatformDataKeys.PSI_ELEMENT);
PsiFieldImpl f = (PsiFieldImpl) psiElement;
int offset = f.getTextOffset();

获取UserEntity的偏移量(实际得到的是字母U前面空格的偏移量,拿到结果自己+1即可)

PsiElement psiElement = e.getData(PlatformDataKeys.PSI_ELEMENT);
PsiFieldImpl f = (PsiFieldImpl) psiElement;
int offset = f.getStartOffsetInParent();

获取name字段注释(光标必须在name上),也就是本示例的"怀念二抱"和"想念三抱"

PsiElement psiElement = e.getData(PlatformDataKeys.PSI_ELEMENT);
PsiFieldImpl f = (PsiFieldImpl) psiElement;
PsiDocComment javaDoc = f.getDocComment();
for (PsiElement descriptionElement : descriptionElements) {
    // 因为是文本操作,所以我们只取我们写的注释,忽略斜杠星号什么的,所以此处if判断
    // 只有PsiDocToken的子类PsiDocTokenImpl才是我们写的注释,这个if会进入2次,
    // 1次是"怀念二抱"
    // 1次是"想念三抱"
    if(descriptionElement instanceof PsiDocToken){
        System.out.println(descriptionElement.getText());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTMLCSS

1、HTML 1.1 介绍 HTML 是一门语言&#xff0c;所有的网页都是用HTML 这门语言编写出来的&#xff0c;也就是HTML是用来写网页的&#xff0c;像京东&#xff0c;12306等网站有很多网页。 这些都是网页展示出来的效果。而HTML也有专业的解释 HTML(HyperText Markup Language)…

【EKF】卡尔曼滤波原理

前言 本篇是最近在学习云台以及姿态融合时&#xff0c;想学习一下卡尔曼滤波的原理&#xff0c;基于 DR_CAN 老师的卡尔曼滤波的视频做的笔记&#xff0c;基本上是按照 DR_CAN 老师的思路自己推导计算了一遍&#xff0c;推荐还是看一下原视频&#xff0c;讲解得很不错&#xf…

5款写作神器,帮助你写出5w+爆款文案,好用到哭

我不允许还有文案小白、新手博主不知道这5款写作利器&#xff01; 每次一写文案就头秃的新媒体工作者&#xff0c;赶紧看过来吧&#xff01;这5款好用到爆的写作神器&#xff0c;喝一杯咖啡的时间就能完成写作。 我和同事都是用它们&#xff0c;出了很多的爆款&#xff0c;现…

shell脚本--函数

目录 一&#xff1a;shell函数定义 1.函数的含义 2.函数的优点 3.函数的格式 4.函数返回值 &#xff08;1&#xff09;return输出 &#xff08;2&#xff09;echo输出 二&#xff1a;函数传参 1.情景一 2.情景二 3.情景三 4.情景四 三:递归函数 1.递归函数定义 2.通过…

STM32F103ZET6驱动TOF250激光测距传感器

STM32驱动TOF250激光测距传感器 TOF250介绍I2C通讯协议I2C寄存器地址 TOF250引脚说明和STM32的接线和STM32的接线 程序实验结果总结 TOF250介绍 TOF250是一款基于TOF原理的单点测距雷达&#xff0c;采用940nm红外光源&#xff0c;提供了精确和可重复的远 距离测量用于高速自动对…

OceanBase写入限速源码解读

一、简介 OceanBase中的写入限速机制旨在控制系统中写入操作&#xff08;一般写入操作包括插入、更新和删除等&#xff09;的速率&#xff0c;目的是为了提高数据库系统的稳定性。本文主要通过以下2个参数来解释写入限速的实现机制。 **1.**writing_throttling_trigger_perce…

MySQL-----索引特性

文章目录 前言一、没有索引,可能会有什么问题二、认识磁盘MySQL与存储先来研究一下磁盘在看看磁盘中一个盘片扇区结论磁盘随机访问(Random Access)和连续访问(Sequential Access) 三、MySQL与磁盘交互的基本单位四、建立共识五、索引的理解建立测试表插入多条记录查看插入结果中…

程序员最终会被自己开发的轮子所淘汰吗?

螺丝刀和扳手的发明&#xff0c;并没有让工人下岗&#xff1b; 工程机械&#xff08;挖掘机等&#xff09;的发明&#xff0c;也不会让建筑工人的需求量减少&#xff1b; 现代医学的各种先进设备&#xff0c;似乎也没有让医生数量大幅减少&#xff1b; …… 所以&#xff0c;关…

【团购-自定义Cell完善 Objective-C语言】

一、我们刚才这么写,有一个问题, 1.CZGoodsCell *cell = [[NSBundle mainBundle] loadNibNamed:@“CZGoodsCell” owner : nil options : nil ] ; 这样是不是没有进行单元格重用啊, 没有重用单元格, 我们说,前面还有一个对单元格进行重用吧, static NSString *ID = @“…

4.shell函数

文章目录 shell函数shell函数的作用函数返回值函数传参函数变量作用范围递归阶乘使用函数递归目录/var/log&#xff0c;如果是文件直接输出文件名&#xff0c;如果是目录则输出目录名且输出此目录下的所有目录和文件名通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录…

python的小技巧

python的小方法 &#xff08;1&#xff09;利用dir()这个函数方法&#xff0c;知道库里面的方法有些什么。&#xff08;2&#xff09; 利用type()这个函数方法&#xff0c;知道是什么类型的数据&#xff08;3&#xff09;从序列元素中获取元素[1]单个星号还可以在列表/元组/字典…

纯干货!蓝牙耳机哪个牌子好?性价比高蓝牙耳机推荐

蓝牙耳机是我们使用最多的数码产品之一&#xff0c;不论是通勤、运动、上课都少不了它。身为数码测评专员&#xff0c;我每天都会进行测评&#xff0c;对各类数码产品也有深入研究&#xff0c;近期很多网友咨询蓝牙耳机哪个牌子好&#xff0c;于是我进行深入测评后整理了这份性…

【刷题】141. 环形链表

141. 环形链表 一、题目描述二、示例三、实现思考总结 141. 环形链表 一、题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环…

基于jdk11从源码角度剖析AQS 抽象同步其的核心原理

在高并发的情况下&#xff0c;使用基于CAS自旋实现的轻量级锁存在恶性空自旋浪费CPU 资源和导致“总线风暴”两大问题&#xff0c; 解决CAS恶性空自旋的有效方法是空间换时间&#xff0c;常见解决方法有分散操作热点和使用队列削峰。JUC并发包使用的是队列削峰的方案解决CAS的性…

YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

目录 一、EfficientNet骨干网络1、EfficientNet架构2、EfficientNet在目标检测中的应用3、EfficientNet分辨率的缩放4、EfficientNet深度与宽度的缩放 二、YOLOv7结构1、YOLOv7网络架构2、YOLOv7骨干网络3、YOLOv7使用了EfficientNet作为骨干网络&#xff0c;具有以下几个优点&…

如何基于异步消息队列进行深度学习模型推理预测?distributed inference with pytorch celery huey sqlite

文章目录 celery 简介celery in pytorchwindows 平台下使用celery 的一些问题参考文献与学习路径一些类似消息队列多进行推理预测的实现参考celery and sqlitecelery vs hueycelery 简介 先说一下celery 不支持windows 【或者说支持的不好】 pypi https://pypi.org/project/…

docker-安装prometheus

概述 什么是Prometheus 如果对Prometheus不熟悉的, 可以先了解一下Prometheus的官网或者文档; Prometheus是一个开源的系统监控和报警系统&#xff0c;现在已经加入到CNCF基金会&#xff0c;成为继k8s之后第二个在CNCF托管的项目&#xff0c;在kubernetes容器管理系统中&…

基于java和go-cqhttp实现QQ机器人

目录 yh-qqrobot机器人简介go-cqhttp搭建1.下载应用2.生成bat文件3. 初始化项目4. 配置5. 运行项目 yh-qqrobot搭建搭建后端1. 导入sql文件2. 配置文件3. 导入到idea 搭建前端 yh-qqrobot机器人简介 yh-qqrobot是一个基于若依框和go-cqhttp集成的系统&#xff0c;一开始我只是揣…

ACM 1010 | 利润计算

文章目录 0x00 前言 0x01 题目描述 0x02 问题分析 0x03 代码设计 0x04 完整代码 0x05 运行效果 0x06 总结 0x00 前言 C 语言网不仅提供 C 语言&#xff0c;还包括 C 、 java 、算法与数据结构等课程在内的各种入门教程、视频录像、编程经验、编译器教程及软件下载、题解博…

day2_内存区域2垃圾回收算法

文章目录 方法区1.StringTable2.StringTable的位置3.StringTable的调优 垃圾回收1. 判断垃圾2. 5种引用3. 垃圾回收算法 方法区 前面提到了方法区中的组成&#xff0c;它的组成主要是: class(例如它的属性&#xff0c;方法等)常量池(StringTable等)类加载器 在jdk 1.8中&…