From 5618c8ade1885ca17a56d9303a7559b332ae3e9e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 7 Jan 2019 16:16:02 +0300 Subject: regenerate --- crates/ra_syntax/src/ast/generated.rs | 4843 ++++++++++++--------------------- 1 file changed, 1791 insertions(+), 3052 deletions(-) diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 24f72393a..5e96ab142 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -9,4648 +9,3387 @@ #![cfg_attr(rustfmt, rustfmt_skip)] -use std::hash::{Hash, Hasher}; +use rowan::TransparentNewType; use crate::{ - ast, - SyntaxNode, SyntaxNodeRef, AstNode, - yellow::{TreeRoot, RaTypes, OwnedRoot, RefRoot}, - SyntaxKind::*, + SyntaxNode, SyntaxKind::*, + yellow::{RaTypes, TreePtr}, + ast::{self, AstNode}, }; // ArgList -#[derive(Debug, Clone, Copy,)] -pub struct ArgListNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ArgList { + pub(crate) syntax: SyntaxNode, } -pub type ArgList<'a> = ArgListNode>; - -impl, R2: TreeRoot> PartialEq> for ArgListNode { - fn eq(&self, other: &ArgListNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for ArgListNode {} -impl> Hash for ArgListNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ArgList { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ArgList<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ArgList { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ARG_LIST => Some(ArgList { syntax }), + ARG_LIST => Some(ArgList::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ArgListNode { - pub fn borrowed(&self) -> ArgList { - ArgListNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ArgListNode { - ArgListNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ArgList<'a> { - pub fn args(self) -> impl Iterator> + 'a { +impl ArgList { + pub fn args(&self) -> impl Iterator { super::children(self) } } // ArrayExpr -#[derive(Debug, Clone, Copy,)] -pub struct ArrayExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ArrayExpr<'a> = ArrayExprNode>; - -impl, R2: TreeRoot> PartialEq> for ArrayExprNode { - fn eq(&self, other: &ArrayExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ArrayExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ArrayExprNode {} -impl> Hash for ArrayExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ArrayExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ArrayExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ArrayExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ARRAY_EXPR => Some(ArrayExpr { syntax }), + ARRAY_EXPR => Some(ArrayExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ArrayExprNode { - pub fn borrowed(&self) -> ArrayExpr { - ArrayExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ArrayExprNode { - ArrayExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ArrayExpr<'a> {} +impl ArrayExpr {} // ArrayType -#[derive(Debug, Clone, Copy,)] -pub struct ArrayTypeNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ArrayType { + pub(crate) syntax: SyntaxNode, } -pub type ArrayType<'a> = ArrayTypeNode>; - -impl, R2: TreeRoot> PartialEq> for ArrayTypeNode { - fn eq(&self, other: &ArrayTypeNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for ArrayTypeNode {} -impl> Hash for ArrayTypeNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ArrayType { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ArrayType<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ArrayType { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ARRAY_TYPE => Some(ArrayType { syntax }), + ARRAY_TYPE => Some(ArrayType::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ArrayTypeNode { - pub fn borrowed(&self) -> ArrayType { - ArrayTypeNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ArrayTypeNode { - ArrayTypeNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ArrayType<'a> { - pub fn type_ref(self) -> Option> { +impl ArrayType { + pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } - pub fn expr(self) -> Option> { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // Attr -#[derive(Debug, Clone, Copy,)] -pub struct AttrNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type Attr<'a> = AttrNode>; - -impl, R2: TreeRoot> PartialEq> for AttrNode { - fn eq(&self, other: &AttrNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Attr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for AttrNode {} -impl> Hash for AttrNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Attr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Attr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Attr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ATTR => Some(Attr { syntax }), + ATTR => Some(Attr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> AttrNode { - pub fn borrowed(&self) -> Attr { - AttrNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> AttrNode { - AttrNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> Attr<'a> { - pub fn value(self) -> Option> { +impl Attr { + pub fn value(&self) -> Option<&TokenTree> { super::child_opt(self) } } // BinExpr -#[derive(Debug, Clone, Copy,)] -pub struct BinExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct BinExpr { + pub(crate) syntax: SyntaxNode, } -pub type BinExpr<'a> = BinExprNode>; - -impl, R2: TreeRoot> PartialEq> for BinExprNode { - fn eq(&self, other: &BinExprNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for BinExprNode {} -impl> Hash for BinExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for BinExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for BinExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for BinExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BIN_EXPR => Some(BinExpr { syntax }), + BIN_EXPR => Some(BinExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> BinExprNode { - pub fn borrowed(&self) -> BinExpr { - BinExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> BinExprNode { - BinExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> BinExpr<'a> {} +impl BinExpr {} // BindPat -#[derive(Debug, Clone, Copy,)] -pub struct BindPatNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type BindPat<'a> = BindPatNode>; - -impl, R2: TreeRoot> PartialEq> for BindPatNode { - fn eq(&self, other: &BindPatNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct BindPat { + pub(crate) syntax: SyntaxNode, } -impl> Eq for BindPatNode {} -impl> Hash for BindPatNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for BindPat { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for BindPat<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for BindPat { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BIND_PAT => Some(BindPat { syntax }), + BIND_PAT => Some(BindPat::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> BindPatNode { - pub fn borrowed(&self) -> BindPat { - BindPatNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> BindPatNode { - BindPatNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::NameOwner<'a> for BindPat<'a> {} -impl<'a> BindPat<'a> {} +impl ast::NameOwner for BindPat {} +impl BindPat {} // Block -#[derive(Debug, Clone, Copy,)] -pub struct BlockNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Block { + pub(crate) syntax: SyntaxNode, } -pub type Block<'a> = BlockNode>; - -impl, R2: TreeRoot> PartialEq> for BlockNode { - fn eq(&self, other: &BlockNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for BlockNode {} -impl> Hash for BlockNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Block { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Block<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Block { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BLOCK => Some(Block { syntax }), + BLOCK => Some(Block::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> BlockNode { - pub fn borrowed(&self) -> Block { - BlockNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> BlockNode { - BlockNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> Block<'a> { - pub fn statements(self) -> impl Iterator> + 'a { +impl Block { + pub fn statements(&self) -> impl Iterator { super::children(self) } - pub fn expr(self) -> Option> { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // BlockExpr -#[derive(Debug, Clone, Copy,)] -pub struct BlockExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type BlockExpr<'a> = BlockExprNode>; - -impl, R2: TreeRoot> PartialEq> for BlockExprNode { - fn eq(&self, other: &BlockExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct BlockExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for BlockExprNode {} -impl> Hash for BlockExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for BlockExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for BlockExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for BlockExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BLOCK_EXPR => Some(BlockExpr { syntax }), + BLOCK_EXPR => Some(BlockExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> BlockExprNode { - pub fn borrowed(&self) -> BlockExpr { - BlockExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> BlockExprNode { - BlockExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> BlockExpr<'a> { - pub fn block(self) -> Option> { +impl BlockExpr { + pub fn block(&self) -> Option<&Block> { super::child_opt(self) } } // BreakExpr -#[derive(Debug, Clone, Copy,)] -pub struct BreakExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct BreakExpr { + pub(crate) syntax: SyntaxNode, } -pub type BreakExpr<'a> = BreakExprNode>; - -impl, R2: TreeRoot> PartialEq> for BreakExprNode { - fn eq(&self, other: &BreakExprNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for BreakExprNode {} -impl> Hash for BreakExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for BreakExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for BreakExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for BreakExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BREAK_EXPR => Some(BreakExpr { syntax }), + BREAK_EXPR => Some(BreakExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> BreakExprNode { - pub fn borrowed(&self) -> BreakExpr { - BreakExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> BreakExprNode { - BreakExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> BreakExpr<'a> { - pub fn expr(self) -> Option> { +impl BreakExpr { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // Byte -#[derive(Debug, Clone, Copy,)] -pub struct ByteNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type Byte<'a> = ByteNode>; - -impl, R2: TreeRoot> PartialEq> for ByteNode { - fn eq(&self, other: &ByteNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Byte { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ByteNode {} -impl> Hash for ByteNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Byte { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Byte<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Byte { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BYTE => Some(Byte { syntax }), + BYTE => Some(Byte::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ByteNode { - pub fn borrowed(&self) -> Byte { - ByteNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ByteNode { - ByteNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> Byte<'a> {} +impl Byte {} // ByteString -#[derive(Debug, Clone, Copy,)] -pub struct ByteStringNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ByteString { + pub(crate) syntax: SyntaxNode, } -pub type ByteString<'a> = ByteStringNode>; - -impl, R2: TreeRoot> PartialEq> for ByteStringNode { - fn eq(&self, other: &ByteStringNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for ByteStringNode {} -impl> Hash for ByteStringNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ByteString { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ByteString<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ByteString { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - BYTE_STRING => Some(ByteString { syntax }), + BYTE_STRING => Some(ByteString::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ByteStringNode { - pub fn borrowed(&self) -> ByteString { - ByteStringNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ByteStringNode { - ByteStringNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ByteString<'a> {} +impl ByteString {} // CallExpr -#[derive(Debug, Clone, Copy,)] -pub struct CallExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type CallExpr<'a> = CallExprNode>; - -impl, R2: TreeRoot> PartialEq> for CallExprNode { - fn eq(&self, other: &CallExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct CallExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for CallExprNode {} -impl> Hash for CallExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for CallExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for CallExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for CallExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - CALL_EXPR => Some(CallExpr { syntax }), + CALL_EXPR => Some(CallExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> CallExprNode { - pub fn borrowed(&self) -> CallExpr { - CallExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> CallExprNode { - CallExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::ArgListOwner<'a> for CallExpr<'a> {} -impl<'a> CallExpr<'a> { - pub fn expr(self) -> Option> { +impl ast::ArgListOwner for CallExpr {} +impl CallExpr { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // CastExpr -#[derive(Debug, Clone, Copy,)] -pub struct CastExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct CastExpr { + pub(crate) syntax: SyntaxNode, } -pub type CastExpr<'a> = CastExprNode>; - -impl, R2: TreeRoot> PartialEq> for CastExprNode { - fn eq(&self, other: &CastExprNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for CastExprNode {} -impl> Hash for CastExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for CastExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for CastExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for CastExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - CAST_EXPR => Some(CastExpr { syntax }), + CAST_EXPR => Some(CastExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> CastExprNode { - pub fn borrowed(&self) -> CastExpr { - CastExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> CastExprNode { - CastExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> CastExpr<'a> { - pub fn expr(self) -> Option> { +impl CastExpr { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } - pub fn type_ref(self) -> Option> { + pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // Char -#[derive(Debug, Clone, Copy,)] -pub struct CharNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type Char<'a> = CharNode>; - -impl, R2: TreeRoot> PartialEq> for CharNode { - fn eq(&self, other: &CharNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Char { + pub(crate) syntax: SyntaxNode, } -impl> Eq for CharNode {} -impl> Hash for CharNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Char { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Char<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Char { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - CHAR => Some(Char { syntax }), + CHAR => Some(Char::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> CharNode { - pub fn borrowed(&self) -> Char { - CharNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> CharNode { - CharNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> Char<'a> {} +impl Char {} // Comment -#[derive(Debug, Clone, Copy,)] -pub struct CommentNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Comment { + pub(crate) syntax: SyntaxNode, } -pub type Comment<'a> = CommentNode>; - -impl, R2: TreeRoot> PartialEq> for CommentNode { - fn eq(&self, other: &CommentNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for CommentNode {} -impl> Hash for CommentNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Comment { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Comment<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Comment { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - COMMENT => Some(Comment { syntax }), + COMMENT => Some(Comment::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> CommentNode { - pub fn borrowed(&self) -> Comment { - CommentNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> CommentNode { - CommentNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> Comment<'a> {} +impl Comment {} // Condition -#[derive(Debug, Clone, Copy,)] -pub struct ConditionNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type Condition<'a> = ConditionNode>; - -impl, R2: TreeRoot> PartialEq> for ConditionNode { - fn eq(&self, other: &ConditionNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Condition { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ConditionNode {} -impl> Hash for ConditionNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Condition { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Condition<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Condition { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - CONDITION => Some(Condition { syntax }), + CONDITION => Some(Condition::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ConditionNode { - pub fn borrowed(&self) -> Condition { - ConditionNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ConditionNode { - ConditionNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> Condition<'a> { - pub fn pat(self) -> Option> { +impl Condition { + pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } - pub fn expr(self) -> Option> { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // ConstDef -#[derive(Debug, Clone, Copy,)] -pub struct ConstDefNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ConstDef { + pub(crate) syntax: SyntaxNode, } -pub type ConstDef<'a> = ConstDefNode>; - -impl, R2: TreeRoot> PartialEq> for ConstDefNode { - fn eq(&self, other: &ConstDefNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for ConstDefNode {} -impl> Hash for ConstDefNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ConstDef { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ConstDef<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ConstDef { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - CONST_DEF => Some(ConstDef { syntax }), + CONST_DEF => Some(ConstDef::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ConstDefNode { - pub fn borrowed(&self) -> ConstDef { - ConstDefNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ConstDefNode { - ConstDefNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::VisibilityOwner<'a> for ConstDef<'a> {} -impl<'a> ast::NameOwner<'a> for ConstDef<'a> {} -impl<'a> ast::TypeParamsOwner<'a> for ConstDef<'a> {} -impl<'a> ast::AttrsOwner<'a> for ConstDef<'a> {} -impl<'a> ast::DocCommentsOwner<'a> for ConstDef<'a> {} -impl<'a> ConstDef<'a> {} +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 ConstDef {} // ContinueExpr -#[derive(Debug, Clone, Copy,)] -pub struct ContinueExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ContinueExpr<'a> = ContinueExprNode>; - -impl, R2: TreeRoot> PartialEq> for ContinueExprNode { - fn eq(&self, other: &ContinueExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ContinueExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ContinueExprNode {} -impl> Hash for ContinueExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ContinueExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ContinueExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ContinueExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - CONTINUE_EXPR => Some(ContinueExpr { syntax }), + CONTINUE_EXPR => Some(ContinueExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ContinueExprNode { - pub fn borrowed(&self) -> ContinueExpr { - ContinueExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ContinueExprNode { - ContinueExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ContinueExpr<'a> {} +impl ContinueExpr {} // DynTraitType -#[derive(Debug, Clone, Copy,)] -pub struct DynTraitTypeNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct DynTraitType { + pub(crate) syntax: SyntaxNode, } -pub type DynTraitType<'a> = DynTraitTypeNode>; - -impl, R2: TreeRoot> PartialEq> for DynTraitTypeNode { - fn eq(&self, other: &DynTraitTypeNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for DynTraitTypeNode {} -impl> Hash for DynTraitTypeNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for DynTraitType { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for DynTraitType<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for DynTraitType { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - DYN_TRAIT_TYPE => Some(DynTraitType { syntax }), + DYN_TRAIT_TYPE => Some(DynTraitType::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> DynTraitTypeNode { - pub fn borrowed(&self) -> DynTraitType { - DynTraitTypeNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> DynTraitTypeNode { - DynTraitTypeNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> DynTraitType<'a> {} +impl DynTraitType {} // EnumDef -#[derive(Debug, Clone, Copy,)] -pub struct EnumDefNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type EnumDef<'a> = EnumDefNode>; - -impl, R2: TreeRoot> PartialEq> for EnumDefNode { - fn eq(&self, other: &EnumDefNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct EnumDef { + pub(crate) syntax: SyntaxNode, } -impl> Eq for EnumDefNode {} -impl> Hash for EnumDefNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for EnumDef { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for EnumDef<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for EnumDef { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ENUM_DEF => Some(EnumDef { syntax }), + ENUM_DEF => Some(EnumDef::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> EnumDefNode { - pub fn borrowed(&self) -> EnumDef { - EnumDefNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> EnumDefNode { - EnumDefNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::VisibilityOwner<'a> for EnumDef<'a> {} -impl<'a> ast::NameOwner<'a> for EnumDef<'a> {} -impl<'a> ast::TypeParamsOwner<'a> for EnumDef<'a> {} -impl<'a> ast::AttrsOwner<'a> for EnumDef<'a> {} -impl<'a> ast::DocCommentsOwner<'a> for EnumDef<'a> {} -impl<'a> EnumDef<'a> { - pub fn variant_list(self) -> Option> { +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, Clone, Copy,)] -pub struct EnumVariantNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct EnumVariant { + pub(crate) syntax: SyntaxNode, } -pub type EnumVariant<'a> = EnumVariantNode>; - -impl, R2: TreeRoot> PartialEq> for EnumVariantNode { - fn eq(&self, other: &EnumVariantNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for EnumVariantNode {} -impl> Hash for EnumVariantNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for EnumVariant { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for EnumVariant<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for EnumVariant { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ENUM_VARIANT => Some(EnumVariant { syntax }), + ENUM_VARIANT => Some(EnumVariant::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> EnumVariantNode { - pub fn borrowed(&self) -> EnumVariant { - EnumVariantNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> EnumVariantNode { - EnumVariantNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::NameOwner<'a> for EnumVariant<'a> {} -impl<'a> EnumVariant<'a> { - pub fn expr(self) -> Option> { +impl ast::NameOwner for EnumVariant {} +impl EnumVariant { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // EnumVariantList -#[derive(Debug, Clone, Copy,)] -pub struct EnumVariantListNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type EnumVariantList<'a> = EnumVariantListNode>; - -impl, R2: TreeRoot> PartialEq> for EnumVariantListNode { - fn eq(&self, other: &EnumVariantListNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct EnumVariantList { + pub(crate) syntax: SyntaxNode, } -impl> Eq for EnumVariantListNode {} -impl> Hash for EnumVariantListNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for EnumVariantList { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for EnumVariantList<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for EnumVariantList { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ENUM_VARIANT_LIST => Some(EnumVariantList { syntax }), + ENUM_VARIANT_LIST => Some(EnumVariantList::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> EnumVariantListNode { - pub fn borrowed(&self) -> EnumVariantList { - EnumVariantListNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> EnumVariantListNode { - EnumVariantListNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> EnumVariantList<'a> { - pub fn variants(self) -> impl Iterator> + 'a { +impl EnumVariantList { + pub fn variants(&self) -> impl Iterator { super::children(self) } } // Expr -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Expr<'a> { - TupleExpr(TupleExpr<'a>), - ArrayExpr(ArrayExpr<'a>), - ParenExpr(ParenExpr<'a>), - PathExpr(PathExpr<'a>), - LambdaExpr(LambdaExpr<'a>), - IfExpr(IfExpr<'a>), - LoopExpr(LoopExpr<'a>), - ForExpr(ForExpr<'a>), - WhileExpr(WhileExpr<'a>), - ContinueExpr(ContinueExpr<'a>), - BreakExpr(BreakExpr<'a>), - Label(Label<'a>), - BlockExpr(BlockExpr<'a>), - ReturnExpr(ReturnExpr<'a>), - MatchExpr(MatchExpr<'a>), - StructLit(StructLit<'a>), - CallExpr(CallExpr<'a>), - IndexExpr(IndexExpr<'a>), - MethodCallExpr(MethodCallExpr<'a>), - FieldExpr(FieldExpr<'a>), - TryExpr(TryExpr<'a>), - CastExpr(CastExpr<'a>), - RefExpr(RefExpr<'a>), - PrefixExpr(PrefixExpr<'a>), - RangeExpr(RangeExpr<'a>), - BinExpr(BinExpr<'a>), - Literal(Literal<'a>), -} - -impl<'a> AstNode<'a> for Expr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { - match syntax.kind() { - TUPLE_EXPR => Some(Expr::TupleExpr(TupleExpr { syntax })), - ARRAY_EXPR => Some(Expr::ArrayExpr(ArrayExpr { syntax })), - PAREN_EXPR => Some(Expr::ParenExpr(ParenExpr { syntax })), - PATH_EXPR => Some(Expr::PathExpr(PathExpr { syntax })), - LAMBDA_EXPR => Some(Expr::LambdaExpr(LambdaExpr { syntax })), - IF_EXPR => Some(Expr::IfExpr(IfExpr { syntax })), - LOOP_EXPR => Some(Expr::LoopExpr(LoopExpr { syntax })), - FOR_EXPR => Some(Expr::ForExpr(ForExpr { syntax })), - WHILE_EXPR => Some(Expr::WhileExpr(WhileExpr { syntax })), - CONTINUE_EXPR => Some(Expr::ContinueExpr(ContinueExpr { syntax })), - BREAK_EXPR => Some(Expr::BreakExpr(BreakExpr { syntax })), - LABEL => Some(Expr::Label(Label { syntax })), - BLOCK_EXPR => Some(Expr::BlockExpr(BlockExpr { syntax })), - RETURN_EXPR => Some(Expr::ReturnExpr(ReturnExpr { syntax })), - MATCH_EXPR => Some(Expr::MatchExpr(MatchExpr { syntax })), - STRUCT_LIT => Some(Expr::StructLit(StructLit { syntax })), - CALL_EXPR => Some(Expr::CallExpr(CallExpr { syntax })), - INDEX_EXPR => Some(Expr::IndexExpr(IndexExpr { syntax })), - METHOD_CALL_EXPR => Some(Expr::MethodCallExpr(MethodCallExpr { syntax })), - FIELD_EXPR => Some(Expr::FieldExpr(FieldExpr { syntax })), - TRY_EXPR => Some(Expr::TryExpr(TryExpr { syntax })), - CAST_EXPR => Some(Expr::CastExpr(CastExpr { syntax })), - REF_EXPR => Some(Expr::RefExpr(RefExpr { syntax })), - PREFIX_EXPR => Some(Expr::PrefixExpr(PrefixExpr { syntax })), - RANGE_EXPR => Some(Expr::RangeExpr(RangeExpr { syntax })), - BIN_EXPR => Some(Expr::BinExpr(BinExpr { syntax })), - LITERAL => Some(Expr::Literal(Literal { syntax })), - _ => None, - } - } - fn syntax(self) -> SyntaxNodeRef<'a> { - match self { - Expr::TupleExpr(inner) => inner.syntax(), - Expr::ArrayExpr(inner) => inner.syntax(), - Expr::ParenExpr(inner) => inner.syntax(), - Expr::PathExpr(inner) => inner.syntax(), - Expr::LambdaExpr(inner) => inner.syntax(), - Expr::IfExpr(inner) => inner.syntax(), - Expr::LoopExpr(inner) => inner.syntax(), - Expr::ForExpr(inner) => inner.syntax(), - Expr::WhileExpr(inner) => inner.syntax(), - Expr::ContinueExpr(inner) => inner.syntax(), - Expr::BreakExpr(inner) => inner.syntax(), - Expr::Label(inner) => inner.syntax(), - Expr::BlockExpr(inner) => inner.syntax(), - Expr::ReturnExpr(inner) => inner.syntax(), - Expr::MatchExpr(inner) => inner.syntax(), - Expr::StructLit(inner) => inner.syntax(), - Expr::CallExpr(inner) => inner.syntax(), - Expr::IndexExpr(inner) => inner.syntax(), - Expr::MethodCallExpr(inner) => inner.syntax(), - Expr::FieldExpr(inner) => inner.syntax(), - Expr::TryExpr(inner) => inner.syntax(), - Expr::CastExpr(inner) => inner.syntax(), - Expr::RefExpr(inner) => inner.syntax(), - Expr::PrefixExpr(inner) => inner.syntax(), - Expr::RangeExpr(inner) => inner.syntax(), - Expr::BinExpr(inner) => inner.syntax(), - Expr::Literal(inner) => inner.syntax(), - } - } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Expr { + pub(crate) syntax: SyntaxNode, +} +unsafe impl TransparentNewType for Expr { + type Repr = rowan::SyntaxNode; } -impl<'a> Expr<'a> {} +#[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), +} + +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 => Some(Expr::from_repr(syntax.into_repr())), + _ => None, + } + } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::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()), + _ => unreachable!(), + } + } +} + +impl Expr {} // ExprStmt -#[derive(Debug, Clone, Copy,)] -pub struct ExprStmtNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ExprStmt<'a> = ExprStmtNode>; - -impl, R2: TreeRoot> PartialEq> for ExprStmtNode { - fn eq(&self, other: &ExprStmtNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ExprStmt { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ExprStmtNode {} -impl> Hash for ExprStmtNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ExprStmt { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ExprStmt<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ExprStmt { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - EXPR_STMT => Some(ExprStmt { syntax }), + EXPR_STMT => Some(ExprStmt::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ExprStmtNode { - pub fn borrowed(&self) -> ExprStmt { - ExprStmtNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ExprStmtNode { - ExprStmtNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ExprStmt<'a> { - pub fn expr(self) -> Option> { +impl ExprStmt { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } } // ExternCrateItem -#[derive(Debug, Clone, Copy,)] -pub struct ExternCrateItemNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ExternCrateItem<'a> = ExternCrateItemNode>; - -impl, R2: TreeRoot> PartialEq> for ExternCrateItemNode { - fn eq(&self, other: &ExternCrateItemNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ExternCrateItem { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ExternCrateItemNode {} -impl> Hash for ExternCrateItemNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ExternCrateItem { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ExternCrateItem<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ExternCrateItem { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - EXTERN_CRATE_ITEM => Some(ExternCrateItem { syntax }), + EXTERN_CRATE_ITEM => Some(ExternCrateItem::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ExternCrateItemNode { - pub fn borrowed(&self) -> ExternCrateItem { - ExternCrateItemNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ExternCrateItemNode { - ExternCrateItemNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ExternCrateItem<'a> {} +impl ExternCrateItem {} // FieldExpr -#[derive(Debug, Clone, Copy,)] -pub struct FieldExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type FieldExpr<'a> = FieldExprNode>; - -impl, R2: TreeRoot> PartialEq> for FieldExprNode { - fn eq(&self, other: &FieldExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct FieldExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for FieldExprNode {} -impl> Hash for FieldExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for FieldExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for FieldExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for FieldExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FIELD_EXPR => Some(FieldExpr { syntax }), + FIELD_EXPR => Some(FieldExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> FieldExprNode { - pub fn borrowed(&self) -> FieldExpr { - FieldExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> FieldExprNode { - FieldExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> FieldExpr<'a> { - pub fn expr(self) -> Option> { +impl FieldExpr { + pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) } - pub fn name_ref(self) -> Option> { + pub fn name_ref(&self) -> Option<&NameRef> { super::child_opt(self) } } // FieldPatList -#[derive(Debug, Clone, Copy,)] -pub struct FieldPatListNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type FieldPatList<'a> = FieldPatListNode>; - -impl, R2: TreeRoot> PartialEq> for FieldPatListNode { - fn eq(&self, other: &FieldPatListNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct FieldPatList { + pub(crate) syntax: SyntaxNode, } -impl> Eq for FieldPatListNode {} -impl> Hash for FieldPatListNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for FieldPatList { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for FieldPatList<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for FieldPatList { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FIELD_PAT_LIST => Some(FieldPatList { syntax }), + FIELD_PAT_LIST => Some(FieldPatList::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> FieldPatListNode { - pub fn borrowed(&self) -> FieldPatList { - FieldPatListNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> FieldPatListNode { - FieldPatListNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> FieldPatList<'a> {} +impl FieldPatList {} // FnDef -#[derive(Debug, Clone, Copy,)] -pub struct FnDefNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type FnDef<'a> = FnDefNode>; - -impl, R2: TreeRoot> PartialEq> for FnDefNode { - fn eq(&self, other: &FnDefNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct FnDef { + pub(crate) syntax: SyntaxNode, } -impl> Eq for FnDefNode {} -impl> Hash for FnDefNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for FnDef { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for FnDef<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for FnDef { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FN_DEF => Some(FnDef { syntax }), + FN_DEF => Some(FnDef::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> FnDefNode { - pub fn borrowed(&self) -> FnDef { - FnDefNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> FnDefNode { - FnDefNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::VisibilityOwner<'a> for FnDef<'a> {} -impl<'a> ast::NameOwner<'a> for FnDef<'a> {} -impl<'a> ast::TypeParamsOwner<'a> for FnDef<'a> {} -impl<'a> ast::AttrsOwner<'a> for FnDef<'a> {} -impl<'a> ast::DocCommentsOwner<'a> for FnDef<'a> {} -impl<'a> FnDef<'a> { - pub fn param_list(self) -> Option> { +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> { + pub fn body(&self) -> Option<&Block> { super::child_opt(self) } - pub fn ret_type(self) -> Option> { + pub fn ret_type(&self) -> Option<&RetType> { super::child_opt(self) } } // FnPointerType -#[derive(Debug, Clone, Copy,)] -pub struct FnPointerTypeNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type FnPointerType<'a> = FnPointerTypeNode>; - -impl, R2: TreeRoot> PartialEq> for FnPointerTypeNode { - fn eq(&self, other: &FnPointerTypeNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct FnPointerType { + pub(crate) syntax: SyntaxNode, } -impl> Eq for FnPointerTypeNode {} -impl> Hash for FnPointerTypeNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for FnPointerType { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for FnPointerType<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for FnPointerType { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FN_POINTER_TYPE => Some(FnPointerType { syntax }), + FN_POINTER_TYPE => Some(FnPointerType::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> FnPointerTypeNode { - pub fn borrowed(&self) -> FnPointerType { - FnPointerTypeNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> FnPointerTypeNode { - FnPointerTypeNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> FnPointerType<'a> { - pub fn param_list(self) -> Option> { +impl FnPointerType { + pub fn param_list(&self) -> Option<&ParamList> { super::child_opt(self) } - pub fn ret_type(self) -> Option> { + pub fn ret_type(&self) -> Option<&RetType> { super::child_opt(self) } } // ForExpr -#[derive(Debug, Clone, Copy,)] -pub struct ForExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ForExpr<'a> = ForExprNode>; - -impl, R2: TreeRoot> PartialEq> for ForExprNode { - fn eq(&self, other: &ForExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ForExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ForExprNode {} -impl> Hash for ForExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ForExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ForExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ForExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FOR_EXPR => Some(ForExpr { syntax }), + FOR_EXPR => Some(ForExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ForExprNode { - pub fn borrowed(&self) -> ForExpr { - ForExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ForExprNode { - ForExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::LoopBodyOwner<'a> for ForExpr<'a> {} -impl<'a> ForExpr<'a> { - pub fn pat(self) -> Option> { +impl ast::LoopBodyOwner for ForExpr {} +impl ForExpr { + pub fn pat(&self) -> Option<&Pat> { super::child_opt(self) } - pub fn iterable(self) -> Option> { + pub fn iterable(&self) -> Option<&Expr> { super::child_opt(self) } } // ForType -#[derive(Debug, Clone, Copy,)] -pub struct ForTypeNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ForType<'a> = ForTypeNode>; - -impl, R2: TreeRoot> PartialEq> for ForTypeNode { - fn eq(&self, other: &ForTypeNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ForType { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ForTypeNode {} -impl> Hash for ForTypeNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ForType { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ForType<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ForType { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FOR_TYPE => Some(ForType { syntax }), + FOR_TYPE => Some(ForType::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ForTypeNode { - pub fn borrowed(&self) -> ForType { - ForTypeNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ForTypeNode { - ForTypeNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ForType<'a> { - pub fn type_ref(self) -> Option> { +impl ForType { + pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) } } // IfExpr -#[derive(Debug, Clone, Copy,)] -pub struct IfExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type IfExpr<'a> = IfExprNode>; - -impl, R2: TreeRoot> PartialEq> for IfExprNode { - fn eq(&self, other: &IfExprNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct IfExpr { + pub(crate) syntax: SyntaxNode, } -impl> Eq for IfExprNode {} -impl> Hash for IfExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for IfExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for IfExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for IfExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - IF_EXPR => Some(IfExpr { syntax }), + IF_EXPR => Some(IfExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> IfExprNode { - pub fn borrowed(&self) -> IfExpr { - IfExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> IfExprNode { - IfExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> IfExpr<'a> { - pub fn condition(self) -> Option> { +impl IfExpr { + pub fn condition(&self) -> Option<&Condition> { super::child_opt(self) } } // ImplBlock -#[derive(Debug, Clone, Copy,)] -pub struct ImplBlockNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ImplBlock<'a> = ImplBlockNode>; - -impl, R2: TreeRoot> PartialEq> for ImplBlockNode { - fn eq(&self, other: &ImplBlockNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ImplBlock { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ImplBlockNode {} -impl> Hash for ImplBlockNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ImplBlock { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ImplBlock<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ImplBlock { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - IMPL_BLOCK => Some(ImplBlock { syntax }), + IMPL_BLOCK => Some(ImplBlock::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ImplBlockNode { - pub fn borrowed(&self) -> ImplBlock { - ImplBlockNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ImplBlockNode { - ImplBlockNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ImplBlock<'a> { - pub fn item_list(self) -> Option> { +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 ImplItem<'a> { - FnDef(FnDef<'a>), - TypeDef(TypeDef<'a>), - ConstDef(ConstDef<'a>), +pub enum ImplItemKind<'a> { + FnDef(&'a FnDef), + TypeDef(&'a TypeDef), + ConstDef(&'a ConstDef), } -impl<'a> AstNode<'a> for ImplItem<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ImplItem { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - FN_DEF => Some(ImplItem::FnDef(FnDef { syntax })), - TYPE_DEF => Some(ImplItem::TypeDef(TypeDef { syntax })), - CONST_DEF => Some(ImplItem::ConstDef(ConstDef { syntax })), + | FN_DEF + | TYPE_DEF + | CONST_DEF => Some(ImplItem::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { - match self { - ImplItem::FnDef(inner) => inner.syntax(), - ImplItem::TypeDef(inner) => inner.syntax(), - ImplItem::ConstDef(inner) => inner.syntax(), + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::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_DEF => ImplItemKind::TypeDef(TypeDef::cast(&self.syntax).unwrap()), + CONST_DEF => ImplItemKind::ConstDef(ConstDef::cast(&self.syntax).unwrap()), + _ => unreachable!(), } } } -impl<'a> ImplItem<'a> {} +impl ImplItem {} // ImplTraitType -#[derive(Debug, Clone, Copy,)] -pub struct ImplTraitTypeNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ImplTraitType<'a> = ImplTraitTypeNode>; - -impl, R2: TreeRoot> PartialEq> for ImplTraitTypeNode { - fn eq(&self, other: &ImplTraitTypeNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ImplTraitType { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ImplTraitTypeNode {} -impl> Hash for ImplTraitTypeNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ImplTraitType { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ImplTraitType<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ImplTraitType { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - IMPL_TRAIT_TYPE => Some(ImplTraitType { syntax }), + IMPL_TRAIT_TYPE => Some(ImplTraitType::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ImplTraitTypeNode { - pub fn borrowed(&self) -> ImplTraitType { - ImplTraitTypeNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ImplTraitTypeNode { - ImplTraitTypeNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ImplTraitType<'a> {} +impl ImplTraitType {} // IndexExpr -#[derive(Debug, Clone, Copy,)] -pub struct IndexExprNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct IndexExpr { + pub(crate) syntax: SyntaxNode, } -pub type IndexExpr<'a> = IndexExprNode>; - -impl, R2: TreeRoot> PartialEq> for IndexExprNode { - fn eq(&self, other: &IndexExprNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for IndexExprNode {} -impl> Hash for IndexExprNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for IndexExpr { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for IndexExpr<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for IndexExpr { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - INDEX_EXPR => Some(IndexExpr { syntax }), + INDEX_EXPR => Some(IndexExpr::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> IndexExprNode { - pub fn borrowed(&self) -> IndexExpr { - IndexExprNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> IndexExprNode { - IndexExprNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> IndexExpr<'a> {} +impl IndexExpr {} // ItemList -#[derive(Debug, Clone, Copy,)] -pub struct ItemListNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, -} -pub type ItemList<'a> = ItemListNode>; - -impl, R2: TreeRoot> PartialEq> for ItemListNode { - fn eq(&self, other: &ItemListNode) -> bool { self.syntax == other.syntax } +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct ItemList { + pub(crate) syntax: SyntaxNode, } -impl> Eq for ItemListNode {} -impl> Hash for ItemListNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for ItemList { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for ItemList<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for ItemList { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - ITEM_LIST => Some(ItemList { syntax }), + ITEM_LIST => Some(ItemList::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> ItemListNode { - pub fn borrowed(&self) -> ItemList { - ItemListNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> ItemListNode { - ItemListNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr { TreePtr::cast(self.syntax.to_owned()) } } -impl<'a> ast::FnDefOwner<'a> for ItemList<'a> {} -impl<'a> ast::ModuleItemOwner<'a> for ItemList<'a> {} -impl<'a> ItemList<'a> { - pub fn impl_items(self) -> impl Iterator> + 'a { +impl ast::FnDefOwner for ItemList {} +impl ast::ModuleItemOwner for ItemList {} +impl ItemList { + pub fn impl_items(&self) -> impl Iterator { super::children(self) } } // Label -#[derive(Debug, Clone, Copy,)] -pub struct LabelNode = OwnedRoot> { - pub(crate) syntax: SyntaxNode, +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct Label { + pub(crate) syntax: SyntaxNode, } -pub type Label<'a> = LabelNode>; - -impl, R2: TreeRoot> PartialEq> for LabelNode { - fn eq(&self, other: &LabelNode) -> bool { self.syntax == other.syntax } -} -impl> Eq for LabelNode {} -impl> Hash for LabelNode { - fn hash(&self, state: &mut H) { self.syntax.hash(state) } +unsafe impl TransparentNewType for Label { + type Repr = rowan::SyntaxNode; } -impl<'a> AstNode<'a> for Label<'a> { - fn cast(syntax: SyntaxNodeRef<'a>) -> Option { +impl AstNode for Label { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { match syntax.kind() { - LABEL => Some(Label { syntax }), + LABEL => Some(Label::from_repr(syntax.into_repr())), _ => None, } } - fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } -} - -impl> LabelNode { - pub fn borrowed(&self) -> Label { - LabelNode { syntax: self.syntax.borrowed() } - } - pub fn owned(&self) -> LabelNode { - LabelNode { syntax: self.syntax.owned() } - } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn to_owned(&self) -> TreePtr