Ce que vous voulez est une source à la source program transformation system (PTS).
Ces outils analysent le code source dans RSHS, vous offrent la possibilité de transformer ces RSHS dans d'autres RSHS avec des motifs de surface syntaxe, puis cracher sur la source code pour l'AST révisé en conséquence. Si vous passez des AST dans une langue aux AST dans une autre, vous obtenez ce que vous appelez un transpiler (ce n'est pas mon terme préféré, PTS était très bien).
Source à la syntaxe de transformation source varie, mais en substance, vous écrivez quelque chose comme cela en utilisant la surface syntaxe du langage (réelle) des langues source et cible:
if you see *this*, replace it by *that* if some_condition(*this*)
Le ce et cet élément sont des motifs exprimés dans la syntaxe du langage; Le conditionnel optionnel ("contrainte sémantique") permet à l'outil de prendre en compte les informations de contexte (telles que les propriétés des symboles, etc.). Souvent, il faut plusieurs ou plusieurs règles pour accomplir une transformation complexe; les règles peuvent généralement être séquencées pour obtenir un effet composé d'intérêt. L'expression des rulles et leur séquencement sont des "scripts" qui intéressent OP.
Vous devez soit en obtenir un qui acceptera les nouvelles définitions de langue (les très générales seront) et définissez JavaScript, ou en obtenir un qui a déjà un analyseur JavaScript disponible et simplement l'utiliser. Un de ces genres, PTS est notre DMS Software Reengineering Toolkit. Il a un Javascript front end disponible.
problème de changement de nom de OP peut être spécifié comme en a DMS Rewrite Rule comme suit:
rule rename_controller(): IDENTIFIER
"controller" -> "getController";
Les guillemets sont méta citations utilisées pour distinguer la syntaxe de la langue de motif, de la syntaxe des langauges source/cible , qui est écrit à l'intérieur des méta quotes. Pour renommer tous les appels API, OP aurait besoin de règles pour chaque entrée d'API unique.
Bien que facile à écrire, c'est plutôt lourd; tout identifiant portant ce nom dans les fichiers traités par le sera renommé ainsi. Cela peut renommer "controller" dans les portées que OP n'a pas l'intention. S'il n'y a pas de risque de plusieurs déclarations avec le même nom, alors il sera possible de l'exécuter en toute sécurité en utilisant la tactique intégrée de DMS «appliquer les règles partout» comme tâche scriptable en ligne de commande. (Il peut être plus facile de renommer les identifiants utilisés dans le code OP pour les API, il est plus facile d'éviter les collisions de noms dans le code qu'il écrit que les collisions de noms dans les fichiers sources des API qu'il n'a pas écrites).
Pour ce faire droit, OP doit se qualifier en quelque sorte qui déclaration de « contrôleur » il veut renommé. Ce qu'il devra définir une contrainte personnalisée qui vérifie qu'il est renommant le « bon », quelque chose comme:
rule rename_controller(i:IDENTIFIER): IDENTIFIER
"\i" -> "getController"
if (match(i,"controller") & declaration_at_line(i,1219);
nous nous adaptons ici un identifiant avec l'intention d'obtenir un accès au nœud AST dans lequel il est trouvé (\ texte de syntaxe de surface interne, i en dehors de ce texte.). Le prédicat match est déjà intégré dans DMS; il est utilisé pour insister sur le fait que nous avons trouvé le bon nom. Le prédicat declaration_at_line est utilisé pour vérifier que le nœud AST correspondant correspond à un nœud ayant le même nom déclaré à un emplacement spécifique dans le fichier. Cela nécessite ce qui équivaut à une recherche de nom étendue qui suit les règles ECMAScript, donc un travail personnalisé est requis. (À l'heure actuelle, ce front-end DMS ne fournit pas cela, d'autres frontaux DMS pour d'autres langues fournissent parfois cette capacité hors de la boîte). Le choix de la manière de contraindre quelle déclaration est la cible est plutôt arbitraire; on pourrait définir par le chemin de la racine de l'espace de noms global pour arriver à atteindre comme OP laisse deviner dans son exemple:
... declaration_in(i,"Room.prototype") ...
On aura toujours besoin de règles de consultation de portée pour traiter un tel chemin.
Nous remarquons que quel que soit le PTS choisi par OP, une recherche de portée sera nécessaire pour un renommage précis. Beaucoup d'autres PTS (TXL, Stratego, ...) n'apportent aucun support pour la mise en œuvre de ce système.
Enveloppez tout votre code dans un IIFE et isolez-le de l'espace de noms global ??Pas tout à fait clair où les collisions se produisent – charlietfl
C'est exactement ce que je fais en ce moment, mais les appels de fonctions supplémentaires sont des frais généraux que je veux éviter, d'où ma demande pour un moyen de renommer-sur-transpiler. –