idea插件开发-自定义语言01Language和LanguageType

news2024/10/7 10:24:24

        Intellij platform本质是对不同的开发语言提供支持,举例来说我们也可以用notebook.app来开发java代码,但效率上可能没有可比性。因为Intellij idea提供了很多语言特定功能(例如语法高亮显示和代码分析)。很多插件本质上都是效率插件,围绕编程语言或环境而设。

        在Intellij体系中在实现这类高级功能其核心是PSI。PSI比较复杂,如果同学们系统学习过JAVA-AST可能会有直观的感觉,PSI可以说有过之而无不及,相应的功能也更强大。掌握PSI的最好方法就是从头创造一个新的语言,所以从本章开始笔者会用大量实验带大家一起开发一个属于自己的编程语言。

建议安装并启用Grammar-Kit(PSI生成器)和PsiViewer(PSI查看器)这两个插件

一、语言和文件类型

        IntelliJ IDEA 维护一个文件类型列表,每个文件类型将一种语言服务与一个或多个文件名模式相关联。开发自定义语言插件的第一步是注册与该语言关联的文件类型。IDE 通常通过查看文件名或扩展名来确定文件的类型。自定义语言文件类型是派生自LanguageFileType的类,它将Language子类传递给其基类构造函数。

1、注册LanguageType

        LanguageFileType通过com.intellij.fileType扩展点注册。同时要注意配置中的属性language与LanguageFileType.getLanguage()值相同,属性name值需要与FileType.getName()的值相同。比如以下示例代码:

<fileType 
 name="Properties"
 language="Properties"
 extensions="properties"
 fieldName="INSTANCE" 
 implementationClass="com.intellij.lang.properties.PropertiesFileType"/>

其它属性说明:

  • extensions: 文件扩展名,格式为分号分隔的扩展名列表,没有.前缀;
  • fileNames/fileNamesCaseInsensitive:硬编码文件名,分号分隔的(不区分大小写)文件名列表;
  • patterns:文件名模式规则,以分号分隔的模式列表 ( *and ?),比如*.java;
  • hashBangs:分号分隔的 hash bang 模式列表,比如#!*java*;
public final class PropertiesFileType extends LanguageFileType {
  public static final LanguageFileType INSTANCE = new PropertiesFileType();
  public static final String DEFAULT_EXTENSION = "properties";
  public static final String DOT_DEFAULT_EXTENSION = "."+DEFAULT_EXTENSION;
  public static final Charset PROPERTIES_DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;

  private PropertiesFileType() {
    super(PropertiesLanguage.INSTANCE);
  }

  @Override
  public @NotNull String getName() {
    return "Properties";
  }

  @Override
  public @NotNull String getDescription() {
    return PropertiesBundle.message("filetype.properties.description");
  }

  @Override
  public @NotNull String getDefaultExtension() {
    return DEFAULT_EXTENSION;
  }

  @Override
  public Icon getIcon() {
    return IconManager.getInstance().getPlatformIcon(PlatformIcons.PropertiesFileType);
  }

  @Override
  public String getCharset(@NotNull VirtualFile file, byte @NotNull [] content) {
    Charset charset = EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(file);
    if (charset == null) {
      charset = PROPERTIES_DEFAULT_CHARSET;
    }
    if (EncodingRegistry.getInstance().isNative2Ascii(file)) {
      charset = Native2AsciiCharset.wrap(charset);
    }
    return charset.name();
  }
}

二、实现示例

1、定义Language

public class SimpleLanguage extends Language {

  public static final SimpleLanguage INSTANCE = new SimpleLanguage();

  private SimpleLanguage() {
    super("Simple");
  }

}

2、定义Icon

        图标文件放在了/resource/icons/jar-gray.png下面

public class SimpleIcons {

  public static final Icon FILE = IconLoader.getIcon("/icons/jar-gray.png", SimpleIcons.class);

}

3、定义FileType

public class SimpleFileType extends LanguageFileType {

  public static final SimpleFileType INSTANCE = new SimpleFileType();

  private SimpleFileType() {
    super(SimpleLanguage.INSTANCE);
  }

  @NotNull
  @Override
  public String getName() {
    return "Simple File";
  }

  @NotNull
  @Override
  public String getDescription() {
    return "Simple language file";
  }

  @NotNull
  @Override
  public String getDefaultExtension() {
    return "simple";
  }

  @Nullable
  @Override
  public Icon getIcon() {
    return SimpleIcons.FILE;
  }

}

4、注册FileType

        extensions属性设置了文件后续,但配置时不需要配置.,即.simple会简写成simple。同时需要注意这个配置中的相关值要与类中的相关值一样。

<extensions defaultExtensionNs="com.intellij">
  <fileType
      name="Simple File"
      implementationClass="org.intellij.sdk.language.SimpleFileType"
      fieldName="INSTANCE"
      language="Simple"
      extensions="simple"/>
</extensions>

5、测试运行

        要验证文件类型是否已正确注册,可以运行插件并验证是否可以正确显示LanguageFileType.getIcon()方法设置的图标,查看位置Settings | Editor | File Types:

         第二种验证方式是可以在 File | New | file(因暂时还没实现把新语言添加到菜单中),创建一个以.simple为后缀的文件,会显示如下图所示:

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

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

相关文章

AI项目二:基于mediapipe的虚拟鼠标控制

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 由于博主太懒&#xff0c;mediapipe如何实现鼠标控制的原理直接忽略&#xff0c;最初的想法是想控制摄像头识别手指控制鼠标&#xff0c;达到播放电影的效果。基本上效果也是可以的。简单的说是使用mediapipe检…

【软件测试】随笔系统测试报告

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: 软件测试 随笔系统采用 SSM 框架前后端分离的方法实现&#xff0c;本文主要针对功能&#xff1a;登录&#xff0c;注册&#xff0c;注销&#xff0c;写随笔&#xff0c;删除随笔&#xff0c;随笔详情页…

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储&#xff0c;并且支持数据的增删改查操作。其中&#xff0c;宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能&#xff1a; 创建 SQLite 数据库表&#xff0c;用于存储宠…

【KD】2023 ICML Linkless Link Prediction via Relational Distillation

1、简介 图神经网络(GNN)有很强的链接预测能力,但是其计算依赖于对邻居节点知识的聚合,因此导致其在实际应用中往往有较高的延迟。与GNN不同,多层感知机(MLP)在预测时不依赖于邻居节点信息,因此其推理速度更快,但也在一定程度上影响了其预测准确性。为了同时利用这两…

Linux下如何修改CPU 电源工作模式

最近处理一起历史遗留问题&#xff0c;感觉很爽。 现象&#xff1a; 背景&#xff1a;设备采用ARM&#xff0c;即rk3568处理器&#xff0c;采用Linux系统&#xff1b;主要用于视觉后端处理 现象&#xff1a;当软件运行一段时间&#xff0c;大概1个小时&#xff08;也不是很固定…

安卓开发问题记录:app:checkDebugDuplicateClasses

开发过程中报错&#xff1a; Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-21.0.3-runtime (com.android.support:support-v4:21.0.3)按网上找到的说法&#xff1a;新引…

Java学习路线大全推荐来啦!

Java作为目前最热门使用最广泛的编程语言之一&#xff0c;许多人都想学习它。但Java学习书籍那么多&#xff0c;如何选择适合自己的呢?在这里&#xff0c;小编将为大家推荐两本Java学习书籍。 1.动力节点Java 《Java从零基础到精通》是一本Java实用教材&#xff0c;由动力节点…

Maven(四)常用命令大全

目录 一、mvn 命令参数二、mvn 插件命令1.介绍2.查看插件的使用文档3.常用的插件命令 官网地址&#xff1a; https://maven.apache.org/官方插件清单&#xff1a; https://maven.apache.org/plugins/index.html Maven 是一个强大的构建工具&#xff0c;它提供了许多命令来进行项…

EasyV用户必须了解的实操方法论|模板复用五步法

本文根据元宝 在模板复用训练课程上的分享整理而成。 从我们模板复用课程上线到现在&#xff0c;每一期我们都在反复强调&#xff1a;**如何让「所有的」EasyV用户都能搭建制作出「可以落地交付」的可视化大屏是我们课程制作的初衷&#xff0c;跳出「大屏搭建 大屏设计」的思维…

【机器视觉系统】NoobVision

NoobVision 基于Qt/C实现的视觉框架平台&#xff0c;已有多款项目成功实施 功能不算非常完善&#xff0c;但架构设计成熟 Q 2903612753

Spring事务的隔离级别介绍说明以及怎么去修改Spring事务的隔离级别

&#x1f600;前言 本篇是Spring 声明式事务系列的最后一篇介绍了Spring事务的隔离级别介绍说明 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的…

SystemVerilog中$timeformat的用法

在SystemVerilog中&#xff0c;输出信息显示时间时&#xff0c;经常会在输出信息格式中指定“%t”格式符&#xff0c;一般情况下“%t”输出的格式都是固定的&#xff0c;但是这样固定的输出显示的时间可能有时会让用户看起来感觉比较诧异&#xff0c;例如下面的示例。 【示例】…

【word密码】设置word只读模式

想要将word文档设置为只读模式&#xff0c;方法有很多&#xff0c;今天小奥超人介绍几个方法给大家。 方法一&#xff1a;文件属性 常见的、简单的设置方法&#xff0c;不用打开word文件&#xff0c;只需要右键选择文件&#xff0c;打开文件属性&#xff0c;勾选上【只读】选…

ROSE75 GAS DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

助力金融服务行业转型,NETCLOUD的全方位解决方案!

随着科技的飞速发展和数字化时代的到来&#xff0c;金融行业也面临着前所未有的变革和挑战。在这个信息爆炸的时代&#xff0c;数字化转型已经成为金融行业不可忽视的趋势。从传统的银行、保险到投资管理&#xff0c;无一不受到数字化浪潮的影响。那么&#xff0c;为什么金融行…

Android CameraX适配Android13的踩坑之路

AndroidCameraX适配Android13的踩坑之路 前言&#xff1a; 最近把AGP插件升级到8.1.0&#xff0c;新建项目的时候目标版本和编译版本都是33&#xff0c;发现之前的demo使用Camerax拍照和录像都失败了&#xff0c;于是查看了一下官网和各种资料&#xff0c;找到了Android13的适…

中远麒麟堡垒机 SQL注入漏洞复现

0x01 产品简介 中远麒麟依托自身强大的研发能力,丰富的行业经验&#xff0c;自主研发了新一代软硬件一体化统一安全运维平台一-iAudit 统一安全运维平台。该产品支持对企业运维人员在运维过程中进行统一身份认证、统一授权、统一审计、统一监控&#xff0c;消除了传统运维过程中…

十七、地物识别

描述了使用2D卷积神经网络图像识别的全过程。下载和安装标注工具,对图像进行标注,生成标注后的图像。然后对数据进行增强,划分训练集和测试集。最后通过神经网络建立分类模型,对现有图片进行分类应用。 1、Labelme工具 Labelme工具是语义分割标注工具,在地物类型或建…

《论文阅读14》FAST-LIO

一、论文 研究领域&#xff1a;激光雷达惯性测距框架论文&#xff1a;FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter IEEE Robotics and Automation Letters, 2021 香港大学火星实验室 论文链接论文github 二、论文概…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——性质——第三节——真假推理

文章目录 第三节 性质—真假推理题—性质—两命题间的关系—①先找矛盾&#xff0c;后找包含—矛盾&#xff1a;“所有A都是B”矛盾“有的A不是B”&#xff1b;“所有A都不是B”矛盾“有的A是B”。—包含&#xff1a;“所有A都是B”→“有的A是B”&#xff1b;“所有A都不是B”…