void
ExpandVisitor::visit (AST::GroupedExpr &expr)
{
- visit (expr.get_expr_in_parens ());
+ maybe_expand_expr (expr.get_expr_in_parens ());
}
void
visit (pattern);
if (arm.has_match_arm_guard ())
- visit (arm.get_guard_expr ());
+ maybe_expand_expr (arm.get_guard_expr ());
- visit (match_case.get_expr ());
+ maybe_expand_expr (match_case.get_expr ());
}
}
void
ExpandVisitor::visit (AST::EnumItemDiscriminant &item)
{
- visit (item.get_expr ());
+ maybe_expand_expr (item.get_expr ());
}
void
visit (generic);
for (auto &variant : enum_item.get_variants ())
- visit (variant);
+ variant->accept_vis (*this);
}
void
{
maybe_expand_type (const_item.get_type ());
- visit (const_item.get_expr ());
+ maybe_expand_expr (const_item.get_expr ());
}
void
{
maybe_expand_type (static_item.get_type ());
- visit (static_item.get_expr ());
+ maybe_expand_expr (static_item.get_expr ());
}
void
maybe_expand_type (const_item.get_type ());
if (const_item.has_expr ())
- visit (const_item.get_expr ());
+ maybe_expand_expr (const_item.get_expr ());
}
void
{}
void
-EarlyNameResolver::visit (AST::EnumItemTuple &)
-{}
+EarlyNameResolver::visit (AST::EnumItemTuple &item)
+{
+ for (auto &field : item.get_tuple_fields ())
+ field.get_field_type ()->accept_vis (*this);
+}
void
-EarlyNameResolver::visit (AST::EnumItemStruct &)
-{}
+EarlyNameResolver::visit (AST::EnumItemStruct &item)
+{
+ for (auto &field : item.get_struct_fields ())
+ field.get_field_type ()->accept_vis (*this);
+}
void
-EarlyNameResolver::visit (AST::EnumItemDiscriminant &)
-{}
+EarlyNameResolver::visit (AST::EnumItemDiscriminant &item)
+{
+ item.get_expr ()->accept_vis (*this);
+}
void
-EarlyNameResolver::visit (AST::Enum &)
-{}
+EarlyNameResolver::visit (AST::Enum &enum_item)
+{
+ for (auto &generic : enum_item.get_generic_params ())
+ generic->accept_vis (*this);
+
+ for (auto &variant : enum_item.get_variants ())
+ variant->accept_vis (*this);
+}
void
EarlyNameResolver::visit (AST::Union &)
--- /dev/null
+macro_rules! foo {
+ () => {"foo"};
+ (number) => { 12 };
+ (false) => { false };
+}
+
+pub const A: &'static str = foo!();
+pub static B: &'static str = foo!();
+
+pub trait Number {
+ const VALUE: u32;
+}
+
+impl Number for u32 {
+ const VALUE: u32 = foo!(number);
+}
+
+impl u32 {
+ pub const TWELVE: u32 = foo!(number);
+}
+
+pub enum E {
+ Variant = foo!(number),
+}
+
+pub fn f(c: bool) -> &'static str {
+ match c {
+ false => foo!(),
+ true if foo!(false) => "abc",
+ _ => "xyz"
+ }
+}
+
+
+fn main() {
+ let _ = A;
+ let _ = u32::VALUE - u32::TWELVE;
+}
--- /dev/null
+macro_rules! id {
+ ($i:ident) => { $i }
+}
+
+pub enum F {
+ Tuple(id!(u32)),
+ Struct { field: id!(u64) },
+}
+
+fn main() {}