Skip to content

Instantly share code, notes, and snippets.

@vendettamit
Created October 7, 2015 21:06
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vendettamit/5a1a71eba84c741b397a to your computer and use it in GitHub Desktop.
Save vendettamit/5a1a71eba84c741b397a to your computer and use it in GitHub Desktop.
This is a sample code that can be used to find references using Roslyn version Microsoft.CodeAnalysis 1.0.0
class ReferenceFinder
{
public void Find(string methodName)
{
string solutionPath = @"C:\Users\achoudhary\Documents\Visual Studio 2013\Projects\ConsoleForEverything\ConsoleForEverything.sln";
var msWorkspace = MSBuildWorkspace.Create();
List<ReferencedSymbol> referencesToMethod = new List<ReferencedSymbol>();
Console.WriteLine("Searching for method \"{0}\" reference in solution {1} ", methodName, Path.GetFileName(solutionPath));
ISymbol methodSymbol = null;
bool found = false;
//You must install the MSBuild Tools or this line will throw an exception.
var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
foreach (var project in solution.Projects)
{
foreach (var document in project.Documents)
{
var model = document.GetSemanticModelAsync().Result;
var methodInvocation = document.GetSyntaxRootAsync().Result;
InvocationExpressionSyntax node = null;
try
{
node = methodInvocation.DescendantNodes().OfType<InvocationExpressionSyntax>()
.Where(x => ((MemberAccessExpressionSyntax)x.Expression).Name.ToString() == methodName).FirstOrDefault();
if (node == null)
continue;
}
catch(Exception exception)
{
// Swallow the exception of type cast.
// Could be avoided by a better filtering on above linq.
continue;
}
methodSymbol = model.GetSymbolInfo(node).Symbol;
found = true;
break;
}
if (found) break;
}
foreach (var item in SymbolFinder.FindReferencesAsync(methodSymbol, solution).Result)
{
foreach (var location in item.Locations)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Project Assembly -> {0}", location.Document.Project.AssemblyName);
Console.ResetColor();
}
}
Console.WriteLine("Finished searching. Press any key to continue....");
}
}
}
@AliSarshogh
Copy link

Could you possibly review my code at
http://stackoverflow.com/questions/35437644/how-can-i-have-all-references-of-a-method-in-roslyn-method-is-called-by-other-c

? I followed your code but it does not work, also References could not be founded in entire solution

@M-Yankov
Copy link

M-Yankov commented Feb 2, 2018

Invoking SymbolFinder.FindReferencesAsync(methodSymbol, solution).Result throws an exception An item with the same key has already been added.

Microsoft.CodeAnalysis version="2.6.1"

@ChaitaliSen
Copy link

Can we get line number from this method

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment