Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix sorting error in case of nested trailing comma #223

Merged
merged 1 commit into from
Mar 4, 2024

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
@VSCodeTriageBot VSCodeTriageBot added this to the March 2024 milestone Mar 4, 2024
@aiday-mar aiday-mar merged commit e140c73 into microsoft:main Mar 4, 2024
3 checks passed
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