2017-11-14 7 views
1

私はC#コンパイラ用のアナライザを開発中です。私の仕事の1つは、すべてのクラスプロパティのsetメソッドが特定のメソッドを実行ボディで呼び出していることを確認することです。特定のメソッド呼び出しのためにプロパティ実行ボディをチェックする

は、私は次のような単純なクラスがあるとします。

public class SomeClass 
{ 
    public void SetPropertyValue(int propertyValue) 
    { 
     // some code here 
    } 
} 

public class MyClass : SomeClass 
{ 
    public int MyProperty1 
    { 
     set => SetPropertyValue(value); 
    } 

    public int MyProperty2 
    { 
     set => AnotherMethod(value); 
    } 
} 

をクラス宣言のオブジェクトがタイプINamedTypeSymbolmyClassTypeSymbolに格納されているとします。

私は呼び出しを介して、分析のためのすべてのプロパティオブジェクトを取得:今すぐ

var propertyObjects = myClassTypeSymbol.OfType<IPropertySymbol>(); 

propertyObjectsMyProperty1と内部MyProperty2Enumerationが含まれています。

この列挙を繰り返し、すべてのプロパティに対してsetメソッドを取得します。私はドキュメントから理解されるように

foreach (var onePropertyObject in propertyObjects) 
{ 
    IMethodSymbol setMethod = onePropertyObject.SetMethod; 

    // setMethod contains "set" method of a processing property. 

    // how can I test here, 
    // that setMethod contains invocation of SetPropertyValue() method? 
} 
+0

ユニットテスト用ですか? –

+0

はい、単体テスト用です。 –

+0

あなたは 'SomeClass'を変更できますか?もしそうなら、 'SetPropertyValue()'から 'PropertyChanged'スタイルのイベントを発生させることが明らかですが、あなたは既に考えていると思います。 –

答えて

0

は限りsetMethod変数からメソッド本体を入手する方法はありません。

しかし、構文木と処理構文木ノードで作業することは可能です。

使用CSharpSyntaxTreeは、そのようなコードを、解析する:

var tree = CSharpSyntaxTree.ParseText(@" 
    // code to be analyzed goes here 
"); 

そして、構文木のルートノードを取得します:

SyntaxNode rootNode = tree.GetRoot(); 

そして、あなたは、クラス、メソッド、プロパティ宣言を取得することができます

var classes = rootNode.DescendantNodes().OfType<ClassDeclarationSyntax>(); 
var methods = rootNode.DescendantNodes().OfType<MethodDeclarationSyntax>(); 
var properties = rootNode.DescendantNodes().OfType<PropertyDeclarationSyntax>(); 

次に、DescendantNodes()コールを使用して、descendant syを取得します。 ntaxノードとGetText()を使用して、ノードテキストを解析します。

これだけです。

関連する問題