mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
simplify codegen
This commit is contained in:
parent
7fb7cfc2d1
commit
60e8a845ca
@ -40,22 +40,6 @@ pub enum SyntaxKind {
|
|||||||
NEQ,
|
NEQ,
|
||||||
MINUS,
|
MINUS,
|
||||||
THIN_ARROW,
|
THIN_ARROW,
|
||||||
ERROR,
|
|
||||||
IDENT,
|
|
||||||
UNDERSCORE,
|
|
||||||
WHITESPACE,
|
|
||||||
INT_NUMBER,
|
|
||||||
FLOAT_NUMBER,
|
|
||||||
LIFETIME,
|
|
||||||
CHAR,
|
|
||||||
BYTE,
|
|
||||||
STRING,
|
|
||||||
RAW_STRING,
|
|
||||||
BYTE_STRING,
|
|
||||||
RAW_BYTE_STRING,
|
|
||||||
COMMENT,
|
|
||||||
DOC_COMMENT,
|
|
||||||
SHEBANG,
|
|
||||||
USE_KW,
|
USE_KW,
|
||||||
FN_KW,
|
FN_KW,
|
||||||
STRUCT_KW,
|
STRUCT_KW,
|
||||||
@ -88,6 +72,22 @@ pub enum SyntaxKind {
|
|||||||
AUTO_KW,
|
AUTO_KW,
|
||||||
DEFAULT_KW,
|
DEFAULT_KW,
|
||||||
UNION_KW,
|
UNION_KW,
|
||||||
|
ERROR,
|
||||||
|
IDENT,
|
||||||
|
UNDERSCORE,
|
||||||
|
WHITESPACE,
|
||||||
|
INT_NUMBER,
|
||||||
|
FLOAT_NUMBER,
|
||||||
|
LIFETIME,
|
||||||
|
CHAR,
|
||||||
|
BYTE,
|
||||||
|
STRING,
|
||||||
|
RAW_STRING,
|
||||||
|
BYTE_STRING,
|
||||||
|
RAW_BYTE_STRING,
|
||||||
|
COMMENT,
|
||||||
|
DOC_COMMENT,
|
||||||
|
SHEBANG,
|
||||||
FILE,
|
FILE,
|
||||||
STRUCT_ITEM,
|
STRUCT_ITEM,
|
||||||
ENUM_ITEM,
|
ENUM_ITEM,
|
||||||
@ -186,22 +186,6 @@ impl SyntaxKind {
|
|||||||
NEQ => &SyntaxInfo { name: "NEQ" },
|
NEQ => &SyntaxInfo { name: "NEQ" },
|
||||||
MINUS => &SyntaxInfo { name: "MINUS" },
|
MINUS => &SyntaxInfo { name: "MINUS" },
|
||||||
THIN_ARROW => &SyntaxInfo { name: "THIN_ARROW" },
|
THIN_ARROW => &SyntaxInfo { name: "THIN_ARROW" },
|
||||||
ERROR => &SyntaxInfo { name: "ERROR" },
|
|
||||||
IDENT => &SyntaxInfo { name: "IDENT" },
|
|
||||||
UNDERSCORE => &SyntaxInfo { name: "UNDERSCORE" },
|
|
||||||
WHITESPACE => &SyntaxInfo { name: "WHITESPACE" },
|
|
||||||
INT_NUMBER => &SyntaxInfo { name: "INT_NUMBER" },
|
|
||||||
FLOAT_NUMBER => &SyntaxInfo { name: "FLOAT_NUMBER" },
|
|
||||||
LIFETIME => &SyntaxInfo { name: "LIFETIME" },
|
|
||||||
CHAR => &SyntaxInfo { name: "CHAR" },
|
|
||||||
BYTE => &SyntaxInfo { name: "BYTE" },
|
|
||||||
STRING => &SyntaxInfo { name: "STRING" },
|
|
||||||
RAW_STRING => &SyntaxInfo { name: "RAW_STRING" },
|
|
||||||
BYTE_STRING => &SyntaxInfo { name: "BYTE_STRING" },
|
|
||||||
RAW_BYTE_STRING => &SyntaxInfo { name: "RAW_BYTE_STRING" },
|
|
||||||
COMMENT => &SyntaxInfo { name: "COMMENT" },
|
|
||||||
DOC_COMMENT => &SyntaxInfo { name: "DOC_COMMENT" },
|
|
||||||
SHEBANG => &SyntaxInfo { name: "SHEBANG" },
|
|
||||||
USE_KW => &SyntaxInfo { name: "USE_KW" },
|
USE_KW => &SyntaxInfo { name: "USE_KW" },
|
||||||
FN_KW => &SyntaxInfo { name: "FN_KW" },
|
FN_KW => &SyntaxInfo { name: "FN_KW" },
|
||||||
STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" },
|
STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" },
|
||||||
@ -234,6 +218,22 @@ impl SyntaxKind {
|
|||||||
AUTO_KW => &SyntaxInfo { name: "AUTO_KW" },
|
AUTO_KW => &SyntaxInfo { name: "AUTO_KW" },
|
||||||
DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" },
|
DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" },
|
||||||
UNION_KW => &SyntaxInfo { name: "UNION_KW" },
|
UNION_KW => &SyntaxInfo { name: "UNION_KW" },
|
||||||
|
ERROR => &SyntaxInfo { name: "ERROR" },
|
||||||
|
IDENT => &SyntaxInfo { name: "IDENT" },
|
||||||
|
UNDERSCORE => &SyntaxInfo { name: "UNDERSCORE" },
|
||||||
|
WHITESPACE => &SyntaxInfo { name: "WHITESPACE" },
|
||||||
|
INT_NUMBER => &SyntaxInfo { name: "INT_NUMBER" },
|
||||||
|
FLOAT_NUMBER => &SyntaxInfo { name: "FLOAT_NUMBER" },
|
||||||
|
LIFETIME => &SyntaxInfo { name: "LIFETIME" },
|
||||||
|
CHAR => &SyntaxInfo { name: "CHAR" },
|
||||||
|
BYTE => &SyntaxInfo { name: "BYTE" },
|
||||||
|
STRING => &SyntaxInfo { name: "STRING" },
|
||||||
|
RAW_STRING => &SyntaxInfo { name: "RAW_STRING" },
|
||||||
|
BYTE_STRING => &SyntaxInfo { name: "BYTE_STRING" },
|
||||||
|
RAW_BYTE_STRING => &SyntaxInfo { name: "RAW_BYTE_STRING" },
|
||||||
|
COMMENT => &SyntaxInfo { name: "COMMENT" },
|
||||||
|
DOC_COMMENT => &SyntaxInfo { name: "DOC_COMMENT" },
|
||||||
|
SHEBANG => &SyntaxInfo { name: "SHEBANG" },
|
||||||
FILE => &SyntaxInfo { name: "FILE" },
|
FILE => &SyntaxInfo { name: "FILE" },
|
||||||
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
|
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
|
||||||
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
|
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
|
||||||
@ -285,7 +285,6 @@ impl SyntaxKind {
|
|||||||
LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" },
|
LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" },
|
||||||
TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" },
|
TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" },
|
||||||
TYPE_ARG_LIST => &SyntaxInfo { name: "TYPE_ARG_LIST" },
|
TYPE_ARG_LIST => &SyntaxInfo { name: "TYPE_ARG_LIST" },
|
||||||
|
|
||||||
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
|
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
|
||||||
EOF => &SyntaxInfo { name: "EOF" },
|
EOF => &SyntaxInfo { name: "EOF" },
|
||||||
}
|
}
|
||||||
|
@ -5,23 +5,14 @@ use super::SyntaxInfo;
|
|||||||
/// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT_DEF`.
|
/// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT_DEF`.
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
pub enum SyntaxKind {
|
pub enum SyntaxKind {
|
||||||
{%- for t in single_byte_tokens %}
|
{%- for t in concat(a=single_byte_tokens, b=multi_byte_tokens) %}
|
||||||
{{t.1}},
|
{{t.1}},
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
{% for t in multi_byte_tokens %}
|
{% for kw in concat(a=keywords, b=contextual_keywords) %}
|
||||||
{{t.1}},
|
{{kw | upper}}_KW,
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
{% for t in tokens %}
|
{% for t in concat(a=tokens, b=nodes) %}
|
||||||
{{t}},
|
{{t}},
|
||||||
{%- endfor -%}
|
|
||||||
{% for kw in keywords %}
|
|
||||||
{{kw | upper}}_KW,
|
|
||||||
{%- endfor -%}
|
|
||||||
{% for kw in contextual_keywords %}
|
|
||||||
{{kw | upper}}_KW,
|
|
||||||
{%- endfor -%}
|
|
||||||
{% for node in nodes %}
|
|
||||||
{{node}},
|
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
// Technical SyntaxKinds: they appear temporally during parsing,
|
// Technical SyntaxKinds: they appear temporally during parsing,
|
||||||
// but never end up in the final tree
|
// but never end up in the final tree
|
||||||
@ -35,25 +26,15 @@ use self::SyntaxKind::*;
|
|||||||
impl SyntaxKind {
|
impl SyntaxKind {
|
||||||
pub(crate) fn info(self) -> &'static SyntaxInfo {
|
pub(crate) fn info(self) -> &'static SyntaxInfo {
|
||||||
match self {
|
match self {
|
||||||
{%- for t in single_byte_tokens %}
|
{%- for t in concat(a=single_byte_tokens, b=multi_byte_tokens) %}
|
||||||
{{t.1}} => &SyntaxInfo { name: "{{t.1}}" },
|
{{t.1}} => &SyntaxInfo { name: "{{t.1}}" },
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
{% for t in multi_byte_tokens %}
|
{% for kw in concat(a=keywords, b=contextual_keywords) %}
|
||||||
{{t.1}} => &SyntaxInfo { name: "{{t.1}}" },
|
{{kw | upper}}_KW => &SyntaxInfo { name: "{{kw | upper}}_KW" },
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
{% for t in tokens %}
|
{% for t in concat(a=tokens, b=nodes) %}
|
||||||
{{t}} => &SyntaxInfo { name: "{{t}}" },
|
{{t}} => &SyntaxInfo { name: "{{t}}" },
|
||||||
{%- endfor -%}
|
|
||||||
{% for kw in keywords %}
|
|
||||||
{{kw | upper}}_KW => &SyntaxInfo { name: "{{kw | upper}}_KW" },
|
|
||||||
{%- endfor -%}
|
|
||||||
{% for kw in contextual_keywords %}
|
|
||||||
{{kw | upper}}_KW => &SyntaxInfo { name: "{{kw | upper}}_KW" },
|
|
||||||
{%- endfor -%}
|
|
||||||
{% for node in nodes %}
|
|
||||||
{{node}} => &SyntaxInfo { name: "{{node}}" },
|
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
|
|
||||||
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
|
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
|
||||||
EOF => &SyntaxInfo { name: "EOF" },
|
EOF => &SyntaxInfo { name: "EOF" },
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ extern crate tera;
|
|||||||
extern crate walkdir;
|
extern crate walkdir;
|
||||||
extern crate tools;
|
extern crate tools;
|
||||||
|
|
||||||
use std::{collections::HashSet, fs, path::Path};
|
use std::{collections::{HashSet, HashMap}, fs, path::Path};
|
||||||
use clap::{App, Arg, SubCommand};
|
use clap::{App, Arg, SubCommand};
|
||||||
use tools::{collect_tests, Test};
|
use tools::{collect_tests, Test};
|
||||||
|
|
||||||
@ -63,9 +63,26 @@ fn update(path: &Path, contents: &str, verify: bool) -> Result<()> {
|
|||||||
fn get_kinds() -> Result<String> {
|
fn get_kinds() -> Result<String> {
|
||||||
let grammar = grammar()?;
|
let grammar = grammar()?;
|
||||||
let template = fs::read_to_string(SYNTAX_KINDS_TEMPLATE)?;
|
let template = fs::read_to_string(SYNTAX_KINDS_TEMPLATE)?;
|
||||||
let ret = tera::Tera::one_off(&template, &grammar, false)
|
let mut tera = tera::Tera::default();
|
||||||
|
tera.add_raw_template("grammar", &template)
|
||||||
.map_err(|e| format_err!("template error: {:?}", e))?;
|
.map_err(|e| format_err!("template error: {:?}", e))?;
|
||||||
Ok(ret)
|
tera.register_global_function("concat", Box::new(concat));
|
||||||
|
let ret = tera.render("grammar", &grammar)
|
||||||
|
.map_err(|e| format_err!("template error: {:?}", e))?;
|
||||||
|
return Ok(ret);
|
||||||
|
|
||||||
|
fn concat(args: HashMap<String, tera::Value>) -> tera::Result<tera::Value> {
|
||||||
|
let mut elements = Vec::new();
|
||||||
|
for &key in ["a", "b", "c"].iter() {
|
||||||
|
let val = match args.get(key) {
|
||||||
|
Some(val) => val,
|
||||||
|
None => continue,
|
||||||
|
};
|
||||||
|
let val = val.as_array().unwrap();
|
||||||
|
elements.extend(val.iter().cloned());
|
||||||
|
}
|
||||||
|
Ok(tera::Value::Array(elements))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn grammar() -> Result<ron::value::Value> {
|
fn grammar() -> Result<ron::value::Value> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user