Skip to content

Conversation

@denisw
Copy link
Contributor

@denisw denisw commented Feb 29, 2024

Fixes microsoft/vscode#178229

When encountering a nested object property with a trailing comma, such as { "a": { "x": 1, "y": 2, }, "c": 3 }, the json/sort command would throw the following error:

Range#create called with invalid arguments[[object Object], [object Object], undefined, undefined]: Error: Request json/sort failed with message: Range#create called with invalid arguments[[object Object], [object Object], undefined, undefined]

The reason is that the sorting code's scanner failed to navigate up to the parent when } after the trailing comma is encountered, because the condition currentProperty!.endLineNumber === undefined for doing so is false if the previous non-trivia non-comment token was a comma (endLineNumber would have already been set when processing the comma).

As a consequence, any further properties in the parent object (like "c" in the above example) would be wronly considered to be part of the preceding nested object, which confuses the scanner and results in the endLineNumber of the last property not being set at all. This, in the end, triggers the Range.create() error when the sorting code attempts build a range with that undefined end line number.

When encountering a nested object property with a trailing comma,
such as `{ "a": { "x": 1, "y": 2, }, "c": 3 }`, the `json/sort` command
would throw the following error:

```
Range#create called with invalid arguments[[object Object], [object Object], undefined, undefined]: Error: Request json/sort failed with message: Range#create called with invalid arguments[[object Object], [object Object], undefined, undefined]
```

The reason is that the sorting code's scanner failed to navigate up to
the parent when `}` after the trailing comma is encountered, because
the condition `currentProperty!.endLineNumber === undefined` for
doing so is false if the previous non-trivia non-comment token was a
comma (`endLineNumber` would have already been set when processing
the comma).

As a consequence, any further properties in the parent object (like
`"c"` in the above example) would be wronly considered to be part of the
preceding nested object, which confuses the scanner and results in the
`endLineNumber` of the last property not being set at all. This, in the
end, triggers the `Range.create()` error when the sorting code attempts
build a range with that undefined end line number.

Fixes microsoft/vscode#178229
@aiday-mar
Copy link
Contributor

Thank you for the valuable contribution. I will have a look at the PR.

@aiday-mar aiday-mar requested a review from aeschli March 4, 2024 09:44
@vscodenpa vscodenpa added this to the March 2024 milestone Mar 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JSON: Sort document does not work

4 participants