mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-29 02:52:11 +00:00
refactor: Reduce codegen burden for SyntaxNode and SyntaxToken
This commit is contained in:
parent
d6dc1bf05e
commit
d31301cbe7
4 changed files with 2767 additions and 426 deletions
|
|
@ -1008,7 +1008,7 @@ impl ::core::cmp::Eq for SyntaxKind {}
|
||||||
impl ::core::cmp::PartialOrd for SyntaxKind {
|
impl ::core::cmp::PartialOrd for SyntaxKind {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn partial_cmp(&self, other: &Self) -> core::option::Option<core::cmp::Ordering> {
|
fn partial_cmp(&self, other: &Self) -> core::option::Option<core::cmp::Ordering> {
|
||||||
(*self as u16).partial_cmp(&(*other as u16))
|
Some(self.cmp(other))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl ::core::cmp::Ord for SyntaxKind {
|
impl ::core::cmp::Ord for SyntaxKind {
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -5,8 +5,7 @@ use crate::{
|
||||||
SyntaxKind::{self, *},
|
SyntaxKind::{self, *},
|
||||||
SyntaxToken,
|
SyntaxToken,
|
||||||
};
|
};
|
||||||
|
use std::{fmt, hash};
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
||||||
pub struct Byte {
|
pub struct Byte {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -26,8 +25,21 @@ impl AstToken for Byte {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for Byte {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("Byte").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for Byte {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for Byte {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for Byte {}
|
||||||
|
impl PartialEq for Byte {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct ByteString {
|
pub struct ByteString {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -47,8 +59,21 @@ impl AstToken for ByteString {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for ByteString {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("ByteString").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for ByteString {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for ByteString {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for ByteString {}
|
||||||
|
impl PartialEq for ByteString {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct CString {
|
pub struct CString {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -68,8 +93,21 @@ impl AstToken for CString {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for CString {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("CString").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for CString {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for CString {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for CString {}
|
||||||
|
impl PartialEq for CString {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct Char {
|
pub struct Char {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -89,8 +127,21 @@ impl AstToken for Char {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for Char {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("Char").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for Char {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for Char {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for Char {}
|
||||||
|
impl PartialEq for Char {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct Comment {
|
pub struct Comment {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -110,8 +161,21 @@ impl AstToken for Comment {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for Comment {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("Comment").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for Comment {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for Comment {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for Comment {}
|
||||||
|
impl PartialEq for Comment {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct FloatNumber {
|
pub struct FloatNumber {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -131,8 +195,21 @@ impl AstToken for FloatNumber {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for FloatNumber {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("FloatNumber").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for FloatNumber {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for FloatNumber {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for FloatNumber {}
|
||||||
|
impl PartialEq for FloatNumber {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct Ident {
|
pub struct Ident {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -152,8 +229,21 @@ impl AstToken for Ident {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for Ident {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("Ident").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for Ident {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for Ident {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for Ident {}
|
||||||
|
impl PartialEq for Ident {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct IntNumber {
|
pub struct IntNumber {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -173,8 +263,21 @@ impl AstToken for IntNumber {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for IntNumber {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("IntNumber").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for IntNumber {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for IntNumber {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for IntNumber {}
|
||||||
|
impl PartialEq for IntNumber {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct String {
|
pub struct String {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -194,8 +297,21 @@ impl AstToken for String {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for String {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("String").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for String {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for String {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for String {}
|
||||||
|
impl PartialEq for String {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
pub struct Whitespace {
|
pub struct Whitespace {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -215,3 +331,18 @@ impl AstToken for Whitespace {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
impl fmt::Debug for Whitespace {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct("Whitespace").field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for Whitespace {
|
||||||
|
fn clone(&self) -> Self { Self { syntax: self.syntax.clone() } }
|
||||||
|
}
|
||||||
|
impl hash::Hash for Whitespace {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) { self.syntax.hash(state); }
|
||||||
|
}
|
||||||
|
impl Eq for Whitespace {}
|
||||||
|
impl PartialEq for Whitespace {
|
||||||
|
fn eq(&self, other: &Self) -> bool { self.syntax == other.syntax }
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,6 @@ fn generate_tokens(grammar: &AstSrc) -> String {
|
||||||
let name = format_ident!("{}", token);
|
let name = format_ident!("{}", token);
|
||||||
let kind = format_ident!("{}", to_upper_snake_case(token));
|
let kind = format_ident!("{}", to_upper_snake_case(token));
|
||||||
quote! {
|
quote! {
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
||||||
pub struct #name {
|
pub struct #name {
|
||||||
pub(crate) syntax: SyntaxToken,
|
pub(crate) syntax: SyntaxToken,
|
||||||
}
|
}
|
||||||
|
|
@ -83,6 +82,29 @@ fn generate_tokens(grammar: &AstSrc) -> String {
|
||||||
}
|
}
|
||||||
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
fn syntax(&self) -> &SyntaxToken { &self.syntax }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for #name {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct(#token).field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Clone for #name {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Self { syntax: self.syntax.clone() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl hash::Hash for #name {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.syntax.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for #name {}
|
||||||
|
impl PartialEq for #name {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.syntax == other.syntax
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -90,7 +112,10 @@ fn generate_tokens(grammar: &AstSrc) -> String {
|
||||||
crate::flags::CodegenType::Grammar,
|
crate::flags::CodegenType::Grammar,
|
||||||
reformat(
|
reformat(
|
||||||
quote! {
|
quote! {
|
||||||
|
use std::{fmt, hash};
|
||||||
|
|
||||||
use crate::{SyntaxKind::{self, *}, SyntaxToken, ast::AstToken};
|
use crate::{SyntaxKind::{self, *}, SyntaxToken, ast::AstToken};
|
||||||
|
|
||||||
#(#tokens)*
|
#(#tokens)*
|
||||||
}
|
}
|
||||||
.to_string(),
|
.to_string(),
|
||||||
|
|
@ -104,6 +129,7 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
.nodes
|
.nodes
|
||||||
.iter()
|
.iter()
|
||||||
.map(|node| {
|
.map(|node| {
|
||||||
|
let node_str_name = &node.name;
|
||||||
let name = format_ident!("{}", node.name);
|
let name = format_ident!("{}", node.name);
|
||||||
let kind = format_ident!("{}", to_upper_snake_case(&node.name));
|
let kind = format_ident!("{}", to_upper_snake_case(&node.name));
|
||||||
let traits = node
|
let traits = node
|
||||||
|
|
@ -149,7 +175,6 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
(
|
(
|
||||||
quote! {
|
quote! {
|
||||||
#[pretty_doc_comment_placeholder_workaround]
|
#[pretty_doc_comment_placeholder_workaround]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
||||||
pub struct #name {
|
pub struct #name {
|
||||||
pub(crate) syntax: SyntaxNode,
|
pub(crate) syntax: SyntaxNode,
|
||||||
}
|
}
|
||||||
|
|
@ -180,6 +205,31 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn syntax(&self) -> &SyntaxNode { &self.syntax }
|
fn syntax(&self) -> &SyntaxNode { &self.syntax }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl hash::Hash for #name {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.syntax.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for #name {}
|
||||||
|
impl PartialEq for #name {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.syntax == other.syntax
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for #name {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Self { syntax: self.syntax.clone() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for #name {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct(#node_str_name).field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
@ -265,6 +315,7 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
.sorted_by_key(|(name, _)| *name)
|
.sorted_by_key(|(name, _)| *name)
|
||||||
.map(|(trait_name, nodes)| {
|
.map(|(trait_name, nodes)| {
|
||||||
let name = format_ident!("Any{}", trait_name);
|
let name = format_ident!("Any{}", trait_name);
|
||||||
|
let node_str_name = name.to_string();
|
||||||
let trait_name = format_ident!("{}", trait_name);
|
let trait_name = format_ident!("{}", trait_name);
|
||||||
let kinds: Vec<_> = nodes
|
let kinds: Vec<_> = nodes
|
||||||
.iter()
|
.iter()
|
||||||
|
|
@ -274,13 +325,9 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
(
|
(
|
||||||
quote! {
|
quote! {
|
||||||
#[pretty_doc_comment_placeholder_workaround]
|
#[pretty_doc_comment_placeholder_workaround]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
||||||
pub struct #name {
|
pub struct #name {
|
||||||
pub(crate) syntax: SyntaxNode,
|
pub(crate) syntax: SyntaxNode,
|
||||||
}
|
}
|
||||||
impl ast::#trait_name for #name {}
|
|
||||||
},
|
|
||||||
quote! {
|
|
||||||
impl #name {
|
impl #name {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new<T: ast::#trait_name>(node: T) -> #name {
|
pub fn new<T: ast::#trait_name>(node: T) -> #name {
|
||||||
|
|
@ -289,6 +336,9 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
quote! {
|
||||||
|
impl ast::#trait_name for #name {}
|
||||||
impl AstNode for #name {
|
impl AstNode for #name {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn can_cast(kind: SyntaxKind) -> bool {
|
fn can_cast(kind: SyntaxKind) -> bool {
|
||||||
|
|
@ -304,6 +354,31 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl hash::Hash for #name {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.syntax.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for #name {}
|
||||||
|
impl PartialEq for #name {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.syntax == other.syntax
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for #name {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Self { syntax: self.syntax.clone() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for #name {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
f.debug_struct(#node_str_name).field("syntax", &self.syntax).finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#(
|
#(
|
||||||
impl From<#nodes> for #name {
|
impl From<#nodes> for #name {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
@ -346,6 +421,8 @@ fn generate_nodes(kinds: KindsSrc, grammar: &AstSrc) -> String {
|
||||||
|
|
||||||
let ast = quote! {
|
let ast = quote! {
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
use std::{fmt, hash};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
SyntaxNode, SyntaxToken, SyntaxKind::{self, *},
|
SyntaxNode, SyntaxToken, SyntaxKind::{self, *},
|
||||||
ast::{self, AstNode, AstChildren, support},
|
ast::{self, AstNode, AstChildren, support},
|
||||||
|
|
@ -613,7 +690,7 @@ fn generate_syntax_kinds(grammar: KindsSrc) -> String {
|
||||||
impl ::core::cmp::PartialOrd for SyntaxKind {
|
impl ::core::cmp::PartialOrd for SyntaxKind {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn partial_cmp(&self, other: &Self) -> core::option::Option<core::cmp::Ordering> {
|
fn partial_cmp(&self, other: &Self) -> core::option::Option<core::cmp::Ordering> {
|
||||||
(*self as u16).partial_cmp(&(*other as u16))
|
Some(self.cmp(other))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl ::core::cmp::Ord for SyntaxKind {
|
impl ::core::cmp::Ord for SyntaxKind {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue