Вы можете использовать инструменты, которые захватывают форматирование и комментарии, и регенерируют их по завершении процесса преобразования, как вы заметили, что делает Roslyn.Однако Roslyn и «компилятор» TypeScript специфичны для их целевых языков.
В общем, вам нужна «система преобразования программ».Это инструменты, которые принимают грамматики, автоматически создают AST, которые захватывают все эти данные форматирования, позволяют вам определять преобразования с использованием шаблонов уровня источника и выполнять эти преобразования путем сопоставления / исправления AST, и они просто распечатывают модифицированное дерево, сохраняющее эти данные форматирования.
Наш комплект реинжиниринга программного обеспечения DMS может сделать это.
Для этого нужно определить грамматику целевого языка;мы сделали для многих языков, включая JavaScript, но еще не для TypeScript.Однако вы можете строить языковые диалекты, опираясь на другие определения.Или вы можете сделать TypeScript с нуля;это не сложно, если у вас есть явная грамматика, которая, я думаю, существует для TypeScript.Часть этого определения сообщает синтаксическому анализу, как распознать комментарии, чтобы их можно было сохранить;DMS знает, как сохранить все данные форматирования и макета.
Таким образом, для решения конкретной задачи вы могли бы написать на самом деле очень простые преобразования, используя правила перезаписи DMS:
source domain ECMAScript~TypeScript; -- assuming TypeScript is built as a dialect
target domain ECMAScript~TypeScript; -- we're defining rules that map TypeScript to itself
-- you could write rules map TypeScript to C++ if you insist
rule InternationalizeStringLiteral(s:STRINGLITERAL): primary-> primary
= "\s"-> "Translate(\s)";
rule InternationalizeJsText(jst:JSTText): primary -> primary
= " \jst " -> "Translate(\jst)";
ruleset Internationalize = { InternationalizeStringLiteral, InternationalizeJsText};
Вы можетепопросите DMS проанализировать файл, применить нижний набор правил к вашему дереву, а затем распечатать результат.
Эти правила полностью поддерживают синтаксис, поскольку они работают с AST, поэтому их не обманывает текст в комментариях.или строковые литералы, или границы строк / пробелы / форматы / переплетенные комментарии, ...
Теперь у вас есть 1000 файлов для изменения.Это достаточно большой, поэтому может стоить усилий для определения TypeScript и применения DMS.(Если бы интерфейсная часть TypeScript для DMS была готова, было бы хлопотать, сделайте все выше).Иногда это не так;YMMV в зависимости от того, что вы действительно хотите сделать.DMS лучше всего использовать на больших базах кода, и он действительно хорош, если вам нужно выполнить сложные преобразования.