public FindUsagesResponse FindUsages(FindUsagesRequest request) { var res = _parser.ParsedContent(request.Buffer, request.FileName); var loc = new TextLocation(request.Line, request.Column); var result = new ConcurrentBag<AstNode>(); var findReferences = new FindReferences(); ResolveResult resolveResult = ResolveAtLocation.Resolve(res.Compilation, res.UnresolvedFile, res.SyntaxTree, loc); if (resolveResult is LocalResolveResult) { var variable = (resolveResult as LocalResolveResult).Variable; findReferences.FindLocalReferences(variable, res.UnresolvedFile, res.SyntaxTree, res.Compilation, (node, rr) => result.Add(node), CancellationToken.None); } else { IEntity entity = null; if (resolveResult is TypeResolveResult) { entity = (resolveResult as TypeResolveResult).Type.GetDefinition(); } if (resolveResult is MemberResolveResult) { entity = (resolveResult as MemberResolveResult).Member; } if (entity == null) { return new FindUsagesResponse {Usages = new List<Usage>()}; } var searchScopes = findReferences.GetSearchScopes(entity); var interesting = new List<CSharpUnresolvedFile>(); foreach (var scope in searchScopes) { var scopeInteresting = findReferences.GetInterestingFiles(scope, res.Compilation); interesting.AddRange(scopeInteresting); } Parallel.ForEach(interesting, file => { ParsedResult parsedResult = _parser.ParsedContent( _solution.GetFile(file.FileName).Content.Text, file.FileName); findReferences.FindReferencesInFile(searchScopes, file, parsedResult.SyntaxTree, parsedResult.Compilation, (node, rr) => result.Add(node), CancellationToken.None); }); } var usages = result.Select(node => new Usage { FileName = node.GetRegion().FileName, Text = node.Preview(_solution.GetFile(node.GetRegion().FileName)).Replace("'", "''"), Line = node.StartLocation.Line, Column = node.StartLocation.Column, }); return new FindUsagesResponse { Usages = usages }; }
public QuickFixResponse FindUsages(FindUsagesRequest request) { var result = FindUsageNodes(request) .Distinct(new NodeComparer()) .OrderBy(n => n.GetRegion().FileName.FixPath()) .ThenBy(n => n.StartLocation.Line) .ThenBy(n => n.StartLocation.Column); var res = new QuickFixResponse(); if (result.Any()) { var usages = result.Select(node => new QuickFix { FileName = node.GetRegion().FileName, Text = node.Preview(_solution.GetFile(node.GetRegion().FileName), request.MaxWidth).Replace("'", "''"), Line = node.StartLocation.Line, Column = node.StartLocation.Column, }); res.QuickFixes = usages; } return(res); }