pub struct SourceView<'a> { /* private fields */ }Expand description
Bundles source text with its precomputed line-start table.
Copy so inner functions can pass it by value without lifetime annotation churn.
Implementations§
Source§impl<'a> SourceView<'a>
impl<'a> SourceView<'a>
pub fn source(self) -> &'a str
pub fn position_of(self, offset: u32) -> Position
Sourcepub fn positions_of_offsets(self, offsets: &[u32]) -> Vec<Position>
pub fn positions_of_offsets(self, offsets: &[u32]) -> Vec<Position>
Convert many byte offsets to LSP positions in one pass per touched line.
Calling Self::position_of repeatedly is fine for a handful of spans,
but local-variable features can produce hundreds of ranges in one large
method. Grouping by line avoids rescanning the same line prefix for
every occurrence.
pub fn line_starts(self) -> &'a [u32]
Sourcepub fn line_of(self, offset: u32) -> u32
pub fn line_of(self, offset: u32) -> u32
O(log lines) line number for a byte offset. Cheaper than
position_of(..).line because it skips the UTF-16 column scan.
Sourcepub fn byte_of_position(self, pos: Position) -> u32
pub fn byte_of_position(self, pos: Position) -> u32
O(log lines) UTF-16 Position -> byte offset. Uses the precomputed
line_starts table to jump to the target line and only scans that
line’s characters. Much faster than a linear scan over the whole
source when the cursor is late in the file.
pub fn range_of(self, span: Span) -> Range
pub fn name_range(self, name: &str) -> Range
Sourcepub fn name_range_in_span(self, name: &str, span: Span) -> Range
pub fn name_range_in_span(self, name: &str, span: Span) -> Range
Like name_range, but searches for name within span instead
of the whole source. Needed when the same name appears in earlier
docblock comments / other declarations — a global search would
otherwise point at the first textual occurrence, not the AST node
the caller actually meant.
When name cannot be located anywhere (e.g. a synthetic Ident::ERROR
placeholder such as "<error>", which never occurs in real source),
falls back to an empty range at span.start — guaranteed to be
contained in the caller’s span, unlike byte offset 0.
Sourcepub fn name_range_after_attrs(
self,
name: &str,
attributes: &[Attribute<'_, '_>],
span: Span,
) -> Range
pub fn name_range_after_attrs( self, name: &str, attributes: &[Attribute<'_, '_>], span: Span, ) -> Range
Like [name_range_in_span], but excludes any leading #[...] attribute
groups from the search span first.
php-rs-parser captures a member’s span starting at its first attribute
token, not at the declaration keyword/name — so searching the raw span
can match name as a substring inside an attribute argument (e.g. a
method named index matching 'blog_index' in #[Route(name: 'blog_index')])
instead of the actual identifier.
Trait Implementations§
Source§impl<'a> Clone for SourceView<'a>
impl<'a> Clone for SourceView<'a>
impl<'a> Copy for SourceView<'a>
Auto Trait Implementations§
impl<'a> Freeze for SourceView<'a>
impl<'a> RefUnwindSafe for SourceView<'a>
impl<'a> Send for SourceView<'a>
impl<'a> Sync for SourceView<'a>
impl<'a> Unpin for SourceView<'a>
impl<'a> UnsafeUnpin for SourceView<'a>
impl<'a> UnwindSafe for SourceView<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more