pub struct Fact {
pub type_name: String,
pub args: Option<Vec<String>>,
pub call: Option<String>,
pub awaited: bool,
pub is_array: bool,
pub nullable: bool,
pub lambda: Option<LambdaSlot>,
}Expand description
One receiver fact: the declared type NAME plus that type’s top-level
type-argument descriptors when it carried any. Two facts agree only when
BOTH halves do, so Box<int> a and Box<string> a in sibling blocks
conflict exactly like two different type names would.
Fields§
§type_name: StringThe type name value.
args: Option<Vec<String>>The args value.
call: Option<String>When set, the name’s type is whatever the method of this name returns
on the type type_name stands for, a lookup only the resolver can do.
Part of the equality the table compares, so var x = A.Make() and
var x = A.Build() in sibling blocks conflict exactly like two
different type names would.
awaited: booltrue when this is a call fact (call.is_some()) built from an
AWAITED invocation (var x = await Q.M()); meaningless – and always
false – when call is None. Part of the equality the table
compares, so var x = Q.M() and var x = await Q.M() in sibling
blocks conflict exactly like two different callees would, rather than
silently picking one awaited-ness for a name the source gives two.
is_array: booltrue when the declaration’s own type node was, at its TOP level, an
array_type (Widget[]) – set ONLY by type_fact, false
everywhere else (a call fact, a receiver-args unwrap, this/base’s
own fact: none of those can be an array). base_type_identifier
already collapses Widget[] to the same type_name/args shape a
plain Widget field would carry (the element type’s own base
identifier, no type-argument list), so this bit is the ONLY signal
left that distinguishes “one Widget” from “an array of Widget” –
needed by the lambda-parameter element-typing rule, which must tell
Widget[] apart from Widget even though both facts otherwise read
identically. Part of the equality the table compares.
nullable: booltrue when the declaration’s own type node was, at its TOP level, a
nullable_type (Widget?) – set ONLY by type_fact, false
everywhere else, mirroring is_array: a call fact, a receiver-args
unwrap and this/base’s own fact are never nullable-annotated.
base_type_identifier already unwraps Widget? to the same
type_name a plain Widget field would carry, so this bit is the
only signal left that a System.Nullable<T> sits between the
declared name and the value – needed so the resolver can refuse a
member the wrapper itself owns (.Value, .HasValue,
.GetValueOrDefault) rather than binding T’s own same-named
member. Part of the equality the table compares.
lambda: Option<LambdaSlot>When set, the name is an untyped lambda parameter whose type is the
corresponding delegate parameter of the callee this slot names – a
lookup only the resolver can do; type_name is empty and call is
None. Part of the equality the table compares, so two sibling
lambdas binding the same parameter name to different callees
conflict exactly like two different type names would.
Trait Implementations§
impl Eq for Fact
impl StructuralPartialEq for Fact
Auto Trait Implementations§
impl Freeze for Fact
impl RefUnwindSafe for Fact
impl Send for Fact
impl Sync for Fact
impl Unpin for Fact
impl UnsafeUnpin for Fact
impl UnwindSafe for Fact
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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