web-dev-qa-db-ja.com

TypeScript:構文ツリーを取得する

私は「インターネット全体」を読みましたが、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));
41
bukvaG

この質問は 9月に戻る の前に出てきました。

現在、これを実行するものはありません-これを実行する魔法のgetSyntaxTreeメソッドはありません。

TypeScriptコンパイラはオープンソースですが、完全にTypeScriptで記述されているので、TypeScriptコンパイラをスキャンして、使用またはハンドルを追加できるものがあるかどうかを確認できます。

これの利点は、2つの質問に対する賛成票で判断すると、オープンソースプロジェクトとして作品をリリースする大きな機会があることです。これにはある程度の需要があります。

または、コンパイルされたJavaScript(実行時に実際に実行されるコード)から構文ツリーを取得するには、 Esprima または SpiderMonkey を使用します。

7
Fenton

TypeScriptパーサーはそのようなツリーを直接生成しませんが、そのオブジェクトモデルを使用してあらゆる種類のことを実行できます。たとえば、一部のツールでこれを使用して、テスト目的で構文変換を行います。次に、構文ツリーを出力するために使用できるスニペットを示します。

import ts = require('TypeScript');

const code = "enum { x = 1 }"
const sc = ts.createSourceFile('x.ts', code, ts.ScriptTarget.Latest, true);

let indent = 0;
function print(node: ts.Node) {
    console.log(new Array(indent + 1).join(' ') + ts.SyntaxKind[node.kind]);
    indent++;
    ts.forEachChild(node, print);
    indent--;
}

print(sc);
19
Ryan Cavanaugh

Recastとbabylon @ nextを使用することは可能です。 TypeScriptコードを表すためにこれらのテクノロジーによって定義された構文を信頼する必要がありますASTそしてそれらは最新の状態に保たれます-TypeScriptにはリリースごとに新しい言語機能がリリースされているため(短期間)-明確に定義されたバージョンがあり、標準でリリースされている他の言語(JavaScript)とは異なります。ユーザーが新しい言語機能の使用を開始した場合、これらのテクノロジー(たぶんbabylon)は最新の状態に保つ必要があります。そうしないと、解析が失敗します。

// npm install recast babylon@next
const source = `
interface I {
  color: string
}
class C implements I{
  color: string='blue'
}
`
const recast = require('recast')
const tsParser = require("recast/parsers/TypeScript")
const ast = recast.parse(source, {
  parser: tsParser
});
console.log(`
CODE: 

${source}

AST: 

${JSON.stringify(ast)}
`);
3
cancerbero

私は recast が非常にうまく機能していることを発見しました。例:

var recast = require('recast');
var ast = recast.parse(`var answer = 6 * 7;`);
console.log(ast);

これは必要なすべての情報とイベントTypeAnnotationを出力するので、このlibは本当に素晴らしいです:)

[
   {
      "type": "VariableDeclaration",
      "declarations": [
         {
            "type": "VariableDeclarator",
            "id": {
               "type": "Identifier",
               "name": "answer",
               "typeAnnotation": {
                  "type": "TypeAnnotation",
                  "typeAnnotation": {
                     "type": "NumberTypeAnnotation",
                     "loc": {
                        "start": {
                           "line": 1,
                           "column": 12
                        },
                        "end": {
                           "line": 1,
                           "column": 18
                        },
                        "lines": {},
                        "indent": 0
                     }
                  },
                  "loc": {
                     "start": {
                        "line": 1,
                        "column": 10
                     },
                     "end": {
                        "line": 1,
                        "column": 18
                     },
                     "lines": {},
                     "indent": 0
                  }
               },
               "loc": {
                  "start": {
                     "line": 1,
                     "column": 4
                  },
                  "end": {
                     "line": 1,
                     "column": 18
                  },
                  "lines": {},
                  "indent": 0
               }
            },
            "init": {
               "type": "BinaryExpression",
               "operator": "*",
               "left": {
                  "type": "Literal",
                  "value": 6,
                  "raw": "6",
                  "loc": {
                     "start": {
                        "line": 1,
                        "column": 21
                     },
                     "end": {
                        "line": 1,
                        "column": 22
                     },
                     "lines": {},
                     "indent": 0
                  }
               },
               "right": {
                  "type": "Literal",
                  "value": 7,
                  "raw": "7",
                  "loc": {
                     "start": {
                        "line": 1,
                        "column": 25
                     },
                     "end": {
                        "line": 1,
                        "column": 26
                     },
                     "lines": {},
                     "indent": 0
                  }
               },
               "loc": {
                  "start": {
                     "line": 1,
                     "column": 21
                  },
                  "end": {
                     "line": 1,
                     "column": 26
                  },
                  "lines": {},
                  "indent": 0
               }
            },
            "loc": {
               "start": {
                  "line": 1,
                  "column": 4
               },
               "end": {
                  "line": 1,
                  "column": 26
               },
               "lines": {},
               "indent": 0
            }
         }
      ],
      "kind": "var",
      "loc": {
         "start": {
            "line": 1,
            "column": 0
         },
         "end": {
            "line": 1,
            "column": 27
         },
         "lines": {},
         "indent": 0
      }
   }
]
0