2016-11-24 42 views
1

我有一個帶有1重載的方法,我想找出與Roslyn是否有人調用過載方法並在這種情況下顯示提示。爲Roslyn提供某種特定方法的調用者信息

的方法是這樣的:

public void Info(string message, [CallerMemberName] string memberName = "") 
{ 
} 


public void Info(string message, string secondMessage, [CallerMemberName] string memberName = "") 
{ 
} 


如果有人類型,例如:

Info("The message", secondMessage: "Second message"); 

我想顯示一些信息給開發者。


是否可以與Roslyn做到這一點?

回答

0

是否有可能與Roslyn做到這一點?

是的。你需要得到從語義模型的方法符號,然後用FindReferencesAsync

// Get your semantic model 
var semanticModel = compilation.GetSemanticModel(tree); 
//Or 
var semanticModel = document.GetSemanticModelAsync(); 

// Get the method you want to find references to. 
// You have a lot of ways to do that, but for example: 
var method = doc.GetSyntaxRootAsync(). 
    Result.DescendantNodes(). 
    OfType<InvocationExpressionSyntax>(). 
    First(); 
//Or 
var method = root.DescendantNodes(). 
    OfType<InvocationExpressionSyntax>(). 
    First(); 

//Then get the symbol info of the method 
var methodSymbol = semanticModel.GetSymbolInfo(method).Symbol; 

// And finally 
SymbolFinder.FindReferencesAsync(methodSymbol, solution).Result 

我建議閱讀有關Solution\Project\DocumentSyntaxTree\Root\NodeCompilation\SemanticModel

一旦你明白了這一點,就可以輕鬆地將分析器寫入你想要的東西。我可以在這裏粘貼一個分析器的例子,但是你可以在網絡中找到更多的東西(例如,查看我評論中的鏈接)。

+0

謝謝你非常。你是否也知道,如何在Visual Studio的診斷分析器中使用它? –

+1

@ Mi.Sharp當你編寫分析器\代碼修復時,你有一個上下文,從上下文中你可以得到你所需要的(根,文檔,語義模型等)。例如,檢查[this](https://github.com/dotnet/roslyn/wiki/How-To-Write-a-C%23-Analyzer-and-Code-Fix)。 –

+0

這幫了很多,謝謝。 –

1

根據不同的場景中,可能足以只是添加[Obsolete]

[Obsolete("You're probably doing it wrong, neighbour", false)] 
public void Info(string message, string secondMessage, 
    [CallerMemberName] string memberName = "") 

如果你想從一些自己的代碼中調用它,而不警告:

#pragma warning disable 0618 
Info("foo", "bar", "blap"); 
#pragma warning restore 0618 
+0

這非常接近我想要的。應該有可能在分析器中做到這一點,以便我可以控制一些行爲?:) –

+0

@ Mi.Sharp,我相信你*可以*在分析器中做到這一點;我從來沒有寫過一個,雖然... –

+0

@ Mi.Sharp你可以用分析器做到這一點,你可以在我的答案中看到。有關編寫分析器的幫助,您可以查看我評論中的鏈接。如果您還有任何問題,請告訴我。 –

相關問題