git.delta.rocks / jrsonnet / refs/commits / 6baa18de6571

difftreelog

refactor drop derivative dependency

Yaroslav Bolyukin2024-11-24parent: #a9a2382.patch.diff
in: master

5 files changed

modifiedCargo.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",
 ]
modifiedCargo.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"
modifiedcrates/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"
modifiedcrates/jrsonnet-evaluator/src/function/parse.rsdiffbeforeafterboth
before · crates/jrsonnet-evaluator/src/function/parse.rs
1use 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				&param.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) = &param.1 {228			destruct(229				&param.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				&param.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}
after · crates/jrsonnet-evaluator/src/function/parse.rs
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				&param.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) = &param.1 {227			destruct(228				&param.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				&param.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}
modifiedcrates/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)