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§
Implementations§
Trait Implementations§
Source§impl Clone for UnresolvedRef
impl Clone for UnresolvedRef
Source§fn clone(&self) -> UnresolvedRef
fn clone(&self) -> UnresolvedRef
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for UnresolvedRef
impl Debug for UnresolvedRef
Source§impl FormatEquivalent for UnresolvedRef
impl FormatEquivalent for UnresolvedRef
Source§fn format_equivalent(&self, other: &Self) -> bool
fn format_equivalent(&self, other: &Self) -> bool
true if self and other are equivalent up to formatting.