首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TypeScript编译器:如何从CallExpression中获取原始函数的FunctionDeclaration?

TypeScript编译器是一种用于将TypeScript代码转换为JavaScript代码的工具。它提供了丰富的功能和API,可以帮助开发人员更好地理解和处理TypeScript代码。

在TypeScript中,CallExpression表示函数调用表达式,它由函数表达式或函数声明作为调用者和一组参数组成。要从CallExpression中获取原始函数的FunctionDeclaration,可以使用TypeScript编译器提供的AST(抽象语法树)解析工具。

以下是一种从CallExpression中获取原始函数的FunctionDeclaration的方法:

  1. 首先,需要使用TypeScript编译器的API将TypeScript代码解析为AST。可以使用ts.createSourceFile函数将TypeScript代码解析为AST。
代码语言:txt
复制
import * as ts from 'typescript';

const code = `function add(a: number, b: number): number {
  return a + b;
}

add(1, 2);`;

const sourceFile = ts.createSourceFile('example.ts', code, ts.ScriptTarget.ESNext, true);
  1. 接下来,可以使用AST遍历工具来遍历AST并查找CallExpression节点。可以使用ts.forEachChild函数遍历AST节点。
代码语言:txt
复制
function visit(node: ts.Node) {
  if (ts.isCallExpression(node)) {
    // 处理CallExpression节点
    const functionName = node.expression.getText();
    console.log('Function Name:', functionName);
    
    // 获取原始函数的FunctionDeclaration
    const functionDeclaration = findFunctionDeclaration(node.expression, sourceFile);
    console.log('Function Declaration:', functionDeclaration.getText());
  }

  ts.forEachChild(node, visit);
}

visit(sourceFile);
  1. 在处理CallExpression节点时,可以使用node.expression属性获取函数调用的表达式。然后,可以使用findFunctionDeclaration函数来查找原始函数的FunctionDeclaration。
代码语言:txt
复制
function findFunctionDeclaration(expression: ts.Expression, sourceFile: ts.SourceFile): ts.FunctionDeclaration | undefined {
  if (ts.isIdentifier(expression)) {
    const functionName = expression.getText();
    const functionDeclaration = sourceFile.statements.find((node) => {
      return ts.isFunctionDeclaration(node) && node.name && node.name.getText() === functionName;
    }) as ts.FunctionDeclaration;
    return functionDeclaration;
  }
  return undefined;
}

通过以上步骤,我们可以从CallExpression中获取原始函数的FunctionDeclaration,并对其进行进一步处理。

需要注意的是,以上代码示例仅演示了如何从CallExpression中获取原始函数的FunctionDeclaration,并没有涉及具体的腾讯云产品和链接地址。如果需要了解与TypeScript编译器相关的腾讯云产品和链接地址,可以参考腾讯云官方文档或咨询腾讯云的技术支持团队。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

探索类型系统底层 - 自己实现一个 TypeScript(硬核干货)

语言编译器如何工作?...使用预定义算法,引擎将计算给定变量或者函数类型。 TypeScript 在其 Binding 阶段(两次语义传递第一次)中使用最佳公共类型算法。...这些类型检查有很多种,类型错误匹配到类型不存在。 对于 TypeScript 来说,这是 Checker (第二个语义传递) ,它有 20000+ 行代码。...我们将其限制在三个场景原因是,我们可以关注每一个场景具体机制,并希望到最后能够对如何引入更复杂类型检查有一个更好构思。 我们将在编译器中使用函数声明和表达式(调用该函数)。...表达式:找到被调用函数声明,获取声明上参数类型,然后获取函数调用表达式传入参数类型,并进行比较。

1.2K40

掌握 AST,轻松落地关键业务「技术创作101训练营」

解释器: 利:启动和执行更快,第一行开始翻译,就可以依次继续执行了 弊: 运行同样代码一次以上(如执行一个循环),解释器就不得不一次又一次进行翻译,这是一种效率低下表现 编译器: 利:循环代码执行很快...上述是如何做到?解释了两次?还是先编译后运行? 一旦 V8 引擎进入一个执行具体代码执行上下文(函数),它就对代码进行词法分析或者分词。...最终,结合了解释器和编译器两者优点。 基本思想: 在 JavaScript 引擎增加一个监视器(也叫分析器)。监视器监控着代码运行情况,记录代码一共运行了多少次、如何运行等信息。...如果一段代码变成了 “warm”,就把它送到基线编译器,并且把编译结果存储起来;后续监视器监视到了执行同样代码和同样变量类型,那么就直接把这个已编译版本 push 出来给浏览器。...如果一段代码变成了 “hot”,就把它发送到优化编译器。生成一个更快速和高效代码版本出来,并且存储。为了生成一个更快速代码版本,优化编译器必须做一些假设。

1K169159

【JS】547- 200行JS代码,带你实现代码编译器(人人都能学会)

使用 AOT 编译后应用,不再包含任何 HTML 片段,取而代之是编译生成 TypeScript 代码,这样的话 TypeScript 编译器就能提前发现错误。...❞ 这里更强调了编译器作用:「将原始程序作为输入,翻译产生目标语言等价程序」。...三、编译器实现 本文将通过 「The Super Tiny Compiler[3]」 源码解读,学习如何实现一个轻量编译器,最终「实现将下面原始代码字符串(Lisp 风格函数调用)编译成 JavaScript...,获取函数参数,直到出现右括号")" while ((token.type !...接下来通过前面原始需求代码,测试编译器效果如何: const add = (a, b) => a + b; const subtract = (a, b) => a - b; const source

2.6K40

玩转Babel

什么是BabelBabel 是 JavaScript 编译器,更确切地说是源码到源码编译器,通常也叫做“转换编译器(transpiler)”。...Babel 主要用来做以下几件事情:转换语法(例如jsx)目标环境缺少 Polyfill 功能(例如core-js)源代码转换 (codemods)Babel处理流程代码输入到最终输出结果,Babel...图片在 generator 过程还可以通过参数配置是否生成sourceMap 。sourceMap记录了源代码与目标代码映射关系,方便目标代码定位问题。...简单说它们就是一个对象,定义了用于在一个树状结构获取具体节点方法。 这么说有些抽象所以让我们来看一个例子。...在 Typescript 是可以使用装饰器写法,但是在 Javascript 目前这一语法还处于提案阶段(tc39/proposal-decorators@d6c056fa06)。

76241

AST 与前端工程化实战AST 与前端工程化实战

(arrow)),输出如下 () => {} OK,我们已经获取到一个空箭头函数了。...定期 code review … 等等 以上这些,我之前也写过一篇文章做过一些点详细说明,TypeScript + 大型项目实战 自动化:最早先 grunt、gulp 等,再到目前 webpack...新建一个空箭头函数,并将保存好 firstExp 赋值到该空箭头函数 BlockStatement CallExpression 类型进行遍历,将 AST MemberExpression...修改成为有 catch 片段格式 将改造完成 AST 返回 现在,按照我们思路,我们一步一步来做 AST 改造 首先,我们需要获取到已有箭头函数第一个 ExpressionStatement...紧接着,我们需要判定我们获取 firstExp 是否存在,因为我们 then 处理可以是一个空箭头函数

1.5K40

【图文详解】200行JS代码,带你实现代码编译器(人人都能学会)

angular 编译器,这样可以减少我们 JS 脚本库大小 使用 AOT 编译后应用,不再包含任何 HTML 片段,取而代之是编译生成 TypeScript 代码,这样的话 TypeScript...三、编译器实现 本文将通过 The Super Tiny Compiler 源码解读,学习如何实现一个轻量编译器,最终实现将下面原始代码字符串(Lisp 风格函数调用)编译成 JavaScript 可执行代码...Tiny Compiler  编译器核心工作流程: [The Super Tiny Compiler编译器工作流程.png] 图中详细流程如下: 执行入口函数,输入原始代码字符串作为参数; // 原始代码字符串...,获取函数参数,直到出现右括号")" while ((token.type !...接下来通过前面原始需求代码,测试编译器效果如何: const add = (a, b) => a + b; const subtract = (a, b) => a - b; const source

3.1K00

AST 与前端工程化实战

(arrow)),输出如下 () => {} OK,我们已经获取到一个空箭头函数了。...定期 code review … 等等 以上这些,我之前也写过一篇文章做过一些点详细说明,TypeScript + 大型项目实战 自动化:最早先 grunt、gulp 等,再到目前 webpack...新建一个空箭头函数,并将保存好 firstExp 赋值到该空箭头函数 BlockStatement CallExpression 类型进行遍历,将 AST MemberExpression...修改成为有 catch 片段格式 将改造完成 AST 返回 现在,按照我们思路,我们一步一步来做 AST 改造 首先,我们需要获取到已有箭头函数第一个 ExpressionStatement...紧接着,我们需要判定我们获取 firstExp 是否存在,因为我们 then 处理可以是一个空箭头函数

1.3K31

Python操作AST解JS混淆

通过生成语法树(AST),可快速修改代码一些混淆处理,从而简化代码,便于后续分析。 本文通过Python来把JS转为AST并进行简单操作,内容很简单。...比如我们下图中JS代码,有sum和minus两个函数,一个变量a,两个换行\n,以及一次sum函数调用,参数为1和2。...在body下元素有这几种类型: 函数声明:FunctionDeclaration 空语句(\n):EmptyStatement 变量声明:VariableDeclaration...表达式语句:ExpressionStatement 根据Json可看到FunctionDeclaration中有基本函数名、参数名、参数类型、块语句和返回语句等。...代码很简单,大家试试如何删除无关变量a吧! 本文牛刀小试,更多内容我们后续再见!

1.8K30

【面试】1902- tree-shaking原理是什么?

作者:han_ https://juejin.cn/post/7265125368553685050 前言 在前端面试过程,前端工程化一直是考察面试者能力一个重点,而在我们常用项目打包工具,...function add() {},解析为ast是FunctionDeclaration,也就是函数声明节点。...比如提取函数、变量重命名、语法升级、函数移动等。 其实在实际开发,我们也可以利用做很多事情,比如实现自动埋点、自动国际化、依赖分析和治理等等,有兴趣小伙伴可以自行去探索。...很明显,multiple方法是没有被调用到,打包时候其实是可以被删除掉,以减少我们打包后代码体积。 那么,如何删除multiple呢?这时候就该我们ast就登场了!...小结 本文通过ast语法分析能力,分析JavaScript代码未被引用函数或变量,进而实现了一个最简单版本tree-shaking,希望大家看完都能有所收获哦~

11810

123. 精读《用 Babel 创造自定义 JS 语法》

个人学习也是如此,养成定期学习习惯,比在培训班突击几个月更有用,学会在生活规律学习,甚至好过读几年名牌大学。...,希望能为读者提供一套学习思维框架,让你能学习到如何找到好文章,以及如何解读它。...语法 词法已经可以将 @@ 解析为 atat Token,下一步我们就要利用这个 Token,让生成 AST 结构包含柯里化函数信息,并利用 babel 插件在解析时实现柯里化功能。...关于递归下降语法分析更多知识,可以参考 精读《手写 SQL 编译器 - 语法分析》,或者阅读原文。 我们再次执行测试函数,发现测试通过了,一切都在预料中。...如何快速写一个支持尾递归函数

49110

如何优雅地 hack 用户代码

前言:做基础技术时候,会经常碰到一个问题就是如何让自己提供代码对用户少侵入,无感。...但是应用层无法使用这种技术解决我们问题,因为操作系统这些技术针对是底层函数,比如我想知道一个 JS 函数耗时,只能在 V8 层面或者 JS 层面去解决,V8 这方面似乎也没有提供很好能力,所以目前我们更多是考虑纯...在 Node.js ,统计 JS 函数耗时通常做法是 cpu profile,但是这种方式只能拿到一段时间耗时,如果我想实时收集耗时数据,cpu profile 就有点难搞,最直接就是定时收集...function compute() { // do something } 如果我们想统计这种函数执行耗时,最自然方式就是在函数开始和结束地方插入一些代码。...那么基于这个基础我们利用 V8 调试协议 Debugger Domain 实现动态重写,这种方式还能重写 Node.js 内部 JS 代码。首先改一下测试代码。

59620

H5应用加固防破解-js虚拟机保护方案浅谈

虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境,JavaScript基于原型编程、多范式动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。...那么使用JS保护是必需。 1.3、如何对JS代码进行保护?...图3 3.2、指令生成原理 指令生成流程 分为如下几个步骤: 第一步:读取分析整个源代码 第二步:编译器扫描函数声明和变量声明,做语法分析,有错则报语法错误 处理函数声明:如果出现函数命名冲突,会进行覆盖...处理变量声明:如果出现变量命名冲突,会忽略 第三步:将扫描到函数和变量保存到一个对象。...在编译原理课程,我们思考过这么一个问题:如何让计算机运行算数表达式1+2+3: 当机器执行时候,它会将表达式翻译成这样机器码: 1 PUSH 1 2 PUSH 2 3 ADD 4 PUSH 3

4.1K21

模块构建之解析_source获取dependencies

模块构建之解析_source获取dependencies 8. dependency graph 到 chunk graph 9. chunk到最终文件内容到最后文件输出?...本文重点说如何_source解析出模块依赖dependencies?基础是什么?...词法作用域意味着作用域是由编写时变量/函数被声明位置决定编译器词法分析阶段实质上可以知道所有的标识符是在哪里和如何声明,并在执行期间预测它们将如何被查询。...,目的是为了函数体内可以正常获取到该变量,如果获取不到则说明这个变量没有被定义过(!...这么做好处是,当在函数内部获取到某个标识符时可以获取原始指向(重命名标识符),比如这里在函数体内部当再次解析到this实际就是解析require。

62510

写给小白开源编译器

一、什么是编译器 概念上简单讲: 编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”程序。...让我们一起跟着代码,弄清楚上述三个阶段具体做了哪些事情~ 3.1 解析 解析通常分为两个阶段:词法分析和句法分析 词法分析:获取原始代码并通过一种称为标记器(或词法分析器 Tokenizer)东西将其拆分为一种称为标记...let char = input[current]; } 如何获取字符串里面的单个字符呢?...node 节点,并存入我们 ast.body 数组: function walk() { // 在 walk 函数里面,我们首先获取`current`标记 let token = tokens...要做就是获取 AST 之后再对其进行更改。它可以用相同语言操作 AST,也可以将其翻译成一种全新语言。 那如何转换 AST 呢? 你可能会注意到我们 AST 元素看起来非常相似。

62410

简述babel解析过程

编译器解析过程 大多数编译器主要分为三个阶段:解析,转换和代码生成。 1.解析是将原始代码转换成更抽象代码表示。 2.转换采用这种抽象表示和操作来完成编译器结果。...这个阶段会将上一步获取抽象语法树做一些改变。这个操作可以用同一种编成语言,也可以用其他编程语言。...在转换过程,我们需要以深度优先方式遍历这个抽象语法树每个节点。...(4) 移动到CallExpression (subtract)第一个参数 NumberLiteral(2) 移动到CallExpression (subtract)第二个参数 代码生成 编译器最后一步就是生成代码...比如之前前端模板art-template,或者说vue本身也是依赖模板框架,而它{{xxxx}}语法似乎也可以理解为一种DSL。 那么,如何自定义一个DSL,这个问题值得思考一下。

44320

【Babel 小玩具】如何用 Babel 为代码自动引入依赖

前言 最近在尝试玩一玩已经被大家玩腻 Babel,今天给大家分享「如何用 Babel 为代码自动引入依赖」,通过一个简单例子入门 Babel 插件开发。...了解了 AST 是什么样,就可以开始研究 Babel 工作过程了。 Babel 功能其实很纯粹,它只是一个编译器。 大多数编译器工作过程可以分为三部分,如图所示: ?...Babel 会维护一个称作 Visitor 对象,这个对象定义了用于 AST 获取具体节点方法。...箭头函数是 ES5 不支持语法,所以 Babel 得把它转换成普通函数,一层层遍历下去,找到了 ArrowFunctionExpression 节点,这时候就需要把它替换成 FunctionDeclaration...」和「目标代码」都解析成 AST,观察它们特点,找找看如何「增删改」 AST 节点,从而达到自己目的。

88010

【译】一个超级小编译器

今天我们一起动手写一个编译器,但不是我们平常所说编译器,而是一个超级超级小编译器,小到如果你把本文件所有注释都删了,真正代码也就200多行。...实际上我们代码生成器知道如何去打印AST上所有不同类型节点,它会递归调用自己去打印所有嵌套节点,直到所有内容都被打印到一个长长代码字符串。...函数接收一个代码字符串为入参,我们要做两件事: function tokenizer(input) { // `current`变量就像一个游标,跟踪我们在代码当前位置 let current...函数会接受一个lispAST作为参数: (译者注:要理解下面这个函数,还是先要搞清楚到新都做了哪些转换,回到上面的对比,可以看到CallExpression节点type没变,但是把name...我们代码生成器会递归调用自己,把树每个节点都打印到一个巨大字符里。

64120
领券