public override Task <Reference[]> FindReferences(ReferencesParams @params) => FindReferences(@params, CancellationToken.None);
internal async Task <Reference[]> FindReferences(ReferencesParams @params, CancellationToken cancellationToken) { var uri = @params.textDocument.uri; ProjectFiles.GetAnalysis(@params.textDocument, @params.position, @params._version, out var entry, out var tree); TraceMessage($"References in {uri} at {@params.position}"); var analysis = entry != null ? await entry.GetAnalysisAsync(50, cancellationToken) : null; if (analysis == null) { TraceMessage($"No analysis found for {uri}"); return(Array.Empty <Reference>()); } tree = GetParseTree(entry, uri, cancellationToken, out var version); var extras = new List <Reference>(); if (@params.context?.includeDeclaration ?? false) { var index = tree.LocationToIndex(@params.position); var w = new ImportedModuleNameWalker(entry, index, tree); tree.Walk(w); if (w.ImportedType != null) { @params._expr = w.ImportedType.Name; } else { foreach (var n in w.ImportedModules) { if (Analyzer.Modules.TryGetImportedModule(n.Name, out var modRef) && modRef.AnalysisModule != null) { // Return a module reference extras.AddRange(modRef.AnalysisModule.Locations .Select(l => new Reference { uri = l.DocumentUri, range = l.Span, _version = version?.Version, _kind = ReferenceKind.Definition }) .ToArray()); } } } } IEnumerable <IAnalysisVariable> result; if (!string.IsNullOrEmpty(@params._expr)) { TraceMessage($"Getting references for {@params._expr}"); result = analysis.GetVariables(@params._expr, @params.position); } else { var finder = new ExpressionFinder(tree, GetExpressionOptions.FindDefinition); if (finder.GetExpression(@params.position) is Expression expr) { TraceMessage($"Getting references for {expr.ToCodeString(tree, CodeFormattingOptions.Traditional)}"); result = analysis.GetVariables(expr, @params.position); } else { TraceMessage($"No references found in {uri} at {@params.position}"); result = Enumerable.Empty <IAnalysisVariable>(); } } var filtered = result.Where(v => v.Type != VariableType.None); if (!(@params.context?.includeDeclaration ?? false)) { filtered = filtered.Where(v => v.Type != VariableType.Definition); } if (!(@params.context?._includeValues ?? false)) { filtered = filtered.Where(v => v.Type != VariableType.Value); } var res = filtered.Select(v => new Reference { uri = v.Location.DocumentUri, range = v.Location.Span, _kind = ToReferenceKind(v.Type), _version = version?.Version }) .Concat(extras) .GroupBy(r => r, ReferenceComparer.Instance) .Select(g => g.OrderByDescending(r => (SourceLocation)r.range.end).ThenBy(r => (int?)r._kind ?? int.MaxValue).First()) .ToArray(); return(res); }
public virtual Task <Reference[]> FindReferences(ReferencesParams @params) => throw new NotImplementedException();