2017-08-14 103 views
0

我正在開發Roslyn分析器來檢測特定方法的使用,method1。我想允許在forwhile循環中使用此方法,並在代碼中的所有其他情況下創建一個問題。如何在使用Roslyn的給定節點之前查找節點?

我該怎麼做?我開發的代碼隨處可見method1。每次我找到函數時,我都會想要檢查它是否在循環中,並且只有在循環中不產生錯誤。

+2

但是,您希望允許的* nesting *級別是什麼?你的分析儀應該離呼叫棧多遠?如果你有一個調用鏈'methodN'->'method2'->'method1'並且調用這個鏈的循環在'methodN'中?另外,考慮一下在運行時和編譯時代碼結構不一樣的事實。如果您將'method1'作爲委託傳遞給另一個將其封裝在循環中的方法,那麼在運行時呢?就像LINQ使用'Func'一樣。 – ironstone13

回答

2

該方法調用將是循環聲明的後代,如果它在其中。您可以訪問任何SyntaxNodeAncestors資產。開始在您檢測到的MethodInvocation節點的祖先中間,直到您點擊循環或成員聲明。

如果你打了一個循環(ForStatementSyntaxWhileStatementSyntax),那麼你很好。 如果你點擊一個MemberDeclarationSyntax節點,這意味着你已經到達了你調用method1的任何塊的開始,並且可能會拋出一個錯誤。

在這一點上,你的直接問題是主要是解決了,你必須決定你想要覆蓋多少個角落案例。如果從lambda表達式調用它會怎麼樣?如果調用method1的方法是從循環中調用的呢?或從遞歸方法?

您可以檢測到所有這些情況,但您必須決定是否值得您付出努力。

相關問題