Как создать код C# из ICompilationUnit (ICSharpCode)

Я пытаюсь обновить существующий код C#. Код анализируется с использованием ICSharpCode.NRefactory.IParser, Моя система широко используется ICompilationUnit изучить существующий код.

Теперь я хочу добавить метод в существующий файл и сохранить его обратно на диск в виде кода C#. Пока что у меня есть:

CompilationUnit compilationUnit = GetCompilationUnit();
var visitor = new NRefactoryASTConvertVisitor(new ParseProjectContent());
compilationUnit.AcceptVisitor(visitor, null);
IMethod method = //GetMethod from otherplace
visitor.Cu.Classes[0].Methods.Add(method);
// How the updated visitor.Cu be transformed to C# code

Я хотел бы создать код на C# из visitor.Cu, Есть ли способ генерировать код C# из ICompilationUnit?

1 ответ

Решение

Вы добавляете метод в качестве IMethod - IMethod просто представляет метод как объект DOM вместе с некоторой информацией о его сигнатуре (без какого-либо кода) - поэтому я не понимаю, как вы сможете сгенерировать код C# из него...

(если вы не имеете в виду создание кода только для сигнатуры метода? в этом случае вам следует обратиться к классу ICSharpCode.SharpDevelop.Dom.Refactoring.CodeGenerator для преобразования DOM->AST, а именно к ConvertMember(IMethod m, ClassFinder targetContext) метод).

Однако ваш CompilationUnit является абстрактным синтаксическим деревом файла кода и может быть легко преобразован обратно в код C#/VB.NET с помощью классов CSharpOutputVisitor и VBNetOutputVisitor.

Вы можете добавить MethodDeclaration, который представляет код вашего метода, в TypeDefinition, который представляет некоторый класс в исходном файле, а затем использовать вышеупомянутых выходных посетителей, чтобы сгенерировать код со вставленным вашим новым методом.

Для вашего удобства я прилагаю метод расширения PrettyPrint, который полезен при работе по преобразованию INodes в код:

    public static string PrettyPrint(this INode code, LanguageProperties language)
    {
        if (code == null) return string.Empty;
        IOutputAstVisitor csOutVisitor = CreateCodePrinter(language);
        code.AcceptVisitor(csOutVisitor, null);
        return csOutVisitor.Text;
    }

    private static IOutputAstVisitor CreateCodePrinter(LanguageProperties language)
    {
        if (language == LanguageProperties.CSharp) return new CSharpOutputVisitor();
        if (language == LanguageProperties.VBNet) return new VBNetOutputVisitor();
        throw new NotSupportedException();
    }

    public static string ToCSharpCode(this INode code)
    {
        return code.PrettyPrint(LanguageProperties.CSharp);
    }
Другие вопросы по тегам