use proc_macro2::{Ident, Literal, Punct, Spacing, TokenStream, TokenTree};
use quote::{format_ident, quote};
use crate::models::domain::ClassCodegenLevel;
use crate::models::json::JsonClass;
use crate::special_cases;
pub fn option_as_slice<T>(option: &Option<Vec<T>>) -> &[T] {
option.as_ref().map_or(&[], Vec::as_slice)
}
pub fn make_imports() -> TokenStream {
quote! {
use godot_ffi as sys;
use crate::builtin::*;
use crate::meta::{AsArg, ClassId, CowArg, InParamTuple, OutParamTuple, ParamTuple, RawPtr, RefArg};
use crate::private::Signature;
use crate::classes::native::*;
use crate::classes::Object;
use crate::obj::Gd;
use crate::sys::GodotFfi as _;
}
}
pub fn c_str(string: &str) -> Literal {
let c_string = std::ffi::CString::new(string).expect("CString::new() failed");
Literal::c_string(&c_string)
}
pub fn make_string_name(identifier: &str) -> TokenStream {
let lit = c_str(identifier);
quote! { StringName::__cstr(#lit) }
}
pub fn make_sname_ptr(identifier: &str) -> TokenStream {
quote! {
string_names.fetch(#identifier)
}
}
pub fn get_api_level(class: &JsonClass) -> ClassCodegenLevel {
if let Some(forced_classification) = special_cases::classify_codegen_level(&class.name) {
return forced_classification;
}
match class.api_type.as_str() {
"editor" => ClassCodegenLevel::Editor,
"core" => ClassCodegenLevel::Scene,
"extension" => ClassCodegenLevel::Scene,
"editor_extension" => ClassCodegenLevel::Editor,
_ => {
panic!(
"class {} has unknown API type {}",
class.name, class.api_type
);
}
}
}
pub fn ident(s: &str) -> Ident {
format_ident!("{}", s)
}
pub fn lifetime(s: &str) -> TokenStream {
let tk_apostrophe = TokenTree::Punct(Punct::new('\'', Spacing::Joint));
let tk_lifetime = TokenTree::Ident(ident(s));
TokenStream::from_iter([tk_apostrophe, tk_lifetime])
}
pub fn make_load_safety_doc() -> TokenStream {
quote! {
}
}
#[rustfmt::skip]
pub fn safe_ident(s: &str) -> Ident {
match s {
| "as" | "break" | "const" | "continue" | "crate" | "else" | "enum" | "extern" | "false" | "fn" | "for" | "if"
| "impl" | "in" | "let" | "loop" | "match" | "mod" | "move" | "mut" | "pub" | "ref" | "return" | "self" | "Self"
| "static" | "struct" | "super" | "trait" | "true" | "type" | "unsafe" | "use" | "where" | "while"
| "async" | "await" | "dyn"
| "abstract" | "become" | "box" | "do" | "final" | "macro" | "override" | "priv" | "typeof" | "unsized" | "virtual" | "yield"
| "try"
| "gen"
=> format_ident!("{}_", s),
_ => ident(s)
}
}