代码分析工具 自定义插件——检查any类型的代码

代码分析工具 自定义插件——检查any类型的代码

本文是基于掘金小册《前端依赖治理:代码分析工具开发实战》

转载于我的掘金博客,并非抄袭

gitHub仓库:https://github.com/huang-jaskld/code-analysis/tree/master

逻辑步骤

源代码过于庞大,以下步骤只提取主要代码

扫描文件

我们首先需要在analysis.config.js文件中进行配置需要扫描的文件路径

image.png
我们会根据不同的文件类型,扫描不同的文件:

// sitem 为文件目录
if (type === CODEFILETYPE.VUE) {tempEntry = scanFileVue(sitem);
} else if (type === CODEFILETYPE.TS) {tempEntry = scanFileTs(sitem);
}

在扫描文件过程中,我们使用到了glob依赖进行扫描

示例:该文件目录下所有tstsx文件都会被获取到,不论中间文件层级

// 扫描TS文件
function scanFileTs(scanPath) {const tsFiles = glob.sync(path.join(process.cwd(), `${scanPath}/**/*.ts`));const tsxFiles = glob.sync(path.join(process.cwd(), `${scanPath}/**/*.tsx`));return tsFiles.concat(tsxFiles);
}

解析代码生成

// 解析ts文件代码,获取ast,checker
exports.parseTS = function (fileName) {// 创建Program// fileNames参数表示文件路径列表,是一个数组,可以只传1个文件// options参数是编译选项,可以理解成tsconfigconst program = tsCompiler.createProgram([fileName], {});const ast = program.getSourceFile(fileName);const checker = program.getTypeChecker();return {ast,checker,};
};

处理AST树

首先,我们需要分析any类型的特征:

image.png

node.kind === tsCompiler.SyntaxKind.AnyKeyword // 节点的类型为AnyKeyword

然后我们需要获取any类型所在的代码,获取到代码块:

我们调用了上下文(CodeAnalysis)中的_getFullCode方法,进行获取

let fullCode = context._getFullCode(tsCompiler, node);

具体实现:

image.png

  _getFullCode(tsCompiler, node) {if (node.parent && !tsCompiler.isSourceFile(node.parent)) {return this._getFullCode(tsCompiler, node.parent);} else {return node.getFullText();}}

逐级向上查找,如果该节点的父节点是SourceFile类型,那么该节点已是代码块的根节点(除了File节点),我们可以通过getFullText()方法进行获取

获取节点行数

const line =ast.getLineAndCharacterOfPosition(node.getStart()).line + baseLine + 1; // 获取节点所在行

完整代码

exports.anyTypePlugin = function (analysisContext) {const mapName = "anyTypeMap";// 在分析实例上下文挂载副作用analysisContext[mapName] = {};function isAnyTypeCheck(context,tsCompiler,checker,node,depth,apiName,filePath,projectName,httpRepo,line) {try {if (node.kind === tsCompiler.SyntaxKind.AnyKeyword) {let fullCode = context._getFullCode(tsCompiler, node);if (!context[mapName][filePath]) {// 记录信息context[mapName][filePath] = [];let temp = {};temp.code = fullCode;temp.line = line;temp.filePath = filePath;temp.pos = node.pos;temp.end = node.end;context[mapName][filePath].push(temp);} else {let temp = {};temp.code = fullCode;temp.line = line;temp.filePath = filePath;temp.pos = node.pos;temp.end = node.end;context[mapName][filePath].push(temp);}}} catch (e) {const info = {projectName: projectName,apiName: apiName,httpRepo: httpRepo + filePath.split("&")[1] + "#L" + line,file: filePath.split("&")[1],line: line,stack: e.stack,};context.addDiagnosisInfo(info);return false;}}return false;
};return {mapName: mapName,checkFun: isAnyTypeCheck,afterHook: null,
};

不足

当前的插件只能检查类型中明显存在any的情况,比如Array<any>any之类的

但是对于复杂类型来说是检查不到的,比如以下情况:

interface IProps {name:any,age:number
}let info : IProps = {name:1,age:12
}

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

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

相关文章

文华财经指标公式博易大师软件指标公式期货多空买卖指标图,文华加密破解二次加密

天:ma(CLOSE,25)MA(CLOSE,25)*20/100,COLORRED,LINETHICK2; 强势线:MA(CLOSE,25)MA(CLOSE,25)*6/100,COLORYELLOW,LINETHICK2; 天2:MA(CLOSE,18)MA(CLOSE,18)*20/100,COLORFFFFFF,LINETHICK1; stICKLINE(C>强势线,H,L,0,1),COLORFFFFFF; STICKLINE(C>强势线,C,O,2,1),COL…

外盘期货分仓软件(如智星系统,信管家)等功能

1、创建子账户&#xff0c;如图所示&#xff1a;管理--账户管理—开户&#xff0c;填写客户姓名&#xff0c;登陆密码&#xff0c;手机号&#xff0c;勾选账户风控。 2、子账户风控 a) 报警线&#xff1a;资金剩余达到保证金的 n%&#xff0c;系统报警&#xff1b; b) 强平线…

开发国信股票自动交易软件

大多免费的股票交易软件&#xff0c;不能自动盯盘&#xff0c;不能灵活简单地定制自动交易策略&#xff0c;而且最大的问题在于&#xff0c;不能上班时间看盘^_^。于是客户找到我们&#xff0c;希望能开发一个能解决以上痛点的股票自动交易软件。 我们通过逆向国信股票交易网页…

免费软件 --- 国信证券帐户历史成交统计器

很早之前就想写这个软件&#xff0c;这2天花费了点时间写出来了&#xff0c;测试后就发布了。当然了&#xff0c;本软件只针对国信证券而开发的&#xff0c;只支持统计国信证券交易软件的记录。如果是其他券商开户的&#xff0c;请不要来下载了。 软件简要说明&#xff1a;本软…

【大作业之爬虫实战+数据分析与可视化处理上】——案例——如桃花来

目的任务&#xff1a; 目的任务 爬取租房网对应元素&#xff1a; 租房名 每月的价格 室内规格构造 房间大小 交通信息 保存数据到excel表格中 做数据清洗 数据可视化呈现 设计要求&#xff1a; 设计要求&#xff1a; 以类的方式书写&#xff0c;简洁明了。能够促进学生…

记录 vue3 webpack 使用 iframe 遇到的坑

需求 我尝试用Vue3写一个自己的主页&#xff0c;把常用的功能集中到主页中&#xff0c;如下图 后发现一个好玩的东西&#xff0c;js实现的在网页底部出现鱼和波浪&#xff0c;如下图&#xff0c;就像想也放到自己的主页中&#xff0c;搜索后发现可以在Vue中用iframe标签直接引…

基于redis实现消息队列(更推荐使用专业的mq)

目录 利用redis实现消息队列&#xff08;基于list&#xff0c;点对点模型&#xff09;——lpush存放队列&#xff08;lpush 队列名 队列内容&#xff08;可一次存放多个内容&#xff0c;用空格隔开&#xff09;&#xff09; brpop取队列&#xff08;brpop 队列名 等待时间单位秒…

(windows)如何删除删不掉的文件

有时候删除时明明是管理员&#xff0c;却提示需要管理员权限 点击更改-然后再高级 立即查找&#xff0c;搜索当前用户 找到现在的用户名&#xff0c;确定 点击审核&#xff0c;添加--选择主体 高级—选择现在的计算机名——权限完全控制 7.所有对话框点击确定&#…

文件夹删不掉,显示有文件打开怎么办

1 打开任务管理器 2 选中性能 3 点开打开资源监视器 4 点进CPU 5 在输入框输入删除不掉的文件夹名字 6 再右击进程关掉就可

解决:文件名太长删不掉

今天删除一个无用文件夹时windows跳出如下弹窗&#xff1a; 解决方法&#xff1a; 1、在要删除的文件夹同级新建一个空文件夹&#xff08;如图&#xff1a;1是要删除的文件夹&#xff0c;也就是包含那个文件名过长的文件的文件夹&#xff0c;2是空文件夹&#xff09; 2、点下空…

win10系统遇到删不掉的文件夹怎么办

win10系统遇到删不掉的文件夹怎么办&#xff1a; 具体操作步骤如下&#xff1a; 1、打开“此电脑”-“查看”&#xff0c;在“文件扩展名”前打钩&#xff1b; 2、然后在桌面上新建一个txt文本文档&#xff1b; 3、双击打开新建的文本文档&#xff0c;复制粘贴下列的代码&…

删除电脑中删不掉的文件或文件夹

强制删除文件或文件夹 前言一、新建一个文本文件二、打开文本文件1.在文本文件中输入2.保存 前言 在一次拉取git文件&#xff0c;不知道做了什么错误的操作&#xff0c;是的文件夹在删除的时候&#xff0c;一直显示“当前文件不存在”&#xff0c;可是明明就存在我的桌面&…

遇见流氓软件怎么才能卸载,文件夹删不掉显示被占用(小鸟,海螺,原始传奇等),到底应该怎么办?

遇见流氓软件怎么才能卸载&#xff0c;文件夹删不掉显示被占用&#xff08;小鸟&#xff0c;海螺&#xff0c;原始传奇等&#xff09; 首先&#xff0c;描述一下我遇见流氓软件的过程&#xff0c;最开始我想下一个音乐播放器&#xff0c;选择了网易云音乐&#xff0c;在谷歌浏…

服务器上网站文件无法删除不了怎么办啊,Windows服务器上文件夹删不掉怎么办...

我们在用服务器的过程中有的时候会遇到这样的问题&#xff0c;那就是文件夹删除不掉。甚至有的时候需要重启服务器才能删除&#xff0c;甚至还遇到即便重启了服务器也删除不掉文件夹的情况。那么今天纵然云计算小编就带大家来学习一下怎么删除这些删除不掉的文件夹。 那么我们先…

如何删除tmp计算机桌面,temp文件删不掉怎么办

当我们在使用win10系统的时候&#xff0c;会产生系统临时文件&#xff0c;temp文件。如果一直不清理的话&#xff0c;太多的话就会占用系统磁盘空间影响电脑运行速度。但是有小伙伴发现自己电脑的temp文件删不掉不知道怎么办&#xff1f;下面小编就教下大家temp文件怎么删除。 …

空文件夹删不掉打不开,“该项目不存在请确认该项目位置“,“项目正在打开中无法删除“,“文件已损坏或者已经被移动删除“(多种方法图文详解,细节需要注意,以及可能遇到的问题)

1.事前概要-触发这种文件夹的情况 这个删不掉的文件或文件夹其实是Windows系统的祖传bug到目前为止依然没有修复,所以说我们需要通过特别的手段来处理它,听我慢慢讲他的缘由可能会对解决这个问题的帮助更多,会有几种方法,我都试过了的,我把最后一种成功的放在第一个讲,没有成功…

文件夹删不掉

有一天我打开电脑运行我的项目&#xff0c;但发现项目运行不起来额&#xff0c;追查原因的时候发现有一个文件夹损坏&#xff0c;打开这个文件夹&#xff0c;正常&#xff0c;可以浏览里面文件&#xff0c;也可以重命名。右键查看文件夹属性&#xff0c;见其为只读属性&#xf…

服务器空文件夹无法删除怎么办,为什么文件夹删不掉

网民求助&#xff1a;文件夹删不掉,文件夹删不掉怎么办? 相信大家已经发觉自己的系统中有文件夹无法删除后&#xff0c;束手无策的情况下&#xff0c;经常到网上求助&#xff0c;但是许多人给出的方法都不能很好的解决这一问题&#xff0c;因为多种原因都会导致文件夹删不掉情…

win10计算机中删除桌面,win10 电脑桌面文件夹为什么删不掉该如何处理

通常&#xff0c;对于一些没用的文件夹或则资料&#xff0c;大家都会选择把他们删掉的方法来节省电脑空间&#xff0c;但是好多人给白豆芽说&#xff0c;不知道为什么&#xff0c;自己的win10 电脑桌面文件夹总是删不掉&#xff0c;这是怎么回事呢我们又该如何处理呢&#xff1…

计算机app无法删除,文件夹删不掉怎么办?

一、常规解决办法 1&#xff0e;注消或重启电脑&#xff0c;然后再试着删除。 2&#xff0e;进入“安全模式删除”。 3&#xff0e;在纯DOS命令行下使用DEL、DELTREE和RD命令将其删除。 4&#xff0e;如果是文件夹中有比较多的子目录或文件而导致无法删除&#xff0c;可先删除该…