2017-07-14 28 views
0

我正在嘗試使用Roslyn來確定有關添加到集合中的對象的信息。代碼的一般模式是將IList傳遞給一個方法(我可以獲得MethodDeclarationSytax),然後將一些對象添加到該集合中。我需要能夠告訴Add方法在傳入的集合中被調用的位置,它始終是傳遞給該方法的唯一參數。Roslyn可以識別與給定變量相對應的所有令牌嗎?

我只能弄清楚如何在字符串匹配到標記上做到這一點,而不是能夠直接識別給定的標記是基於範圍的相同變量。

如何從Roslyn獲取信息,表明標記實際上是基於範圍實際引用相同的變量?在語義視圖中是否有這個選項?字符串比較和手動範圍檢查是唯一可用的選項嗎?

public void AddColumns(IList<Column> columns) 
{ 
    Column newColumn = new Column("something"); 
    columns.Add(newColumn); 

    newColumn = new Column("somethingElse"); 
    columns.Add(newColumn); 

    Column anotherNewColumn = new Column("something else"); 
    anotherNewColumn.MakeSomeChanges("123"); 
    columns.Add(anotherNewColumn); 
} 

在這段代碼中,例如,我爲AddColumns指定了MethodDeclarationSyntax。我需要能夠將第4,7和11行識別爲發生Add的位置,並且最好還需要確定newColumn和anotherNewColumn來自哪裏(第3,6和9行)。

我可以回退到基於字符串的檢查,如果我必須,但我擔心遺漏的情況不符合我的預期,因爲也有添加列使用方法的例子,所以它會得到真的很複雜。

+0

只有一個建議:你會發現研究這種以正確名稱搜索的東西比較容易 - 羅斯林不是羅莎琳。我知道,爲這樣的產品名稱拼寫錯誤非常容易;我不想批評。 (我看過「lambda」的次數,並且對'b'是否屬於那裏感到困惑。) –

+0

至於實際的問題 - 我不確定*它是否進行那種數據流分析。如果你給出一個你正在分析的代碼類型的具體例子,它可能會幫助別人提出你的問題。 –

+0

@JonSkeet - 感謝您的編輯。我甚至知道我拼錯了它,但仍然沒有進入我的腦海,錯過了我再次滑入錯誤的拼寫。謝謝你的收穫。我會嘗試模擬一個樣本,使其更清晰。我有點擔心它不能做到這一點,但它似乎很奇怪,因爲它是從一個類似的樹到如果我的理解是正確的編譯器使用的。 –

回答

1

您需要使用SemanticModel API,您可以從Compilation對象獲取作爲編譯組成部分的特定SyntaxTree的API。使用SemanticModel,您可以通過爲參數名稱(可能是IdentifierNameSyntax)的表達式調用GetSymbolInfo來獲取源中特定點處引用的符號。