【发布时间】:2020-04-15 01:43:18
【问题描述】:
从纯字符串创建SoureFile 对象很容易:
ts.createSourceFile(fileName, sourceText, languageVersion, setParentNodes, scriptKind)
但是,我没有看到从Statement-nodes 数组(由各种工厂函数创建)创建一个的方法。
我试图提出这样的解决方案:
const source = ts.createSourceFile(fileName, '', languageVersion);
source.statements = myNodeArray;
但这(也许不足为奇)不起作用。 我也尝试过(ab)像这样使用转换器 API:
function createSourcefile(filename: string, ast: ts.Node[], languageVersion: ts.ScriptTarget): ts.SourceFile {
const dummy = ts.createSourceFile(filename, 'dummy', languageVersion); // need at least 1 node
return ts.transform(
dummy,
[ transformContext => sourceFile => ts.visitEachChild(sourceFile, node => ast, transformContext) ]
).transformed[0];
}
但这似乎也不起作用。
使用这两种方法,我在emit 过程中收到以下错误:
Error: start < 0
at createTextSpan (node_modules\typescript\lib\typescript.js:10263:19)
at Object.createTextSpanFromBounds (node_modules\typescript\lib\typescript.js:10272:16)
at getErrorSpanForNode (node_modules\typescript\lib\typescript.js:13544:19)
at createDiagnosticForNodeInSourceFile (node_modules\typescript\lib\typescript.js:13449:20)
at Object.createDiagnosticForNode (node_modules\typescript\lib\typescript.js:13440:16)
at lookupOrIssueError (node_modules\typescript\lib\typescript.js:34976:22)
at addDuplicateDeclarationError (node_modules\typescript\lib\typescript.js:35177:23)
at \node_modules\typescript\lib\typescript.js:35173:17
at Object.forEach (node_modules\typescript\lib\typescript.js:317:30)
at addDuplicateDeclarationErrorsForSymbols (node_modules\typescript\lib\typescript.js:35171:16)
at mergeSymbol (node_modules\typescript\lib\typescript.js:35158:21)
at \node_modules\typescript\lib\typescript.js:35200:47
at Map.forEach (<anonymous>)
at mergeSymbolTable (node_modules\typescript\lib\typescript.js:35198:20)
at initializeTypeChecker (node_modules\typescript\lib\typescript.js:66463:21)
at Object.createTypeChecker (node_modules\typescript\lib\typescript.js:34935:9)
at getDiagnosticsProducingTypeChecker (node_modules\typescript\lib\typescript.js:98560:93)
at emitWorker (node_modules\typescript\lib\typescript.js:98588:32)
at \node_modules\typescript\lib\typescript.js:98569:66
at runWithCancellationToken (node_modules\typescript\lib\typescript.js:98665:24)
at Object.emit (node_modules\typescript\lib\typescript.js:98569:20)
*snip*
有没有办法让它工作?
我想我可以理论上使用打印机将 AST 转换为字符串,但这显然是一种巨大的浪费。
我使用“虚拟编译器主机”和 David Sherret 的范围剥离建议创建了一个 gist 的独立示例。
奇怪的是,我发现并非所有节点类型都会发生此错误。在我的(有限)测试中,我只在 AST 包含 ImportDeclaration 节点时遇到它。
【问题讨论】:
标签: typescript typescript-compiler-api