typegen: Pipewire and related support changes
- Added enum singleton support
This commit is contained in:
parent
57ba1768f8
commit
ff5da84a8b
12
Justfile
12
Justfile
|
@ -14,8 +14,10 @@ clean:
|
||||||
rm -rf content/docs/types/Quickshell.Wayland
|
rm -rf content/docs/types/Quickshell.Wayland
|
||||||
rm -rf data/modules/Quickshell.DBusMenu
|
rm -rf data/modules/Quickshell.DBusMenu
|
||||||
rm -rf content/docs/types/Quickshell.DBusMenu
|
rm -rf content/docs/types/Quickshell.DBusMenu
|
||||||
rm -rf data/modules/Quickshell.Service.SystemTray
|
rm -rf data/modules/Quickshell.Services.SystemTray
|
||||||
rm -rf content/docs/types/Quickshell.Service.SystemTray
|
rm -rf content/docs/types/Quickshell.Services.SystemTray
|
||||||
|
rm -rf data/modules/Quickshell.Services.PipeWire
|
||||||
|
rm -rf content/docs/types/Quickshell.Services.PipeWire
|
||||||
rm -rf data/modules/Quickshell.Hyprland
|
rm -rf data/modules/Quickshell.Hyprland
|
||||||
rm -rf content/docs/types/Quickshell.Hyprland
|
rm -rf content/docs/types/Quickshell.Hyprland
|
||||||
|
|
||||||
|
@ -28,13 +30,15 @@ typedocs: clean buildtypegen
|
||||||
{{typegen_bin}} gentypes {{src_path}}/io/module.md build/types/types/Quickshell.Io.json
|
{{typegen_bin}} gentypes {{src_path}}/io/module.md build/types/types/Quickshell.Io.json
|
||||||
{{typegen_bin}} gentypes {{src_path}}/wayland/module.md build/types/types/Quickshell.Wayland.json
|
{{typegen_bin}} gentypes {{src_path}}/wayland/module.md build/types/types/Quickshell.Wayland.json
|
||||||
{{typegen_bin}} gentypes {{src_path}}/dbus/dbusmenu/module.md build/types/types/Quickshell.DBusMenu.json
|
{{typegen_bin}} gentypes {{src_path}}/dbus/dbusmenu/module.md build/types/types/Quickshell.DBusMenu.json
|
||||||
{{typegen_bin}} gentypes {{src_path}}/services/status_notifier/module.md build/types/types/Quickshell.Service.SystemTray.json
|
{{typegen_bin}} gentypes {{src_path}}/services/status_notifier/module.md build/types/types/Quickshell.Services.SystemTray.json
|
||||||
|
{{typegen_bin}} gentypes {{src_path}}/services/pipewire/module.md build/types/types/Quickshell.Services.PipeWire.json
|
||||||
{{typegen_bin}} gentypes {{src_path}}/wayland/hyprland/module.md build/types/types/Quickshell.Hyprland.json
|
{{typegen_bin}} gentypes {{src_path}}/wayland/hyprland/module.md build/types/types/Quickshell.Hyprland.json
|
||||||
sh -c '{{typegen_bin}} gendocs {{src_path}}/core/module.md data/modules/Quickshell content/docs/types/Quickshell types/* build/types/types/*'
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/core/module.md data/modules/Quickshell content/docs/types/Quickshell types/* build/types/types/*'
|
||||||
sh -c '{{typegen_bin}} gendocs {{src_path}}/io/module.md data/modules/Quickshell.Io content/docs/types/Quickshell.Io types/* build/types/types/*'
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/io/module.md data/modules/Quickshell.Io content/docs/types/Quickshell.Io types/* build/types/types/*'
|
||||||
sh -c '{{typegen_bin}} gendocs {{src_path}}/wayland/module.md data/modules/Quickshell.Wayland content/docs/types/Quickshell.Wayland types/* build/types/types/*'
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/wayland/module.md data/modules/Quickshell.Wayland content/docs/types/Quickshell.Wayland types/* build/types/types/*'
|
||||||
sh -c '{{typegen_bin}} gendocs {{src_path}}/dbus/dbusmenu/module.md data/modules/Quickshell.DBusMenu content/docs/types/Quickshell.DBusMenu types/* build/types/types/*'
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/dbus/dbusmenu/module.md data/modules/Quickshell.DBusMenu content/docs/types/Quickshell.DBusMenu types/* build/types/types/*'
|
||||||
sh -c '{{typegen_bin}} gendocs {{src_path}}/services/status_notifier/module.md data/modules/Quickshell.Service.SystemTray content/docs/types/Quickshell.Service.SystemTray types/* build/types/types/*'
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/services/status_notifier/module.md data/modules/Quickshell.Services.SystemTray content/docs/types/Quickshell.Services.SystemTray types/* build/types/types/*'
|
||||||
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/services/pipewire/module.md data/modules/Quickshell.Services.PipeWire content/docs/types/Quickshell.Services.PipeWire types/* build/types/types/*'
|
||||||
sh -c '{{typegen_bin}} gendocs {{src_path}}/wayland/hyprland/module.md data/modules/Quickshell.Hyprland content/docs/types/Quickshell.Hyprland types/* build/types/types/*'
|
sh -c '{{typegen_bin}} gendocs {{src_path}}/wayland/hyprland/module.md data/modules/Quickshell.Hyprland content/docs/types/Quickshell.Hyprland types/* build/types/types/*'
|
||||||
|
|
||||||
serve: typedocs
|
serve: typedocs
|
||||||
|
|
|
@ -53,6 +53,19 @@
|
||||||
{{ if $type.details -}} <a href="#details">More</a> {{- end -}}
|
{{ if $type.details -}} <a href="#details">More</a> {{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $type.variants -}}
|
||||||
|
<h4>Variants</h4>
|
||||||
|
<ul>
|
||||||
|
{{- range $name, $variant := $type.variants -}}
|
||||||
|
<li>
|
||||||
|
<span class="typegray">
|
||||||
|
<a href="#variant.{{ $name }}">{{ $name }}</a>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
{{- end -}}
|
||||||
|
</ul>
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
{{- if $type.properties -}}
|
{{- if $type.properties -}}
|
||||||
<h4>Properties</h4>
|
<h4>Properties</h4>
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -113,24 +126,28 @@
|
||||||
</ul>
|
</ul>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- if $type.variants -}}
|
|
||||||
<h4>Variants</h4>
|
|
||||||
<ul>
|
|
||||||
{{- range $name, $variant := $type.variants -}}
|
|
||||||
<li>
|
|
||||||
<span class="typegray">
|
|
||||||
<a href="#variant.{{ $name }}">{{ $name }}</a>
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
{{- end -}}
|
|
||||||
</ul>
|
|
||||||
{{- end -}}
|
|
||||||
|
|
||||||
{{- if $type.details -}}
|
{{- if $type.details -}}
|
||||||
<h3 id="details">Detailed Description</h3>
|
<h3 id="details">Detailed Description</h3>
|
||||||
{{- $type.details | $.Page.RenderString (dict "display" "block") -}}
|
{{- $type.details | $.Page.RenderString (dict "display" "block") -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if $type.variants -}}
|
||||||
|
<h3>Variant Details</h3>
|
||||||
|
{{ range $name, $variant := $type.variants }}
|
||||||
|
<div id="variant.{{ $name }}" class = "qmlpropdef">
|
||||||
|
<p>{{ $name -}}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="qmlpropdetails">
|
||||||
|
{{- if $variant.details -}}
|
||||||
|
{{- $variant.details | $.Page.RenderString (dict "display" "block") -}}
|
||||||
|
{{- else -}}
|
||||||
|
<p style="color: #999999"><i>No details provided.</i></p>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
{{- if $type.properties -}}
|
{{- if $type.properties -}}
|
||||||
<h3>Property Details</h3>
|
<h3>Property Details</h3>
|
||||||
{{ range $propname, $prop := $type.properties }}
|
{{ range $propname, $prop := $type.properties }}
|
||||||
|
@ -228,20 +245,3 @@
|
||||||
</div>
|
</div>
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
{{- if $type.variants -}}
|
|
||||||
<h3>Variant Details</h3>
|
|
||||||
{{ range $name, $variant := $type.variants }}
|
|
||||||
<div id="variant.{{ $name }}" class = "qmlpropdef">
|
|
||||||
<p>{{ $name -}}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="qmlpropdetails">
|
|
||||||
{{- if $variant.details -}}
|
|
||||||
{{- $variant.details | $.Page.RenderString (dict "display" "block") -}}
|
|
||||||
{{- else -}}
|
|
||||||
<p style="color: #999999"><i>No details provided.</i></p>
|
|
||||||
{{- end -}}
|
|
||||||
</div>
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
|
|
40
typegen/Cargo.lock
generated
40
typegen/Cargo.lock
generated
|
@ -17,12 +17,38 @@ version = "1.0.79"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bit-set"
|
||||||
|
version = "0.5.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
|
||||||
|
dependencies = [
|
||||||
|
"bit-vec",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bit-vec"
|
||||||
|
version = "0.6.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equivalent"
|
name = "equivalent"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fancy-regex"
|
||||||
|
version = "0.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2"
|
||||||
|
dependencies = [
|
||||||
|
"bit-set",
|
||||||
|
"regex-automata",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.14.3"
|
version = "0.14.3"
|
||||||
|
@ -69,18 +95,6 @@ dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex"
|
|
||||||
version = "1.10.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
|
|
||||||
dependencies = [
|
|
||||||
"aho-corasick",
|
|
||||||
"memchr",
|
|
||||||
"regex-automata",
|
|
||||||
"regex-syntax",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-automata"
|
name = "regex-automata"
|
||||||
version = "0.4.5"
|
version = "0.4.5"
|
||||||
|
@ -194,7 +208,7 @@ name = "typegen"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"regex",
|
"fancy-regex",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"toml",
|
"toml",
|
||||||
|
|
|
@ -5,7 +5,7 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "^1"
|
anyhow = "^1"
|
||||||
regex = "^1.10"
|
fancy-regex = "^0.13"
|
||||||
serde = { version = "^1", features = ["derive"] }
|
serde = { version = "^1", features = ["derive"] }
|
||||||
serde_json = "^1"
|
serde_json = "^1"
|
||||||
toml = "^0.8"
|
toml = "^0.8"
|
||||||
|
|
|
@ -27,6 +27,7 @@ pub struct ClassInfo {
|
||||||
pub properties: HashMap<String, Property>,
|
pub properties: HashMap<String, Property>,
|
||||||
pub functions: Vec<Function>,
|
pub functions: Vec<Function>,
|
||||||
pub signals: HashMap<String, Signal>,
|
pub signals: HashMap<String, Signal>,
|
||||||
|
pub variants: HashMap<String, Variant>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
|
@ -133,4 +134,5 @@ pub enum Flag {
|
||||||
Writeonly,
|
Writeonly,
|
||||||
Singleton,
|
Singleton,
|
||||||
Uncreatable,
|
Uncreatable,
|
||||||
|
Enum,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
use anyhow::{anyhow, bail, Context};
|
use anyhow::{anyhow, bail, Context};
|
||||||
use regex::Regex;
|
use fancy_regex::Regex;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
use crate::typespec;
|
use crate::typespec;
|
||||||
|
@ -45,6 +45,7 @@ pub struct ClassInfo<'a> {
|
||||||
pub properties: Vec<Property<'a>>,
|
pub properties: Vec<Property<'a>>,
|
||||||
pub invokables: Vec<Invokable<'a>>,
|
pub invokables: Vec<Invokable<'a>>,
|
||||||
pub signals: Vec<Signal<'a>>,
|
pub signals: Vec<Signal<'a>>,
|
||||||
|
pub enums: Vec<EnumInfo<'a>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -108,7 +109,8 @@ pub struct Parser {
|
||||||
pub signal_regex: Regex,
|
pub signal_regex: Regex,
|
||||||
pub fn_param_regex: Regex,
|
pub fn_param_regex: Regex,
|
||||||
pub defaultprop_classinfo_regex: Regex,
|
pub defaultprop_classinfo_regex: Regex,
|
||||||
pub enum_regex: Regex,
|
pub enum_ns_regex: Regex,
|
||||||
|
pub enum_class_regex: Regex,
|
||||||
pub enum_variant_regex: Regex,
|
pub enum_variant_regex: Regex,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,16 +132,17 @@ impl Default for ParseContext<'_> {
|
||||||
impl Parser {
|
impl Parser {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
class_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*class\s+(?<name>\w+)(?:\s*:\s*public\s+(?<super>\w+)(\s*,(\s*\w+)*)*)?\s*\{(?<body>[\s\S]*?)};"#).unwrap(),
|
class_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*class\s+(?<name>\w+)(?:\s*:\s*public\s+(?<super>\w+)(\s*,(\s*\w+)*)*)?\s*\{(?<body>[\s\S]*?)(?!};\s*Q_ENUM)};"#).unwrap(),
|
||||||
macro_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*(?<hide>QSDOC_HIDE\s)?(?<type>(Q|QML|QSDOC)_\w+)\s*(\(\s*(?<args>.*)\s*\))?;"#).unwrap(),
|
macro_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*(?<hide>QSDOC_HIDE\s)?(?<type>(Q|QML|QSDOC)_\w+)\s*(\(\s*(?<args>.*)\s*\))?;"#).unwrap(),
|
||||||
property_regex: Regex::new(r#"^\s*(?<type>(\w|::|, |<|>|\*)+)\*?\s+(?<name>\w+)(\s+(MEMBER\s+(?<member>\w+)|READ\s+(?<read>\w+)|WRITE\s+(?<write>\w+)|NOTIFY\s+(?<notify>\w+)|(?<const>CONSTANT)))+\s*$"#).unwrap(),
|
property_regex: Regex::new(r#"^\s*(?<type>(\w|::|, |<|>|\*)+)\*?\s+(?<name>\w+)(\s+(MEMBER\s+(?<member>\w+)|READ\s+(?<read>\w+)|WRITE\s+(?<write>\w+)|NOTIFY\s+(?<notify>\w+)|(?<const>CONSTANT)))+\s*$"#).unwrap(),
|
||||||
fn_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*Q_INVOKABLE\s+(\[\[.*\]\]\s+)?(?<type>(\w|::|<|>)+\*?)\s+(?<name>\w+)\((?<params>[\s\S]*?)\)(\s*const)?;"#).unwrap(),
|
fn_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*Q_INVOKABLE\s+(\[\[.*\]\]\s+)?(static\s+)?(?<type>(\w|::|<|>)+\*?)\s+(?<name>\w+)\((?<params>[\s\S]*?)\)(\s*const)?;"#).unwrap(),
|
||||||
signal_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*void\s+(?<name>\w+)\((?<params>[\s\S]*?)\);"#).unwrap(),
|
signal_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*void\s+(?<name>\w+)\((?<params>[\s\S]*?)\);"#).unwrap(),
|
||||||
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_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*\{[\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_variant_regex: Regex::new(r#"(?<comment>(\s*\/\/\/.*\n)+)?\s*(?<name>\w+)\s*=\s*\d+,"#).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(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,6 +152,8 @@ impl Parser {
|
||||||
ctx: &mut ParseContext<'a>,
|
ctx: &mut ParseContext<'a>,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
for class in self.class_regex.captures_iter(text) {
|
for class in self.class_regex.captures_iter(text) {
|
||||||
|
let class = class?;
|
||||||
|
|
||||||
let comment = class.name("comment").map(|m| m.as_str());
|
let comment = class.name("comment").map(|m| m.as_str());
|
||||||
let name = class.name("name").unwrap().as_str();
|
let name = class.name("name").unwrap().as_str();
|
||||||
let mut superclass = class.name("super").map(|m| m.as_str());
|
let mut superclass = class.name("super").map(|m| m.as_str());
|
||||||
|
@ -163,9 +168,12 @@ impl Parser {
|
||||||
let mut invokables = Vec::new();
|
let mut invokables = Vec::new();
|
||||||
let mut notify_signals = Vec::new();
|
let mut notify_signals = Vec::new();
|
||||||
let mut signals = Vec::new();
|
let mut signals = Vec::new();
|
||||||
|
let mut enums = Vec::new();
|
||||||
|
|
||||||
(|| {
|
(|| {
|
||||||
for macro_ in self.macro_regex.captures_iter(body) {
|
for macro_ in self.macro_regex.captures_iter(body) {
|
||||||
|
let macro_ = macro_?;
|
||||||
|
|
||||||
if macro_.name("hide").is_some() {
|
if macro_.name("hide").is_some() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -196,7 +204,7 @@ impl Parser {
|
||||||
self.property_regex
|
self.property_regex
|
||||||
.captures(args.ok_or_else(|| {
|
.captures(args.ok_or_else(|| {
|
||||||
anyhow!("expected args for Q_PROPERTY")
|
anyhow!("expected args for Q_PROPERTY")
|
||||||
})?)
|
})?)?
|
||||||
.ok_or_else(|| anyhow!("unable to parse Q_PROPERTY"))?;
|
.ok_or_else(|| anyhow!("unable to parse Q_PROPERTY"))?;
|
||||||
|
|
||||||
let member = prop.name("member").is_some();
|
let member = prop.name("member").is_some();
|
||||||
|
@ -220,7 +228,7 @@ impl Parser {
|
||||||
"Q_CLASSINFO" => {
|
"Q_CLASSINFO" => {
|
||||||
let classinfo = self.defaultprop_classinfo_regex.captures(
|
let classinfo = self.defaultprop_classinfo_regex.captures(
|
||||||
args.ok_or_else(|| anyhow!("expected args for Q_CLASSINFO"))?,
|
args.ok_or_else(|| anyhow!("expected args for Q_CLASSINFO"))?,
|
||||||
);
|
)?;
|
||||||
|
|
||||||
if let Some(classinfo) = classinfo {
|
if let Some(classinfo) = classinfo {
|
||||||
let prop = classinfo.name("prop").unwrap().as_str();
|
let prop = classinfo.name("prop").unwrap().as_str();
|
||||||
|
@ -246,6 +254,8 @@ impl Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
for invokable in self.fn_regex.captures_iter(body) {
|
for invokable in self.fn_regex.captures_iter(body) {
|
||||||
|
let invokable = invokable?;
|
||||||
|
|
||||||
let comment = invokable.name("comment").map(|m| m.as_str());
|
let comment = invokable.name("comment").map(|m| m.as_str());
|
||||||
let type_ = invokable.name("type").unwrap().as_str();
|
let type_ = invokable.name("type").unwrap().as_str();
|
||||||
let name = invokable.name("name").unwrap().as_str();
|
let name = invokable.name("name").unwrap().as_str();
|
||||||
|
@ -254,6 +264,8 @@ impl Parser {
|
||||||
let mut params = Vec::new();
|
let mut params = Vec::new();
|
||||||
|
|
||||||
for param in self.fn_param_regex.captures_iter(params_raw) {
|
for param in self.fn_param_regex.captures_iter(params_raw) {
|
||||||
|
let param = param?;
|
||||||
|
|
||||||
let type_ = param.name("type").unwrap().as_str();
|
let type_ = param.name("type").unwrap().as_str();
|
||||||
let name = param.name("name").unwrap().as_str();
|
let name = param.name("name").unwrap().as_str();
|
||||||
|
|
||||||
|
@ -269,9 +281,13 @@ impl Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
for signal_set in self.signals_regex.captures_iter(body) {
|
for signal_set in self.signals_regex.captures_iter(body) {
|
||||||
|
let signal_set = signal_set?;
|
||||||
|
|
||||||
let signals_body = signal_set.name("signals").unwrap().as_str();
|
let signals_body = signal_set.name("signals").unwrap().as_str();
|
||||||
|
|
||||||
for signal in self.signal_regex.captures_iter(signals_body) {
|
for signal in self.signal_regex.captures_iter(signals_body) {
|
||||||
|
let signal = signal?;
|
||||||
|
|
||||||
if signal.name("invokable").is_some() {
|
if signal.name("invokable").is_some() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -287,6 +303,8 @@ impl Parser {
|
||||||
let mut params = Vec::new();
|
let mut params = Vec::new();
|
||||||
|
|
||||||
for param in self.fn_param_regex.captures_iter(params_raw) {
|
for param in self.fn_param_regex.captures_iter(params_raw) {
|
||||||
|
let param = param?;
|
||||||
|
|
||||||
let type_ = param.name("type").unwrap().as_str();
|
let type_ = param.name("type").unwrap().as_str();
|
||||||
let name = param.name("name").unwrap().as_str();
|
let name = param.name("name").unwrap().as_str();
|
||||||
|
|
||||||
|
@ -301,6 +319,23 @@ impl Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for enum_ in self.enum_class_regex.captures_iter(body) {
|
||||||
|
let enum_ = enum_?;
|
||||||
|
|
||||||
|
let comment = enum_.name("comment").map(|m| m.as_str());
|
||||||
|
let enum_name = enum_.name("enum_name").unwrap().as_str();
|
||||||
|
let body = enum_.name("body").unwrap().as_str();
|
||||||
|
let variants = self.parse_enum_variants(body)?;
|
||||||
|
|
||||||
|
enums.push(EnumInfo {
|
||||||
|
namespace: name,
|
||||||
|
enum_name,
|
||||||
|
qml_name: enum_name,
|
||||||
|
comment,
|
||||||
|
variants,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
Ok::<_, anyhow::Error>(())
|
Ok::<_, anyhow::Error>(())
|
||||||
})()
|
})()
|
||||||
.with_context(|| format!("while parsing class `{name}`"))?;
|
.with_context(|| format!("while parsing class `{name}`"))?;
|
||||||
|
@ -318,6 +353,7 @@ impl Parser {
|
||||||
properties,
|
properties,
|
||||||
invokables,
|
invokables,
|
||||||
signals,
|
signals,
|
||||||
|
enums,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,7 +361,9 @@ impl Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_enums<'a>(&self, text: &'a str, ctx: &mut ParseContext<'a>) -> anyhow::Result<()> {
|
pub fn parse_enums<'a>(&self, text: &'a str, ctx: &mut ParseContext<'a>) -> anyhow::Result<()> {
|
||||||
for enum_ in self.enum_regex.captures_iter(text) {
|
for enum_ in self.enum_ns_regex.captures_iter(text) {
|
||||||
|
let enum_ = enum_?;
|
||||||
|
|
||||||
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 enum_name = enum_.name("enum_name").unwrap().as_str();
|
||||||
|
@ -334,15 +372,7 @@ impl Parser {
|
||||||
.map(|m| m.as_str())
|
.map(|m| m.as_str())
|
||||||
.unwrap_or(namespace);
|
.unwrap_or(namespace);
|
||||||
let body = enum_.name("body").unwrap().as_str();
|
let body = enum_.name("body").unwrap().as_str();
|
||||||
|
let variants = self.parse_enum_variants(body)?;
|
||||||
let mut variants = Vec::new();
|
|
||||||
|
|
||||||
for variant in self.enum_variant_regex.captures_iter(body) {
|
|
||||||
let comment = variant.name("comment").map(|m| m.as_str());
|
|
||||||
let name = variant.name("name").unwrap().as_str();
|
|
||||||
|
|
||||||
variants.push(Variant { name, comment });
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.enums.push(EnumInfo {
|
ctx.enums.push(EnumInfo {
|
||||||
namespace,
|
namespace,
|
||||||
|
@ -356,6 +386,21 @@ impl Parser {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_enum_variants<'a>(&self, body: &'a str) -> anyhow::Result<Vec<Variant<'a>>> {
|
||||||
|
let mut variants = Vec::new();
|
||||||
|
|
||||||
|
for variant in self.enum_variant_regex.captures_iter(body) {
|
||||||
|
let variant = variant?;
|
||||||
|
|
||||||
|
let comment = variant.name("comment").map(|m| m.as_str());
|
||||||
|
let name = variant.name("name").unwrap().as_str();
|
||||||
|
|
||||||
|
variants.push(Variant { name, comment });
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(variants)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse<'a>(&self, text: &'a str, ctx: &mut ParseContext<'a>) -> anyhow::Result<()> {
|
pub fn parse<'a>(&self, text: &'a str, ctx: &mut ParseContext<'a>) -> anyhow::Result<()> {
|
||||||
self.parse_classes(text, ctx)?;
|
self.parse_classes(text, ctx)?;
|
||||||
self.parse_enums(text, ctx)?;
|
self.parse_enums(text, ctx)?;
|
||||||
|
@ -370,13 +415,28 @@ impl ParseContext<'_> {
|
||||||
typemap: self
|
typemap: self
|
||||||
.classes
|
.classes
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|class| {
|
.flat_map(|class| {
|
||||||
Some(typespec::QmlTypeMapping {
|
let Some(qmlname) = class.qml_name else { return Vec::new() };
|
||||||
|
|
||||||
|
let mut classes = Vec::new();
|
||||||
|
classes.push(typespec::QmlTypeMapping {
|
||||||
// filters gadgets
|
// filters gadgets
|
||||||
name: class.qml_name?.to_string(),
|
name: qmlname.to_string(),
|
||||||
cname: class.name.to_string(),
|
cname: class.name.to_string(),
|
||||||
module: Some(module.to_string()),
|
module: Some(module.to_string()),
|
||||||
})
|
});
|
||||||
|
|
||||||
|
// dirty hack to fix unknowns in resolution
|
||||||
|
if let Some(e) = class.enums.iter().find(|e| e.enum_name == "Enum") {
|
||||||
|
classes.push(typespec::QmlTypeMapping {
|
||||||
|
// filters gadgets
|
||||||
|
name: qmlname.to_string(),
|
||||||
|
cname: format!("{}::{}", e.namespace, e.enum_name),
|
||||||
|
module: Some(module.to_string()),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
classes
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
classes: self
|
classes: self
|
||||||
|
@ -400,6 +460,28 @@ impl ParseContext<'_> {
|
||||||
properties: class.properties.iter().map(|p| (*p).into()).collect(),
|
properties: class.properties.iter().map(|p| (*p).into()).collect(),
|
||||||
functions: class.invokables.iter().map(|f| f.as_typespec()).collect(),
|
functions: class.invokables.iter().map(|f| f.as_typespec()).collect(),
|
||||||
signals: class.signals.iter().map(|s| s.as_typespec()).collect(),
|
signals: class.signals.iter().map(|s| s.as_typespec()).collect(),
|
||||||
|
enums: class
|
||||||
|
.enums
|
||||||
|
.iter()
|
||||||
|
.map(|enum_| {
|
||||||
|
let (description, details) = enum_
|
||||||
|
.comment
|
||||||
|
.map(parse_details_desc)
|
||||||
|
.unwrap_or((None, None));
|
||||||
|
|
||||||
|
typespec::Enum {
|
||||||
|
name: enum_.qml_name.to_string(),
|
||||||
|
module: Some(module.to_string()),
|
||||||
|
cname: Some(format!(
|
||||||
|
"{}::{}",
|
||||||
|
enum_.namespace, enum_.enum_name
|
||||||
|
)),
|
||||||
|
description,
|
||||||
|
details,
|
||||||
|
varaints: enum_.variants.iter().map(|v| (*v).into()).collect(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
|
|
|
@ -119,11 +119,14 @@ pub fn resolve_types(
|
||||||
list = true;
|
list = true;
|
||||||
} else if ctype.starts_with("QList<") {
|
} else if ctype.starts_with("QList<") {
|
||||||
ctype = &ctype[6..ctype.len() - 1];
|
ctype = &ctype[6..ctype.len() - 1];
|
||||||
if ctype.ends_with('*') {
|
|
||||||
ctype = &ctype[0..ctype.len() - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
list = true;
|
list = true;
|
||||||
|
} else if ctype.starts_with("QVector<") {
|
||||||
|
ctype = &ctype[8..ctype.len() - 1];
|
||||||
|
list = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ctype.ends_with('*') {
|
||||||
|
ctype = &ctype[0..ctype.len() - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut type_ = qmlparamtype(ctype, typespec);
|
let mut type_ = qmlparamtype(ctype, typespec);
|
||||||
|
@ -218,6 +221,20 @@ pub fn resolve_types(
|
||||||
.map(|signal| (signal.name.clone(), solvesignal(signal, &typespec)))
|
.map(|signal| (signal.name.clone(), solvesignal(signal, &typespec)))
|
||||||
.collect::<HashMap<_, _>>();
|
.collect::<HashMap<_, _>>();
|
||||||
|
|
||||||
|
let coreenum = class.enums.iter().find(|e| e.name == "Enum");
|
||||||
|
let variants = match coreenum {
|
||||||
|
Some(e) => e
|
||||||
|
.varaints
|
||||||
|
.iter()
|
||||||
|
.map(|variant| {
|
||||||
|
(variant.name.clone(), outform::Variant {
|
||||||
|
details: variant.details.clone(),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
None => HashMap::new(),
|
||||||
|
};
|
||||||
|
|
||||||
let type_ = outform::ClassInfo {
|
let type_ = outform::ClassInfo {
|
||||||
superclass,
|
superclass,
|
||||||
description: class.description.clone(),
|
description: class.description.clone(),
|
||||||
|
@ -225,7 +242,9 @@ pub fn resolve_types(
|
||||||
flags: {
|
flags: {
|
||||||
let mut flags = Vec::new();
|
let mut flags = Vec::new();
|
||||||
|
|
||||||
if class.singleton {
|
if coreenum.is_some() {
|
||||||
|
flags.push(Flag::Enum);
|
||||||
|
} else if class.singleton {
|
||||||
flags.push(Flag::Singleton);
|
flags.push(Flag::Singleton);
|
||||||
} else if class.uncreatable {
|
} else if class.uncreatable {
|
||||||
flags.push(Flag::Uncreatable);
|
flags.push(Flag::Uncreatable);
|
||||||
|
@ -236,6 +255,7 @@ pub fn resolve_types(
|
||||||
properties,
|
properties,
|
||||||
functions,
|
functions,
|
||||||
signals,
|
signals,
|
||||||
|
variants,
|
||||||
};
|
};
|
||||||
|
|
||||||
outtypes.insert(mapping.name.clone(), outform::TypeInfo::Class(type_));
|
outtypes.insert(mapping.name.clone(), outform::TypeInfo::Class(type_));
|
||||||
|
|
|
@ -38,6 +38,7 @@ pub struct Class {
|
||||||
pub properties: Vec<Property>,
|
pub properties: Vec<Property>,
|
||||||
pub functions: Vec<Function>,
|
pub functions: Vec<Function>,
|
||||||
pub signals: Vec<Signal>,
|
pub signals: Vec<Signal>,
|
||||||
|
pub enums: Vec<Enum>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
|
|
@ -20,11 +20,21 @@
|
||||||
"cname": "qint32",
|
"cname": "qint32",
|
||||||
"module": null
|
"module": null
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "int",
|
||||||
|
"cname": "quint32",
|
||||||
|
"module": null
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "real",
|
"name": "real",
|
||||||
"cname": "qreal",
|
"cname": "qreal",
|
||||||
"module": null
|
"module": null
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "real",
|
||||||
|
"cname": "float",
|
||||||
|
"module": null
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "point",
|
"name": "point",
|
||||||
"cname": "QPointF",
|
"cname": "QPointF",
|
||||||
|
|
Loading…
Reference in a new issue