From 18727ed31b068ad9c9a580f9b24258d68b1d1a9b Mon Sep 17 00:00:00 2001 From: Niklas Dewally Date: Thu, 19 Sep 2024 14:42:37 +0100 Subject: [PATCH] core: replace manual uniplate impls with derive macro Replace the manual implementation of the Uniplate and Biplate traits for the AST with the derive macro. Adding uniplate_derive to the ast broke is_enum_variant, therefore this commit also removes and replaces all invocations of is_xxx() functions with let..else or pattern matching. Signed-off-by: Niklas Dewally --- Cargo.lock | 155 ++++---------------- conjure_oxide/Cargo.toml | 6 +- conjure_oxide/src/main.rs | 1 + crates/conjure_core/Cargo.toml | 5 +- crates/conjure_core/src/ast/constants.rs | 4 +- crates/conjure_core/src/ast/expressions.rs | 6 +- crates/conjure_core/src/ast/uniplate.rs | 3 + crates/conjure_core/src/rule_engine/rule.rs | 2 +- crates/conjure_core/src/rules/constant.rs | 2 +- crates/conjure_core/src/rules/minion.rs | 26 +++- 10 files changed, 66 insertions(+), 144 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3292d16d9c..b9952e7729 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,7 +138,7 @@ dependencies = [ "log", "prettyplease", "proc-macro2", - "quote 1.0.37", + "quote", "regex", "rustc-hash", "shlex", @@ -159,7 +159,7 @@ dependencies = [ "log", "prettyplease", "proc-macro2", - "quote 1.0.37", + "quote", "regex", "rustc-hash", "shlex", @@ -300,9 +300,9 @@ version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -326,7 +326,6 @@ dependencies = [ "clap", "conjure_macros", "derivative", - "derive_is_enum_variant", "enum_compatability_macro", "im", "itertools 0.13.0", @@ -342,8 +341,7 @@ dependencies = [ "strum", "strum_macros", "thiserror", - "uniplate 0.1.0 (git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170)", - "uniplate_derive 0.1.0 (git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170)", + "uniplate", "walkdir", ] @@ -353,7 +351,7 @@ version = "0.1.0" dependencies = [ "linkme", "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -376,8 +374,7 @@ dependencies = [ "strum", "strum_macros", "thiserror", - "uniplate 0.1.0 (git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170)", - "uniplate_derive 0.1.0 (git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170)", + "uniplate", "versions", "walkdir", ] @@ -407,7 +404,7 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.37", + "quote", "strsim", "syn 2.0.77", ] @@ -419,7 +416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -440,7 +437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 1.0.109", ] @@ -451,21 +448,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302ccf094df1151173bb6f5a2282fcd2f45accd5eae1bdf82dcbfefbc501ad5c" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 1.0.109", ] -[[package]] -name = "derive_is_enum_variant" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ac8859845146979953797f03cc5b282fb4396891807cdb3d04929a88418197" -dependencies = [ - "heck 0.3.3", - "quote 0.3.15", - "syn 0.11.11", -] - [[package]] name = "dyn-clone" version = "1.0.17" @@ -483,7 +469,7 @@ name = "enum_compatability_macro" version = "0.1.0" dependencies = [ "itertools 0.13.0", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -560,15 +546,6 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.5.0" @@ -780,7 +757,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb26336e6dc7cc76e7927d2c9e7e3bb376d7af65a6f56a0b16c47d18a9b1abc5" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -972,17 +949,6 @@ dependencies = [ "unarray", ] -[[package]] -name = "proptest-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf16337405ca084e9c78985114633b6827711d22b9e6ef6c6c0d665eb3f0b6e" -dependencies = [ - "proc-macro2", - "quote 1.0.37", - "syn 1.0.109", -] - [[package]] name = "proptest-derive" version = "0.5.0" @@ -990,7 +956,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -1000,12 +966,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quote" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" - [[package]] name = "quote" version = "1.0.37" @@ -1178,7 +1138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "serde_derive_internals", "syn 2.0.77", ] @@ -1205,7 +1165,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -1216,7 +1176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -1276,7 +1236,7 @@ checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ "darling", "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -1333,9 +1293,9 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", - "quote 1.0.37", + "quote", "rustversion", "syn 2.0.77", ] @@ -1418,17 +1378,6 @@ dependencies = [ "sval_nested", ] -[[package]] -name = "syn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -dependencies = [ - "quote 0.3.15", - "synom", - "unicode-xid", -] - [[package]] name = "syn" version = "1.0.109" @@ -1436,7 +1385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "unicode-ident", ] @@ -1447,19 +1396,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "unicode-ident", ] -[[package]] -name = "synom" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -dependencies = [ - "unicode-xid", -] - [[package]] name = "tempfile" version = "3.12.0" @@ -1498,7 +1438,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -1617,39 +1557,16 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" - [[package]] name = "uniplate" version = "0.1.0" dependencies = [ "im", "proptest", - "proptest-derive 0.5.0", + "proptest-derive", "thiserror", "trybuild", - "uniplate_derive 0.1.0", -] - -[[package]] -name = "uniplate" -version = "0.1.0" -source = "git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170#0dc7090f0388d9a4fc0460d7d5fbf79da7854170" -dependencies = [ - "im", - "proptest", - "proptest-derive 0.4.0", - "thiserror", + "uniplate_derive", ] [[package]] @@ -1660,20 +1577,8 @@ dependencies = [ "lazy_static", "log", "proc-macro2", - "quote 1.0.37", - "syn 2.0.77", -] - -[[package]] -name = "uniplate_derive" -version = "0.1.0" -source = "git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170#0dc7090f0388d9a4fc0460d7d5fbf79da7854170" -dependencies = [ - "log", - "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", - "uniplate 0.1.0 (git+https://github.com/conjure-cp/conjure-oxide.git?rev=0dc7090f0388d9a4fc0460d7d5fbf79da7854170)", ] [[package]] @@ -1780,7 +1685,7 @@ dependencies = [ "log", "once_cell", "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", "wasm-bindgen-shared", ] @@ -1791,7 +1696,7 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "quote 1.0.37", + "quote", "wasm-bindgen-macro-support", ] @@ -1802,7 +1707,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -1952,6 +1857,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", - "quote 1.0.37", + "quote", "syn 2.0.77", ] diff --git a/conjure_oxide/Cargo.toml b/conjure_oxide/Cargo.toml index 7db12e5f9c..6a54f59613 100644 --- a/conjure_oxide/Cargo.toml +++ b/conjure_oxide/Cargo.toml @@ -10,13 +10,13 @@ walkdir = "2.5.0" [dependencies] conjure_core = { path = "../crates/conjure_core" } -uniplate = { git = "https://github.com/conjure-cp/conjure-oxide.git", rev = "0dc7090f0388d9a4fc0460d7d5fbf79da7854170" } -uniplate_derive = { git = "https://github.com/conjure-cp/conjure-oxide.git", rev = "0dc7090f0388d9a4fc0460d7d5fbf79da7854170" } +uniplate = {path = "../crates/uniplate"} +minion_rs = { path = "../solvers/minion" } + serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.119" serde_with = "3.8.2" thiserror = "1.0.61" -minion_rs = { path = "../solvers/minion" } anyhow = "1.0.86" clap = { version = "4.5.8", features = ["derive"] } strum_macros = "0.26.4" diff --git a/conjure_oxide/src/main.rs b/conjure_oxide/src/main.rs index a74a25b95b..6347e809de 100644 --- a/conjure_oxide/src/main.rs +++ b/conjure_oxide/src/main.rs @@ -97,6 +97,7 @@ pub fn main() -> AnyhowResult<()> { .append(true) .open("conjure_oxide.log")?; + //Builder::with_level("Trace") Builder::new() .with_target_writer("info", new_writer(stdout())) .with_target_writer("file", new_writer(log_file)) diff --git a/crates/conjure_core/Cargo.toml b/crates/conjure_core/Cargo.toml index e7227f2d4e..3fd6d244d9 100644 --- a/crates/conjure_core/Cargo.toml +++ b/crates/conjure_core/Cargo.toml @@ -6,9 +6,9 @@ edition = "2021" [dependencies] conjure_macros = { path = "../conjure_macros" } enum_compatability_macro = { path = "../enum_compatability_macro" } -uniplate = { git = "https://github.com/conjure-cp/conjure-oxide.git", rev = "0dc7090f0388d9a4fc0460d7d5fbf79da7854170" } -uniplate_derive = { git = "https://github.com/conjure-cp/conjure-oxide.git", rev = "0dc7090f0388d9a4fc0460d7d5fbf79da7854170" } +uniplate = { path = "../uniplate"} minion_rs = { path = "../../solvers/minion" } + project-root = "0.2.2" linkme = "0.3.27" serde = { version = "1.0.203", features = ["derive"] } @@ -17,7 +17,6 @@ serde_with = "3.8.2" strum = "0.26.3" strum_macros = "0.26.4" thiserror = "1.0.61" -derive_is_enum_variant = "0.1.1" log = "0.4.22" anyhow = "1.0.86" regex = "1.10.5" diff --git a/crates/conjure_core/src/ast/constants.rs b/crates/conjure_core/src/ast/constants.rs index 853980a74f..0acd04e67c 100644 --- a/crates/conjure_core/src/ast/constants.rs +++ b/crates/conjure_core/src/ast/constants.rs @@ -1,8 +1,10 @@ use std::fmt::{Display, Formatter}; use serde::{Deserialize, Serialize}; +use uniplate::Uniplate; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize,Uniplate)] +#[uniplate()] pub enum Constant { Int(i32), Bool(bool), diff --git a/crates/conjure_core/src/ast/expressions.rs b/crates/conjure_core/src/ast/expressions.rs index df067e911e..64af89f535 100644 --- a/crates/conjure_core/src/ast/expressions.rs +++ b/crates/conjure_core/src/ast/expressions.rs @@ -1,9 +1,9 @@ use std::fmt::{Display, Formatter}; -use derive_is_enum_variant::is_enum_variant; use serde::{Deserialize, Serialize}; use enum_compatability_macro::document_compatibility; +use uniplate::Uniplate; use crate::ast::constants::Constant; use crate::ast::symbol_table::{Name, SymbolTable}; @@ -13,7 +13,9 @@ use crate::metadata::Metadata; use super::{Domain, Range}; #[document_compatibility] -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, is_enum_variant)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize,Uniplate)] +#[uniplate(walk_into=[])] +#[biplate(to=Constant)] #[non_exhaustive] pub enum Expression { /** diff --git a/crates/conjure_core/src/ast/uniplate.rs b/crates/conjure_core/src/ast/uniplate.rs index ec90f19830..471dacd329 100644 --- a/crates/conjure_core/src/ast/uniplate.rs +++ b/crates/conjure_core/src/ast/uniplate.rs @@ -6,6 +6,8 @@ use uniplate::biplate::Uniplate; use crate::ast::constants::Constant; + +/* //NOTE (niklasdewally): Temporary manual implementation until the macro is sorted out impl Uniplate for Expression { fn uniplate( @@ -345,3 +347,4 @@ impl Uniplate for Expression { } } } +*/ diff --git a/crates/conjure_core/src/rule_engine/rule.rs b/crates/conjure_core/src/rule_engine/rule.rs index 65c120dd5c..224d3c6c2c 100644 --- a/crates/conjure_core/src/rule_engine/rule.rs +++ b/crates/conjure_core/src/rule_engine/rule.rs @@ -70,7 +70,7 @@ impl Reduction { // Apply side-effects (e.g. symbol table updates pub fn apply(self, model: &mut Model) { model.variables.extend(self.symbols); // Add new assignments to the symbol table - if self.new_top.is_nothing() { + if let Expression::Nothing = self.new_top { model.constraints = self.new_expression.clone(); } else { model.constraints = match self.new_expression { diff --git a/crates/conjure_core/src/rules/constant.rs b/crates/conjure_core/src/rules/constant.rs index 543149416c..1e06242463 100644 --- a/crates/conjure_core/src/rules/constant.rs +++ b/crates/conjure_core/src/rules/constant.rs @@ -9,7 +9,7 @@ register_rule_set!("Constant", 255, ()); #[register_rule(("Constant", 255))] fn apply_eval_constant(expr: &Expr, _: &Model) -> ApplicationResult { - if expr.is_constant() { + if let Expr::Constant(_,_) = expr { return Err(ApplicationError::RuleNotApplicable); } eval_constant(expr) diff --git a/crates/conjure_core/src/rules/minion.rs b/crates/conjure_core/src/rules/minion.rs index 4603b55b84..57f03b702b 100644 --- a/crates/conjure_core/src/rules/minion.rs +++ b/crates/conjure_core/src/rules/minion.rs @@ -262,7 +262,15 @@ fn leq_to_ineq(expr: &Expr, _: &Model) -> ApplicationResult { */ #[register_rule(("Minion", 101))] fn flatten_safediv(expr: &Expr, mdl: &Model) -> ApplicationResult { - if expr.is_eq() || expr.is_leq() || expr.is_geq() || expr.is_neq() { + use Expr::*; + match expr { + Eq(_,_,_) => {}, + Leq(_,_,_) => {}, + Geq(_,_,_) => {}, + Neq(_,_,_) => {}, + _ => {return Err(ApplicationError::RuleNotApplicable);} + } + let mut sub = expr.children(); let mut new_vars = SymbolTable::new(); @@ -294,7 +302,6 @@ fn flatten_safediv(expr: &Expr, mdl: &Model) -> ApplicationResult { new_vars, )); } - } Err(ApplicationError::RuleNotApplicable) } @@ -303,9 +310,11 @@ fn div_eq_to_diveq(expr: &Expr, _: &Model) -> ApplicationResult { match expr { Expr::Eq(metadata, a, b) => { if let Expr::SafeDiv(_, x, y) = a.as_ref() { - if !(b.is_reference() || b.is_constant()) { - return Err(ApplicationError::RuleNotApplicable); - } + match **b { + Expr::Reference(_,_) | Expr::Constant(_,_) => {}, + _ => {return Err(ApplicationError::RuleNotApplicable);} + }; + Ok(Reduction::pure(Expr::DivEq( metadata.clone_dirty(), x.clone(), @@ -313,9 +322,10 @@ fn div_eq_to_diveq(expr: &Expr, _: &Model) -> ApplicationResult { b.clone(), ))) } else if let Expr::SafeDiv(_, x, y) = b.as_ref() { - if !(a.is_reference() || a.is_constant()) { - return Err(ApplicationError::RuleNotApplicable); - } + match **a { + Expr::Reference(_,_) | Expr::Constant(_,_) => {}, + _ => {return Err(ApplicationError::RuleNotApplicable);} + }; Ok(Reduction::pure(Expr::DivEq( metadata.clone_dirty(), x.clone(),