diff --git a/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs b/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs index 53a3c807d..eb66599b6 100644 --- a/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs +++ b/src/Protocol/Serialization/Converters/SymbolInformationOrDocumentSymbolConverter.cs @@ -27,8 +27,8 @@ public override SymbolInformationOrDocumentSymbol ReadJson(JsonReader reader, Ty { var result = JObject.Load(reader); - // Commands have a name, CodeActions do not - if (result["location"].Type == JTokenType.Object) + // SymbolInformation has property location, DocumentSymbol does not. + if (result["location"] != null) { return new SymbolInformationOrDocumentSymbol(result.ToObject()); } diff --git a/test/Client.Tests/ClientTests.cs b/test/Client.Tests/ClientTests.cs index 4f2eb6afd..ea1a0ed76 100644 --- a/test/Client.Tests/ClientTests.cs +++ b/test/Client.Tests/ClientTests.cs @@ -373,6 +373,56 @@ public async Task DocumentHighlights_Success() }); } + /// + /// Ensure that the language client can successfully request DocumentHighlight. + /// + [Fact(DisplayName = "Language client can successfully request document symbols")] + public async Task DocumentSymbols_DocumentSymbol_Success() + { + await Connect(); + + const int line = 5; + const int character = 6; + var expectedDocumentPath = AbsoluteDocumentPath; + var expectedDocumentUri = DocumentUri.FromFileSystemPath(expectedDocumentPath); + var detail = "some detail"; + + var documentSymbol = new DocumentSymbol { + Detail = detail, + Kind = SymbolKind.Class, + Range = new Range(new Position(line, character), new Position(line, character)) + }; + var expectedSymbols = new SymbolInformationOrDocumentSymbolContainer( + new SymbolInformationOrDocumentSymbol(documentSymbol)); + + ServerDispatcher.HandleRequest(DocumentNames.DocumentSymbol, (request, cancellationToken) => { + Assert.NotNull(request.TextDocument); + + Assert.Equal(expectedDocumentUri, request.TextDocument.Uri); + + return Task.FromResult(expectedSymbols); + }); + var documentSymbolParams = new DocumentSymbolParams { + TextDocument = new TextDocumentIdentifier(expectedDocumentUri) + }; + var symbols = await LanguageClient.SendRequest(DocumentNames.DocumentSymbol, documentSymbolParams); + + var actualSymbols = symbols.ToArray(); + Assert.Collection(actualSymbols, actualSymbol => { + var expectedSymbol = expectedSymbols.Single(); + + Assert.True(expectedSymbol.IsDocumentSymbol); + + Assert.NotNull(actualSymbol.DocumentSymbol); + Assert.Equal(expectedSymbol.DocumentSymbol.Detail, actualSymbol.DocumentSymbol.Detail); + Assert.Equal(expectedSymbol.DocumentSymbol.Kind, actualSymbol.DocumentSymbol.Kind); + Assert.Equal(expectedSymbol.DocumentSymbol.Range.Start.Line, actualSymbol.DocumentSymbol.Range.Start.Line); + Assert.Equal(expectedSymbol.DocumentSymbol.Range.Start.Character, actualSymbol.DocumentSymbol.Range.Start.Character); + Assert.Equal(expectedSymbol.DocumentSymbol.Range.End.Line, actualSymbol.DocumentSymbol.Range.End.Line); + Assert.Equal(expectedSymbol.DocumentSymbol.Range.End.Character, actualSymbol.DocumentSymbol.Range.End.Character); + }); + } + /// /// Ensure that the language client can successfully request FoldingRanges. ///