开发者

How to generate C# code from ICompilationUnit (ICSharpCode)

I'm trying to update an existing C# code. The code is parsed using ICSharpCode.NRefactory.IParser. My system is using widely ICompilationUnit to explore existing code.

Now, I want to add a method to an existing file and save it back to disk as C# code. So far I have:

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

What I'd like to do is to generate C# code from visitor.Cu. Is there a way to g开发者_运维技巧enerate C# code from ICompilationUnit?


You're adding the method as an IMethod - an IMethod just represents a method as a DOM entity along with some information about its signature (without any code) - so I don't see how you would be able to generate C# code from it...

(unless you mean generating code just for the method's signature? in which case you should look into the class ICSharpCode.SharpDevelop.Dom.Refactoring.CodeGenerator for the DOM->AST conversion, specifically the ConvertMember(IMethod m, ClassFinder targetContext) method).

Your CompilationUnit, however, is the Abstract Syntax Tree of the code file, and can easily be converted back to C#/VB.NET code using the CSharpOutputVisitor and VBNetOutputVisitor classes.

You could add a MethodDeclaration that represents your method's code to a TypeDefinition which represents some class in the original file, and then use the aforementioned output visitors to generate the code with your new method inserted.

For your convinience I'm attaching a PrettyPrint extension method that is useful when working on converting INodes to code:

    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);
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜