2017-06-05 1 views
0
// Input 
class Foo { 
    templateString = 'some value'; 
} 

// Output 
import __LIB__ from '@scope/lib/path/to/lib'; 

class Foo { 
    templateString = (function compiledTemplate(deps) { 
     // ... 
     return result; 
    })({lib: __LIB__}); 
} 

J'ai deux questions:Insérer un texte arbitraire et modifier NodeArrays dans le En fait, API compilateur tapuscrit

  1. Comment créer fragment d'AST de chaîne?
  2. Comment ajouter une importation?

post-scriptum I tried diverses méthodes createSourceFile et ts.createImportDeclaration, mais ils conduisent tous à telle ou telle erreur: [

+1

Avez-vous essayé de créer un identificateur avec le texte approprié pour le nœud de remplacement? En d'autres termes: '' createIdentifier ('(function compiledTemplate (deps) {/*...*/}') ''. –

+0

C'est un travail 0_o , mais comment ajouter 'import lib de '@ scope/lib';'? – RubaXa

Répondre

1

Pour ajouter dans le texte arbitraire, la meilleure façon que je connaisse est d'utiliser createIdentifier avec la chaîne que vous souhaitez insérer.


Pour ajouter dans une déclaration d'importation, rappelez-vous que vous mettez à jour l'arbre sans l'original muter.

L'API ts.visitEachChild prend un paramètre nodesVisitor qui fonctionne spécialement sur NodeArray s. Habituellement, si vous ne passez pas un nodesVisitor dedans, il fonctionnera sur chaque Node dans le NodeArray en utilisant le premier rappel que vous passez pour le paramètre visitor, mais ici vous voulez spécialement opérer sur le tableau de nœuds complet.

Dans votre cas, vous êtes intéressé par une des déclarations de SourceFile (qui est un NodeArray<Statement> Vous pouvez créer l'importation avec createImportDeclaration, et mettre à jour le SourceFile en passant dans un nodesVisitor comme ce qui suit:.

function addImport(statements: ts.NodeArray<ts.Statement>) { 
    const importStatement = ts.createImportStatement(/*...*/); 
    return ts.createNodeArray([importStatement, ...statements]); 
} 

visitEachChild(
    sourceFile, 
    /*replace this with something that controls traversal*/ x => x, 
    context, 
    addImport); 
+0

Hélas, ne fonctionne pas: https://gist.github.com/RubaXa/5896badb923f0805aa9fcdc480afe9cc#file-x-danielros enwasser-ts – RubaXa

+0

Consultez l'exemple que j'ai donné pour savoir comment créer un nouveau noeud et comment appeler 'visitEachChild'. –

+0

Arrivé, mais ne fonctionne toujours pas correctement: https://github.com/RubaXa/typescript-api-questions/tree/master/import-add – RubaXa