mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Generate AST in a more stable manner
This commit is contained in:
parent
20d521db74
commit
4b679f90dd
File diff suppressed because it is too large
Load Diff
@ -77,6 +77,7 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
|
|||||||
let (node_defs, node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
|
let (node_defs, node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
|
||||||
.nodes
|
.nodes
|
||||||
.iter()
|
.iter()
|
||||||
|
.sorted_by_key(|it| it.name.clone())
|
||||||
.map(|node| {
|
.map(|node| {
|
||||||
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));
|
||||||
@ -88,12 +89,13 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
|
|||||||
node.name != "ForExpr" && node.name != "WhileExpr"
|
node.name != "ForExpr" && node.name != "WhileExpr"
|
||||||
|| trait_name.as_str() != "HasLoopBody"
|
|| trait_name.as_str() != "HasLoopBody"
|
||||||
})
|
})
|
||||||
|
.sorted()
|
||||||
.map(|trait_name| {
|
.map(|trait_name| {
|
||||||
let trait_name = format_ident!("{}", trait_name);
|
let trait_name = format_ident!("{}", trait_name);
|
||||||
quote!(impl ast::#trait_name for #name {})
|
quote!(impl ast::#trait_name for #name {})
|
||||||
});
|
});
|
||||||
|
|
||||||
let methods = node.fields.iter().map(|field| {
|
let methods = node.fields.iter().sorted_by_key(|it| it.method_name()).map(|field| {
|
||||||
let method_name = field.method_name();
|
let method_name = field.method_name();
|
||||||
let ty = field.ty();
|
let ty = field.ty();
|
||||||
|
|
||||||
@ -149,14 +151,16 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
|
|||||||
let (enum_defs, enum_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
|
let (enum_defs, enum_boilerplate_impls): (Vec<_>, Vec<_>) = grammar
|
||||||
.enums
|
.enums
|
||||||
.iter()
|
.iter()
|
||||||
|
.sorted_by_key(|it| it.name.clone())
|
||||||
.map(|en| {
|
.map(|en| {
|
||||||
let variants: Vec<_> = en.variants.iter().map(|var| format_ident!("{}", var)).collect();
|
let variants: Vec<_> =
|
||||||
|
en.variants.iter().map(|var| format_ident!("{}", var)).sorted().collect();
|
||||||
let name = format_ident!("{}", en.name);
|
let name = format_ident!("{}", en.name);
|
||||||
let kinds: Vec<_> = variants
|
let kinds: Vec<_> = variants
|
||||||
.iter()
|
.iter()
|
||||||
.map(|name| format_ident!("{}", to_upper_snake_case(&name.to_string())))
|
.map(|name| format_ident!("{}", to_upper_snake_case(&name.to_string())))
|
||||||
.collect();
|
.collect();
|
||||||
let traits = en.traits.iter().map(|trait_name| {
|
let traits = en.traits.iter().sorted().map(|trait_name| {
|
||||||
let trait_name = format_ident!("{}", trait_name);
|
let trait_name = format_ident!("{}", trait_name);
|
||||||
quote!(impl ast::#trait_name for #name {})
|
quote!(impl ast::#trait_name for #name {})
|
||||||
});
|
});
|
||||||
@ -266,15 +270,17 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
|
|||||||
let node_names = grammar.nodes.iter().map(|it| &it.name);
|
let node_names = grammar.nodes.iter().map(|it| &it.name);
|
||||||
|
|
||||||
let display_impls =
|
let display_impls =
|
||||||
enum_names.chain(node_names.clone()).map(|it| format_ident!("{}", it)).map(|name| {
|
enum_names.chain(node_names.clone()).map(|it| format_ident!("{}", it)).sorted().map(
|
||||||
quote! {
|
|name| {
|
||||||
impl std::fmt::Display for #name {
|
quote! {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
impl std::fmt::Display for #name {
|
||||||
std::fmt::Display::fmt(self.syntax(), f)
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
std::fmt::Display::fmt(self.syntax(), f)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
});
|
);
|
||||||
|
|
||||||
let defined_nodes: FxHashSet<_> = node_names.collect();
|
let defined_nodes: FxHashSet<_> = node_names.collect();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user