VScode插件之get、set函数自动生成

文章目录

  • VScode插件之get、set函数自动生成
    • 插件名称
    • 现有功能
    • 功能快捷键使用总结
    • 与部分插件的get、set生成对比
    • 部分实现效果展示
    • 部分实现思路

VScode插件之get、set函数自动生成

初次尝试插件的编写开发,这篇博客也是对自己成果的一个记录,如有不足请指正!

插件名称

扩展搜索(持续更新ing):Get Set generate
链接: link
在这里插入图片描述

现有功能

该插件主要是针对TS以及JS的get、set函数的自动生成,具体功能如下:

  1. 针对TS、JS生成传统面向对象方法的set、get函数或ES6存取器的set、get函数;
  2. 能够识别函数是否重复,避免重复生成函数(缺失get或set函数其中一个会进行补全);
  3. 能够对修饰符缺失以及’_'缺失的情况进行提示(所以会对代码规范有一定的要求,不符合要求的属性无法生成函数);
  4. 能够针对单个属性(鼠标选中完整的单个属性信息)、单个文件(文件内所有类包含的属性)以及在快速选择框中选择属性等三种情况生成函数;
  5. 能够通过配置项确定是否需要生成函数注释,确定代码生成风格为传统面向对象方法或ES6存取器;

注意:
请在保存代码后食用!请根据提示修改属性信息!

功能快捷键使用总结

前面三个为ES6对应的函数生成,后三个为传统面向对象写法的函数生成

功能快捷键命令
单个属性插入函数Ctrl + Win + Shift + SgenerateGetterSetter
文件内所有属性插入函数Ctrl + Win + Shift + DgenerateGetterSetterForAll
选择属性生成函数Ctrl + Alt + GSelectGSGenerate
生成函数是否包含注释-ConfigurationExegesis
是否生成ES6风格函数-ConfigurationES6

(如果和自己vscode的快捷键冲突,可以自行更改或使用命令)

使用命令:Ctrl + Shift + P后输入对应命令

更改快捷键:Ctrl + Shift + P后输入对应命令,点击配置键绑定(下图设置符号),根据自己需求更改快捷键

在这里插入图片描述

与部分插件的get、set生成对比

插件名称缺点分析优点分析包含功能
TypeScript GetSet如果函数已存在或部分已存在仍然会进行插入;有一个属性不规范所有代码无法插入;只能生成TS的函数代码;-生成一个类所有属性的get以及set函数;生成一个类所有属性的get或set函数;
TypeScript Toolbox只能插入private修饰的属性;插入所有属性的函数时只能识别第一个类;只能生成TS的函数代码;使用正则匹配分析代码插入速度更快;生成一个类所有属性的get以及set函数;生成一个属性的get或set函数;生成一个属性的get以及set函数;
Getter Setter Ultimate代码插入位置在所有类最后,如果存在多个类需要手动修改;-生成选中属性的ES6写法的get以及set函数;生成选中属性的传统写法的get以及set函数;
TypeScript’s Getters and Setters Object Oriented Programming Style选中内容不完全时会生成错误信息;只能生成TS的函数代码;-生成选中属性的的get以及set函数;

部分实现效果展示

(只展示了部分实现效果!!!)

  • 针对ES6存取器
    • 单个属性插入函数:
      在这里插入图片描述

    • 选择属性生成函数
      选择框内选择需要生成对应函数的属性
      在这里插入图片描述
      具体实现效果类似于单个属性插入函数效果,只是插入内容变多啦,不展示了

  • 针对传统面向对象:
    • 文件内所有属性插入函数(展示了部分生成结果)
      在这里插入图片描述
      因为部分属性的函数已存在(如tel),故会进行如下提示:
      在这里插入图片描述
  • 修改配置:生成函数是否包含注释(默认包含注释)
    Ctrl + Shift + P后输入命令ConfigurationExegesis
    在这里插入图片描述
    提示后即修改成功
    在这里插入图片描述
  • 修改配置:是否生成ES6风格函数(默认为ES6写法)

部分实现思路

  • 在activate函数中,注册了6个命令,每个命令对应一种生成 getter 和 setter
    函数的方式(如单个属性、所有属性、选择属性等)。

  • 用户在 VSCode中通过快捷键或命令面板执行相应的命令。根据用户执行的命令,调用对应的函数(如GSGenerateCommandES6、SelectGSGenerateES6等)。

  • 在函数执行过程中,通过ClassAnalyzer类获取当前文档中类和属性的相关信息(使用ts-morph库来解析 TypeScript 或JavaScript 文件为 AST)。其中主要通过getPropertyInformation函数获取所需要用到的属性以及函数信息:

  • 展示信息获取部分主要实现代码:

sourceFile.getClasses().forEach(classDecl => {
      const className = classDecl.getName();
      if (className) {
        const classInfo: ClassInfo = {
			name: className,
			position: 0,
			properties: [],
			propertyTypes: [],
			isNonStandard: [],
			hasSetter: [],
			hasGetter: []
        };
		// 创建属性名到索引的映射表
		const propertyNameToIndexMap = new Map<string, number>();
		//将类中属性对应的hasSetter 、hasGetter函数设置为否(即默认均不存在函数)
		const propertyCount = classDecl.getProperties().length;
		classInfo.hasSetter = new Array(propertyCount).fill(false);
		classInfo.hasGetter = new Array(propertyCount).fill(false);
		//获取属性相关信息
		classDecl.getProperties().forEach((propDecl, index) => {
        	const propName = propDecl.getName();
			const propType = propDecl.getType().getText();
			const modifiers = this.getModifiers(propDecl);
			
			!propName.startsWith('_') ? classInfo.isNonStandard.push(2) : 0;
			classInfo.isNonStandard.push(modifiers.length <= 0 ? 1 : 0);

			let trimmedName = propName.startsWith('_') ? propName.substring(1) : propName;
			classInfo.properties.push(trimmedName);
			trimmedName = trimmedName.startsWith('#') ? trimmedName.substring(1) : trimmedName;
			classInfo.propertyTypes.push(propType);
			
			propertyNameToIndexMap.set(trimmedName, index);
			//将函数插入在各个类中最后一个的下方
			if (index === propertyCount - 1) {
				classInfo.position = propDecl.getEndLineNumber();
			}

        });
		//获取实例对象,判断是否已经生成了getter\setter函数(针对ES6)
		const processInstanceMembers = async () => {
			await Promise.all(
			  classDecl.getInstanceMembers().map(async (member) => {
				const propertyIndex = propertyNameToIndexMap.get(member.getName());
				if (propertyIndex !== undefined && propertyIndex !== -1) {
				  if (member.getKind() === SyntaxKind.GetAccessor) {
					classInfo.hasGetter[propertyIndex] = true;
				  } else if (member.getKind() === SyntaxKind.SetAccessor) {
					classInfo.hasSetter[propertyIndex] = true;
				  }
				}
			  })
			);
		  };
		  //获取方法,判断是否生成了传统面向对象写法的set\get函数
		const processMethods = async () => {
			await Promise.all(
			    classDecl.getMethods().map(async (methodDecl) => {
				const methodName = methodDecl.getName();
				// 检查方法名是否符合 set+prop 或 get+prop 的模式
				if (methodName.startsWith('set') || methodName.startsWith('get')) {
				  const propPart = methodName.slice(3); // 去掉前缀 "set" 或 "get"
				  const lowerCasePropPart = propPart.charAt(0).toLowerCase() + propPart.slice(1);
				  const propertyIndex = propertyNameToIndexMap.get(lowerCasePropPart);
				  if (propertyIndex !== undefined && propertyIndex !== -1) {
					if (methodName.startsWith('set')) {
					  classInfo.hasSetter[propertyIndex] = true;
					} else {
					  classInfo.hasGetter[propertyIndex] = true;
					}
				  }
				}
			  })
			);
		  };
      }
    });
  • 根据返回的属性信息和语言类型,生成 getter 和 setter 函数代码,并在生成函数过程中对函数重复情况进行判断提示。

  • 如下为生成文件内所有属性的插入实现部分(插入成功后,保存文件):

editor.edit(editBuilder => {
        //一个一个属性生成并插入
        classList.forEach(classInfo => {
            classInfo.properties.forEach((prop, index) => {
            const positionEnd = new vscode.Position(classInfo.position, 0);

            const getterSetterCode = func.getsetfinalES6(isTS,classInfo.isNonStandard[index], prop, classInfo.propertyTypes[index], classInfo.hasGetter[index],classInfo.hasSetter[index]);
            if(getterSetterCode === ''){
                vscode.window.showErrorMessage(`The function for this attribute already exists : ${prop} `);
            }
            else if(getterSetterCode !== '-1')editBuilder.insert(positionEnd, `\n${getterSetterCode}\n`);
            })
        });
    }).then(success => {
        if (!success) {
            vscode.window.showErrorMessage('Failed to insert getter and setter methods.');
        }
        else{
            document.save();
        };
    });  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Lua热更新】上篇

Lua 热更新 - 上篇 下篇链接&#xff1a;【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…

完全二叉树的权值(蓝桥杯2019年试题G)

给定一棵包含N个节点的完全二叉树&#xff0c;树上的每个节点都有一个权值&#xff0c;按从上到小、从左到右的顺序依次是A1、A2……An,&#xff08;1&#xff0c;2&#xff0c;n为下标。&#xff09;如下图所示。 现在&#xff0c;小明要把相同深度的节点的权值加到一起&#…

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

前端yarn工具打包时网络连接问题排查与解决

最近线上前端打包时提示 “There appears to be trouble with your network connection”&#xff0c;以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包&#xff0c;命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…

harmony UI组件学习(1)

Image 图片组件 string格式&#xff0c;通常用来加载网络图片&#xff0c;需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式&#xff0c;可以加载像素图&#xff0c;常用在图片编辑中 Image(pixelMapobject) Resource格式&#xff0c;加…

mac 安装graalvm

Download GraalVM 上面链接选择jdk的版本 以及系统的环境下载graalvm的tar包 解压tar包 tar -xzf graalvm-jdk-<version>_macos-<architecture>.tar.gz 移入java的文件夹目录 sudo mv graalvm-jdk-<version> /Library/Java/JavaVirtualMachines 设置环境变…

14-zookeeper环境搭建

0、环境 java&#xff1a;1.8zookeeper&#xff1a;3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压&#xff0c;放到你想放的目录里。先看一下zookeeper的目录结构&#xff0c;如下图&#xff1a; 进入conf目录&#xff0c;复制zoo_sample.cfg&#xff0…

如何使用Python处理视频合成

使用 Python 处理视频合成可借助 MoviePy 库&#xff0c;以下是具体步骤&#xff1a; 安装 MoviePy 通过 pip 命令安装&#xff0c;即 pip install moviepy&#xff0c;需确保已安装 ffmpeg&#xff0c;并正确设置环境变量&#xff0c;因为 MoviePy 依赖它来处理视频. 基本合…

存储过程 与 存储函数的区别及用法 及 触发器 !!!

引言&#xff1a; 存储函数和存储过程&#xff0c;作为数据库中的预编译代码块&#xff0c;能够封装复杂的业务逻辑和数据处理流程&#xff0c;使得数据库操作更加简洁、易读和可维护。而触发器&#xff0c;则像是一个智能的守卫&#xff0c;能够在特定事件发生时自动执行预设的…

用nginx部署两个前端(超简单,三步!)

1.首先在nginx的html目录下创两个文件夹分别用于放两个前端打包好的静态资源&#xff0c;并且把静态资源各自放好&#xff1a; 2. 在nginx的配置文件里&#xff0c;写好两个server。如图&#xff0c;写好两个前端要用的端口以及刚才那两文件夹的路径&#xff1a; worker_proces…

level2逐笔委托查询接口

沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板&#xff1a; http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…

flask-admin的modelview 实现list列表视图中某个列字段值翻译

背景&#xff1a; flask-admin 开发中modelview视图是非常强大的&#xff0c;但文档写的很难受&#xff0c;只能通过源码慢慢摸索学习&#xff0c;一点点记录 材料&#xff1a; 可用的flask-admin 环境 制作&#xff1a; 样例代码&#xff1a; 1、modelview 视图代码 col…

打造基于 SSM 和 Vue 的卓越电脑测评系统:挖掘电脑潜力

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

物联网:全面概述、架构、应用、仿真工具、挑战和未来方向

中文论文标题&#xff1a;物联网&#xff1a;全面概述、架构、应用、仿真工具、挑战和未来方向 英文论文标题&#xff1a;Internet of Things: a comprehensive overview, architectures, applications, simulation tools, challenges and future directions 作者信息&#x…

【AI学习】OpenAI推出o3,向AGI迈出关键一步

2024年12月21日&#xff0c;OpenAI在其为期12天发布会活动的最后一天&#xff0c;正式发布了备受期待的o3系列模型&#xff0c;包括o3和o3-mini。 o3 是一个非常强大的模型&#xff0c;在编码、数学以及 ARC-AGI 基准测试等多个基准上超过了 OpenAI 此前的 o1 模型&#xff08…

Oracle 中间件 Webcenter Portal服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…

仿途唬养车系统汽修服务小程序修车店小程序源码

仿途唬养车系统汽修服务小程序修车店小程序源码 用户端&#xff0b;商家端&#xff0b;师傅端 也支持根据客户保养记录&#xff0c;系统自动推送 定期车检短信提醒 功能介绍: 支持下单上门服务、到店核销&#xff0c;支持单独选择项目、也支持选择服务人员、 和选择门店…

CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现

效果如下&#xff1a; &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载此dll插件&#xff0c;然后输入“xx”运行&#xff0c;选择文件夹即可。&#xff09; 部分代码如下&#xff1a; #if DEBUG using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoC…

Java性能调优 - JVM性能监测及调优

JVM 内存模型概述 堆 堆是JVM内存中最大的一块内存空间&#xff0c;该内存被所有线程共享&#xff0c;几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代&#xff0c;新生代又被进一步划分为Eden和Survivor区&#xff0c;最后Survivor由From Survivor和To Su…

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件.