Adding Go's Defer to the TypeScript Compiler
L'auteur a tenté d'ajouter l'instruction defer de Go au compilateur TypeScript et a réalisé une transformation d'arbre syntaxique pour en émuler le comportement à l'exécution. Il a étendu l'analyseur pour reconnaître DeferStatement, ajouté des vérifications (emplacement dans une fonction, appel valide) et transformé chaque fonction contenant des defer pour maintenir une pile interne de callbacks qui capturent immédiatement le callee, le receiver et les arguments et sont exécutés en LIFO au moment de la sortie. Pour les fonctions async il rejette l'expression "defer await" et, dans la transformation, chaque cleanup différé est attendu séquentiellement pendant le finally; les règles d'erreur imposent que tout cleanup s'exécute, que l'erreur initiale soit préservée et que les erreurs multiples soient regroupées dans un AggregateError. Après avoir traité tous les cas limites l'auteur conclut que defer ne convient probablement pas à TypeScript car en JavaScript les exceptions sont du contrôle de flux et obligent à définir des politiques d'agrégation, de priorité et d'exécution asynchrone absentes en Go. Comme alternative il recommande la proposition ECMAScript d'Explicit Resource Management avec des objets Disposable et la syntaxe using (par exemple using await acquirePermit(sema)), et indique qu'une implémentation MVP de defer existe dans une branche de son fork TypeScript.