我正在尝试更新现有的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
我想做的是从visitor.Cu
生成C#代码。有没有办法从ICompilationUnit
生成C#代码?
答案 0 :(得分:2)
您将方法添加为IMethod - IMethod只是将方法表示为DOM实体以及有关其签名的一些信息(没有任何代码) - 所以我看不出您将如何生成C#来自它的代码......
(除非你的意思是为方法的签名生成代码?在这种情况下,你应该查看用于DOM-> AST转换的类ICSharpCode.SharpDevelop.Dom.Refactoring.CodeGenerator,特别是ConvertMember(IMethod m, ClassFinder targetContext)
方法)。
然而, CompilationUnit 是代码文件的抽象语法树,可以使用CSharpOutputVisitor和VBNetOutputVisitor类轻松地转换回C#/ VB.NET代码。
您可以将表示方法代码的MethodDeclaration添加到TypeDefinition中,该TypeDefinition表示原始文件中的某个类,然后使用上述输出访问者生成插入新方法的代码。
为了您的方便,我附加了一个PrettyPrint扩展方法,该方法在将INode转换为代码时非常有用:
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);
}