Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
name: CI

on: [push, pull_request]
on:
push:
branches: [main]
tags:
- '*'
pull_request:
branches: [main]

jobs:
build:
Expand Down
13 changes: 13 additions & 0 deletions src/parse_to_value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,19 @@ mod tests {
assert!(matches!(err.kind(), ParseErrorKind::UnexpectedToken));
}

#[test]
fn error_unexpected_word_should_have_full_range() {
// https://github.com/dprint/jsonc-parser/issues/2
// the error range should cover the entire word, not just the first character
let err = parse_to_value(r#"{ "test": asdf }"#, &Default::default())
.err()
.unwrap();
assert!(matches!(err.kind(), ParseErrorKind::UnexpectedWord));
// "asdf" is at bytes 10..14
assert_eq!(err.range().start, 10);
assert_eq!(err.range().end, 14);
}

#[test]
fn it_should_parse_surrogate_pair() {
// RFC 8259 § 7: non-BMP character 𝄞 (U+1D11E) should be escaped as surrogate pair \uD834\uDD1E
Expand Down
15 changes: 14 additions & 1 deletion src/scanner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,20 @@ impl<'a> Scanner<'a> {
}

pub(super) fn create_error_for_current_token(&self, kind: ParseErrorKind) -> ParseError {
self.create_error_for_start(self.token_start, kind)
let end = if self.byte_index > self.token_start {
// token was fully scanned — use the exact token end
self.byte_index
} else if let Some(c) = self.file_text[self.byte_index..].chars().next() {
// scanner hasn't advanced past token_start — cover the current character
self.byte_index + c.len_utf8()
} else {
self.file_text.len()
};
let range = Range {
start: self.token_start,
end,
};
self.create_error_for_range(range, kind)
}

pub(super) fn create_error_for_current_char(&self, kind: ParseErrorKind) -> ParseError {
Expand Down
Loading