Struct rustc_span::hygiene::SyntaxContext[][src]

pub struct SyntaxContext(u32);
Expand description

A SyntaxContext represents a chain of pairs (ExpnId, Transparency) named “marks”.

Tuple Fields

0: u32

Implementations

Extend a syntax context with a given expansion and transparency.

Pulls a single mark off of the syntax context. This effectively moves the context up one macro definition level. That is, if we have a nested macro definition as follows:

macro_rules! f {
   macro_rules! g {
       ...
   }
}

and we have a SyntaxContext that is referring to something declared by an invocation of g (call it g1), calling remove_mark will result in the SyntaxContext for the invocation of f that created g1. Returns the mark that was removed.

Adjust this context for resolution in a scope created by the given expansion. For example, consider the following three resolutions of f:

mod foo { pub fn f() {} } // `f`'s `SyntaxContext` is empty.
m!(f);
macro m($f:ident) {
    mod bar {
        pub fn f() {} // `f`'s `SyntaxContext` has a single `ExpnId` from `m`.
        pub fn $f() {} // `$f`'s `SyntaxContext` is empty.
    }
    foo::f(); // `f`'s `SyntaxContext` has a single `ExpnId` from `m`
    //^ Since `mod foo` is outside this expansion, `adjust` removes the mark from `f`,
    //| and it resolves to `::foo::f`.
    bar::f(); // `f`'s `SyntaxContext` has a single `ExpnId` from `m`
    //^ Since `mod bar` not outside this expansion, `adjust` does not change `f`,
    //| and it resolves to `::bar::f`.
    bar::$f(); // `f`'s `SyntaxContext` is empty.
    //^ Since `mod bar` is not outside this expansion, `adjust` does not change `$f`,
    //| and it resolves to `::bar::$f`.
}

This returns the expansion whose definition scope we use to privacy check the resolution, or None if we privacy check as usual (i.e., not w.r.t. a macro definition scope).

Like SyntaxContext::adjust, but also normalizes self to macros 2.0.

Adjust this context for resolution in a scope created by the given expansion via a glob import with the given SyntaxContext. For example:

m!(f);
macro m($i:ident) {
    mod foo {
        pub fn f() {} // `f`'s `SyntaxContext` has a single `ExpnId` from `m`.
        pub fn $i() {} // `$i`'s `SyntaxContext` is empty.
    }
    n(f);
    macro n($j:ident) {
        use foo::*;
        f(); // `f`'s `SyntaxContext` has a mark from `m` and a mark from `n`
        //^ `glob_adjust` removes the mark from `n`, so this resolves to `foo::f`.
        $i(); // `$i`'s `SyntaxContext` has a mark from `n`
        //^ `glob_adjust` removes the mark from `n`, so this resolves to `foo::$i`.
        $j(); // `$j`'s `SyntaxContext` has a mark from `m`
        //^ This cannot be glob-adjusted, so this is a resolution error.
    }
}

This returns None if the context cannot be glob-adjusted. Otherwise, it returns the scope to use when privacy checking (see adjust for details).

Undo glob_adjust if possible:

if let Some(privacy_checking_scope) = self.reverse_glob_adjust(expansion, glob_ctxt) {
    assert!(self.glob_adjust(expansion, glob_ctxt) == Some(privacy_checking_scope));
}

ctxt.outer_expn_data() is equivalent to but faster than ctxt.outer_expn().expn_data().

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Feeds this value into the given Hasher. Read more

Feeds a slice of this type into the given Hasher. Read more

This method returns an Ordering between self and other. Read more

Compares and returns the maximum of two values. Read more

Compares and returns the minimum of two values. Read more

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

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

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

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

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

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

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Layout

Note: Most layout information is completely unstable and may be different between compiler versions and platforms. 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: 4 bytes