typegen: detect flags in enum namespaces
Currently doesn't mark them as flags or work outside of enum namespaces, just a baseline so they show up at all.
This commit is contained in:
parent
f30aa9e954
commit
89a533173b
|
@ -154,7 +154,7 @@ impl Parser {
|
||||||
fn_param_regex: Regex::new(r#"(const\s+)?(?<type>(\w|::|<|>)+\*?)&?\s+(?<name>\w+)(,|$)"#).unwrap(),
|
fn_param_regex: Regex::new(r#"(const\s+)?(?<type>(\w|::|<|>)+\*?)&?\s+(?<name>\w+)(,|$)"#).unwrap(),
|
||||||
signals_regex: Regex::new(r#"signals:(?<signals>(\s*(\s*///.*\s*)*void .*;)*)"#).unwrap(),
|
signals_regex: Regex::new(r#"signals:(?<signals>(\s*(\s*///.*\s*)*void .*;)*)"#).unwrap(),
|
||||||
defaultprop_classinfo_regex: Regex::new(r#"^\s*"DefaultProperty", "(?<prop>.+)"\s*$"#).unwrap(),
|
defaultprop_classinfo_regex: Regex::new(r#"^\s*"DefaultProperty", "(?<prop>.+)"\s*$"#).unwrap(),
|
||||||
enum_ns_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*namespace (?<namespace>\w+)\s*\{[\s\S]*?(QML_ELEMENT|QML_NAMED_ELEMENT\((?<qml_name>\w+)\));[\s\S]*?enum\s*(?<enum_name>\w+)\s*\{(?<body>[\s\S]*?)\};[\s\S]*?\}"#).unwrap(),
|
enum_ns_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*namespace (?<namespace>\w+)\s*\{(?<nsbody>[\s\S]*?(QML_ELEMENT|QML_NAMED_ELEMENT\((?<qml_name>\w+)\));[\s\S]*?enum\s*(?<enum_name>\w+)\s*\{(?<body>[\s\S]*?)\};[\s\S]*?)\}"#).unwrap(),
|
||||||
enum_class_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*enum\s*(?<enum_name>\w+)\s*\{(?<body>[\s\S]*?)\};\s+Q_ENUM\(.+\);"#).unwrap(),
|
enum_class_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*enum\s*(?<enum_name>\w+)\s*\{(?<body>[\s\S]*?)\};\s+Q_ENUM\(.+\);"#).unwrap(),
|
||||||
enum_variant_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*(?<name>\w+)\s*=\s*.+,"#).unwrap(),
|
enum_variant_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*(?<name>\w+)\s*=\s*.+,"#).unwrap(),
|
||||||
}
|
}
|
||||||
|
@ -384,14 +384,41 @@ impl Parser {
|
||||||
|
|
||||||
let comment = enum_.name("comment").map(|m| m.as_str());
|
let comment = enum_.name("comment").map(|m| m.as_str());
|
||||||
let namespace = enum_.name("namespace").unwrap().as_str();
|
let namespace = enum_.name("namespace").unwrap().as_str();
|
||||||
let enum_name = enum_.name("enum_name").unwrap().as_str();
|
let mut enum_name = enum_.name("enum_name").unwrap().as_str();
|
||||||
let qml_name = enum_
|
let qml_name = enum_
|
||||||
.name("qml_name")
|
.name("qml_name")
|
||||||
.map(|m| m.as_str())
|
.map(|m| m.as_str())
|
||||||
.unwrap_or(namespace);
|
.unwrap_or(namespace);
|
||||||
|
let nsbody = enum_.name("nsbody").unwrap().as_str();
|
||||||
let body = enum_.name("body").unwrap().as_str();
|
let body = enum_.name("body").unwrap().as_str();
|
||||||
let variants = self.parse_enum_variants(body, ctx)?;
|
let variants = self.parse_enum_variants(body, ctx)?;
|
||||||
|
|
||||||
|
for macro_ in self.macro_regex.captures_iter(nsbody) {
|
||||||
|
let macro_ = macro_?;
|
||||||
|
|
||||||
|
let type_ = macro_.name("type").unwrap().as_str();
|
||||||
|
let args = macro_.name("args").map(|m| m.as_str());
|
||||||
|
|
||||||
|
(|| {
|
||||||
|
match type_ {
|
||||||
|
"Q_DECLARE_FLAGS" => {
|
||||||
|
enum_name = args
|
||||||
|
.expect("Q_DECLARE_FLAGS must have arguments")
|
||||||
|
.split_once(',')
|
||||||
|
.expect("Q_DECLARE_FLAGS must have two arguments")
|
||||||
|
.0
|
||||||
|
.trim();
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok::<_, anyhow::Error>(())
|
||||||
|
})()
|
||||||
|
.with_context(|| {
|
||||||
|
format!("while parsing macro `{}`", macro_.get(0).unwrap().as_str())
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
|
||||||
ctx.enums.push(EnumInfo {
|
ctx.enums.push(EnumInfo {
|
||||||
namespace,
|
namespace,
|
||||||
enum_name,
|
enum_name,
|
||||||
|
|
Loading…
Reference in a new issue