Búsqueda de sitios web

análisis sintáctico - Cómo analizar una base de código TypeScript en ASTs


Quiero analizar proyectos de TypeScript en ASTs.

Puedo analizar un solo archivo por:

import ts = require("typescript");
var fs          = require('fs');
var util      = require('util');


const ast = ts.createSourceFile('sample.ts', fs.readFileSync('sample.ts').toString(), ts.ScriptTarget.ES6, true);

console.log("AST:"+util.inspect(ast));

Incluso puedo recorrer los archivos y filtrar los archivos por extensión y ejecutar el código anterior para generar AST.

Sin embargo, quiero analizar todo el proyecto de tal manera que las relaciones (como las importaciones) se conserven en el AST.

Por ejemplo:

Si a.ts está haciendo referencia a la variable x de b.ts como se muestra a continuación:

a.ts:

var y = x;

b.ts:

var x = 5;

En este caso, la firma de x en un .ts debería resolverse como: b.ts.x o equivalente.

Solo quiero que todas esas relaciones se resuelvan en los ASts mientras analizo los archivos .ts uno por uno.

Respuesta #1

Puedes cargar tu proyecto usando

ts.createProgram(rootNames: string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program)

rootNames es la lista de todos los archivos TypeScript en tu proyecto. Hasta donde sé, a menos que declares el tipo explícitamente, el AST no tendrá ninguna referencia a él.

por ejemplo, si tienes

class MyClass { 
   // some code
}

let instance1 = new MyClass();
let instance2: MyClass = new MyClass();

En el AST, el nodo para instance1 tendrá la propiedad type como undefined, para instance2 la propiedad type tendrá un TypeReference adecuado

Para la verificación de tipos puedes usar Program.getTypeChecker(). Esto devuelve un TypeChecker que se puede usar para analizar archivos en el programa.