diff --git a/language-server/src/features/DocumentSymbols.test.ts b/language-server/src/features/DocumentSymbols.test.ts index d4ffd1a..d69adb7 100644 --- a/language-server/src/features/DocumentSymbols.test.ts +++ b/language-server/src/features/DocumentSymbols.test.ts @@ -186,4 +186,31 @@ describe("DocumentSymbols", () => { expect(result).toEqual([]); }); + + test("should skip incomplete properties when generating document symbols, prevents crash", async () => { + await client.writeDocument("test.json", `{ + "bar": 1, + "foo": + }`); + const uri = await client.openDocument("test.json"); + + const result = await client.sendRequest(DocumentSymbolRequest.type, { + textDocument: { uri } + }); + + expect(result).toEqual([ + { + name: "bar", + kind: SymbolKind.Number, + range: { + start: { line: 1, character: 6 }, + end: { line: 1, character: 14 } + }, + selectionRange: { + start: { line: 1, character: 6 }, + end: { line: 1, character: 11 } + } + } + ]); + }); }); diff --git a/language-server/src/features/DocumentSymbols.ts b/language-server/src/features/DocumentSymbols.ts index 052b2ba..0658d1e 100644 --- a/language-server/src/features/DocumentSymbols.ts +++ b/language-server/src/features/DocumentSymbols.ts @@ -41,6 +41,10 @@ export class DocumentSymbols { const keyNode = propertyNode.children![0]; const valueNode = propertyNode.children![1]; + if (!valueNode) { + continue; + } + const name = String(keyNode.value); const range = { start: jsonDocument.positionAt(propertyNode.offset),