// This file is automatically generated based on the file `./generated.rs.tera` when `cargo gen-syntax` is run // Do not edit manually //! This module contains auto-generated Rust AST. Like `SyntaxNode`s, AST nodes //! are generic over ownership: `X<'a>` things are `Copy` references, `XNode` //! are Arc-based. You can switch between the two variants using `.owned` and //! `.borrowed` functions. Most of the code works with borowed mode, and only //! this mode has all AST accessors. #![cfg_attr(rustfmt, rustfmt_skip)] use rowan::TransparentNewType; use crate::{ SyntaxNode, SyntaxKind::*, syntax_node::{TreeArc}, ast::{self, AstNode}, }; // Alias #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Alias { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Alias { type Repr = rowan::SyntaxNode; } impl AstNode for Alias { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ALIAS => Some(Alias::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Alias { type Owned = TreeArc<Alias>; fn to_owned(&self) -> TreeArc<Alias> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::NameOwner for Alias {} impl Alias {} // ArgList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ArgList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ArgList { type Repr = rowan::SyntaxNode; } impl AstNode for ArgList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ARG_LIST => Some(ArgList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ArgList { type Owned = TreeArc<ArgList>; fn to_owned(&self) -> TreeArc<ArgList> { TreeArc::cast(self.syntax.to_owned()) } } impl ArgList { pub fn args(&self) -> impl Iterator<Item = &Expr> { super::children(self) } } // ArrayExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ArrayExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ArrayExpr { type Repr = rowan::SyntaxNode; } impl AstNode for ArrayExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ARRAY_EXPR => Some(ArrayExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ArrayExpr { type Owned = TreeArc<ArrayExpr>; fn to_owned(&self) -> TreeArc<ArrayExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ArrayExpr { pub fn exprs(&self) -> impl Iterator<Item = &Expr> { super::children(self) } } // ArrayType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ArrayType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ArrayType { type Repr = rowan::SyntaxNode; } impl AstNode for ArrayType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ARRAY_TYPE => Some(ArrayType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ArrayType { type Owned = TreeArc<ArrayType>; fn to_owned(&self) -> TreeArc<ArrayType> { TreeArc::cast(self.syntax.to_owned()) } } impl ArrayType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // AssocTypeArg #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct AssocTypeArg { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for AssocTypeArg { type Repr = rowan::SyntaxNode; } impl AstNode for AssocTypeArg { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ASSOC_TYPE_ARG => Some(AssocTypeArg::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for AssocTypeArg { type Owned = TreeArc<AssocTypeArg>; fn to_owned(&self) -> TreeArc<AssocTypeArg> { TreeArc::cast(self.syntax.to_owned()) } } impl AssocTypeArg { pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // Attr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Attr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Attr { type Repr = rowan::SyntaxNode; } impl AstNode for Attr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ATTR => Some(Attr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Attr { type Owned = TreeArc<Attr>; fn to_owned(&self) -> TreeArc<Attr> { TreeArc::cast(self.syntax.to_owned()) } } impl Attr { pub fn value(&self) -> Option<&TokenTree> { super::child_opt(self) } } // BinExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct BinExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for BinExpr { type Repr = rowan::SyntaxNode; } impl AstNode for BinExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { BIN_EXPR => Some(BinExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for BinExpr { type Owned = TreeArc<BinExpr>; fn to_owned(&self) -> TreeArc<BinExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl BinExpr {} // BindPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct BindPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for BindPat { type Repr = rowan::SyntaxNode; } impl AstNode for BindPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { BIND_PAT => Some(BindPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for BindPat { type Owned = TreeArc<BindPat>; fn to_owned(&self) -> TreeArc<BindPat> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::NameOwner for BindPat {} impl BindPat { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } } // Block #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Block { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Block { type Repr = rowan::SyntaxNode; } impl AstNode for Block { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { BLOCK => Some(Block::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Block { type Owned = TreeArc<Block>; fn to_owned(&self) -> TreeArc<Block> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::AttrsOwner for Block {} impl Block { pub fn statements(&self) -> impl Iterator<Item = &Stmt> { super::children(self) } pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // BlockExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct BlockExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for BlockExpr { type Repr = rowan::SyntaxNode; } impl AstNode for BlockExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { BLOCK_EXPR => Some(BlockExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for BlockExpr { type Owned = TreeArc<BlockExpr>; fn to_owned(&self) -> TreeArc<BlockExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl BlockExpr { pub fn block(&self) -> Option<&Block> { super::child_opt(self) } } // BreakExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct BreakExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for BreakExpr { type Repr = rowan::SyntaxNode; } impl AstNode for BreakExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { BREAK_EXPR => Some(BreakExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for BreakExpr { type Owned = TreeArc<BreakExpr>; fn to_owned(&self) -> TreeArc<BreakExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl BreakExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // CallExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct CallExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for CallExpr { type Repr = rowan::SyntaxNode; } impl AstNode for CallExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { CALL_EXPR => Some(CallExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for CallExpr { type Owned = TreeArc<CallExpr>; fn to_owned(&self) -> TreeArc<CallExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::ArgListOwner for CallExpr {} impl CallExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // CastExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct CastExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for CastExpr { type Repr = rowan::SyntaxNode; } impl AstNode for CastExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { CAST_EXPR => Some(CastExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for CastExpr { type Owned = TreeArc<CastExpr>; fn to_owned(&self) -> TreeArc<CastExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl CastExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // Condition #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Condition { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Condition { type Repr = rowan::SyntaxNode; } impl AstNode for Condition { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { CONDITION => Some(Condition::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Condition { type Owned = TreeArc<Condition>; fn to_owned(&self) -> TreeArc<Condition> { TreeArc::cast(self.syntax.to_owned()) } } impl Condition { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // ConstDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ConstDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ConstDef { type Repr = rowan::SyntaxNode; } impl AstNode for ConstDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { CONST_DEF => Some(ConstDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ConstDef { type Owned = TreeArc<ConstDef>; fn to_owned(&self) -> TreeArc<ConstDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for ConstDef {} impl ast::NameOwner for ConstDef {} impl ast::TypeParamsOwner for ConstDef {} impl ast::AttrsOwner for ConstDef {} impl ast::DocCommentsOwner for ConstDef {} impl ast::TypeAscriptionOwner for ConstDef {} impl ConstDef { pub fn body(&self) -> Option<&Expr> { super::child_opt(self) } } // ContinueExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ContinueExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ContinueExpr { type Repr = rowan::SyntaxNode; } impl AstNode for ContinueExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { CONTINUE_EXPR => Some(ContinueExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ContinueExpr { type Owned = TreeArc<ContinueExpr>; fn to_owned(&self) -> TreeArc<ContinueExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ContinueExpr {} // DynTraitType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct DynTraitType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for DynTraitType { type Repr = rowan::SyntaxNode; } impl AstNode for DynTraitType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { DYN_TRAIT_TYPE => Some(DynTraitType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for DynTraitType { type Owned = TreeArc<DynTraitType>; fn to_owned(&self) -> TreeArc<DynTraitType> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeBoundsOwner for DynTraitType {} impl DynTraitType {} // EnumDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct EnumDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for EnumDef { type Repr = rowan::SyntaxNode; } impl AstNode for EnumDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ENUM_DEF => Some(EnumDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for EnumDef { type Owned = TreeArc<EnumDef>; fn to_owned(&self) -> TreeArc<EnumDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for EnumDef {} impl ast::NameOwner for EnumDef {} impl ast::TypeParamsOwner for EnumDef {} impl ast::AttrsOwner for EnumDef {} impl ast::DocCommentsOwner for EnumDef {} impl EnumDef { pub fn variant_list(&self) -> Option<&EnumVariantList> { super::child_opt(self) } } // EnumVariant #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct EnumVariant { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for EnumVariant { type Repr = rowan::SyntaxNode; } impl AstNode for EnumVariant { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ENUM_VARIANT => Some(EnumVariant::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for EnumVariant { type Owned = TreeArc<EnumVariant>; fn to_owned(&self) -> TreeArc<EnumVariant> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::NameOwner for EnumVariant {} impl ast::DocCommentsOwner for EnumVariant {} impl ast::AttrsOwner for EnumVariant {} impl EnumVariant { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // EnumVariantList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct EnumVariantList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for EnumVariantList { type Repr = rowan::SyntaxNode; } impl AstNode for EnumVariantList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ENUM_VARIANT_LIST => Some(EnumVariantList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for EnumVariantList { type Owned = TreeArc<EnumVariantList>; fn to_owned(&self) -> TreeArc<EnumVariantList> { TreeArc::cast(self.syntax.to_owned()) } } impl EnumVariantList { pub fn variants(&self) -> impl Iterator<Item = &EnumVariant> { super::children(self) } } // Expr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Expr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Expr { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ExprKind<'a> { TupleExpr(&'a TupleExpr), ArrayExpr(&'a ArrayExpr), ParenExpr(&'a ParenExpr), PathExpr(&'a PathExpr), LambdaExpr(&'a LambdaExpr), IfExpr(&'a IfExpr), LoopExpr(&'a LoopExpr), ForExpr(&'a ForExpr), WhileExpr(&'a WhileExpr), ContinueExpr(&'a ContinueExpr), BreakExpr(&'a BreakExpr), Label(&'a Label), BlockExpr(&'a BlockExpr), ReturnExpr(&'a ReturnExpr), MatchExpr(&'a MatchExpr), StructLit(&'a StructLit), CallExpr(&'a CallExpr), IndexExpr(&'a IndexExpr), MethodCallExpr(&'a MethodCallExpr), FieldExpr(&'a FieldExpr), TryExpr(&'a TryExpr), CastExpr(&'a CastExpr), RefExpr(&'a RefExpr), PrefixExpr(&'a PrefixExpr), RangeExpr(&'a RangeExpr), BinExpr(&'a BinExpr), Literal(&'a Literal), MacroCall(&'a MacroCall), } impl<'a> From<&'a TupleExpr> for &'a Expr { fn from(n: &'a TupleExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ArrayExpr> for &'a Expr { fn from(n: &'a ArrayExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ParenExpr> for &'a Expr { fn from(n: &'a ParenExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PathExpr> for &'a Expr { fn from(n: &'a PathExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a LambdaExpr> for &'a Expr { fn from(n: &'a LambdaExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a IfExpr> for &'a Expr { fn from(n: &'a IfExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a LoopExpr> for &'a Expr { fn from(n: &'a LoopExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ForExpr> for &'a Expr { fn from(n: &'a ForExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a WhileExpr> for &'a Expr { fn from(n: &'a WhileExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ContinueExpr> for &'a Expr { fn from(n: &'a ContinueExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a BreakExpr> for &'a Expr { fn from(n: &'a BreakExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a Label> for &'a Expr { fn from(n: &'a Label) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a BlockExpr> for &'a Expr { fn from(n: &'a BlockExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ReturnExpr> for &'a Expr { fn from(n: &'a ReturnExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a MatchExpr> for &'a Expr { fn from(n: &'a MatchExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a StructLit> for &'a Expr { fn from(n: &'a StructLit) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a CallExpr> for &'a Expr { fn from(n: &'a CallExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a IndexExpr> for &'a Expr { fn from(n: &'a IndexExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a MethodCallExpr> for &'a Expr { fn from(n: &'a MethodCallExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a FieldExpr> for &'a Expr { fn from(n: &'a FieldExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TryExpr> for &'a Expr { fn from(n: &'a TryExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a CastExpr> for &'a Expr { fn from(n: &'a CastExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a RefExpr> for &'a Expr { fn from(n: &'a RefExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PrefixExpr> for &'a Expr { fn from(n: &'a PrefixExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a RangeExpr> for &'a Expr { fn from(n: &'a RangeExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a BinExpr> for &'a Expr { fn from(n: &'a BinExpr) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a Literal> for &'a Expr { fn from(n: &'a Literal) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl<'a> From<&'a MacroCall> for &'a Expr { fn from(n: &'a MacroCall) -> &'a Expr { Expr::cast(&n.syntax).unwrap() } } impl AstNode for Expr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | TUPLE_EXPR | ARRAY_EXPR | PAREN_EXPR | PATH_EXPR | LAMBDA_EXPR | IF_EXPR | LOOP_EXPR | FOR_EXPR | WHILE_EXPR | CONTINUE_EXPR | BREAK_EXPR | LABEL | BLOCK_EXPR | RETURN_EXPR | MATCH_EXPR | STRUCT_LIT | CALL_EXPR | INDEX_EXPR | METHOD_CALL_EXPR | FIELD_EXPR | TRY_EXPR | CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR | LITERAL | MACRO_CALL => Some(Expr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Expr { type Owned = TreeArc<Expr>; fn to_owned(&self) -> TreeArc<Expr> { TreeArc::cast(self.syntax.to_owned()) } } impl Expr { pub fn kind(&self) -> ExprKind { match self.syntax.kind() { TUPLE_EXPR => ExprKind::TupleExpr(TupleExpr::cast(&self.syntax).unwrap()), ARRAY_EXPR => ExprKind::ArrayExpr(ArrayExpr::cast(&self.syntax).unwrap()), PAREN_EXPR => ExprKind::ParenExpr(ParenExpr::cast(&self.syntax).unwrap()), PATH_EXPR => ExprKind::PathExpr(PathExpr::cast(&self.syntax).unwrap()), LAMBDA_EXPR => ExprKind::LambdaExpr(LambdaExpr::cast(&self.syntax).unwrap()), IF_EXPR => ExprKind::IfExpr(IfExpr::cast(&self.syntax).unwrap()), LOOP_EXPR => ExprKind::LoopExpr(LoopExpr::cast(&self.syntax).unwrap()), FOR_EXPR => ExprKind::ForExpr(ForExpr::cast(&self.syntax).unwrap()), WHILE_EXPR => ExprKind::WhileExpr(WhileExpr::cast(&self.syntax).unwrap()), CONTINUE_EXPR => ExprKind::ContinueExpr(ContinueExpr::cast(&self.syntax).unwrap()), BREAK_EXPR => ExprKind::BreakExpr(BreakExpr::cast(&self.syntax).unwrap()), LABEL => ExprKind::Label(Label::cast(&self.syntax).unwrap()), BLOCK_EXPR => ExprKind::BlockExpr(BlockExpr::cast(&self.syntax).unwrap()), RETURN_EXPR => ExprKind::ReturnExpr(ReturnExpr::cast(&self.syntax).unwrap()), MATCH_EXPR => ExprKind::MatchExpr(MatchExpr::cast(&self.syntax).unwrap()), STRUCT_LIT => ExprKind::StructLit(StructLit::cast(&self.syntax).unwrap()), CALL_EXPR => ExprKind::CallExpr(CallExpr::cast(&self.syntax).unwrap()), INDEX_EXPR => ExprKind::IndexExpr(IndexExpr::cast(&self.syntax).unwrap()), METHOD_CALL_EXPR => ExprKind::MethodCallExpr(MethodCallExpr::cast(&self.syntax).unwrap()), FIELD_EXPR => ExprKind::FieldExpr(FieldExpr::cast(&self.syntax).unwrap()), TRY_EXPR => ExprKind::TryExpr(TryExpr::cast(&self.syntax).unwrap()), CAST_EXPR => ExprKind::CastExpr(CastExpr::cast(&self.syntax).unwrap()), REF_EXPR => ExprKind::RefExpr(RefExpr::cast(&self.syntax).unwrap()), PREFIX_EXPR => ExprKind::PrefixExpr(PrefixExpr::cast(&self.syntax).unwrap()), RANGE_EXPR => ExprKind::RangeExpr(RangeExpr::cast(&self.syntax).unwrap()), BIN_EXPR => ExprKind::BinExpr(BinExpr::cast(&self.syntax).unwrap()), LITERAL => ExprKind::Literal(Literal::cast(&self.syntax).unwrap()), MACRO_CALL => ExprKind::MacroCall(MacroCall::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl Expr {} // ExprStmt #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ExprStmt { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ExprStmt { type Repr = rowan::SyntaxNode; } impl AstNode for ExprStmt { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { EXPR_STMT => Some(ExprStmt::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ExprStmt { type Owned = TreeArc<ExprStmt>; fn to_owned(&self) -> TreeArc<ExprStmt> { TreeArc::cast(self.syntax.to_owned()) } } impl ExprStmt { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // ExternCrateItem #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ExternCrateItem { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ExternCrateItem { type Repr = rowan::SyntaxNode; } impl AstNode for ExternCrateItem { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { EXTERN_CRATE_ITEM => Some(ExternCrateItem::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ExternCrateItem { type Owned = TreeArc<ExternCrateItem>; fn to_owned(&self) -> TreeArc<ExternCrateItem> { TreeArc::cast(self.syntax.to_owned()) } } impl ExternCrateItem { pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } pub fn alias(&self) -> Option<&Alias> { super::child_opt(self) } } // FieldExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct FieldExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for FieldExpr { type Repr = rowan::SyntaxNode; } impl AstNode for FieldExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FIELD_EXPR => Some(FieldExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for FieldExpr { type Owned = TreeArc<FieldExpr>; fn to_owned(&self) -> TreeArc<FieldExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl FieldExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } } // FieldPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct FieldPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for FieldPat { type Repr = rowan::SyntaxNode; } impl AstNode for FieldPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FIELD_PAT => Some(FieldPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for FieldPat { type Owned = TreeArc<FieldPat>; fn to_owned(&self) -> TreeArc<FieldPat> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::NameOwner for FieldPat {} impl FieldPat { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } } // FieldPatList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct FieldPatList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for FieldPatList { type Repr = rowan::SyntaxNode; } impl AstNode for FieldPatList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FIELD_PAT_LIST => Some(FieldPatList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for FieldPatList { type Owned = TreeArc<FieldPatList>; fn to_owned(&self) -> TreeArc<FieldPatList> { TreeArc::cast(self.syntax.to_owned()) } } impl FieldPatList { pub fn field_pats(&self) -> impl Iterator<Item = &FieldPat> { super::children(self) } pub fn bind_pats(&self) -> impl Iterator<Item = &BindPat> { super::children(self) } } // FnDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct FnDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for FnDef { type Repr = rowan::SyntaxNode; } impl AstNode for FnDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FN_DEF => Some(FnDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for FnDef { type Owned = TreeArc<FnDef>; fn to_owned(&self) -> TreeArc<FnDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for FnDef {} impl ast::NameOwner for FnDef {} impl ast::TypeParamsOwner for FnDef {} impl ast::AttrsOwner for FnDef {} impl ast::DocCommentsOwner for FnDef {} impl FnDef { pub fn param_list(&self) -> Option<&ParamList> { super::child_opt(self) } pub fn body(&self) -> Option<&Block> { super::child_opt(self) } pub fn ret_type(&self) -> Option<&RetType> { super::child_opt(self) } } // FnPointerType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct FnPointerType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for FnPointerType { type Repr = rowan::SyntaxNode; } impl AstNode for FnPointerType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FN_POINTER_TYPE => Some(FnPointerType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for FnPointerType { type Owned = TreeArc<FnPointerType>; fn to_owned(&self) -> TreeArc<FnPointerType> { TreeArc::cast(self.syntax.to_owned()) } } impl FnPointerType { pub fn param_list(&self) -> Option<&ParamList> { super::child_opt(self) } pub fn ret_type(&self) -> Option<&RetType> { super::child_opt(self) } } // ForExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ForExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ForExpr { type Repr = rowan::SyntaxNode; } impl AstNode for ForExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FOR_EXPR => Some(ForExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ForExpr { type Owned = TreeArc<ForExpr>; fn to_owned(&self) -> TreeArc<ForExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::LoopBodyOwner for ForExpr {} impl ForExpr { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } pub fn iterable(&self) -> Option<&Expr> { super::child_opt(self) } } // ForType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ForType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ForType { type Repr = rowan::SyntaxNode; } impl AstNode for ForType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { FOR_TYPE => Some(ForType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ForType { type Owned = TreeArc<ForType>; fn to_owned(&self) -> TreeArc<ForType> { TreeArc::cast(self.syntax.to_owned()) } } impl ForType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // IfExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct IfExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for IfExpr { type Repr = rowan::SyntaxNode; } impl AstNode for IfExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { IF_EXPR => Some(IfExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for IfExpr { type Owned = TreeArc<IfExpr>; fn to_owned(&self) -> TreeArc<IfExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl IfExpr { pub fn condition(&self) -> Option<&Condition> { super::child_opt(self) } } // ImplBlock #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ImplBlock { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ImplBlock { type Repr = rowan::SyntaxNode; } impl AstNode for ImplBlock { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { IMPL_BLOCK => Some(ImplBlock::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ImplBlock { type Owned = TreeArc<ImplBlock>; fn to_owned(&self) -> TreeArc<ImplBlock> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeParamsOwner for ImplBlock {} impl ImplBlock { pub fn item_list(&self) -> Option<&ItemList> { super::child_opt(self) } } // ImplItem #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ImplItem { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ImplItem { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ImplItemKind<'a> { FnDef(&'a FnDef), TypeAliasDef(&'a TypeAliasDef), ConstDef(&'a ConstDef), } impl<'a> From<&'a FnDef> for &'a ImplItem { fn from(n: &'a FnDef) -> &'a ImplItem { ImplItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TypeAliasDef> for &'a ImplItem { fn from(n: &'a TypeAliasDef) -> &'a ImplItem { ImplItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ConstDef> for &'a ImplItem { fn from(n: &'a ConstDef) -> &'a ImplItem { ImplItem::cast(&n.syntax).unwrap() } } impl AstNode for ImplItem { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | FN_DEF | TYPE_ALIAS_DEF | CONST_DEF => Some(ImplItem::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ImplItem { type Owned = TreeArc<ImplItem>; fn to_owned(&self) -> TreeArc<ImplItem> { TreeArc::cast(self.syntax.to_owned()) } } impl ImplItem { pub fn kind(&self) -> ImplItemKind { match self.syntax.kind() { FN_DEF => ImplItemKind::FnDef(FnDef::cast(&self.syntax).unwrap()), TYPE_ALIAS_DEF => ImplItemKind::TypeAliasDef(TypeAliasDef::cast(&self.syntax).unwrap()), CONST_DEF => ImplItemKind::ConstDef(ConstDef::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl ImplItem {} // ImplTraitType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ImplTraitType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ImplTraitType { type Repr = rowan::SyntaxNode; } impl AstNode for ImplTraitType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { IMPL_TRAIT_TYPE => Some(ImplTraitType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ImplTraitType { type Owned = TreeArc<ImplTraitType>; fn to_owned(&self) -> TreeArc<ImplTraitType> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeBoundsOwner for ImplTraitType {} impl ImplTraitType {} // IndexExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct IndexExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for IndexExpr { type Repr = rowan::SyntaxNode; } impl AstNode for IndexExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { INDEX_EXPR => Some(IndexExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for IndexExpr { type Owned = TreeArc<IndexExpr>; fn to_owned(&self) -> TreeArc<IndexExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl IndexExpr {} // ItemList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ItemList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ItemList { type Repr = rowan::SyntaxNode; } impl AstNode for ItemList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { ITEM_LIST => Some(ItemList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ItemList { type Owned = TreeArc<ItemList>; fn to_owned(&self) -> TreeArc<ItemList> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::FnDefOwner for ItemList {} impl ast::ModuleItemOwner for ItemList {} impl ItemList { pub fn impl_items(&self) -> impl Iterator<Item = &ImplItem> { super::children(self) } } // Label #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Label { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Label { type Repr = rowan::SyntaxNode; } impl AstNode for Label { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LABEL => Some(Label::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Label { type Owned = TreeArc<Label>; fn to_owned(&self) -> TreeArc<Label> { TreeArc::cast(self.syntax.to_owned()) } } impl Label {} // LambdaExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct LambdaExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for LambdaExpr { type Repr = rowan::SyntaxNode; } impl AstNode for LambdaExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LAMBDA_EXPR => Some(LambdaExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for LambdaExpr { type Owned = TreeArc<LambdaExpr>; fn to_owned(&self) -> TreeArc<LambdaExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl LambdaExpr { pub fn param_list(&self) -> Option<&ParamList> { super::child_opt(self) } pub fn body(&self) -> Option<&Expr> { super::child_opt(self) } } // LetStmt #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct LetStmt { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for LetStmt { type Repr = rowan::SyntaxNode; } impl AstNode for LetStmt { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LET_STMT => Some(LetStmt::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for LetStmt { type Owned = TreeArc<LetStmt>; fn to_owned(&self) -> TreeArc<LetStmt> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeAscriptionOwner for LetStmt {} impl LetStmt { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } pub fn initializer(&self) -> Option<&Expr> { super::child_opt(self) } } // LifetimeArg #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct LifetimeArg { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for LifetimeArg { type Repr = rowan::SyntaxNode; } impl AstNode for LifetimeArg { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LIFETIME_ARG => Some(LifetimeArg::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for LifetimeArg { type Owned = TreeArc<LifetimeArg>; fn to_owned(&self) -> TreeArc<LifetimeArg> { TreeArc::cast(self.syntax.to_owned()) } } impl LifetimeArg {} // LifetimeParam #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct LifetimeParam { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for LifetimeParam { type Repr = rowan::SyntaxNode; } impl AstNode for LifetimeParam { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LIFETIME_PARAM => Some(LifetimeParam::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for LifetimeParam { type Owned = TreeArc<LifetimeParam>; fn to_owned(&self) -> TreeArc<LifetimeParam> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::AttrsOwner for LifetimeParam {} impl LifetimeParam {} // Literal #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Literal { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Literal { type Repr = rowan::SyntaxNode; } impl AstNode for Literal { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LITERAL => Some(Literal::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Literal { type Owned = TreeArc<Literal>; fn to_owned(&self) -> TreeArc<Literal> { TreeArc::cast(self.syntax.to_owned()) } } impl Literal {} // LiteralPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct LiteralPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for LiteralPat { type Repr = rowan::SyntaxNode; } impl AstNode for LiteralPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LITERAL_PAT => Some(LiteralPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for LiteralPat { type Owned = TreeArc<LiteralPat>; fn to_owned(&self) -> TreeArc<LiteralPat> { TreeArc::cast(self.syntax.to_owned()) } } impl LiteralPat { pub fn literal(&self) -> Option<&Literal> { super::child_opt(self) } } // LoopExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct LoopExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for LoopExpr { type Repr = rowan::SyntaxNode; } impl AstNode for LoopExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { LOOP_EXPR => Some(LoopExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for LoopExpr { type Owned = TreeArc<LoopExpr>; fn to_owned(&self) -> TreeArc<LoopExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::LoopBodyOwner for LoopExpr {} impl LoopExpr {} // MacroCall #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MacroCall { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MacroCall { type Repr = rowan::SyntaxNode; } impl AstNode for MacroCall { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MACRO_CALL => Some(MacroCall::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MacroCall { type Owned = TreeArc<MacroCall>; fn to_owned(&self) -> TreeArc<MacroCall> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::NameOwner for MacroCall {} impl ast::AttrsOwner for MacroCall {} impl MacroCall { pub fn token_tree(&self) -> Option<&TokenTree> { super::child_opt(self) } pub fn path(&self) -> Option<&Path> { super::child_opt(self) } } // MacroItems #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MacroItems { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MacroItems { type Repr = rowan::SyntaxNode; } impl AstNode for MacroItems { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MACRO_ITEMS => Some(MacroItems::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MacroItems { type Owned = TreeArc<MacroItems>; fn to_owned(&self) -> TreeArc<MacroItems> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::ModuleItemOwner for MacroItems {} impl ast::FnDefOwner for MacroItems {} impl MacroItems {} // MacroStmts #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MacroStmts { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MacroStmts { type Repr = rowan::SyntaxNode; } impl AstNode for MacroStmts { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MACRO_STMTS => Some(MacroStmts::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MacroStmts { type Owned = TreeArc<MacroStmts>; fn to_owned(&self) -> TreeArc<MacroStmts> { TreeArc::cast(self.syntax.to_owned()) } } impl MacroStmts { pub fn statements(&self) -> impl Iterator<Item = &Stmt> { super::children(self) } pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // MatchArm #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MatchArm { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MatchArm { type Repr = rowan::SyntaxNode; } impl AstNode for MatchArm { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MATCH_ARM => Some(MatchArm::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MatchArm { type Owned = TreeArc<MatchArm>; fn to_owned(&self) -> TreeArc<MatchArm> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::AttrsOwner for MatchArm {} impl MatchArm { pub fn pats(&self) -> impl Iterator<Item = &Pat> { super::children(self) } pub fn guard(&self) -> Option<&MatchGuard> { super::child_opt(self) } pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // MatchArmList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MatchArmList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MatchArmList { type Repr = rowan::SyntaxNode; } impl AstNode for MatchArmList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MATCH_ARM_LIST => Some(MatchArmList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MatchArmList { type Owned = TreeArc<MatchArmList>; fn to_owned(&self) -> TreeArc<MatchArmList> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::AttrsOwner for MatchArmList {} impl MatchArmList { pub fn arms(&self) -> impl Iterator<Item = &MatchArm> { super::children(self) } } // MatchExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MatchExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MatchExpr { type Repr = rowan::SyntaxNode; } impl AstNode for MatchExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MATCH_EXPR => Some(MatchExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MatchExpr { type Owned = TreeArc<MatchExpr>; fn to_owned(&self) -> TreeArc<MatchExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl MatchExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } pub fn match_arm_list(&self) -> Option<&MatchArmList> { super::child_opt(self) } } // MatchGuard #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MatchGuard { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MatchGuard { type Repr = rowan::SyntaxNode; } impl AstNode for MatchGuard { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MATCH_GUARD => Some(MatchGuard::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MatchGuard { type Owned = TreeArc<MatchGuard>; fn to_owned(&self) -> TreeArc<MatchGuard> { TreeArc::cast(self.syntax.to_owned()) } } impl MatchGuard { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // MethodCallExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct MethodCallExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for MethodCallExpr { type Repr = rowan::SyntaxNode; } impl AstNode for MethodCallExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { METHOD_CALL_EXPR => Some(MethodCallExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for MethodCallExpr { type Owned = TreeArc<MethodCallExpr>; fn to_owned(&self) -> TreeArc<MethodCallExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::ArgListOwner for MethodCallExpr {} impl MethodCallExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } pub fn type_arg_list(&self) -> Option<&TypeArgList> { super::child_opt(self) } } // Module #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Module { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Module { type Repr = rowan::SyntaxNode; } impl AstNode for Module { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { MODULE => Some(Module::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Module { type Owned = TreeArc<Module>; fn to_owned(&self) -> TreeArc<Module> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for Module {} impl ast::NameOwner for Module {} impl ast::AttrsOwner for Module {} impl ast::DocCommentsOwner for Module {} impl Module { pub fn item_list(&self) -> Option<&ItemList> { super::child_opt(self) } } // ModuleItem #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ModuleItem { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ModuleItem { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ModuleItemKind<'a> { StructDef(&'a StructDef), EnumDef(&'a EnumDef), FnDef(&'a FnDef), TraitDef(&'a TraitDef), TypeAliasDef(&'a TypeAliasDef), ImplBlock(&'a ImplBlock), UseItem(&'a UseItem), ExternCrateItem(&'a ExternCrateItem), ConstDef(&'a ConstDef), StaticDef(&'a StaticDef), Module(&'a Module), } impl<'a> From<&'a StructDef> for &'a ModuleItem { fn from(n: &'a StructDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a EnumDef> for &'a ModuleItem { fn from(n: &'a EnumDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a FnDef> for &'a ModuleItem { fn from(n: &'a FnDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TraitDef> for &'a ModuleItem { fn from(n: &'a TraitDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TypeAliasDef> for &'a ModuleItem { fn from(n: &'a TypeAliasDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ImplBlock> for &'a ModuleItem { fn from(n: &'a ImplBlock) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a UseItem> for &'a ModuleItem { fn from(n: &'a UseItem) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ExternCrateItem> for &'a ModuleItem { fn from(n: &'a ExternCrateItem) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ConstDef> for &'a ModuleItem { fn from(n: &'a ConstDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a StaticDef> for &'a ModuleItem { fn from(n: &'a StaticDef) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl<'a> From<&'a Module> for &'a ModuleItem { fn from(n: &'a Module) -> &'a ModuleItem { ModuleItem::cast(&n.syntax).unwrap() } } impl AstNode for ModuleItem { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | STRUCT_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | IMPL_BLOCK | USE_ITEM | EXTERN_CRATE_ITEM | CONST_DEF | STATIC_DEF | MODULE => Some(ModuleItem::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ModuleItem { type Owned = TreeArc<ModuleItem>; fn to_owned(&self) -> TreeArc<ModuleItem> { TreeArc::cast(self.syntax.to_owned()) } } impl ModuleItem { pub fn kind(&self) -> ModuleItemKind { match self.syntax.kind() { STRUCT_DEF => ModuleItemKind::StructDef(StructDef::cast(&self.syntax).unwrap()), ENUM_DEF => ModuleItemKind::EnumDef(EnumDef::cast(&self.syntax).unwrap()), FN_DEF => ModuleItemKind::FnDef(FnDef::cast(&self.syntax).unwrap()), TRAIT_DEF => ModuleItemKind::TraitDef(TraitDef::cast(&self.syntax).unwrap()), TYPE_ALIAS_DEF => ModuleItemKind::TypeAliasDef(TypeAliasDef::cast(&self.syntax).unwrap()), IMPL_BLOCK => ModuleItemKind::ImplBlock(ImplBlock::cast(&self.syntax).unwrap()), USE_ITEM => ModuleItemKind::UseItem(UseItem::cast(&self.syntax).unwrap()), EXTERN_CRATE_ITEM => ModuleItemKind::ExternCrateItem(ExternCrateItem::cast(&self.syntax).unwrap()), CONST_DEF => ModuleItemKind::ConstDef(ConstDef::cast(&self.syntax).unwrap()), STATIC_DEF => ModuleItemKind::StaticDef(StaticDef::cast(&self.syntax).unwrap()), MODULE => ModuleItemKind::Module(Module::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl ModuleItem {} // Name #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Name { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Name { type Repr = rowan::SyntaxNode; } impl AstNode for Name { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NAME => Some(Name::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Name { type Owned = TreeArc<Name>; fn to_owned(&self) -> TreeArc<Name> { TreeArc::cast(self.syntax.to_owned()) } } impl Name {} // NameRef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NameRef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NameRef { type Repr = rowan::SyntaxNode; } impl AstNode for NameRef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NAME_REF => Some(NameRef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NameRef { type Owned = TreeArc<NameRef>; fn to_owned(&self) -> TreeArc<NameRef> { TreeArc::cast(self.syntax.to_owned()) } } impl NameRef {} // NamedField #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NamedField { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NamedField { type Repr = rowan::SyntaxNode; } impl AstNode for NamedField { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NAMED_FIELD => Some(NamedField::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NamedField { type Owned = TreeArc<NamedField>; fn to_owned(&self) -> TreeArc<NamedField> { TreeArc::cast(self.syntax.to_owned()) } } impl NamedField { pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // NamedFieldDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NamedFieldDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NamedFieldDef { type Repr = rowan::SyntaxNode; } impl AstNode for NamedFieldDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NAMED_FIELD_DEF => Some(NamedFieldDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NamedFieldDef { type Owned = TreeArc<NamedFieldDef>; fn to_owned(&self) -> TreeArc<NamedFieldDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for NamedFieldDef {} impl ast::NameOwner for NamedFieldDef {} impl ast::AttrsOwner for NamedFieldDef {} impl ast::DocCommentsOwner for NamedFieldDef {} impl ast::TypeAscriptionOwner for NamedFieldDef {} impl NamedFieldDef {} // NamedFieldDefList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NamedFieldDefList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NamedFieldDefList { type Repr = rowan::SyntaxNode; } impl AstNode for NamedFieldDefList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NAMED_FIELD_DEF_LIST => Some(NamedFieldDefList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NamedFieldDefList { type Owned = TreeArc<NamedFieldDefList>; fn to_owned(&self) -> TreeArc<NamedFieldDefList> { TreeArc::cast(self.syntax.to_owned()) } } impl NamedFieldDefList { pub fn fields(&self) -> impl Iterator<Item = &NamedFieldDef> { super::children(self) } } // NamedFieldList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NamedFieldList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NamedFieldList { type Repr = rowan::SyntaxNode; } impl AstNode for NamedFieldList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NAMED_FIELD_LIST => Some(NamedFieldList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NamedFieldList { type Owned = TreeArc<NamedFieldList>; fn to_owned(&self) -> TreeArc<NamedFieldList> { TreeArc::cast(self.syntax.to_owned()) } } impl NamedFieldList { pub fn fields(&self) -> impl Iterator<Item = &NamedField> { super::children(self) } } // NeverType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NeverType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NeverType { type Repr = rowan::SyntaxNode; } impl AstNode for NeverType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { NEVER_TYPE => Some(NeverType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NeverType { type Owned = TreeArc<NeverType>; fn to_owned(&self) -> TreeArc<NeverType> { TreeArc::cast(self.syntax.to_owned()) } } impl NeverType {} // NominalDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct NominalDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for NominalDef { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum NominalDefKind<'a> { StructDef(&'a StructDef), EnumDef(&'a EnumDef), } impl<'a> From<&'a StructDef> for &'a NominalDef { fn from(n: &'a StructDef) -> &'a NominalDef { NominalDef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a EnumDef> for &'a NominalDef { fn from(n: &'a EnumDef) -> &'a NominalDef { NominalDef::cast(&n.syntax).unwrap() } } impl AstNode for NominalDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | STRUCT_DEF | ENUM_DEF => Some(NominalDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for NominalDef { type Owned = TreeArc<NominalDef>; fn to_owned(&self) -> TreeArc<NominalDef> { TreeArc::cast(self.syntax.to_owned()) } } impl NominalDef { pub fn kind(&self) -> NominalDefKind { match self.syntax.kind() { STRUCT_DEF => NominalDefKind::StructDef(StructDef::cast(&self.syntax).unwrap()), ENUM_DEF => NominalDefKind::EnumDef(EnumDef::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl ast::NameOwner for NominalDef {} impl ast::TypeParamsOwner for NominalDef {} impl ast::AttrsOwner for NominalDef {} impl NominalDef {} // Param #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Param { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Param { type Repr = rowan::SyntaxNode; } impl AstNode for Param { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PARAM => Some(Param::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Param { type Owned = TreeArc<Param>; fn to_owned(&self) -> TreeArc<Param> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeAscriptionOwner for Param {} impl Param { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } } // ParamList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ParamList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ParamList { type Repr = rowan::SyntaxNode; } impl AstNode for ParamList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PARAM_LIST => Some(ParamList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ParamList { type Owned = TreeArc<ParamList>; fn to_owned(&self) -> TreeArc<ParamList> { TreeArc::cast(self.syntax.to_owned()) } } impl ParamList { pub fn params(&self) -> impl Iterator<Item = &Param> { super::children(self) } pub fn self_param(&self) -> Option<&SelfParam> { super::child_opt(self) } } // ParenExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ParenExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ParenExpr { type Repr = rowan::SyntaxNode; } impl AstNode for ParenExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PAREN_EXPR => Some(ParenExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ParenExpr { type Owned = TreeArc<ParenExpr>; fn to_owned(&self) -> TreeArc<ParenExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ParenExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // ParenType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ParenType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ParenType { type Repr = rowan::SyntaxNode; } impl AstNode for ParenType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PAREN_TYPE => Some(ParenType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ParenType { type Owned = TreeArc<ParenType>; fn to_owned(&self) -> TreeArc<ParenType> { TreeArc::cast(self.syntax.to_owned()) } } impl ParenType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // Pat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Pat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Pat { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum PatKind<'a> { RefPat(&'a RefPat), BindPat(&'a BindPat), PlaceholderPat(&'a PlaceholderPat), PathPat(&'a PathPat), StructPat(&'a StructPat), TupleStructPat(&'a TupleStructPat), TuplePat(&'a TuplePat), SlicePat(&'a SlicePat), RangePat(&'a RangePat), LiteralPat(&'a LiteralPat), } impl<'a> From<&'a RefPat> for &'a Pat { fn from(n: &'a RefPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a BindPat> for &'a Pat { fn from(n: &'a BindPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PlaceholderPat> for &'a Pat { fn from(n: &'a PlaceholderPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PathPat> for &'a Pat { fn from(n: &'a PathPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a StructPat> for &'a Pat { fn from(n: &'a StructPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TupleStructPat> for &'a Pat { fn from(n: &'a TupleStructPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TuplePat> for &'a Pat { fn from(n: &'a TuplePat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a SlicePat> for &'a Pat { fn from(n: &'a SlicePat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a RangePat> for &'a Pat { fn from(n: &'a RangePat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl<'a> From<&'a LiteralPat> for &'a Pat { fn from(n: &'a LiteralPat) -> &'a Pat { Pat::cast(&n.syntax).unwrap() } } impl AstNode for Pat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | REF_PAT | BIND_PAT | PLACEHOLDER_PAT | PATH_PAT | STRUCT_PAT | TUPLE_STRUCT_PAT | TUPLE_PAT | SLICE_PAT | RANGE_PAT | LITERAL_PAT => Some(Pat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Pat { type Owned = TreeArc<Pat>; fn to_owned(&self) -> TreeArc<Pat> { TreeArc::cast(self.syntax.to_owned()) } } impl Pat { pub fn kind(&self) -> PatKind { match self.syntax.kind() { REF_PAT => PatKind::RefPat(RefPat::cast(&self.syntax).unwrap()), BIND_PAT => PatKind::BindPat(BindPat::cast(&self.syntax).unwrap()), PLACEHOLDER_PAT => PatKind::PlaceholderPat(PlaceholderPat::cast(&self.syntax).unwrap()), PATH_PAT => PatKind::PathPat(PathPat::cast(&self.syntax).unwrap()), STRUCT_PAT => PatKind::StructPat(StructPat::cast(&self.syntax).unwrap()), TUPLE_STRUCT_PAT => PatKind::TupleStructPat(TupleStructPat::cast(&self.syntax).unwrap()), TUPLE_PAT => PatKind::TuplePat(TuplePat::cast(&self.syntax).unwrap()), SLICE_PAT => PatKind::SlicePat(SlicePat::cast(&self.syntax).unwrap()), RANGE_PAT => PatKind::RangePat(RangePat::cast(&self.syntax).unwrap()), LITERAL_PAT => PatKind::LiteralPat(LiteralPat::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl Pat {} // Path #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Path { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Path { type Repr = rowan::SyntaxNode; } impl AstNode for Path { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PATH => Some(Path::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Path { type Owned = TreeArc<Path>; fn to_owned(&self) -> TreeArc<Path> { TreeArc::cast(self.syntax.to_owned()) } } impl Path { pub fn segment(&self) -> Option<&PathSegment> { super::child_opt(self) } pub fn qualifier(&self) -> Option<&Path> { super::child_opt(self) } } // PathExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PathExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PathExpr { type Repr = rowan::SyntaxNode; } impl AstNode for PathExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PATH_EXPR => Some(PathExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PathExpr { type Owned = TreeArc<PathExpr>; fn to_owned(&self) -> TreeArc<PathExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl PathExpr { pub fn path(&self) -> Option<&Path> { super::child_opt(self) } } // PathPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PathPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PathPat { type Repr = rowan::SyntaxNode; } impl AstNode for PathPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PATH_PAT => Some(PathPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PathPat { type Owned = TreeArc<PathPat>; fn to_owned(&self) -> TreeArc<PathPat> { TreeArc::cast(self.syntax.to_owned()) } } impl PathPat { pub fn path(&self) -> Option<&Path> { super::child_opt(self) } } // PathSegment #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PathSegment { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PathSegment { type Repr = rowan::SyntaxNode; } impl AstNode for PathSegment { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PATH_SEGMENT => Some(PathSegment::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PathSegment { type Owned = TreeArc<PathSegment>; fn to_owned(&self) -> TreeArc<PathSegment> { TreeArc::cast(self.syntax.to_owned()) } } impl PathSegment { pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } pub fn type_arg_list(&self) -> Option<&TypeArgList> { super::child_opt(self) } } // PathType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PathType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PathType { type Repr = rowan::SyntaxNode; } impl AstNode for PathType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PATH_TYPE => Some(PathType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PathType { type Owned = TreeArc<PathType>; fn to_owned(&self) -> TreeArc<PathType> { TreeArc::cast(self.syntax.to_owned()) } } impl PathType { pub fn path(&self) -> Option<&Path> { super::child_opt(self) } } // PlaceholderPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PlaceholderPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PlaceholderPat { type Repr = rowan::SyntaxNode; } impl AstNode for PlaceholderPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PLACEHOLDER_PAT => Some(PlaceholderPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PlaceholderPat { type Owned = TreeArc<PlaceholderPat>; fn to_owned(&self) -> TreeArc<PlaceholderPat> { TreeArc::cast(self.syntax.to_owned()) } } impl PlaceholderPat {} // PlaceholderType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PlaceholderType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PlaceholderType { type Repr = rowan::SyntaxNode; } impl AstNode for PlaceholderType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PLACEHOLDER_TYPE => Some(PlaceholderType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PlaceholderType { type Owned = TreeArc<PlaceholderType>; fn to_owned(&self) -> TreeArc<PlaceholderType> { TreeArc::cast(self.syntax.to_owned()) } } impl PlaceholderType {} // PointerType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PointerType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PointerType { type Repr = rowan::SyntaxNode; } impl AstNode for PointerType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { POINTER_TYPE => Some(PointerType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PointerType { type Owned = TreeArc<PointerType>; fn to_owned(&self) -> TreeArc<PointerType> { TreeArc::cast(self.syntax.to_owned()) } } impl PointerType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // PosFieldDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PosFieldDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PosFieldDef { type Repr = rowan::SyntaxNode; } impl AstNode for PosFieldDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { POS_FIELD_DEF => Some(PosFieldDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PosFieldDef { type Owned = TreeArc<PosFieldDef>; fn to_owned(&self) -> TreeArc<PosFieldDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for PosFieldDef {} impl ast::AttrsOwner for PosFieldDef {} impl PosFieldDef { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // PosFieldDefList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PosFieldDefList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PosFieldDefList { type Repr = rowan::SyntaxNode; } impl AstNode for PosFieldDefList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { POS_FIELD_DEF_LIST => Some(PosFieldDefList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PosFieldDefList { type Owned = TreeArc<PosFieldDefList>; fn to_owned(&self) -> TreeArc<PosFieldDefList> { TreeArc::cast(self.syntax.to_owned()) } } impl PosFieldDefList { pub fn fields(&self) -> impl Iterator<Item = &PosFieldDef> { super::children(self) } } // PrefixExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PrefixExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for PrefixExpr { type Repr = rowan::SyntaxNode; } impl AstNode for PrefixExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { PREFIX_EXPR => Some(PrefixExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for PrefixExpr { type Owned = TreeArc<PrefixExpr>; fn to_owned(&self) -> TreeArc<PrefixExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl PrefixExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // RangeExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct RangeExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for RangeExpr { type Repr = rowan::SyntaxNode; } impl AstNode for RangeExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { RANGE_EXPR => Some(RangeExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for RangeExpr { type Owned = TreeArc<RangeExpr>; fn to_owned(&self) -> TreeArc<RangeExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl RangeExpr {} // RangePat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct RangePat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for RangePat { type Repr = rowan::SyntaxNode; } impl AstNode for RangePat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { RANGE_PAT => Some(RangePat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for RangePat { type Owned = TreeArc<RangePat>; fn to_owned(&self) -> TreeArc<RangePat> { TreeArc::cast(self.syntax.to_owned()) } } impl RangePat {} // RefExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct RefExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for RefExpr { type Repr = rowan::SyntaxNode; } impl AstNode for RefExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { REF_EXPR => Some(RefExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for RefExpr { type Owned = TreeArc<RefExpr>; fn to_owned(&self) -> TreeArc<RefExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl RefExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // RefPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct RefPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for RefPat { type Repr = rowan::SyntaxNode; } impl AstNode for RefPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { REF_PAT => Some(RefPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for RefPat { type Owned = TreeArc<RefPat>; fn to_owned(&self) -> TreeArc<RefPat> { TreeArc::cast(self.syntax.to_owned()) } } impl RefPat { pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } } // ReferenceType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ReferenceType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ReferenceType { type Repr = rowan::SyntaxNode; } impl AstNode for ReferenceType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { REFERENCE_TYPE => Some(ReferenceType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ReferenceType { type Owned = TreeArc<ReferenceType>; fn to_owned(&self) -> TreeArc<ReferenceType> { TreeArc::cast(self.syntax.to_owned()) } } impl ReferenceType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // RetType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct RetType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for RetType { type Repr = rowan::SyntaxNode; } impl AstNode for RetType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { RET_TYPE => Some(RetType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for RetType { type Owned = TreeArc<RetType>; fn to_owned(&self) -> TreeArc<RetType> { TreeArc::cast(self.syntax.to_owned()) } } impl RetType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // ReturnExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct ReturnExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for ReturnExpr { type Repr = rowan::SyntaxNode; } impl AstNode for ReturnExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { RETURN_EXPR => Some(ReturnExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for ReturnExpr { type Owned = TreeArc<ReturnExpr>; fn to_owned(&self) -> TreeArc<ReturnExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ReturnExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // SelfParam #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct SelfParam { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for SelfParam { type Repr = rowan::SyntaxNode; } impl AstNode for SelfParam { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { SELF_PARAM => Some(SelfParam::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for SelfParam { type Owned = TreeArc<SelfParam>; fn to_owned(&self) -> TreeArc<SelfParam> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeAscriptionOwner for SelfParam {} impl SelfParam {} // SlicePat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct SlicePat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for SlicePat { type Repr = rowan::SyntaxNode; } impl AstNode for SlicePat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { SLICE_PAT => Some(SlicePat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for SlicePat { type Owned = TreeArc<SlicePat>; fn to_owned(&self) -> TreeArc<SlicePat> { TreeArc::cast(self.syntax.to_owned()) } } impl SlicePat {} // SliceType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct SliceType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for SliceType { type Repr = rowan::SyntaxNode; } impl AstNode for SliceType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { SLICE_TYPE => Some(SliceType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for SliceType { type Owned = TreeArc<SliceType>; fn to_owned(&self) -> TreeArc<SliceType> { TreeArc::cast(self.syntax.to_owned()) } } impl SliceType { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // SourceFile #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct SourceFile { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for SourceFile { type Repr = rowan::SyntaxNode; } impl AstNode for SourceFile { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { SOURCE_FILE => Some(SourceFile::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for SourceFile { type Owned = TreeArc<SourceFile>; fn to_owned(&self) -> TreeArc<SourceFile> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::ModuleItemOwner for SourceFile {} impl ast::FnDefOwner for SourceFile {} impl SourceFile { pub fn modules(&self) -> impl Iterator<Item = &Module> { super::children(self) } } // StaticDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct StaticDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for StaticDef { type Repr = rowan::SyntaxNode; } impl AstNode for StaticDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { STATIC_DEF => Some(StaticDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for StaticDef { type Owned = TreeArc<StaticDef>; fn to_owned(&self) -> TreeArc<StaticDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for StaticDef {} impl ast::NameOwner for StaticDef {} impl ast::TypeParamsOwner for StaticDef {} impl ast::AttrsOwner for StaticDef {} impl ast::DocCommentsOwner for StaticDef {} impl ast::TypeAscriptionOwner for StaticDef {} impl StaticDef { pub fn body(&self) -> Option<&Expr> { super::child_opt(self) } } // Stmt #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Stmt { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Stmt { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum StmtKind<'a> { ExprStmt(&'a ExprStmt), LetStmt(&'a LetStmt), } impl<'a> From<&'a ExprStmt> for &'a Stmt { fn from(n: &'a ExprStmt) -> &'a Stmt { Stmt::cast(&n.syntax).unwrap() } } impl<'a> From<&'a LetStmt> for &'a Stmt { fn from(n: &'a LetStmt) -> &'a Stmt { Stmt::cast(&n.syntax).unwrap() } } impl AstNode for Stmt { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | EXPR_STMT | LET_STMT => Some(Stmt::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Stmt { type Owned = TreeArc<Stmt>; fn to_owned(&self) -> TreeArc<Stmt> { TreeArc::cast(self.syntax.to_owned()) } } impl Stmt { pub fn kind(&self) -> StmtKind { match self.syntax.kind() { EXPR_STMT => StmtKind::ExprStmt(ExprStmt::cast(&self.syntax).unwrap()), LET_STMT => StmtKind::LetStmt(LetStmt::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl Stmt {} // StructDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct StructDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for StructDef { type Repr = rowan::SyntaxNode; } impl AstNode for StructDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { STRUCT_DEF => Some(StructDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for StructDef { type Owned = TreeArc<StructDef>; fn to_owned(&self) -> TreeArc<StructDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for StructDef {} impl ast::NameOwner for StructDef {} impl ast::TypeParamsOwner for StructDef {} impl ast::AttrsOwner for StructDef {} impl ast::DocCommentsOwner for StructDef {} impl StructDef {} // StructLit #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct StructLit { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for StructLit { type Repr = rowan::SyntaxNode; } impl AstNode for StructLit { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { STRUCT_LIT => Some(StructLit::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for StructLit { type Owned = TreeArc<StructLit>; fn to_owned(&self) -> TreeArc<StructLit> { TreeArc::cast(self.syntax.to_owned()) } } impl StructLit { pub fn path(&self) -> Option<&Path> { super::child_opt(self) } pub fn named_field_list(&self) -> Option<&NamedFieldList> { super::child_opt(self) } pub fn spread(&self) -> Option<&Expr> { super::child_opt(self) } } // StructPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct StructPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for StructPat { type Repr = rowan::SyntaxNode; } impl AstNode for StructPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { STRUCT_PAT => Some(StructPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for StructPat { type Owned = TreeArc<StructPat>; fn to_owned(&self) -> TreeArc<StructPat> { TreeArc::cast(self.syntax.to_owned()) } } impl StructPat { pub fn field_pat_list(&self) -> Option<&FieldPatList> { super::child_opt(self) } pub fn path(&self) -> Option<&Path> { super::child_opt(self) } } // TokenTree #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TokenTree { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TokenTree { type Repr = rowan::SyntaxNode; } impl AstNode for TokenTree { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TOKEN_TREE => Some(TokenTree::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TokenTree { type Owned = TreeArc<TokenTree>; fn to_owned(&self) -> TreeArc<TokenTree> { TreeArc::cast(self.syntax.to_owned()) } } impl TokenTree {} // TraitDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TraitDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TraitDef { type Repr = rowan::SyntaxNode; } impl AstNode for TraitDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TRAIT_DEF => Some(TraitDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TraitDef { type Owned = TreeArc<TraitDef>; fn to_owned(&self) -> TreeArc<TraitDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for TraitDef {} impl ast::NameOwner for TraitDef {} impl ast::AttrsOwner for TraitDef {} impl ast::DocCommentsOwner for TraitDef {} impl ast::TypeParamsOwner for TraitDef {} impl ast::TypeBoundsOwner for TraitDef {} impl TraitDef { pub fn item_list(&self) -> Option<&ItemList> { super::child_opt(self) } } // TryExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TryExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TryExpr { type Repr = rowan::SyntaxNode; } impl AstNode for TryExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TRY_EXPR => Some(TryExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TryExpr { type Owned = TreeArc<TryExpr>; fn to_owned(&self) -> TreeArc<TryExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl TryExpr { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // TupleExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TupleExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TupleExpr { type Repr = rowan::SyntaxNode; } impl AstNode for TupleExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TUPLE_EXPR => Some(TupleExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TupleExpr { type Owned = TreeArc<TupleExpr>; fn to_owned(&self) -> TreeArc<TupleExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl TupleExpr { pub fn exprs(&self) -> impl Iterator<Item = &Expr> { super::children(self) } } // TuplePat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TuplePat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TuplePat { type Repr = rowan::SyntaxNode; } impl AstNode for TuplePat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TUPLE_PAT => Some(TuplePat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TuplePat { type Owned = TreeArc<TuplePat>; fn to_owned(&self) -> TreeArc<TuplePat> { TreeArc::cast(self.syntax.to_owned()) } } impl TuplePat { pub fn args(&self) -> impl Iterator<Item = &Pat> { super::children(self) } } // TupleStructPat #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TupleStructPat { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TupleStructPat { type Repr = rowan::SyntaxNode; } impl AstNode for TupleStructPat { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TUPLE_STRUCT_PAT => Some(TupleStructPat::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TupleStructPat { type Owned = TreeArc<TupleStructPat>; fn to_owned(&self) -> TreeArc<TupleStructPat> { TreeArc::cast(self.syntax.to_owned()) } } impl TupleStructPat { pub fn args(&self) -> impl Iterator<Item = &Pat> { super::children(self) } pub fn path(&self) -> Option<&Path> { super::child_opt(self) } } // TupleType #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TupleType { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TupleType { type Repr = rowan::SyntaxNode; } impl AstNode for TupleType { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TUPLE_TYPE => Some(TupleType::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TupleType { type Owned = TreeArc<TupleType>; fn to_owned(&self) -> TreeArc<TupleType> { TreeArc::cast(self.syntax.to_owned()) } } impl TupleType { pub fn fields(&self) -> impl Iterator<Item = &TypeRef> { super::children(self) } } // TypeAliasDef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeAliasDef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeAliasDef { type Repr = rowan::SyntaxNode; } impl AstNode for TypeAliasDef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_ALIAS_DEF => Some(TypeAliasDef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeAliasDef { type Owned = TreeArc<TypeAliasDef>; fn to_owned(&self) -> TreeArc<TypeAliasDef> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::VisibilityOwner for TypeAliasDef {} impl ast::NameOwner for TypeAliasDef {} impl ast::TypeParamsOwner for TypeAliasDef {} impl ast::AttrsOwner for TypeAliasDef {} impl ast::DocCommentsOwner for TypeAliasDef {} impl ast::TypeBoundsOwner for TypeAliasDef {} impl TypeAliasDef { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // TypeArg #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeArg { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeArg { type Repr = rowan::SyntaxNode; } impl AstNode for TypeArg { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_ARG => Some(TypeArg::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeArg { type Owned = TreeArc<TypeArg>; fn to_owned(&self) -> TreeArc<TypeArg> { TreeArc::cast(self.syntax.to_owned()) } } impl TypeArg { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // TypeArgList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeArgList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeArgList { type Repr = rowan::SyntaxNode; } impl AstNode for TypeArgList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_ARG_LIST => Some(TypeArgList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeArgList { type Owned = TreeArc<TypeArgList>; fn to_owned(&self) -> TreeArc<TypeArgList> { TreeArc::cast(self.syntax.to_owned()) } } impl TypeArgList { pub fn type_args(&self) -> impl Iterator<Item = &TypeArg> { super::children(self) } pub fn lifetime_args(&self) -> impl Iterator<Item = &LifetimeArg> { super::children(self) } pub fn assoc_type_args(&self) -> impl Iterator<Item = &AssocTypeArg> { super::children(self) } } // TypeBound #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeBound { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeBound { type Repr = rowan::SyntaxNode; } impl AstNode for TypeBound { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_BOUND => Some(TypeBound::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeBound { type Owned = TreeArc<TypeBound>; fn to_owned(&self) -> TreeArc<TypeBound> { TreeArc::cast(self.syntax.to_owned()) } } impl TypeBound { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // TypeBoundList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeBoundList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeBoundList { type Repr = rowan::SyntaxNode; } impl AstNode for TypeBoundList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_BOUND_LIST => Some(TypeBoundList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeBoundList { type Owned = TreeArc<TypeBoundList>; fn to_owned(&self) -> TreeArc<TypeBoundList> { TreeArc::cast(self.syntax.to_owned()) } } impl TypeBoundList { pub fn bounds(&self) -> impl Iterator<Item = &TypeBound> { super::children(self) } } // TypeParam #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeParam { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeParam { type Repr = rowan::SyntaxNode; } impl AstNode for TypeParam { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_PARAM => Some(TypeParam::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeParam { type Owned = TreeArc<TypeParam>; fn to_owned(&self) -> TreeArc<TypeParam> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::NameOwner for TypeParam {} impl ast::AttrsOwner for TypeParam {} impl ast::TypeBoundsOwner for TypeParam {} impl TypeParam {} // TypeParamList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeParamList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeParamList { type Repr = rowan::SyntaxNode; } impl AstNode for TypeParamList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { TYPE_PARAM_LIST => Some(TypeParamList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeParamList { type Owned = TreeArc<TypeParamList>; fn to_owned(&self) -> TreeArc<TypeParamList> { TreeArc::cast(self.syntax.to_owned()) } } impl TypeParamList { pub fn type_params(&self) -> impl Iterator<Item = &TypeParam> { super::children(self) } pub fn lifetime_params(&self) -> impl Iterator<Item = &LifetimeParam> { super::children(self) } } // TypeRef #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct TypeRef { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for TypeRef { type Repr = rowan::SyntaxNode; } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum TypeRefKind<'a> { ParenType(&'a ParenType), TupleType(&'a TupleType), NeverType(&'a NeverType), PathType(&'a PathType), PointerType(&'a PointerType), ArrayType(&'a ArrayType), SliceType(&'a SliceType), ReferenceType(&'a ReferenceType), PlaceholderType(&'a PlaceholderType), FnPointerType(&'a FnPointerType), ForType(&'a ForType), ImplTraitType(&'a ImplTraitType), DynTraitType(&'a DynTraitType), } impl<'a> From<&'a ParenType> for &'a TypeRef { fn from(n: &'a ParenType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a TupleType> for &'a TypeRef { fn from(n: &'a TupleType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a NeverType> for &'a TypeRef { fn from(n: &'a NeverType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PathType> for &'a TypeRef { fn from(n: &'a PathType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PointerType> for &'a TypeRef { fn from(n: &'a PointerType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ArrayType> for &'a TypeRef { fn from(n: &'a ArrayType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a SliceType> for &'a TypeRef { fn from(n: &'a SliceType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ReferenceType> for &'a TypeRef { fn from(n: &'a ReferenceType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a PlaceholderType> for &'a TypeRef { fn from(n: &'a PlaceholderType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a FnPointerType> for &'a TypeRef { fn from(n: &'a FnPointerType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ForType> for &'a TypeRef { fn from(n: &'a ForType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a ImplTraitType> for &'a TypeRef { fn from(n: &'a ImplTraitType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl<'a> From<&'a DynTraitType> for &'a TypeRef { fn from(n: &'a DynTraitType) -> &'a TypeRef { TypeRef::cast(&n.syntax).unwrap() } } impl AstNode for TypeRef { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { | PAREN_TYPE | TUPLE_TYPE | NEVER_TYPE | PATH_TYPE | POINTER_TYPE | ARRAY_TYPE | SLICE_TYPE | REFERENCE_TYPE | PLACEHOLDER_TYPE | FN_POINTER_TYPE | FOR_TYPE | IMPL_TRAIT_TYPE | DYN_TRAIT_TYPE => Some(TypeRef::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for TypeRef { type Owned = TreeArc<TypeRef>; fn to_owned(&self) -> TreeArc<TypeRef> { TreeArc::cast(self.syntax.to_owned()) } } impl TypeRef { pub fn kind(&self) -> TypeRefKind { match self.syntax.kind() { PAREN_TYPE => TypeRefKind::ParenType(ParenType::cast(&self.syntax).unwrap()), TUPLE_TYPE => TypeRefKind::TupleType(TupleType::cast(&self.syntax).unwrap()), NEVER_TYPE => TypeRefKind::NeverType(NeverType::cast(&self.syntax).unwrap()), PATH_TYPE => TypeRefKind::PathType(PathType::cast(&self.syntax).unwrap()), POINTER_TYPE => TypeRefKind::PointerType(PointerType::cast(&self.syntax).unwrap()), ARRAY_TYPE => TypeRefKind::ArrayType(ArrayType::cast(&self.syntax).unwrap()), SLICE_TYPE => TypeRefKind::SliceType(SliceType::cast(&self.syntax).unwrap()), REFERENCE_TYPE => TypeRefKind::ReferenceType(ReferenceType::cast(&self.syntax).unwrap()), PLACEHOLDER_TYPE => TypeRefKind::PlaceholderType(PlaceholderType::cast(&self.syntax).unwrap()), FN_POINTER_TYPE => TypeRefKind::FnPointerType(FnPointerType::cast(&self.syntax).unwrap()), FOR_TYPE => TypeRefKind::ForType(ForType::cast(&self.syntax).unwrap()), IMPL_TRAIT_TYPE => TypeRefKind::ImplTraitType(ImplTraitType::cast(&self.syntax).unwrap()), DYN_TRAIT_TYPE => TypeRefKind::DynTraitType(DynTraitType::cast(&self.syntax).unwrap()), _ => unreachable!(), } } } impl TypeRef {} // UseItem #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct UseItem { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for UseItem { type Repr = rowan::SyntaxNode; } impl AstNode for UseItem { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { USE_ITEM => Some(UseItem::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for UseItem { type Owned = TreeArc<UseItem>; fn to_owned(&self) -> TreeArc<UseItem> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::AttrsOwner for UseItem {} impl UseItem { pub fn use_tree(&self) -> Option<&UseTree> { super::child_opt(self) } } // UseTree #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct UseTree { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for UseTree { type Repr = rowan::SyntaxNode; } impl AstNode for UseTree { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { USE_TREE => Some(UseTree::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for UseTree { type Owned = TreeArc<UseTree>; fn to_owned(&self) -> TreeArc<UseTree> { TreeArc::cast(self.syntax.to_owned()) } } impl UseTree { pub fn path(&self) -> Option<&Path> { super::child_opt(self) } pub fn use_tree_list(&self) -> Option<&UseTreeList> { super::child_opt(self) } pub fn alias(&self) -> Option<&Alias> { super::child_opt(self) } } // UseTreeList #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct UseTreeList { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for UseTreeList { type Repr = rowan::SyntaxNode; } impl AstNode for UseTreeList { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { USE_TREE_LIST => Some(UseTreeList::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for UseTreeList { type Owned = TreeArc<UseTreeList>; fn to_owned(&self) -> TreeArc<UseTreeList> { TreeArc::cast(self.syntax.to_owned()) } } impl UseTreeList { pub fn use_trees(&self) -> impl Iterator<Item = &UseTree> { super::children(self) } } // Visibility #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Visibility { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for Visibility { type Repr = rowan::SyntaxNode; } impl AstNode for Visibility { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { VISIBILITY => Some(Visibility::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for Visibility { type Owned = TreeArc<Visibility>; fn to_owned(&self) -> TreeArc<Visibility> { TreeArc::cast(self.syntax.to_owned()) } } impl Visibility {} // WhereClause #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct WhereClause { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for WhereClause { type Repr = rowan::SyntaxNode; } impl AstNode for WhereClause { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { WHERE_CLAUSE => Some(WhereClause::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for WhereClause { type Owned = TreeArc<WhereClause>; fn to_owned(&self) -> TreeArc<WhereClause> { TreeArc::cast(self.syntax.to_owned()) } } impl WhereClause { pub fn predicates(&self) -> impl Iterator<Item = &WherePred> { super::children(self) } } // WherePred #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct WherePred { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for WherePred { type Repr = rowan::SyntaxNode; } impl AstNode for WherePred { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { WHERE_PRED => Some(WherePred::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for WherePred { type Owned = TreeArc<WherePred>; fn to_owned(&self) -> TreeArc<WherePred> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::TypeBoundsOwner for WherePred {} impl WherePred { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // WhileExpr #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct WhileExpr { pub(crate) syntax: SyntaxNode, } unsafe impl TransparentNewType for WhileExpr { type Repr = rowan::SyntaxNode; } impl AstNode for WhileExpr { fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { WHILE_EXPR => Some(WhileExpr::from_repr(syntax.into_repr())), _ => None, } } fn syntax(&self) -> &SyntaxNode { &self.syntax } } impl ToOwned for WhileExpr { type Owned = TreeArc<WhileExpr>; fn to_owned(&self) -> TreeArc<WhileExpr> { TreeArc::cast(self.syntax.to_owned()) } } impl ast::LoopBodyOwner for WhileExpr {} impl WhileExpr { pub fn condition(&self) -> Option<&Condition> { super::child_opt(self) } }