difftreelog
refactor drop derivative dependency
in: master
5 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -194,7 +194,7 @@
"heck",
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
]
[[package]]
@@ -244,17 +244,6 @@
dependencies = [
"generic-array",
"typenum",
-]
-
-[[package]]
-name = "derivative"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
]
[[package]]
@@ -483,7 +472,6 @@
dependencies = [
"annotate-snippets",
"anyhow",
- "derivative",
"hashbrown 0.14.5",
"hi-doc",
"jrsonnet-gcmodule",
@@ -533,7 +521,7 @@
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
]
[[package]]
@@ -551,7 +539,7 @@
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
"syn-dissect-closure",
]
@@ -694,7 +682,7 @@
"proc-macro2",
"quote",
"regex-syntax",
- "syn 2.0.76",
+ "syn",
]
[[package]]
@@ -1019,7 +1007,7 @@
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
]
[[package]]
@@ -1123,17 +1111,6 @@
[[package]]
name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
version = "2.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525"
@@ -1151,7 +1128,7 @@
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
]
[[package]]
@@ -1202,7 +1179,7 @@
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
]
[[package]]
@@ -1428,5 +1405,5 @@
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.76",
+ "syn",
]
Cargo.tomldiffbeforeafterboth--- a/Cargo.toml
+++ b/Cargo.toml
@@ -71,7 +71,6 @@
static_assertions = "1.1"
rustc-hash = "1.1"
num-bigint = "0.4.5"
-derivative = "2.2.0"
strsim = "0.11.0"
proc-macro2 = "1.0"
quote = "1.0"
crates/jrsonnet-evaluator/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-evaluator/Cargo.toml
+++ b/crates/jrsonnet-evaluator/Cargo.toml
@@ -59,5 +59,4 @@
hi-doc = { workspace = true, optional = true }
# Bigint
num-bigint = { workspace = true, features = ["serde"], optional = true }
-derivative.workspace = true
stacker = "0.1.15"
crates/jrsonnet-evaluator/src/function/parse.rsdiffbeforeafterboth1use std::mem::replace;23use jrsonnet_gcmodule::Trace;4use jrsonnet_interner::IStr;5use jrsonnet_parser::{LocExpr, ParamsDesc};67use super::{arglike::ArgsLike, builtin::BuiltinParam};8use crate::{9 bail,10 destructure::destruct,11 error::{ErrorKind::*, Result},12 evaluate_named,13 function::builtin::ParamDefault,14 gc::GcHashMap,15 Context, Pending, Thunk, Val,16};1718/// Creates correct [context](Context) for function body evaluation returning error on invalid call.19///20/// ## Parameters21/// * `ctx`: used for passed argument expressions' execution and for body execution (if `body_ctx` is not set)22/// * `body_ctx`: used for default parameter values' execution and for body execution (if set)23/// * `params`: function parameters' definition24/// * `args`: passed function arguments25/// * `tailstrict`: if set to `true` function arguments are eagerly executed, otherwise - lazily26pub fn parse_function_call(27 ctx: Context,28 body_ctx: Context,29 params: &ParamsDesc,30 args: &dyn ArgsLike,31 tailstrict: bool,32) -> Result<Context> {33 let mut passed_args =34 GcHashMap::with_capacity(params.iter().map(|p| p.0.capacity_hint()).sum());35 if args.unnamed_len() > params.len() {36 bail!(TooManyArgsFunctionHas(37 params.len(),38 params39 .iter()40 .map(|p| (p.0.name(), ParamDefault::exists(p.1.is_some())))41 .collect()42 ))43 }4445 let mut filled_named = 0;46 let mut filled_positionals = 0;4748 args.unnamed_iter(ctx.clone(), tailstrict, &mut |id, arg| {49 let name = params[id].0.clone();50 destruct(51 &name,52 arg,53 Pending::new_filled(ctx.clone()),54 &mut passed_args,55 )?;56 filled_positionals += 1;57 Ok(())58 })?;5960 args.named_iter(ctx, tailstrict, &mut |name, value| {61 // FIXME: O(n) for arg existence check62 if !params.iter().any(|p| p.0.name().as_ref() == Some(name)) {63 bail!(UnknownFunctionParameter((name as &str).to_owned()));64 }65 if passed_args.insert(name.clone(), value).is_some() {66 bail!(BindingParameterASecondTime(name.clone()));67 }68 filled_named += 1;69 Ok(())70 })?;7172 if filled_named + filled_positionals < params.len() {73 // Some args are unset, but maybe we have defaults for them74 // Default values should be created in newly created context75 let fctx = Context::new_future();76 let mut defaults = GcHashMap::with_capacity(77 params.iter().map(|p| p.0.capacity_hint()).sum::<usize>()78 - filled_named79 - filled_positionals,80 );8182 for (idx, param) in params.iter().enumerate().filter(|p| p.1 .1.is_some()) {83 if let Some(name) = param.0.name() {84 if passed_args.contains_key(&name) {85 continue;86 }87 } else if idx < filled_positionals {88 continue;89 }9091 destruct(92 ¶m.0,93 {94 let ctx = fctx.clone();95 let name = param.0.name().unwrap_or_else(|| "<destruct>".into());96 let value = param.1.clone().expect("default exists");97 Thunk!(move || evaluate_named(ctx.unwrap(), &value, name))98 },99 fctx.clone(),100 &mut defaults,101 )?;102 if param.0.name().is_some() {103 filled_named += 1;104 } else {105 filled_positionals += 1;106 }107 }108109 // Some args still weren't filled110 if filled_named + filled_positionals != params.len() {111 for param in params.iter().skip(args.unnamed_len()) {112 let mut found = false;113 args.named_names(&mut |name| {114 if Some(name) == param.0.name().as_ref() {115 found = true;116 }117 });118 if !found {119 bail!(FunctionParameterNotBoundInCall(120 param.0.clone().name(),121 params122 .iter()123 .map(|p| (p.0.name(), ParamDefault::exists(p.1.is_some())))124 .collect()125 ));126 }127 }128 unreachable!();129 }130131 Ok(body_ctx132 .extend(passed_args, None, None, None)133 .extend(defaults, None, None, None)134 .into_future(fctx))135 } else {136 let body_ctx = body_ctx.extend(passed_args, None, None, None);137 Ok(body_ctx)138 }139}140141/// You shouldn't probally use this function, use `jrsonnet_macros::builtin` instead142///143/// ## Parameters144/// * `ctx`: used for passed argument expressions' execution and for body execution (if `body_ctx` is not set)145/// * `params`: function parameters' definition146/// * `args`: passed function arguments147/// * `tailstrict`: if set to `true` function arguments are eagerly executed, otherwise - lazily148pub fn parse_builtin_call(149 ctx: Context,150 params: &[BuiltinParam],151 args: &dyn ArgsLike,152 tailstrict: bool,153) -> Result<Vec<Option<Thunk<Val>>>> {154 let mut passed_args: Vec<Option<Thunk<Val>>> = vec![None; params.len()];155 if args.unnamed_len() > params.len() {156 bail!(TooManyArgsFunctionHas(157 params.len(),158 params159 .iter()160 .map(|p| (p.name().as_str().map(IStr::from), p.default()))161 .collect()162 ))163 }164165 let mut filled_args = 0;166167 args.unnamed_iter(ctx.clone(), tailstrict, &mut |id, arg| {168 passed_args[id] = Some(arg);169 filled_args += 1;170 Ok(())171 })?;172173 args.named_iter(ctx, tailstrict, &mut |name, arg| {174 // FIXME: O(n) for arg existence check175 let id = params176 .iter()177 .position(|p| p.name() == name)178 .ok_or_else(|| UnknownFunctionParameter((name as &str).to_owned()))?;179 if replace(&mut passed_args[id], Some(arg)).is_some() {180 bail!(BindingParameterASecondTime(name.clone()));181 }182 filled_args += 1;183 Ok(())184 })?;185186 if filled_args < params.len() {187 for (id, _) in params.iter().enumerate().filter(|(_, p)| p.has_default()) {188 if passed_args[id].is_some() {189 continue;190 }191 filled_args += 1;192 }193194 // Some args still wasn't filled195 if filled_args != params.len() {196 for param in params.iter().skip(args.unnamed_len()) {197 let mut found = false;198 args.named_names(&mut |name| {199 if param.name() == name {200 found = true;201 }202 });203 if !found {204 bail!(FunctionParameterNotBoundInCall(205 param.name().as_str().map(IStr::from),206 params207 .iter()208 .map(|p| (p.name().as_str().map(IStr::from), p.default()))209 .collect()210 ));211 }212 }213 unreachable!();214 }215 }216 Ok(passed_args)217}218219/// Creates Context, which has all argument default values applied220/// and with unbound values causing error to be returned221pub fn parse_default_function_call(body_ctx: Context, params: &ParamsDesc) -> Result<Context> {222 let fctx = Context::new_future();223224 let mut bindings = GcHashMap::with_capacity(params.iter().map(|p| p.0.capacity_hint()).sum());225226 for param in params.iter() {227 if let Some(v) = ¶m.1 {228 destruct(229 ¶m.0.clone(),230 {231 let ctx = fctx.clone();232 let name = param.0.name().unwrap_or_else(|| "<destruct>".into());233 let value = v.clone();234 Thunk!(move || evaluate_named(ctx.unwrap(), &value, name))235 },236 fctx.clone(),237 &mut bindings,238 )?;239 } else {240 destruct(241 ¶m.0,242 {243 let param_name = param.0.name().unwrap_or_else(|| "<destruct>".into());244 let params = params.clone();245 Thunk!(move || Err(FunctionParameterNotBoundInCall(246 Some(param_name),247 params248 .iter()249 .map(|p| (p.0.name(), ParamDefault::exists(p.1.is_some())))250 .collect(),251 )252 .into()))253 },254 fctx.clone(),255 &mut bindings,256 )?;257 }258 }259260 Ok(body_ctx261 .extend(bindings, None, None, None)262 .into_future(fctx))263}1use std::mem::replace;23use jrsonnet_interner::IStr;4use jrsonnet_parser::ParamsDesc;56use super::{arglike::ArgsLike, builtin::BuiltinParam};7use crate::{8 bail,9 destructure::destruct,10 error::{ErrorKind::*, Result},11 evaluate_named,12 function::builtin::ParamDefault,13 gc::GcHashMap,14 Context, Pending, Thunk, Val,15};1617/// Creates correct [context](Context) for function body evaluation returning error on invalid call.18///19/// ## Parameters20/// * `ctx`: used for passed argument expressions' execution and for body execution (if `body_ctx` is not set)21/// * `body_ctx`: used for default parameter values' execution and for body execution (if set)22/// * `params`: function parameters' definition23/// * `args`: passed function arguments24/// * `tailstrict`: if set to `true` function arguments are eagerly executed, otherwise - lazily25pub fn parse_function_call(26 ctx: Context,27 body_ctx: Context,28 params: &ParamsDesc,29 args: &dyn ArgsLike,30 tailstrict: bool,31) -> Result<Context> {32 let mut passed_args =33 GcHashMap::with_capacity(params.iter().map(|p| p.0.capacity_hint()).sum());34 if args.unnamed_len() > params.len() {35 bail!(TooManyArgsFunctionHas(36 params.len(),37 params38 .iter()39 .map(|p| (p.0.name(), ParamDefault::exists(p.1.is_some())))40 .collect()41 ))42 }4344 let mut filled_named = 0;45 let mut filled_positionals = 0;4647 args.unnamed_iter(ctx.clone(), tailstrict, &mut |id, arg| {48 let name = params[id].0.clone();49 destruct(50 &name,51 arg,52 Pending::new_filled(ctx.clone()),53 &mut passed_args,54 )?;55 filled_positionals += 1;56 Ok(())57 })?;5859 args.named_iter(ctx, tailstrict, &mut |name, value| {60 // FIXME: O(n) for arg existence check61 if !params.iter().any(|p| p.0.name().as_ref() == Some(name)) {62 bail!(UnknownFunctionParameter((name as &str).to_owned()));63 }64 if passed_args.insert(name.clone(), value).is_some() {65 bail!(BindingParameterASecondTime(name.clone()));66 }67 filled_named += 1;68 Ok(())69 })?;7071 if filled_named + filled_positionals < params.len() {72 // Some args are unset, but maybe we have defaults for them73 // Default values should be created in newly created context74 let fctx = Context::new_future();75 let mut defaults = GcHashMap::with_capacity(76 params.iter().map(|p| p.0.capacity_hint()).sum::<usize>()77 - filled_named78 - filled_positionals,79 );8081 for (idx, param) in params.iter().enumerate().filter(|p| p.1 .1.is_some()) {82 if let Some(name) = param.0.name() {83 if passed_args.contains_key(&name) {84 continue;85 }86 } else if idx < filled_positionals {87 continue;88 }8990 destruct(91 ¶m.0,92 {93 let ctx = fctx.clone();94 let name = param.0.name().unwrap_or_else(|| "<destruct>".into());95 let value = param.1.clone().expect("default exists");96 Thunk!(move || evaluate_named(ctx.unwrap(), &value, name))97 },98 fctx.clone(),99 &mut defaults,100 )?;101 if param.0.name().is_some() {102 filled_named += 1;103 } else {104 filled_positionals += 1;105 }106 }107108 // Some args still weren't filled109 if filled_named + filled_positionals != params.len() {110 for param in params.iter().skip(args.unnamed_len()) {111 let mut found = false;112 args.named_names(&mut |name| {113 if Some(name) == param.0.name().as_ref() {114 found = true;115 }116 });117 if !found {118 bail!(FunctionParameterNotBoundInCall(119 param.0.clone().name(),120 params121 .iter()122 .map(|p| (p.0.name(), ParamDefault::exists(p.1.is_some())))123 .collect()124 ));125 }126 }127 unreachable!();128 }129130 Ok(body_ctx131 .extend(passed_args, None, None, None)132 .extend(defaults, None, None, None)133 .into_future(fctx))134 } else {135 let body_ctx = body_ctx.extend(passed_args, None, None, None);136 Ok(body_ctx)137 }138}139140/// You shouldn't probally use this function, use `jrsonnet_macros::builtin` instead141///142/// ## Parameters143/// * `ctx`: used for passed argument expressions' execution and for body execution (if `body_ctx` is not set)144/// * `params`: function parameters' definition145/// * `args`: passed function arguments146/// * `tailstrict`: if set to `true` function arguments are eagerly executed, otherwise - lazily147pub fn parse_builtin_call(148 ctx: Context,149 params: &[BuiltinParam],150 args: &dyn ArgsLike,151 tailstrict: bool,152) -> Result<Vec<Option<Thunk<Val>>>> {153 let mut passed_args: Vec<Option<Thunk<Val>>> = vec![None; params.len()];154 if args.unnamed_len() > params.len() {155 bail!(TooManyArgsFunctionHas(156 params.len(),157 params158 .iter()159 .map(|p| (p.name().as_str().map(IStr::from), p.default()))160 .collect()161 ))162 }163164 let mut filled_args = 0;165166 args.unnamed_iter(ctx.clone(), tailstrict, &mut |id, arg| {167 passed_args[id] = Some(arg);168 filled_args += 1;169 Ok(())170 })?;171172 args.named_iter(ctx, tailstrict, &mut |name, arg| {173 // FIXME: O(n) for arg existence check174 let id = params175 .iter()176 .position(|p| p.name() == name)177 .ok_or_else(|| UnknownFunctionParameter((name as &str).to_owned()))?;178 if replace(&mut passed_args[id], Some(arg)).is_some() {179 bail!(BindingParameterASecondTime(name.clone()));180 }181 filled_args += 1;182 Ok(())183 })?;184185 if filled_args < params.len() {186 for (id, _) in params.iter().enumerate().filter(|(_, p)| p.has_default()) {187 if passed_args[id].is_some() {188 continue;189 }190 filled_args += 1;191 }192193 // Some args still wasn't filled194 if filled_args != params.len() {195 for param in params.iter().skip(args.unnamed_len()) {196 let mut found = false;197 args.named_names(&mut |name| {198 if param.name() == name {199 found = true;200 }201 });202 if !found {203 bail!(FunctionParameterNotBoundInCall(204 param.name().as_str().map(IStr::from),205 params206 .iter()207 .map(|p| (p.name().as_str().map(IStr::from), p.default()))208 .collect()209 ));210 }211 }212 unreachable!();213 }214 }215 Ok(passed_args)216}217218/// Creates Context, which has all argument default values applied219/// and with unbound values causing error to be returned220pub fn parse_default_function_call(body_ctx: Context, params: &ParamsDesc) -> Result<Context> {221 let fctx = Context::new_future();222223 let mut bindings = GcHashMap::with_capacity(params.iter().map(|p| p.0.capacity_hint()).sum());224225 for param in params.iter() {226 if let Some(v) = ¶m.1 {227 destruct(228 ¶m.0.clone(),229 {230 let ctx = fctx.clone();231 let name = param.0.name().unwrap_or_else(|| "<destruct>".into());232 let value = v.clone();233 Thunk!(move || evaluate_named(ctx.unwrap(), &value, name))234 },235 fctx.clone(),236 &mut bindings,237 )?;238 } else {239 destruct(240 ¶m.0,241 {242 let param_name = param.0.name().unwrap_or_else(|| "<destruct>".into());243 let params = params.clone();244 Thunk!(move || Err(FunctionParameterNotBoundInCall(245 Some(param_name),246 params247 .iter()248 .map(|p| (p.0.name(), ParamDefault::exists(p.1.is_some())))249 .collect(),250 )251 .into()))252 },253 fctx.clone(),254 &mut bindings,255 )?;256 }257 }258259 Ok(body_ctx260 .extend(bindings, None, None, None)261 .into_future(fctx))262}crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -8,7 +8,6 @@
rc::Rc,
};
-use derivative::Derivative;
use jrsonnet_gcmodule::{Cc, Trace};
use jrsonnet_interner::IStr;
pub use jrsonnet_macros::Thunk;
@@ -402,8 +401,7 @@
/// Represents jsonnet number
/// Jsonnet numbers are finite f64, with NaNs disallowed
-#[derive(Trace, Clone, Copy, Derivative)]
-#[derivative(Debug = "transparent")]
+#[derive(Trace, Clone, Copy)]
#[repr(transparent)]
pub struct NumValue(f64);
impl NumValue {
@@ -439,6 +437,11 @@
Some(self.cmp(other))
}
}
+impl Debug for NumValue {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ Debug::fmt(&self.0, f)
+ }
+}
impl Display for NumValue {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Display::fmt(&self.0, f)