--- a/bindings/jsonnet/src/lib.rs +++ b/bindings/jsonnet/src/lib.rs @@ -22,11 +22,11 @@ use jrsonnet_evaluator::{ apply_tla, bail, - function::TlaArg, gc::WithCapacityExt as _, manifest::{JsonFormat, ManifestFormat, ToStringFormat}, rustc_hash::FxHashMap, stack::set_stack_depth_limit, + tla::TlaArg, trace::{CompactFormat, PathResolver, TraceFormat}, AsPathLike, FileImportResolver, IStr, ImportResolver, Result, State, Val, }; @@ -40,6 +40,7 @@ pub extern "C" fn _start() {} /// Return the version string of the Jsonnet interpreter. +/// /// Conforms to [semantic versioning](http://semver.org/). /// If this does not match `LIB_JSONNET_VERSION` /// then there is a mismatch between header and compiled library. --- a/bindings/jsonnet/src/vars_tlas.rs +++ b/bindings/jsonnet/src/vars_tlas.rs @@ -2,7 +2,8 @@ use std::{ffi::CStr, os::raw::c_char}; -use jrsonnet_evaluator::{function::TlaArg, IStr}; +use jrsonnet_evaluator::tla::TlaArg; +use jrsonnet_evaluator::IStr; use crate::VM; --- a/crates/jrsonnet-cli/src/stdlib.rs +++ b/crates/jrsonnet-cli/src/stdlib.rs @@ -1,7 +1,8 @@ use std::str::FromStr; use clap::Parser; -use jrsonnet_evaluator::{function::TlaArg, trace::PathResolver, Result}; +use jrsonnet_evaluator::tla::TlaArg; +use jrsonnet_evaluator::{trace::PathResolver, Result}; use jrsonnet_stdlib::ContextInitializer; #[derive(Clone)] --- a/crates/jrsonnet-cli/src/tla.rs +++ b/crates/jrsonnet-cli/src/tla.rs @@ -1,7 +1,6 @@ use clap::Parser; -use jrsonnet_evaluator::{ - error::Result, function::TlaArg, gc::WithCapacityExt as _, rustc_hash::FxHashMap, IStr, -}; +use jrsonnet_evaluator::tla::TlaArg; +use jrsonnet_evaluator::{error::Result, gc::WithCapacityExt as _, rustc_hash::FxHashMap, IStr}; use crate::{ExtFile, ExtStr}; --- a/crates/jrsonnet-evaluator/src/arr/mod.rs +++ b/crates/jrsonnet-evaluator/src/arr/mod.rs @@ -9,7 +9,7 @@ use jrsonnet_interner::IBytes; use jrsonnet_parser::{Expr, Spanned}; -use crate::{typed::NativeFn, Context, Result, Thunk, Val}; +use crate::{function::NativeFn, Context, Result, Thunk, Val}; mod spec; pub use spec::{ArrayLike, *}; --- a/crates/jrsonnet-evaluator/src/arr/spec.rs +++ b/crates/jrsonnet-evaluator/src/arr/spec.rs @@ -6,8 +6,7 @@ use jrsonnet_parser::{Expr, Spanned}; use super::ArrValue; -use crate::typed::NativeFn; -use crate::val::NumValue; +use crate::function::NativeFn; use crate::{ error::ErrorKind::InfiniteRecursionDetected, evaluate, typed::Typed, val::ThunkValue, Context, Error, ObjValue, Result, Thunk, Val, --- a/crates/jrsonnet-evaluator/src/function/arglike.rs +++ /dev/null @@ -1,197 +0,0 @@ -use std::collections::HashMap; -use std::rc::Rc; - -use jrsonnet_gcmodule::Trace; -use jrsonnet_interner::IStr; -use jrsonnet_parser::{ArgsDesc, Expr, SourceFifo, SourcePath, Spanned}; - -use crate::{evaluate, typed::Typed, with_state, Context, Result, Thunk, Val}; - -pub trait ArgLike { - fn evaluate_arg(&self, ctx: Context, tailstrict: bool) -> Result>; -} - -impl ArgLike for &Rc> { - fn evaluate_arg(&self, ctx: Context, tailstrict: bool) -> Result> { - Ok(if tailstrict { - Thunk::evaluated(evaluate(ctx, self)?) - } else { - let expr = (*self).clone(); - Thunk!(move || evaluate(ctx, &expr)) - }) - } -} - -impl ArgLike for T -where - T: Typed + Clone, -{ - fn evaluate_arg(&self, _ctx: Context, tailstrict: bool) -> Result> { - if T::provides_lazy() && !tailstrict { - return Ok(T::into_lazy_untyped(self.clone())); - } - let val = T::into_untyped(self.clone())?; - Ok(Thunk::evaluated(val)) - } -} - -#[derive(Clone, Trace)] -pub enum TlaArg { - String(IStr), - Val(Val), - Lazy(Thunk), - Import(String), - ImportStr(String), - InlineCode(String), -} -impl TlaArg { - pub fn evaluate_tailstrict(&self) -> Result { - match self { - Self::String(s) => Ok(Val::string(s.clone())), - Self::Val(val) => Ok(val.clone()), - Self::Lazy(lazy) => Ok(lazy.evaluate()?), - Self::Import(p) => with_state(|s| { - let resolved = s.resolve_from_default(&p.as_str())?; - s.import_resolved(resolved) - }), - Self::ImportStr(p) => with_state(|s| { - let resolved = s.resolve_from_default(&p.as_str())?; - s.import_resolved_str(resolved).map(Val::string) - }), - Self::InlineCode(p) => with_state(|s| { - let resolved = - SourcePath::new(SourceFifo("".to_owned(), p.as_bytes().into())); - s.import_resolved(resolved) - }), - } - } - pub fn evaluate(&self) -> Result> { - match self { - Self::String(s) => Ok(Thunk::evaluated(Val::string(s.clone()))), - Self::Val(val) => Ok(Thunk::evaluated(val.clone())), - Self::Lazy(lazy) => Ok(lazy.clone()), - Self::Import(p) => with_state(|s| { - let resolved = s.resolve_from_default(&p.as_str())?; - Ok(Thunk!(move || s.import_resolved(resolved))) - }), - Self::ImportStr(p) => with_state(|s| { - let resolved = s.resolve_from_default(&p.as_str())?; - Ok(Thunk!(move || s - .import_resolved_str(resolved) - .map(Val::string))) - }), - Self::InlineCode(p) => with_state(|s| { - let resolved = - SourcePath::new(SourceFifo("".to_owned(), p.as_bytes().into())); - Ok(Thunk!(move || s.import_resolved(resolved))) - }), - } - } -} - -pub trait ArgsLike { - fn unnamed_len(&self) -> usize; - fn unnamed_iter( - &self, - ctx: Context, - tailstrict: bool, - handler: &mut dyn FnMut(usize, Thunk) -> Result<()>, - ) -> Result<()>; - fn named_iter( - &self, - ctx: Context, - tailstrict: bool, - handler: &mut dyn FnMut(&IStr, Thunk) -> Result<()>, - ) -> Result<()>; - fn named_names(&self, handler: &mut dyn FnMut(&IStr)); - fn is_empty(&self) -> bool; -} - -impl ArgsLike for Vec { - fn unnamed_len(&self) -> usize { - self.len() - } - fn unnamed_iter( - &self, - _ctx: Context, - _tailstrict: bool, - handler: &mut dyn FnMut(usize, Thunk) -> Result<()>, - ) -> Result<()> { - for (idx, el) in self.iter().enumerate() { - handler(idx, Thunk::evaluated(el.clone()))?; - } - Ok(()) - } - fn named_iter( - &self, - _ctx: Context, - _tailstrict: bool, - _handler: &mut dyn FnMut(&IStr, Thunk) -> Result<()>, - ) -> Result<()> { - Ok(()) - } - fn named_names(&self, _handler: &mut dyn FnMut(&IStr)) {} - fn is_empty(&self) -> bool { - self.is_empty() - } -} - -impl ArgsLike for ArgsDesc { - fn unnamed_len(&self) -> usize { - self.unnamed.len() - } - - fn unnamed_iter( - &self, - ctx: Context, - tailstrict: bool, - handler: &mut dyn FnMut(usize, Thunk) -> Result<()>, - ) -> Result<()> { - for (id, arg) in self.unnamed.iter().enumerate() { - handler( - id, - if tailstrict { - Thunk::evaluated(evaluate(ctx.clone(), arg)?) - } else { - let ctx = ctx.clone(); - let arg = arg.clone(); - - Thunk!(move || evaluate(ctx, &arg)) - }, - )?; - } - Ok(()) - } - - fn named_iter( - &self, - ctx: Context, - tailstrict: bool, - handler: &mut dyn FnMut(&IStr, Thunk) -> Result<()>, - ) -> Result<()> { - for (name, arg) in &self.named { - handler( - name, - if tailstrict { - Thunk::evaluated(evaluate(ctx.clone(), arg)?) - } else { - let ctx = ctx.clone(); - let arg = arg.clone(); - - Thunk!(move || evaluate(ctx, &arg)) - }, - )?; - } - Ok(()) - } - - fn named_names(&self, handler: &mut dyn FnMut(&IStr)) { - for (name, _) in &self.named { - handler(name); - } - } - - fn is_empty(&self) -> bool { - self.unnamed.is_empty() && self.named.is_empty() - } -} --- a/crates/jrsonnet-evaluator/src/function/mod.rs +++ b/crates/jrsonnet-evaluator/src/function/mod.rs @@ -1,11 +1,10 @@ use std::{fmt::Debug, rc::Rc}; -pub use arglike::{ArgLike, ArgsLike, TlaArg}; use educe::Educe; use jrsonnet_gcmodule::{Cc, Trace}; use jrsonnet_interner::IStr; pub use jrsonnet_macros::builtin; -use jrsonnet_parser::{Destruct, Expr, ExprParams, Span, Spanned}; +use jrsonnet_parser::{ArgsDesc, Destruct, Expr, ExprParams, Span, Spanned}; use self::{ builtin::{Builtin, StaticBuiltin}, @@ -17,12 +16,12 @@ Result, Thunk, Val, }; -pub mod arglike; pub mod builtin; -pub mod native; -pub mod parse; +mod native; +mod parse; mod prepared; +pub use native::NativeFn; pub use prepared::PreparedFuncVal; pub use jrsonnet_parser::function::*; @@ -81,10 +80,10 @@ } /// Create context, with which body code will run - pub fn call_body_context( + pub(crate) fn call_body_context( &self, call_ctx: Context, - args: &dyn ArgsLike, + args: &ArgsDesc, tailstrict: bool, ) -> Result { parse_function_call(call_ctx, self.ctx.clone(), &self.params, args, tailstrict) @@ -170,7 +169,7 @@ &self, call_ctx: Context, loc: CallLocation<'_>, - args: &dyn ArgsLike, + args: &ArgsDesc, tailstrict: bool, ) -> Result { match self { @@ -179,7 +178,7 @@ evaluate(body_ctx, &func.body) } Self::Thunk(thunk) => { - if !args.is_empty() { + if !args.named.is_empty() || !args.unnamed.is_empty() { bail!(TooManyArgsFunctionHas(0, FunctionSignature::empty())) } thunk.evaluate() --- a/crates/jrsonnet-evaluator/src/function/native.rs +++ b/crates/jrsonnet-evaluator/src/function/native.rs @@ -1,2 +1,68 @@ +use std::marker::PhantomData; + +use jrsonnet_gcmodule::Trace; + use super::PreparedFuncVal; -use crate::{typed::Typed, CallLocation, Result, Thunk}; +use crate::{bail, function::FuncVal, typed::Typed, CallLocation, Result, Val}; +use jrsonnet_types::{ComplexValType, ValType}; + +#[derive(Debug, Trace, Clone)] +pub struct NativeFn(pub(crate) PreparedFuncVal, PhantomData); +macro_rules! impl_native_desc { + ($i:expr; $($gen:ident)*) => { + impl<$($gen,)* O> NativeFn<($($gen,)* O,)> + where + $($gen: Typed,)* + O: Typed, + { + #[allow(non_snake_case, clippy::too_many_arguments)] + pub fn call( + &self, + $($gen: $gen,)* + ) -> Result { + let val = self.0.call( + CallLocation::native(), + &[$(Typed::into_lazy_untyped($gen),)*], + &[], + )?; + O::from_untyped(val) + } + } + impl<$($gen,)* O> Typed for NativeFn<($($gen,)* O,)> { + const TYPE: &'static ComplexValType = &ComplexValType::Simple(ValType::Func); + + fn into_untyped(_typed: Self) -> Result { + bail!("can only convert functions from jsonnet to native") + } + + fn from_untyped(untyped: Val) -> Result { + let func = FuncVal::from_untyped(untyped)?; + Ok(Self( + PreparedFuncVal::new(func, $i, &[])?, + PhantomData, + )) + } + } + }; + ($i:expr; $($cur:ident)* @ $c:ident $($rest:ident)*) => { + impl_native_desc!($i; $($cur)*); + impl_native_desc!($i + 1; $($cur)* $c @ $($rest)*); + }; + ($i:expr; $($cur:ident)* @) => { + impl_native_desc!($i; $($cur)*); + } +} + +impl_native_desc! { + 0; @ A B C D E F G H I J K L +} + +mod native_macro { + #[macro_export] + macro_rules! NativeFn { + (($($t:ty),* $(,)?) -> $res:ty) => { + NativeFn<($($t,)* $res)> + } + } +} +pub use crate::NativeFn; --- a/crates/jrsonnet-evaluator/src/function/parse.rs +++ b/crates/jrsonnet-evaluator/src/function/parse.rs @@ -1,19 +1,29 @@ +use std::rc::Rc; + use jrsonnet_parser::{ function::{FunctionSignature, ParamName}, - ExprParams, + ArgsDesc, Expr, ExprParams, Spanned, }; use rustc_hash::FxHashMap; -use super::arglike::ArgsLike; use crate::{ bail, destructure::destruct, error::{ErrorKind::*, Result}, - evaluate_named_param, + evaluate, evaluate_named_param, gc::WithCapacityExt as _, Context, Pending, Thunk, Val, }; +fn eval_arg(ctx: Context, arg: &Rc>, tailstrict: bool) -> Result> { + if tailstrict { + Ok(Thunk::evaluated(evaluate(ctx, arg)?)) + } else { + let arg = arg.clone(); + Ok(Thunk!(move || evaluate(ctx, &arg))) + } +} + /// Creates correct [context](Context) for function body evaluation returning error on invalid call. /// /// ## Parameters @@ -22,15 +32,15 @@ /// * `params`: function parameters' definition /// * `args`: passed function arguments /// * `tailstrict`: if set to `true` function arguments are eagerly executed, otherwise - lazily -pub fn parse_function_call( +pub(crate) fn parse_function_call( ctx: Context, body_ctx: Context, params: &ExprParams, - args: &dyn ArgsLike, + args: &ArgsDesc, tailstrict: bool, ) -> Result { let mut passed_args = FxHashMap::with_capacity(params.binds_len()); - if args.unnamed_len() > params.signature.len() { + if args.unnamed.len() > params.signature.len() { bail!(TooManyArgsFunctionHas( params.signature.len(), params.signature.clone(), @@ -40,28 +50,29 @@ let mut filled_named = 0; let mut filled_positionals = 0; - args.unnamed_iter(ctx.clone(), tailstrict, &mut |id, arg| { + for (id, arg) in args.unnamed.iter().enumerate() { destruct( ¶ms.exprs[id].destruct, - arg, + eval_arg(ctx.clone(), arg, tailstrict)?, Pending::new_filled(ctx.clone()), &mut passed_args, )?; filled_positionals += 1; - Ok(()) - })?; + } - args.named_iter(ctx, tailstrict, &mut |name, value| { + for (name, value) in &args.named { // FIXME: O(n) for arg existence check if !params.exprs.iter().any(|p| &p.destruct.name() == name) { bail!(UnknownFunctionParameter(name.clone())); } - if passed_args.insert(name.clone(), value).is_some() { + if passed_args + .insert(name.clone(), eval_arg(ctx.clone(), value, tailstrict)?) + .is_some() + { bail!(BindingParameterASecondTime(name.clone())); } filled_named += 1; - Ok(()) - })?; + } if filled_named + filled_positionals < params.len() { // Some args are unset, but maybe we have defaults for them @@ -104,13 +115,13 @@ // Some args still weren't filled if filled_named + filled_positionals != params.len() { - for param in params.exprs.iter().skip(args.unnamed_len()) { + for param in params.exprs.iter().skip(args.unnamed.len()) { let mut found = false; - args.named_names(&mut |name| { + for (name, _) in &args.named { if ¶m.destruct.name() == name { found = true; } - }); + } if !found { bail!(FunctionParameterNotBoundInCall( param.destruct.name(), @@ -141,34 +152,35 @@ pub fn parse_builtin_call( ctx: Context, params: FunctionSignature, - args: &dyn ArgsLike, + args: &ArgsDesc, tailstrict: bool, ) -> Result>>> { let mut passed_args: Vec>> = vec![None; params.len()]; - if args.unnamed_len() > params.len() { + if args.unnamed.len() > params.len() { bail!(TooManyArgsFunctionHas(params.len(), params,)) } let mut filled_args = 0; - args.unnamed_iter(ctx.clone(), tailstrict, &mut |id, arg| { - passed_args[id] = Some(arg); + for (id, arg) in args.unnamed.iter().enumerate() { + passed_args[id] = Some(eval_arg(ctx.clone(), arg, tailstrict)?); filled_args += 1; - Ok(()) - })?; + } - args.named_iter(ctx, tailstrict, &mut |name, arg| { + for (name, arg) in &args.named { // FIXME: O(n) for arg existence check let id = params .iter() .position(|p| p.name() == name) .ok_or_else(|| UnknownFunctionParameter(name.clone()))?; - if passed_args[id].replace(arg).is_some() { + if passed_args[id] + .replace(eval_arg(ctx.clone(), arg, tailstrict)?) + .is_some() + { bail!(BindingParameterASecondTime(name.clone())); } filled_args += 1; - Ok(()) - })?; + } if filled_args < params.len() { for (id, _) in params.iter().enumerate().filter(|(_, p)| p.has_default()) { @@ -180,13 +192,13 @@ // Some args still wasn't filled if filled_args != params.len() { - for param in params.iter().skip(args.unnamed_len()) { + for param in params.iter().skip(args.unnamed.len()) { let mut found = false; - args.named_names(&mut |name| { + for (name, _) in &args.named { if param.name() == name { found = true; } - }); + } if !found { bail!(FunctionParameterNotBoundInCall( param.name().clone(), --- a/crates/jrsonnet-evaluator/src/lib.rs +++ b/crates/jrsonnet-evaluator/src/lib.rs @@ -19,7 +19,7 @@ mod obj; pub mod stack; pub mod stdlib; -mod tla; +pub mod tla; pub mod trace; pub mod typed; pub mod val; --- a/crates/jrsonnet-evaluator/src/tla.rs +++ b/crates/jrsonnet-evaluator/src/tla.rs @@ -1,12 +1,68 @@ use std::{collections::HashMap, hash::BuildHasher}; +use jrsonnet_gcmodule::Trace; use jrsonnet_interner::IStr; +use jrsonnet_parser::{SourceFifo, SourcePath}; use crate::{ - function::{CallLocation, PreparedFuncVal, TlaArg}, - in_description_frame, Result, Val, + function::{CallLocation, PreparedFuncVal}, + in_description_frame, with_state, Result, Thunk, Val, }; +#[derive(Clone, Trace)] +pub enum TlaArg { + String(IStr), + Val(Val), + Lazy(Thunk), + Import(String), + ImportStr(String), + InlineCode(String), +} +impl TlaArg { + pub fn evaluate_tailstrict(&self) -> Result { + match self { + Self::String(s) => Ok(Val::string(s.clone())), + Self::Val(val) => Ok(val.clone()), + Self::Lazy(lazy) => Ok(lazy.evaluate()?), + Self::Import(p) => with_state(|s| { + let resolved = s.resolve_from_default(&p.as_str())?; + s.import_resolved(resolved) + }), + Self::ImportStr(p) => with_state(|s| { + let resolved = s.resolve_from_default(&p.as_str())?; + s.import_resolved_str(resolved).map(Val::string) + }), + Self::InlineCode(p) => with_state(|s| { + let resolved = + SourcePath::new(SourceFifo("".to_owned(), p.as_bytes().into())); + s.import_resolved(resolved) + }), + } + } + pub fn evaluate(&self) -> Result> { + match self { + Self::String(s) => Ok(Thunk::evaluated(Val::string(s.clone()))), + Self::Val(val) => Ok(Thunk::evaluated(val.clone())), + Self::Lazy(lazy) => Ok(lazy.clone()), + Self::Import(p) => with_state(|s| { + let resolved = s.resolve_from_default(&p.as_str())?; + Ok(Thunk!(move || s.import_resolved(resolved))) + }), + Self::ImportStr(p) => with_state(|s| { + let resolved = s.resolve_from_default(&p.as_str())?; + Ok(Thunk!(move || s + .import_resolved_str(resolved) + .map(Val::string))) + }), + Self::InlineCode(p) => with_state(|s| { + let resolved = + SourcePath::new(SourceFifo("".to_owned(), p.as_bytes().into())); + Ok(Thunk!(move || s.import_resolved(resolved))) + }), + } + } +} + pub fn apply_tla(args: &HashMap, val: Val) -> Result { Ok(if let Val::Func(func) = val { in_description_frame( --- a/crates/jrsonnet-evaluator/src/typed/conversions.rs +++ b/crates/jrsonnet-evaluator/src/typed/conversions.rs @@ -8,7 +8,7 @@ use crate::{ arr::{ArrValue, BytesArray}, bail, - function::{CallLocation, FuncDesc, FuncVal, PreparedFuncVal}, + function::{FuncDesc, FuncVal}, typed::CheckType, val::{IndexableVal, NumValue, StrValue, ThunkMapper}, ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val, @@ -671,69 +671,9 @@ Ok(None) } else { T::from_untyped(untyped).map(Some) - } - } -} - -#[derive(Debug, Trace, Clone)] -pub struct NativeFn(pub(crate) PreparedFuncVal, PhantomData); -macro_rules! impl_native_desc { - ($i:expr; $($gen:ident)*) => { - impl<$($gen,)* O> NativeFn<($($gen,)* O,)> - where - $($gen: Typed,)* - O: Typed, - { - pub fn call( - &self, - $($gen: $gen,)* - ) -> Result { - let val = self.0.call( - CallLocation::native(), - &[$(Typed::into_lazy_untyped($gen),)*], - &[], - )?; - O::from_untyped(val) - } - } - impl<$($gen,)* O> Typed for NativeFn<($($gen,)* O,)> { - const TYPE: &'static ComplexValType = &ComplexValType::Simple(ValType::Func); - - fn into_untyped(_typed: Self) -> Result { - bail!("can only convert functions from jsonnet to native") - } - - fn from_untyped(untyped: Val) -> Result { - let func = FuncVal::from_untyped(untyped)?; - Ok(Self( - PreparedFuncVal::new(func, $i, &[])?, - PhantomData, - )) - } } - }; - ($i:expr; $($cur:ident)* @ $c:ident $($rest:ident)*) => { - impl_native_desc!($i; $($cur)*); - impl_native_desc!($i + 1; $($cur)* $c @ $($rest)*); - }; - ($i:expr; $($cur:ident)* @) => { - impl_native_desc!($i; $($cur)*); } -} - -impl_native_desc! { - 0; @ A B C D E F G H I J K L } - -mod native_macro { - #[macro_export] - macro_rules! NativeFn { - (($($t:ty),* $(,)?) -> $res:ty) => { - NativeFn<($($t,)* $res)> - } - } -} -pub use crate::NativeFn; impl Typed for NumValue { const TYPE: &'static ComplexValType = &ComplexValType::Simple(ValType::Num); --- a/crates/jrsonnet-macros/src/lib.rs +++ b/crates/jrsonnet-macros/src/lib.rs @@ -405,7 +405,7 @@ const _: () = { use ::jrsonnet_evaluator::{ State, Val, - function::{builtin::{Builtin, StaticBuiltin}, FunctionSignature, ParamParse, ParamName, ParamDefault, CallLocation, ArgsLike, parse::parse_builtin_call}, + function::{builtin::{Builtin, StaticBuiltin}, FunctionSignature, ParamParse, ParamName, ParamDefault, CallLocation}, Result, Context, typed::Typed, parser::Span, params, Thunk, }; --- a/crates/jrsonnet-stdlib/src/arrays.rs +++ b/crates/jrsonnet-stdlib/src/arrays.rs @@ -2,9 +2,9 @@ use jrsonnet_evaluator::{ bail, - function::{builtin, FuncVal}, + function::{builtin, FuncVal, NativeFn}, runtime_error, - typed::{BoundedI32, BoundedUsize, Either2, NativeFn, Typed}, + typed::{BoundedI32, BoundedUsize, Either2, Typed}, val::{equals, ArrValue, IndexableVal}, Either, IStr, ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val, }; --- a/crates/jrsonnet-stdlib/src/lib.rs +++ b/crates/jrsonnet-stdlib/src/lib.rs @@ -13,7 +13,8 @@ pub use hash::*; use jrsonnet_evaluator::{ error::Result, - function::{CallLocation, FuncVal, TlaArg}, + function::{CallLocation, FuncVal}, + tla::TlaArg, trace::PathResolver, val::NumValue, ContextBuilder, IStr, ObjValue, ObjValueBuilder, Thunk, Val, --- a/tests/tests/cpp_test_suite.rs +++ b/tests/tests/cpp_test_suite.rs @@ -6,10 +6,10 @@ use jrsonnet_evaluator::{ FileImportResolver, IStr, ObjValueBuilder, State, Val, apply_tla, - function::TlaArg, gc::WithCapacityExt as _, manifest::JsonFormat, rustc_hash::FxHashMap, + tla::TlaArg, trace::{CompactFormat, PathResolver, TraceFormat}, }; use jrsonnet_stdlib::ContextInitializer;