Skip to content

Conversation

@Jarcho
Copy link
Contributor

@Jarcho Jarcho commented May 2, 2025

This is a further rework of our snippet accessing/creating code.

The general design goals with this:

  • Avoid allocating when not strictly necessary.
  • Make it easy to avoid linting if an invalid span is used.
  • Make it easier to debug when an invalid span is used.
  • Make it easy to minimize the number of lookups in the source map.
  • Make it easy to avoid creating intermediary compressed spans.
  • Make it as easy as possible to compose span adjustments/checks while maintaining the previous goals.

changelog: None

@rustbot
Copy link
Collaborator

rustbot commented May 2, 2025

r? @Alexendoo

rustbot has assigned @Alexendoo.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties label May 2, 2025
@Jarcho
Copy link
Contributor Author

Jarcho commented May 2, 2025

The first two commits are mainly renames. The third commit has all the actual changes.

@Jarcho Jarcho force-pushed the source_rework branch 2 times, most recently from 91b8913 to b336277 Compare May 2, 2025 05:13
@Jarcho
Copy link
Contributor Author

Jarcho commented May 2, 2025

Looking at MISSING_DOCS_IN_PRIVATE_ITEMS, that lint needs to be restructured a bit. Macros currently mess up it's implementation quite a bit.

Why is this not part of rustc in the first place?

@rustbot

This comment has been minimized.

Comment on lines 272 to 469
/// Handle to a source file's text and a range within that file.
///
/// With debug assertions the range is checked to be a valid substring of the source text. Without
/// assertions `None` will be returned from various functions when accessing the substring of the
/// source text fails.
#[derive(Clone)]
pub struct SourceFileRange {
file: SourceText,
range: Range<RelativeBytePos>,
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both SourceFileRange and SourceText can represent subsets of a source file, could they be merged into a single type?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doing so would require that SourceFileRange always validate it's range. The main point of SourceText is that it's definitely a valid string.

They're also serving two different purpose. One is a substring of the source text, the other is a movable view of a whole file.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Always validating doesn't seem so bad to me, API wise it's some extra ?ing when using with_lo/with_hi

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They're still modelling two completely different things. Even if only one of them is exposed using both to implement it is still useful.

Comment on lines 287 to 301
&& let Some(span) = new_lhs.span.map_span(cx, |file| {
let src = file.with_hi(span.hi()).src_text()?;
// Do not continue if we have mismatched number of parens, otherwise the suggestion is wrong
src.matches('(').count() == src.matches(')').count()
(src.matches('(').count() == src.matches(')').count()).then_some(file)
})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with_hi mutating file here is confusing, there's similar elsewhere with trim_start/trim_end

Reusing names of non mutating methods while also returning a value makes it difficult to realise what's happening

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, those need to be renamed.

@rustbot

This comment has been minimized.

@rustbot rustbot added has-merge-commits PR has merge commits, merge with caution. S-waiting-on-author Status: This is awaiting some action from the author. (Use `@rustbot ready` to update this status) labels Jul 18, 2025
@github-actions
Copy link

github-actions bot commented Jul 18, 2025

No changes for 0cff672

@Jarcho Jarcho added the S-blocked Status: marked as blocked ❌ on something else such as an RFC or other implementation work label Jul 18, 2025
github-merge-queue bot pushed a commit that referenced this pull request Jul 19, 2025
This is blocking #14724

changelog: none
github-merge-queue bot pushed a commit that referenced this pull request Jul 19, 2025
This is blocking #14724

changelog: none
@rustbot rustbot removed S-waiting-on-author Status: This is awaiting some action from the author. (Use `@rustbot ready` to update this status) has-merge-commits PR has merge commits, merge with caution. labels Jul 19, 2025
@rustbot

This comment has been minimized.

@rustbot

This comment has been minimized.

@rustbot

This comment has been minimized.

@Jarcho Jarcho force-pushed the source_rework branch 2 times, most recently from b21e0f0 to 3f4330b Compare November 16, 2025 23:36
@rustbot

This comment has been minimized.

@Jarcho Jarcho force-pushed the source_rework branch 2 times, most recently from 3f6aaae to bf9f4e9 Compare November 17, 2025 01:02
@Jarcho
Copy link
Contributor Author

Jarcho commented Nov 17, 2025

The API has changed again; this time to support splitting a range. Changes include:

  • get_source_text has been renamed to get_text. The "source" part of the name doesn't really add anything and just makes it longer. check_source_text was renamed similarly.
  • SourceFileRange has been replaced with SpanEditCx which no longer contains the range.
  • map_range's callback now takes both the edit context and the range as separate parameters and returns either a single range or an array of ranges.
  • Functions for shrinking a range based on it's contents have been replaced by a general &str -> &str transformation that recalculates the range positions. This can also return an array of strings.
  • Some entry points no longer load external sources. get_text and check_text are still loading external sources since they hit debug assertions otherwise.
  • A couple of general utils have been added (display and StrExt). They aren't specific to touching the source code, but they will mainly be used when working with it.

I might switch the range editing functions to be on the range, but that means an extra trait will need to be imported everywhere. range.with_leading_prefix(scx, "prefix") is nicer when chaining multiple, so it's probably worth it.

github-merge-queue bot pushed a commit that referenced this pull request Nov 17, 2025
This is blocking #14724 as it triggers the debug
assertions it adds.

The inter item span parsing was introduced to solve
#12197. This is better handled by just not linting
anything within bodies.

changelog: [`missing_docs_in_private_items`]: Don't lint items in bodies
and automatically derived impls
changelog: [`missing_docs_in_private_items`]: Better detect when things
are accessible from the crate root
changelog: [`missing_docs_in_private_items`]: Lint unnameable items
which are accessible outside the crate
@rustbot
Copy link
Collaborator

rustbot commented Nov 18, 2025

This PR was rebased onto a different master commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@Jarcho Jarcho removed the S-blocked Status: marked as blocked ❌ on something else such as an RFC or other implementation work label Nov 18, 2025
@Jarcho Jarcho force-pushed the source_rework branch 2 times, most recently from 1ca84e8 to 0fce0bc Compare November 19, 2025 03:54
@Jarcho Jarcho force-pushed the source_rework branch 3 times, most recently from fce32d4 to 51934e2 Compare November 19, 2025 07:45
Rename `get_source_text` and `check_source_text` to `get_text` and `check_text`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: Awaiting review from the assignee but also interested parties

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants