private async Task ReportSymbolInformationAsync( INavigateToSearchResult result, CancellationToken cancellationToken ) { var location = await ProtocolConversions .TextSpanToLocationAsync( result.NavigableItem.Document, result.NavigableItem.SourceSpan, cancellationToken ) .ConfigureAwait(false); Contract.ThrowIfNull(location); _progress.Report( new VSSymbolInformation { Name = result.Name, ContainerName = result.AdditionalInformation, Kind = ProtocolConversions.NavigateToKindToSymbolKind(result.Kind), Location = location, Icon = new ImageElement(result.NavigableItem.Glyph.GetImageId()) } ); }
static async Task <SymbolInformation> CreateSymbolInformation(INavigateToSearchResult result, CancellationToken cancellationToken) { return(new SymbolInformation { Name = result.Name, Kind = ProtocolConversions.NavigateToKindToSymbolKind(result.Kind), Location = await ProtocolConversions.TextSpanToLocationAsync(result.NavigableItem.Document, result.NavigableItem.SourceSpan, cancellationToken).ConfigureAwait(false), }); }
protected async Task <LSP.Location[]?> GetDefinitionAsync(LSP.TextDocumentPositionParams request, bool typeOnly, RequestContext context, CancellationToken cancellationToken) { var document = context.Document; if (document == null) { return(null); } var locations = ArrayBuilder <LSP.Location> .GetInstance(); var position = await document.GetPositionFromLinePositionAsync(ProtocolConversions.PositionToLinePosition(request.Position), cancellationToken).ConfigureAwait(false); var findDefinitionService = document.GetRequiredLanguageService <IFindDefinitionService>(); var definitions = await findDefinitionService.FindDefinitionsAsync(document, position, cancellationToken).ConfigureAwait(false); if (definitions.Any()) { foreach (var definition in definitions) { if (!ShouldInclude(definition, typeOnly)) { continue; } var location = await ProtocolConversions.TextSpanToLocationAsync( definition.Document, definition.SourceSpan, definition.IsStale, cancellationToken).ConfigureAwait(false); locations.AddIfNotNull(location); } } else if (document.SupportsSemanticModel && _metadataAsSourceFileService != null) { // No definition found - see if we can get metadata as source but that's only applicable for C#\VB. var symbol = await SymbolFinder.FindSymbolAtPositionAsync(document, position, cancellationToken).ConfigureAwait(false); if (symbol != null && _metadataAsSourceFileService.IsNavigableMetadataSymbol(symbol)) { if (!typeOnly || symbol is ITypeSymbol) { var options = _globalOptions.GetMetadataAsSourceOptions(document.Project.LanguageServices); var declarationFile = await _metadataAsSourceFileService.GetGeneratedFileAsync(document.Project, symbol, signaturesOnly : false, options, cancellationToken).ConfigureAwait(false); var linePosSpan = declarationFile.IdentifierLocation.GetLineSpan().Span; locations.Add(new LSP.Location { Uri = new Uri(declarationFile.FilePath), Range = ProtocolConversions.LinePositionToRange(linePosSpan), }); } } } return(locations.ToArrayAndFree());
static async Task ReportSymbolInformation(IProgress <SymbolInformation> progress, INavigateToSearchResult result, CancellationToken cancellationToken) { var location = await ProtocolConversions.TextSpanToLocationAsync(result.NavigableItem.Document, result.NavigableItem.SourceSpan, cancellationToken).ConfigureAwait(false); Contract.ThrowIfNull(location); progress.Report(new SymbolInformation { Name = result.Name, Kind = ProtocolConversions.NavigateToKindToSymbolKind(result.Kind), Location = location, }); }
private static async Task <LSP.Location?> GetSourceDefinitionLocationAsync(XamlSourceDefinition sourceDefinition, RequestContext context, CancellationToken cancellationToken) { Contract.ThrowIfNull(sourceDefinition.FilePath); if (sourceDefinition.Span != null) { // If the Span is not null, use the span. var document = context.Solution?.GetDocuments(ProtocolConversions.GetUriFromFilePath(sourceDefinition.FilePath)).FirstOrDefault(); if (document != null) { return(await ProtocolConversions.TextSpanToLocationAsync( document, sourceDefinition.Span.Value, isStale : false, cancellationToken).ConfigureAwait(false)); } else { // Cannot find the file in solution. This is probably a file lives outside of the solution like generic.xaml // which lives in the Windows SDK folder. Try getting the SourceText from the file path. using var fileStream = new FileStream(sourceDefinition.FilePath, FileMode.Open, FileAccess.Read); var sourceText = SourceText.From(fileStream); return(new LSP.Location { Uri = new Uri(sourceDefinition.FilePath), Range = ProtocolConversions.TextSpanToRange(sourceDefinition.Span.Value, sourceText) }); } } else { // We should have the line and column, so use them to build the LSP Range. var position = new Position(sourceDefinition.Line, sourceDefinition.Column); return(new LSP.Location { Uri = new Uri(sourceDefinition.FilePath), Range = new LSP.Range() { Start = position, End = position } }); } }
public async Task AddItemAsync(Project project, INavigateToSearchResult result, CancellationToken cancellationToken) { var location = await ProtocolConversions.TextSpanToLocationAsync( result.NavigableItem.Document, result.NavigableItem.SourceSpan, result.NavigableItem.IsStale, _context, cancellationToken).ConfigureAwait(false); if (location == null) { return; } _progress.Report(new VSSymbolInformation { Name = result.Name, ContainerName = result.AdditionalInformation, Kind = ProtocolConversions.NavigateToKindToSymbolKind(result.Kind), Location = location, Icon = VSLspExtensionConversions.GetImageIdFromGlyph(result.NavigableItem.Glyph) }); }
private static async Task <ImmutableArray <SymbolInformation> > ConvertAsync( ImmutableArray <INavigateToSearchResult> results, CancellationToken cancellationToken) { var symbols = ImmutableArray.CreateBuilder <SymbolInformation>(); foreach (var result in results) { symbols.Add(new VSSymbolInformation() { Name = result.Name, ContainerName = result.AdditionalInformation, Kind = ProtocolConversions.NavigateToKindToSymbolKind(result.Kind), Location = await ProtocolConversions.TextSpanToLocationAsync(result.NavigableItem.Document, result.NavigableItem.SourceSpan, cancellationToken).ConfigureAwait(false), Icon = new VisualStudio.Text.Adornments.ImageElement(result.NavigableItem.Glyph.GetImageId()) }); } return(symbols.ToImmutableArray()); }
private static async Task <LSP.Location[]> GetSymbolDefinitionLocationsAsync(XamlSymbolDefinition symbolDefinition, RequestContext context, IMetadataAsSourceFileService metadataAsSourceFileService, CancellationToken cancellationToken) { Contract.ThrowIfNull(symbolDefinition.Symbol); using var _ = ArrayBuilder <LSP.Location> .GetInstance(out var locations); var symbol = symbolDefinition.Symbol; var items = NavigableItemFactory.GetItemsFromPreferredSourceLocations(context.Solution, symbol, displayTaggedParts: null, cancellationToken); if (items.Any()) { foreach (var item in items) { var location = await ProtocolConversions.TextSpanToLocationAsync( item.Document, item.SourceSpan, item.IsStale, cancellationToken).ConfigureAwait(false); locations.AddIfNotNull(location); } } else { var metadataLocation = symbol.Locations.Where(loc => loc.IsInMetadata).FirstOrDefault(); if (metadataLocation != null && metadataAsSourceFileService.IsNavigableMetadataSymbol(symbol)) { var project = context.Document?.GetCodeProject(); if (project != null) { var declarationFile = await metadataAsSourceFileService.GetGeneratedFileAsync(project, symbol, allowDecompilation : false, cancellationToken).ConfigureAwait(false); var linePosSpan = declarationFile.IdentifierLocation.GetLineSpan().Span; locations.Add(new LSP.Location { Uri = new Uri(declarationFile.FilePath), Range = ProtocolConversions.LinePositionToRange(linePosSpan), }); } } } return(locations.ToArray()); }
private static async Task <LSP.Location?> GetSourceDefinitionLocationAsync(XamlSourceDefinition sourceDefinition, RequestContext context, CancellationToken cancellationToken) { Contract.ThrowIfNull(sourceDefinition.FilePath); var document = context.Solution?.GetDocuments(ProtocolConversions.GetUriFromFilePath(sourceDefinition.FilePath)).FirstOrDefault(); if (document != null) { var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); var span = sourceDefinition.GetTextSpan(sourceText); if (span != null) { return(await ProtocolConversions.TextSpanToLocationAsync( document, span.Value, isStale : false, cancellationToken).ConfigureAwait(false)); } } else { // Cannot find the file in solution. This is probably a file lives outside of the solution like generic.xaml // which lives in the Windows SDK folder. Try getting the SourceText from the file path. using var fileStream = new FileStream(sourceDefinition.FilePath, FileMode.Open, FileAccess.Read); var sourceText = SourceText.From(fileStream); var span = sourceDefinition.GetTextSpan(sourceText); if (span != null) { return(new LSP.Location { Uri = new Uri(sourceDefinition.FilePath), Range = ProtocolConversions.TextSpanToRange(span.Value, sourceText), }); } } return(null); }