0

既存の 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ますか?

4

1 に答える 1

2

メソッドを IMethod として追加しています。IMethod はメソッドを DOM エンティティとして表し、その署名に関する情報を (コードなしで) 表示するだけです。そのため、そこから C# コードを生成する方法がわかりません。 ...

(メソッドの署名のためだけにコードを生成するつもりでない限り? その場合は、DOM->AST 変換、特にConvertMember(IMethod m, ClassFinder targetContext)メソッドのクラス ICSharpCode.SharpDevelop.Dom.Refactoring.CodeGenerator を調べる必要があります)。

ただし、 CompilationUnitはコード ファイルの抽象構文ツリーであり、 CSharpOutputVisitorおよび VBNetOutputVisitor クラスを使用して簡単に C#/VB.NET コードに戻すことができます。

メソッドのコードを表す MethodDeclaration を、元のファイルのクラスを表す TypeDefinition に追加し、前述の出力ビジターを使用して、新しいメソッドが挿入されたコードを生成できます。

便宜上、INode をコードに変換する際に役立つ PrettyPrint 拡張メソッドを添付します。

    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);
    }
于 2011-03-24T15:30:32.093 に答える