// This file describes nearly all Rust AST types. It is used by gen/process_ast.py to generate // impls of various traits for all AST nodes. // // There are three types of declarations that can appear in this file. // - `struct`s: Similar to Rust struct declarations, except that only field names are given, not // their types. Both "normal" and tuple structs are supported. In normal structs declarations, // the field names must match the actual names of the fields. For tuple structs, names must // still be provided, but they can be chosen arbitrarily (except they must be valid Rust // identifiers, i.e., not keywords). // - `enum`s: Similar to Rust enum declarations. Each variant follows the same format as a struct // declaration. Both tuple-like and struct-like variants are supported. // - `flag`s: These indicate types with no interesting internal structure, such as `Mutability` (an // enum with two nullary variants, `Mutable` and `Immutable`). The code generators will either // ignore these or use a simple default implementation. // // Top-level declarations, enum variants, and struct/variant fields may all be prefixed with // attributes. The attribute format is `#[attr]` or `#[key=value]` (where `value` is a single // word). Consult the doc comments for the code generator modules for information on the supported // attributes and their effects. struct Crate { module, #[seq_rewrite_outer_span='calc_outer_span(&self.attrs, self.span.shrink_to_lo())'] attrs, span, } // Ignore inline because we flip it from false to true when printing (see // `::to_string`). struct Mod { inner, #[mac_table_seq] items, #[rewrite_ignore] inline } #[rewrite_print_recover] #[rewrite_seq_item] #[rewrite_extra_strategies=item_header] #[nonterminal] #[extend_span] #[fold_kind=ItemKind] #[boxed] struct Item { ident, #[match=ignore] attrs, id, kind, vis, span, #[match=ignore] #[rewrite_ignore] tokens } enum ItemKind { ExternCrate(name), Use(vp), Static(ty, mutbl, init), Const(ty, init), Fn(sig, generics, block), Mod(module), ForeignMod(fm), GlobalAsm(asm), TyAlias(ty, generics), Enum(def, generics), Struct(vd, generics), Union(vd, generics), Trait(is_auto, unsafety, generics, bounds, #[mac_table_seq] items), TraitAlias(generics, bounds), Impl(unsafety, polarity, generics, defaultness, trait_ref, ty, #[mac_table_seq] items), Mac(mac), MacroDef(tts), } enum Extern { None, Implicit, Explicit(s), } enum UseTreeKind { Simple(ident, id1, id2), Glob, Nested(nested), } #[fold_kind=UseTreeKind] #[boxed=both] struct UseTree { kind, prefix, span } #[nonterminal] #[extend_span] #[fold_kind=TraitItemKind] struct TraitItem { id, ident, #[match=ignore] attrs, vis, generics, kind, span, #[match=ignore] #[rewrite_ignore] tokens } enum TraitItemKind { Const(ty, init), Method(sig, body), Type(bounds, ty), Macro(mac), } #[nonterminal] #[extend_span] #[fold_item=ImplItemKind] struct ImplItem { id, ident, vis, defaultness, #[match=ignore] attrs, generics, kind, span, #[match=ignore] #[rewrite_ignore] tokens } enum ImplItemKind { Const(ty, init), Method(sig, body), TyAlias(ty), Macro(mac), } struct TraitRef { path, ref_id } struct EnumDef { variants } #[extend_span] struct Variant { ident, #[match=ignore] attrs, id, data, disr_expr, vis, span, is_placeholder } enum VariantData { Struct(fields, id), Tuple(fields, id), Unit(id), } #[extend_span] struct StructField { span, ident, vis, id, ty, #[match=ignore] attrs, is_placeholder } struct ForeignMod { abi, #[mac_table_seq] items } #[rewrite_print_recover] #[rewrite_seq_item] #[nonterminal] #[extend_span] #[fold_kind=ForeignItemKind] struct ForeignItem { ident, #[match=ignore] attrs, kind, id, span, vis } enum ForeignItemKind { Fn(decl, generics), Static(ty, mutbl), Ty, Macro(mac), } struct Generics { params, where_clause, span } #[extend_span] #[fold_kind=GenericParamKind] struct GenericParam { id, ident, attrs, bounds, kind, is_placeholder } enum GenericParamKind { Lifetime, Type { default }, Const { ty }, } struct WhereClause { predicates, span } enum WherePredicate { BoundPredicate(pred), RegionPredicate(pred), EqPredicate(pred), } struct WhereBoundPredicate { span, bounded_ty, bounds, bound_generic_params } struct WhereRegionPredicate { span, lifetime, bounds } struct WhereEqPredicate { id, span, lhs_ty, rhs_ty } enum TraitBoundModifier { None, Maybe, } #[match=ignore] enum VisibilityKind { Public, Crate(crate_sugar), Restricted { path, id }, Inherited, } enum CrateSugar { PubCrate, JustCrate, } #[match=custom] #[rewrite_print_recover] #[mac_table_record] #[nonterminal] #[fold_kind=TyKind] #[boxed] struct Ty { id, kind, span } struct MutTy {ty, mutbl} enum TyKind { Slice(ty), Array(ty, len), Ptr(mty), Rptr(lt, mty), BareFn(ty), Never, Tup(tys), Path(qself, path), TraitObject(bounds, trait_object_syntax), ImplTrait(id, bounds), Paren(ty), Typeof(expr), Infer, ImplicitSelf, #[mac_table_record] Mac(mac), Err, CVarArgs, } enum TraitObjectSyntax { Dyn, None, } enum LitIntType { Signed(ty), Unsigned(ty), Unsuffixed, } enum IntTy { Isize, I8, I16, I32, I64, I128, } enum UintTy { Usize, U8, U16, U32, U64, U128, } enum FloatTy { F32, F64, } #[boxed] struct BareFnTy { unsafety, ext, decl, generic_params } struct Lifetime { id, ident } enum GenericBound { Trait(poly_trait_ref, modifier), Outlives(lt), } struct PolyTraitRef { trait_ref, span, bound_generic_params } struct FnSig { header, decl } #[boxed] struct FnDecl { inputs, output } struct FnHeader { unsafety, asyncness, constness, ext } #[rewrite_print] struct Param { attrs, ty, pat, id, span, is_placeholder } enum FunctionRetTy { Default(sp), Ty(ty), } #[match=custom] #[rewrite_print_recover] #[rewrite_seq_item] #[nonterminal] #[fold_kind=StmtKind] struct Stmt { id, kind, span } #[no_debug] enum StmtKind { Local(local), Item(item), Expr(expr), Semi(expr), Mac(mac), } #[extend_span] #[boxed] struct Local { pat, ty, init, id, span, #[match=ignore] attrs } #[match=custom] #[rewrite_print_recover] #[extend_span] #[mac_table_record] #[nonterminal] #[fold_kind=ExprKind] #[boxed] struct Expr { id, kind, span, #[match=ignore] attrs } #[prec_contains_expr] enum ExprKind { Box(#[prec=PREFIX] expr), Array(#[mac_table_seq] elems), Call(#[prec=POSTFIX] #[prec_special=Callee] func, #[mac_table_seq] args), MethodCall(path_seg, #[prec_first=POSTFIX] #[mac_table_seq] args), Tup(#[mac_table_seq] elems), Binary(op, #[prec_left_of_binop=op] a, #[prec_right_of_binop=op] b), Unary(op, #[prec=PREFIX] a), Lit(lit), Cast(#[prec=As] expr, ty), Type(#[prec=Colon] expr, ty), Let(pats, #[prec_special=Cond] expr), If(#[prec_special=Cond] cond, then_body, else_body), While(#[prec_special=Cond] cond, body, label), ForLoop(pat, #[prec_special=Cond] iter, body, label), Loop(body, label), Match(#[prec_special=Cond] target, arms), Closure(cap, is_async, mov, decl, body, span), Block(body, label), Async(cap, id, block), Await(expr), TryBlock(body), Assign(#[lvalue_mut] #[prec_inc=Assign] lhs, #[prec=Assign] rhs), AssignOp(op, #[lvalue_mut] #[prec_inc=Assign] lhs, #[prec=Assign] rhs), Field(#[lr_propagate] #[prec=POSTFIX] expr, ident), Index(#[lr_propagate] #[prec=POSTFIX] arr, idx), // Special case for `Range`. `AssocOp` claims that `Range` has higher precedence than // `Assign`, but `x .. x = x` gives a parse error instead of `x .. (x = x)`. Here we use a // fake precedence value so that any child with lower precedence than a "normal" binop gets // parenthesized. (`LOr` is the lowest-precedence binop.) Range(#[prec=LOr] lo, #[prec=LOr] hi, limits), Path(qself, path), AddrOf(borrowkind, mutbl, #[lvalue_kind=mutbl] #[prec=PREFIX] expr), Break(label, #[prec=JUMP] expr), Continue(label), Ret(#[prec=JUMP] expr), InlineAsm(asm), #[mac_table_record] Mac(mac), Struct(path, fields, base), Repeat(item, count), Paren(expr), Try(#[prec=POSTFIX] expr), Yield(#[prec=JUMP] expr), Err, } enum IsAsync { Async { closure_id, return_impl_trait_id }, NotAsync, } enum Movability { Static, Movable, } enum UnOp { Deref, Not, Neg, } enum BinOpKind { Add, Sub, Mul, Div, Rem, And, Or, BitXor, BitAnd, BitOr, Shl, Shr, Eq, Lt, Le, Ne, Ge, Gt, } #[extend_span] struct Field { id, ident, expr, span, is_shorthand, attrs, is_placeholder } #[extend_span] struct Arm { id, attrs, pat, guard, body, span, is_placeholder } #[match=custom] #[rewrite_print_recover] #[nonterminal] #[boxed] struct Block { #[mac_table_seq] stmts, id, rules, span } #[match=custom] #[mac_table_record] #[nonterminal] #[fold_kind=PatKind] #[boxed] struct Pat { id, kind, span } enum PatKind { Wild, Ident(mode, id, pat), Struct(path, fields, dotdot), TupleStruct(path, fields), Or(paths), Path(qself, path), Tuple(pats), Box(pat), Ref(pat, mutbl), Lit(expr), Range(lo, hi, end), Slice(pats), Rest, Paren(pat), #[mac_table_record] Mac(mac), } #[extend_span] struct FieldPat { id, ident, pat, is_shorthand, attrs, span, is_placeholder } #[match=custom] #[fold_kind=LitKind] struct Lit { token, kind, span } struct StrLit { style, symbol, suffix, span, symbol_unescaped } enum LitKind { Str(sym, style), ByteStr(bytes), Byte(x), Char(x), Int(x, ty), Float(sym, ty), Bool(x), Err(sym), } enum LitFloatType { Suffixed(ty), Unsuffixed, } #[fold_kind=TokenLitKind] struct TokenLit { kind, symbol, suffix } enum TokenLitKind { Bool, Byte, Char, Integer, Float, Str, StrRaw(n), ByteStr, ByteStrRaw(n), Err, } enum Defaultness { Default, Final, } enum Constness { Const, NotConst, } enum ImplPolarity { Positive, Negative, } enum IsAuto { Yes, No, } enum Unsafety { Unsafe, Normal, } #[to_lua_custom] flag Abi; enum Mutability { Mutable, Immutable, } enum BorrowKind { Ref, Raw, } enum RangeEnd { Included(syntax), Excluded, } enum RangeSyntax { DotDotDot, DotDotEq, } enum BindingMode { ByRef(mutbl), ByValue(mutbl), } enum CaptureBy { Value, Ref, } enum BlockCheckMode { Default, Unsafe(source), } enum UnsafeSource { CompilerGenerated, UserProvided, } enum StrStyle { Cooked, Raw(n), } enum AsmDialect { Att, Intel, } enum RangeLimits { HalfOpen, Closed, } #[no_node_id] #[rewrite_print] #[rewrite_custom=SeqItem] struct Attribute { id, style, kind, span } enum AttrKind { Normal(item), DocComment(symbol), } struct AttrItem { path, args } enum AttrStyle { Outer, Inner, } #[match=custom] #[nonterminal] #[boxed=both] struct Path { span, segments } struct PathSegment { ident, id, args } #[boxed] enum GenericArgs { AngleBracketed(abpd), Parenthesized(ppd), } struct AngleBracketedArgs { span, args, constraints } struct ParenthesizedArgs { span, inputs, output } enum GenericArg { Lifetime(lt), Type(ty), Const(c), } struct QSelf { ty, path_span, position } struct AssocTyConstraint { id, ident, kind, span } enum AssocTyConstraintKind { Equality { ty }, Bound { bounds }, } struct Mac { path, args, prior_type_ascription } enum MacStmtStyle { Semicolon, Braces, NoBraces, } #[equiv_mode=ignore] flag TokenStream; struct MacroDef { body, legacy } #[boxed=both] enum MacArgs { Empty, Delimited(span, delim, tokens), Eq(span, tokens), } #[boxed] struct InlineAsm { asm, asm_str_style, outputs, inputs, clobbers, volatile, alignstack, dialect } #[boxed] struct GlobalAsm { asm } struct InlineAsmOutput { constraint, expr, is_rw, is_indirect } #[match=custom] struct Label { ident } enum MacDelimiter { Parenthesis, Bracket, Brace, } struct AnonConst { id, value, } #[match=custom] #[equiv_mode=custom] struct Ident { name, span } #[match=eq] #[to_lua_custom] flag Name; #[equiv_mode=ignore] #[match=eq] flag SyntaxContext; #[equiv_mode=ignore] #[rewrite_ignore] #[to_lua_custom] flag Span; #[equiv_mode=ignore] #[rewrite_ignore] #[list_node_ids=custom] #[mac_table_custom] #[to_lua_custom] flag NodeId; #[equiv_mode=ignore] #[rewrite_ignore] #[to_lua_custom] flag AttrId; #[to_lua_custom] flag usize; #[match=eq] #[to_lua_custom] flag bool; #[match=eq] #[to_lua_custom] flag u128; #[match=eq] #[to_lua_custom] flag u16; #[match=eq] #[to_lua_custom] flag u8; #[match=eq] #[to_lua_custom] flag char; enum Nonterminal { NtItem(i), NtBlock(b), NtStmt(s), NtPat(p), NtExpr(y), NtTy(t), NtIdent(i, raw), NtLifetime(ident), NtLiteral(expr), NtMeta(m), NtPath(p), NtVis(v), NtTT(tt), NtTraitItem(ti), NtImplItem(ii), NtForeignItem(fi), } enum TokenTree { Token(t), Delimited(sp, d, tts), } struct DelimSpan { open, close } enum DelimToken { Paren, Bracket, Brace, NoDelim, } #[fold_kind=TokenKind] struct Token { kind, span } enum TokenKind { Eq, Lt, Le, EqEq, Ne, Ge, Gt, AndAnd, OrOr, Not, Tilde, BinOp(op), BinOpEq(op), At, Dot, DotDot, DotDotDot, DotDotEq, Comma, Semi, Colon, ModSep, RArrow, LArrow, FatArrow, Pound, Dollar, Question, SingleQuote, OpenDelim(delim), CloseDelim(delim), Literal(lit), Ident(s, is_raw), Lifetime(s), Interpolated(nt), DocComment(s), Whitespace, Comment, Shebang(s), Unknown(s), Eof, } enum BinOpToken { Plus, Minus, Star, Slash, Percent, Caret, And, Or, Shl, Shr, } #[fold_kind=MetaItemKind] struct MetaItem { path, kind, span } enum MetaItemKind { Word, List(l), NameValue(lit), } enum NestedMetaItem { MetaItem(mi), Literal(lit), }