【发布时间】:2022-05-10 05:03:39
【问题描述】:
我已经阅读了“整个互联网”,但找不到任何关于从 TypeScrypt 源获取语法树(就像在 Esprima 中一样)的示例。 我的意思是我怎样才能得到这样的对象(Esprima Parser 示例)
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "answer"
},
"init": {
"type": "BinaryExpression",
"operator": "*",
"left": {
"type": "Literal",
"value": 6,
"raw": "6"
},
"right": {
"type": "Literal",
"value": 7,
"raw": "7"
}
}
}
],
"kind": "var"
}
]
}
来自 javascript 代码
var answer = 6 * 7;
仅适用于 TypeScript 源文本?
附:非常希望对你有所帮助,因为我不想写你自己的糟糕自行车)
P.P.S.我认为 lib 文件 typescript.ts(.js) 和 typescriptServices.ts(.js) 可以帮助我,但我不知道如何:(
已解决
非常感谢用户 Steve Fenton。 这是我的代码,如果有人感兴趣的话:
// uses
var typeScriptLS = new Harness.TypeScriptLS();
var ServicesFactory = new Services.TypeScriptServicesFactory();
var serviceShim = ServicesFactory.createLanguageServiceShim(typeScriptLS);
// add lib.d.ts
var _libText = window.document.getElementById('lib.d.ts').innerText;
typeScriptLS.addScript('lib.d.ts', _libText.replace(/\r\n?/g,"\n"), true);
// add greeter.ts
var _sourceText = window.document.getElementById('greeter.ts').innerText;
typeScriptLS.addScript('greeter.ts', _sourceText.replace(/\r\n?/g,"\n"), true);
// script name
var _scriptName = 'greeter.ts';
// get syntax tree
var _st = serviceShim.languageService.getSyntaxTree(_scriptName);
//console.log(_st);
console.log(JSON.stringify(_st, "", 2));
【问题讨论】:
-
部署文件中
Harness在哪里定义?我在 tsc.js、typescript.js 或 typescriptServices.js 的任何地方都看不到“Harness”。或者更广泛地说,您如何运行此 Solved 代码示例? -
抱歉让您久等了。 /src/harness/ 在github.com/Microsoft/TypeScript 上。但是现在我的代码可能会失效
-
不要使用 Harness,因为它不是公共 API,您需要在 TypeScript 项目本身内部执行此操作(因此您需要重新分发它)或访问非公共 TypeScript API(冒您的软件的风险如果用户没有使用正确的打字稿编译器版本,则会被破坏。可以使用巴比伦解析器来做到这一点 - 请参阅下面的答案
标签: typescript abstract-syntax-tree