Skip to main content

UnresolvedRef

Enum UnresolvedRef 

Source
pub enum UnresolvedRef {
    Path(IdentPath),
}
Expand description

Unresolved reference, produced by the parser before HIR lowering.

Carried by ExprKind::UnresolvedRef. The parser emits these when the meaning of an identifier path cannot be determined from syntax alone; HIR expression lowering (crate::hir::lower_expr) classifies and resolves them in a single pass against the lexical scope and the module-aware resolver.

This indirection is necessary because the same token shape can mean different expression kinds depending on declarations and local scopes. For example, the dotted expression Foo.Bar is parsed as the unresolved path Foo.Bar in both of these programs:

index Foo = { Bar };
node x: Dimensionless = Foo.Bar;

and:

node x: Dimensionless = Foo.Bar;

Only after collecting names from the file can resolution know whether Foo is an index. In the first program Foo.Bar becomes a HIR variant literal; in the second it becomes a qualified constant-like reference.

Bare identifiers have the same issue. PI parses as the unresolved path PI both when it denotes the built-in constant:

node x: Dimensionless = PI;

and when a local binding shadows that constant:

index I = { A };
node x: Dimensionless[I] = for PI: I { PI };

HIR lowering turns the first PI into a built-in constant reference, but the loop body PI in the second program into a local reference.

The payload is a path rather than separate “bare” and “qualified” variants so the parser records the complete syntactic structure uniformly: Foo, Foo.Bar, and Foo.Bar.Baz are all identifier paths. Segment-count restrictions, such as index variants currently being two-segment paths, are semantic rules enforced by HIR lowering rather than parser artifacts.

Variants§

§

Path(IdentPath)

Unresolved identifier path: Foo, Foo.Bar, or Foo.Bar.Baz.

Implementations§

Source§

impl UnresolvedRef

Source

pub fn span(&self) -> Span

Returns the source span of the underlying identifier path.

Trait Implementations§

Source§

impl Clone for UnresolvedRef

Source§

fn clone(&self) -> UnresolvedRef

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UnresolvedRef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FormatEquivalent for UnresolvedRef

Source§

fn format_equivalent(&self, other: &Self) -> bool

Returns true if self and other are equivalent up to formatting.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

fn clone_into(&self, target: &mut T)

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

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.