WIP: BREAKING CHANGE: Store byte offset in Error instead of TextPos.#141
Open
Jayonas wants to merge 1 commit intoRazrFalcon:masterfrom
Open
WIP: BREAKING CHANGE: Store byte offset in Error instead of TextPos.#141Jayonas wants to merge 1 commit intoRazrFalcon:masterfrom
Error instead of TextPos.#141Jayonas wants to merge 1 commit intoRazrFalcon:masterfrom
Conversation
This adds support for error handling scenarios where callers need the byte offset where an error occurred rather than the `TextPos`. Since `TextPos` is calculated from a byte offset (and the source string), the best way to provide support for both situations is to store the byte offset in `Error` and then supply an easy way for the caller to translate it into a `TextPos`. FIX: Callers that want to continue displaying the `TextPos` (i.e. line/col) for an error will need to refactor their error handling code to create that `TextPos` by calling the new `text_pos` free function, passing the original XML string and the result from `Error::pos()` (which is now a `usize` instead of a `TextPos`). Breakdown of changes: * Change all `TextPos` data in `Error` to `usize`. * Change `Error` variants without position data to return `0` from `pos` method. * Remove position info from `Error` `Display` strings, allowing the caller to provide position info in the manner of their choosing. Rephrase a few error strings where the position was in the middle of the string. * Fix up all the places that create errors. * Refactor `Stream::gen_text_pos[_from]` and `Document::text_pos_at` into new lib-level free function `text_pos`. * Refactor `text_pos_*` tests in `tokenizer_tests` to just test the new `text_pos` function. Move them to the `api` tests and renumber them to not conflict with the text pos tests already in that file. * Add position field to `Token::Error` in `tokenizer_tests` so that expected error positions are still verified even though they're not included in the `Display` strings anymore. * Change `ast` test function to concat error strings and their `TextPos` before comparing to the expected file/message. Questions: * When I rephrased error messages it was pretty mechanical, better suggestions are welcome. * The changes in `ast` tests were the minimal needed to get them working without losing functionality. I suggest that it might be preferable to store the expected byte position separately from the message in the yaml file, but I'm not sure what the preferred way to do that would be.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This adds support for error handling scenarios where callers need the byte offset where an error occurred rather than the
TextPos. SinceTextPosis calculated from a byte offset (and the source string), the best way to provide support for both situations is to store the byte offset inErrorand then supply an easy way for the caller to translate it into aTextPos.FIX: Callers that want to continue displaying the
TextPos(i.e. line/col) for an error will need to refactor their error handling code to create thatTextPosby calling the newtext_posfree function, passing the original XML string and the result fromError::pos()(which is now ausizeinstead of aTextPos).Breakdown of changes:
TextPosdata inErrortousize.Errorvariants without position data to return0fromposmethod.ErrorDisplaystrings, allowing the caller to provide position info in the manner of their choosing. Rephrase a few error strings where the position was in the middle of the string.Stream::gen_text_pos[_from]andDocument::text_pos_atinto new lib-level free functiontext_pos.text_pos_*tests intokenizer_teststo just test the newtext_posfunction. Move them to theapitests and renumber them to not conflict with the text pos tests already in that file.Token::Errorintokenizer_testsso that expected error positions are still verified even though they're not included in theDisplaystrings anymore.asttest function to concat error strings and theirTextPosbefore comparing to the expected file/message.Questions:
asttests were the minimal needed to get them working without losing functionality. I suggest that it might be preferable to store the expected byte position separately from the message in the yaml file, but I'm not sure what the preferred way to do that would be.