Как создать код 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);
}