Span in rustc_span - Rust (original) (raw)

pub struct Span {
    lo_or_index: u32,
    len_with_tag_or_marker: u16,
    ctxt_or_parent_or_marker: u16,
}

Expand description

A compressed span.

SpanData is 16 bytes, which is too big to stick everywhere. Span only takes up 8 bytes, with less space for the length, parent and context. The vast majority (99.9%+) of SpanData instances can be made to fit within those 8 bytes. Any SpanData whose fields don’t fit into a Span are stored in a separate interner table, and the Span will index into that table. Interning is rare enough that the cost is low, but common enough that the code is exercised regularly.

An earlier version of this code used only 4 bytes for Span, but that was slower because only 80–90% of spans could be stored inline (even less in very large crates) and so the interner was used a lot more. That version of the code also predated the storage of parents.

There are four different span forms.

Inline-context format (requires non-huge length, non-huge context, and no parent):

Inline-parent format (requires non-huge length, root context, and non-huge parent):

Partially-interned format (requires non-huge context):

Fully-interned format (all cases not covered above):

The partially-interned form requires looking in the interning table for lo and length, but the context is stored inline as well as interned. This is useful because context lookups are often done in isolation, and inline lookups are quicker.

Notes about the choice of field sizes:

In order to reliably use parented spans in incremental compilation, the dependency to the parent definition’s span. This is performed using the callback SPAN_TRACK to access the query engine.

Source§

Source

Reuses the span but adds information like the kind of the desugaring and features that are allowed inside this span.

Source§

Source

Source

Source

Internal function to translate between an encoded span and the expanded representation. This function must not be used outside the incremental engine.

Source

Returns true if this span comes from any kind of macro, desugaring or inlining.

Source

Returns true if this is a dummy span with any hygienic context.

Source

Source

Source

This function is used as a fast path when decoding the full SpanData is not necessary. It’s a cut-down version of data_untracked.

Source

Source

Source

Source§

Source

Source

Source

Source

Source

Source

Source

Returns whether this span originates in a foreign crate’s external macro.

This is used to test whether a lint should not even begin to figure out whether it should be reported on the current node.

Source

Returns true if span originates in a derive-macro’s expansion.

Source

Return whether span is generated by async or await.

Source

Gate suggestions that would not be appropriate in a context the user didn’t write.

Source

Source

Returns a new span representing an empty span at the beginning of this span.

Source

Returns a new span representing an empty span at the end of this span.

Source

Returns true if hi == lo.

Source

Returns self if self is not the dummy span, and other otherwise.

Source

Returns true if self fully encloses other.

Source

Returns true if self touches other.

Source

Returns true if self touches or adjoins other.

Source

Returns true if the spans are equal with regards to the source text.

Use this instead of == when either span could be generated code, and you only care that they point to the same bytes of source text.

Source

Returns Some(span), where the start is trimmed by the end of other.

Source

Returns Some(span), where the end is trimmed by the start of other.

Source

Returns the source span – this is either the supplied span, or the span for the macro callsite that expanded to it.

Source

The Span for the tokens in the previous macro expansion from which self was generated, if any.

Source

Walk down the expansion ancestors to find a span that’s contained within outer.

The span returned by this method may have a different SyntaxContext as outer. If you need to extend the span, use find_ancestor_inside_same_ctxt instead, because joining spans with different syntax contexts can create unexpected results.

Source

Source

Source

Recursively walk down the expansion ancestors to find the oldest ancestor span with the sameSyntaxContext the initial span.

This method is suitable for peeling through local macro expansions to find the “innermost” span that is still local and shares the same SyntaxContext. For example, given

 macro_rules! outer {
     ($x: expr) => {
         inner!($x)
     }
 }

 macro_rules! inner {
     ($x: expr) => {
         format!("error: {}", $x)
         //~^ ERROR mismatched types
     }
 }

 fn bar(x: &str) -> Result<(), Box<dyn std::error::Error>> {
     Err(outer!(x))
 }

if provided the initial span of outer!(x) inside bar, this method will recurse the parent callsites until we reach format!("error: {}", $x), at which point it is the oldest ancestor span that is both still local and shares the same SyntaxContext as the initial span.

Source

Edition of the crate from which this span came.

Source

Is this edition 2015?

Source

Are we allowed to use features from the Rust 2018 edition?

Source

Are we allowed to use features from the Rust 2021 edition?

Source

Are we allowed to use features from the Rust 2024 edition?

Source

Returns the source callee.

Returns None if the supplied span has no expansion trace, else returns the ExpnData for the macro definition corresponding to the source callsite.

Source

Checks if a span is “internal” to a macro in which #[unstable]items can be used (that is, a macro marked with#[allow_internal_unstable]).

Source

Checks if this span arises from a compiler desugaring of kind kind.

Source

Returns the compiler desugaring that created this span, or Noneif this span is not from a desugaring.

Source

Checks if a span is “internal” to a macro in which unsafecan be used without triggering the unsafe_code lint. (that is, a macro marked with #[allow_internal_unsafe]).

Source

Source

Splits a span into two composite spans around a certain position.

Source

Check if you can select metavar spans for the given spans to get matching contexts.

Source

Prepare two spans to a combine operation like to or between.

Source

This span, but in a larger context, may switch to the metavariable span if suitable.

Source

Returns a Span that would enclose both self and end.

Note that this can also be used to extend the span “backwards”:start.to(end) and end.to(start) return the same Span.

    ____             ___
    self lorem ipsum end
    ^^^^^^^^^^^^^^^^^^^^

Source

Returns a Span between the end of self to the beginning of end.

    ____             ___
    self lorem ipsum end
        ^^^^^^^^^^^^^

Source

Returns a Span from the beginning of self until the beginning of end.

    ____             ___
    self lorem ipsum end
    ^^^^^^^^^^^^^^^^^

Source

Returns the Span within the syntax context of “within”. This is useful when “self” is an expansion from a macro variable, since this can be used for providing extra macro expansion context for certain errors.

macro_rules! m {
    ($ident:ident) => { ($ident,) }
}

m!(outer_ident);

If “self” is the span of the outer_ident, and “within” is the span of the ($ident,)expr, then this will return the span of the $ident macro variable.

Source

Source

Equivalent of Span::def_site from the proc macro API, except that the location is taken from the self span.

Source

Equivalent of Span::call_site from the proc macro API, except that the location is taken from the self span.

Source

Equivalent of Span::mixed_site from the proc macro API, except that the location is taken from the self span.

Source

Produces a span with the same location as self and context produced by a macro with the given ID and transparency, assuming that macro was defined directly and not produced by some other macro (which is the case for built-in and procedural macros).

Source

Source

Source

Source

Source

Source

Source

Source

Source§

Source§

Source§

Source§

Source§

Source§

Source§

Source§

Source§

Source§

Hashes a span in a stable way. We can’t directly hash the span’s BytePosfields (that would be similar to hashing pointers, since those are just offsets into the SourceMap). Instead, we hash the (file name, line, column) triple, which stays the same even if the containing SourceFile has moved within the SourceMap.

Also note that we are hashing byte offsets for the column, not unicode codepoint offsets. For the purpose of the hash that’s sufficient. Also, hashing filenames is expensive so we avoid doing it twice when the span starts and ends in the same file, which is almost always the case.

Source§

Source§

Source§

Tests for self and other values to be equal, and is used by ==.

1.0.0 · Source§

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Source§

Source§

This method returns an ordering between self and other values if one exists. Read more

1.0.0 · Source§

Tests less than (for self and other) and is used by the < operator. Read more

1.0.0 · Source§

Tests less than or equal to (for self and other) and is used by the<= operator. Read more

1.0.0 · Source§

Tests greater than (for self and other) and is used by the >operator. Read more

1.0.0 · Source§

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more

Source§

Source§

Source§

§

§

§

§

§

§

§

§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 8 bytes