Разбирать испускать TypeScript?- `const a = {foo: 'bar'}` to `const a = {foo: 'bar', can: 'haz'}`? - PullRequest
0 голосов
/ 18 декабря 2018

Следовал по руководству , кое-что понял:

export function delint(sourceFile: ts.SourceFile) {
  delintNode(sourceFile);

  function delintNode(node: ts.Node) {
    if (node.kind === ts.SyntaxKind.VariableDeclaration) {
      // something
    }

    ts.forEachChild(node, delintNode);

Как мне получить остальную часть пути, т.е. добавить новую вещь в литерал объекта,затем вывести код редактирования с тем же порядком свойств, но новым в конце?

1 Ответ

0 голосов
/ 18 декабря 2018

Если вы просто хотите изменить текст исходного файла для добавления свойства, то это можно сделать следующим образом:

  1. Получить литеральное выражение объекта из AST (используя https://ts -ast-viewer.com помогает понять, как выглядит AST).
  2. Используйте ts.updateObjectLiteral, чтобы получить новый узел для старого узла с новым свойством.
  3. ПечатьВыделите текст нового узла и измените исходный текст печатным текстом узла.
  4. Если необходимо, измените код на новый AST или просто используйте измененный текст.

Обратите внимание, что при печати объектаliteral удалит любое пользовательское форматирование, которое у вас было ранее, потому что принтер печатает узлы по-своему.Возможно, вы захотите потом запустить код через более симпатичный или другой форматтер.

Пример:

import * as ts from "typescript";

// parse the AST
const sourceFile = ts.createSourceFile("file.ts", "const a = { foo: 'bar' };",
    ts.ScriptTarget.Latest, false);

// get the object literal expression
const objectLiteralExpression = sourceFile.statements.find(ts.isVariableStatement)!
    .declarationList.declarations[0].initializer as ts.ObjectLiteralExpression;

// get a transformed node with the new property and print it
const transformedOle = ts.updateObjectLiteral(objectLiteralExpression, [
    ...objectLiteralExpression.properties,
    ts.createPropertyAssignment("can", ts.createStringLiteral("haz"))
]);
const newNodeText = ts.createPrinter()
    .printNode(ts.EmitHint.Unspecified, transformedOle, sourceFile);

// get the new source file text and reparse it to a new AST
const oldText = sourceFile.text;
const newText = oldText.substring(0, objectLiteralExpression.getStart(sourceFile, true))
    + newNodeText + oldText.substring(objectLiteralExpression.end);
const newSourceFile = ts.createSourceFile("file.ts", newText, ts.ScriptTarget.Latest, false);

// outputs: `const a = { foo: "bar", can: "haz" };`
console.log(newText);

Если вы хотите сделать это во время излучения, тогда посмотрите на предоставление собственного преобразователя дляProgram#emit(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...