2013-11-25 11 views
35

Avevo letto "tutto internet", ma non ho trovato alcun esempio sull'ottenere l'albero di sintassi (proprio come in Esprima) da TypeScrypt source. Voglio dire come posso ottenere oggetto come questo (Esprima Parser esempio)TypeScript: get syntax tree

{ 
    "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" 
     } 
    ] 
} 

dal codice javascript

var answer = 6 * 7; 

solo per il testo dattiloscritto fonte?

P.S. Spero molto per il tuo aiuto, perché non voglio scrivere la tua terribile bicicletta)

P.P.S. Credo che i file typescript.ts lib (js) e typescriptServices.ts (js) per aiutare me, ma io non so come :(

Risolto

Grazie mille per l'utente Steve . Fenton Ecco il mio codice, se chiunque sia interessato a:.

// 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)); 
+3

casi in cui è 'Harness' definito nei file distribuiti? Non vedo "Harness" ovunque in tsc.js, typescript.js o typescriptServices.js. O più in generale, come si esegue questo esempio di codice risolto? –

+0

Mi dispiace se stavate aspettando./src/harness/ in https://github.com/Microsoft/TypeScript. Ma ora il mio codice potrebbe diventare non valido – bukvaG

+0

Possibile duplicato di [Come possiamo ottenere l'albero della sintassi di TypeScript?] (Http://stackoverflow.com/questions/18714501/how-can-we-get-the-syntax-tree- di dattiloscritto) – ColinE

risposta

7

questa domanda è venuto prima di back in September

non al momento non è qualcosa che farà questo per voi - il non c'è magia getSyntaxTree metodo da chiamare che farà questo.

Il compilatore TypeScript è open-source, tuttavia, e scritto interamente in TypeScript in modo da poterlo scansionare per scoprire se c'è qualcosa che è possibile utilizzare/aggiungere a un handle.

Il lato positivo di questo è che hai una grande opportunità di pubblicare il tuo lavoro come un progetto open-source a giudicare dai voti positivi delle due domande, c'è una certa domanda per questo.

In alternativa, prendi l'albero della sintassi dal codice JavaScript compilato (che è il codice che verrà effettivamente eseguito in fase di esecuzione) utilizzando Esprima o SpiderMonkey.

+1

+1 come previsto.Ho l'altra domanda già favorita :) – basarat

+0

Mille grazie per il tuo consiglio, mi ha aiutato molto. – bukvaG

12

Il parser TypeScript non produce direttamente un albero del genere, ma è comunque possibile utilizzare il suo modello a oggetti per fare ogni sorta di cose. Lo usiamo in alcuni strumenti per fare trasformazioni di sintassi a scopo di test, per esempio. Ecco un frammento di codice che è possibile utilizzare per stampare l'albero di sintassi:

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); 
+0

Come posso ottenere questo nel file app.js ?: var TypeScript = require ('./ typescriptServices'); in modo che funzioni? –

+0

Ho spiegato la domanda in modo più dettagliato qui: http://stackoverflow.com/questions/23983998/how-do-i-require-the-typescriptservices-d-ts-in-a-node-js-app –

+2

Ho pensato è uscito e ha parlato dei miei risultati su http://blog.ctaggart.com/2014/06/typescript-ast-from-nodejs.html –

0

ho trovato recast di lavorare molto bene. Esempio:

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

Questa uscita volontà c'è bisogno di informazioni e TypeAnnotation evento, quindi questo è veramente sorprendente 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

Per quanto ho provato, recast non riconoscerà la sintassi completa del dattiloscritto. – Jaime