* git mv src/wasm-lib rust Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv wasm-lib to workspace Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv kcl-lib Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv derive docs Signed-off-by: Jess Frazelle <github@jessfraz.com> * resolve file paths Signed-off-by: Jess Frazelle <github@jessfraz.com> * clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> * move more shit Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix more paths Signed-off-by: Jess Frazelle <github@jessfraz.com> * make yarn build:wasm work Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix scripts Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> * better references Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix cargo ci Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix reference Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix more ci Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * cargo sort Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix script Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix a dep Signed-off-by: Jess Frazelle <github@jessfraz.com> * sort Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove unused deps Signed-off-by: Jess Frazelle <github@jessfraz.com> * Revert "remove unused deps" This reverts commit fbabdb062e275fd5cbc1476f8480a1afee15d972. * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * deps; Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
92 lines
3.9 KiB
Rust
92 lines
3.9 KiB
Rust
// Unbox a Vec<Box<T>> to Vec<T>.
|
|
// Unbox a Box<T> to T.
|
|
pub(crate) fn unbox(t: syn::Type) -> syn::Type {
|
|
unbox_inner(unbox_vec(t))
|
|
}
|
|
|
|
// Unbox a syn::Type that is boxed to the inner object.
|
|
fn unbox_inner(t: syn::Type) -> syn::Type {
|
|
match t {
|
|
syn::Type::Path(syn::TypePath { ref path, .. }) => {
|
|
let path = &path.segments;
|
|
if path.len() == 1 {
|
|
let seg = &path[0];
|
|
if seg.ident == "Box" {
|
|
if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) =
|
|
&seg.arguments
|
|
{
|
|
if args.len() == 1 {
|
|
let mut args = args.iter();
|
|
let ok = args.next().unwrap();
|
|
if let syn::GenericArgument::Type(ty) = ok {
|
|
return ty.clone();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_ => {
|
|
return t;
|
|
}
|
|
}
|
|
t
|
|
}
|
|
|
|
// For a Vec<Box<T>> return Vec<T>.
|
|
// For a Vec<T> return Vec<T>.
|
|
fn unbox_vec(t: syn::Type) -> syn::Type {
|
|
match t {
|
|
syn::Type::Path(syn::TypePath { ref path, .. }) => {
|
|
let path = &path.segments;
|
|
if path.len() == 1 {
|
|
let seg = &path[0];
|
|
if seg.ident == "Vec" {
|
|
if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) =
|
|
&seg.arguments
|
|
{
|
|
if args.len() == 1 {
|
|
let mut args = args.iter();
|
|
let ok = args.next().unwrap();
|
|
if let syn::GenericArgument::Type(ty) = ok {
|
|
let unboxed = unbox(ty.clone());
|
|
// Wrap it back in a vec.
|
|
let wrapped = syn::Type::Path(syn::TypePath {
|
|
qself: None,
|
|
path: syn::Path {
|
|
leading_colon: None,
|
|
segments: {
|
|
let mut segments = syn::punctuated::Punctuated::new();
|
|
segments.push_value(syn::PathSegment {
|
|
ident: syn::Ident::new("Vec", proc_macro2::Span::call_site()),
|
|
arguments: syn::PathArguments::AngleBracketed(
|
|
syn::AngleBracketedGenericArguments {
|
|
colon2_token: None,
|
|
lt_token: syn::token::Lt::default(),
|
|
args: {
|
|
let mut args = syn::punctuated::Punctuated::new();
|
|
args.push_value(syn::GenericArgument::Type(unboxed));
|
|
args
|
|
},
|
|
gt_token: syn::token::Gt::default(),
|
|
},
|
|
),
|
|
});
|
|
segments
|
|
},
|
|
},
|
|
});
|
|
return wrapped;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_ => {
|
|
return t;
|
|
}
|
|
}
|
|
t
|
|
}
|