From 572fe685910e5d4bf174d5a7ffadaed27b699069 Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 25 Jun 2023 19:11:55 +0200 Subject: [PATCH] sdk-builder: cleanup/fixes --- sdk-builder/src/main.rs | 66 +++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/sdk-builder/src/main.rs b/sdk-builder/src/main.rs index a172c23..f7934e0 100644 --- a/sdk-builder/src/main.rs +++ b/sdk-builder/src/main.rs @@ -100,9 +100,8 @@ pub mod rust { use std::{borrow::Cow, collections::BTreeMap}; use anyhow::Context; - use itertools::Itertools; use proc_macro2::TokenStream; - use quote::{format_ident, quote, TokenStreamExt}; + use quote::{format_ident, quote}; use unreal_sdk::sdk::repr::{ Class, ClassField, ClassMethod, Enum, ObjectRef, PrimitiveType, ProcessedPackage, Sdk, StructKind, Type, UnrealType, @@ -110,18 +109,18 @@ pub mod rust { use crate::split_at_illegal_char; - const KEYWORDS: [&'static str; 51] = [ - "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", - ]; + // const KEYWORDS: [&'static str; 51] = [ + // "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", + // ]; - const TYPES: [&'static str; 17] = [ - "bool", "f64", "f32", "str", "char", "u8", "u16", "u32", "u64", "u128", "i8", "i16", "i32", - "i64", "i128", "usize", "isize", - ]; + // const TYPES: [&'static str; 17] = [ + // "bool", "f64", "f32", "str", "char", "u8", "u16", "u32", "u64", "u128", "i8", "i16", "i32", + // "i64", "i128", "usize", "isize", + // ]; const WORDS: [&'static str; 68] = [ "as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn", @@ -185,6 +184,14 @@ pub mod rust { } } + pub fn build(self) -> anyhow::Result<()> { + for pkg in self.sdk.packages.values() { + self.generate_package(pkg)?; + } + + Ok(()) + } + fn type_name(&self, ty: &Type) -> anyhow::Result { let type_name = match ty { Type::Ptr(inner) | Type::Ref(inner) => { @@ -230,10 +237,7 @@ pub mod rust { Type::Name => "FName".to_string(), Type::String => "FString".to_string(), Type::Text => "FText".to_string(), - Type::Enum { - underlying, - enum_type, - } => self + Type::Enum { enum_type, .. } => self .type_name_cache .get(enum_type) .context("type name was not cached.")? @@ -285,7 +289,7 @@ pub mod rust { /// - the impls for that type, like Clone, AsUObject, AsPtr and StaticClass fn generate_object( &self, - class: &Class, + _class: &Class, name: &str, ) -> anyhow::Result<(TokenStream, TokenStream)> { let typedef = quote! { @@ -372,7 +376,7 @@ pub mod rust { } } - ctor + #ctor } }; @@ -514,7 +518,7 @@ pub mod rust { byte_mask, field_mask, .. - }) => { + }) if byte_mask != 0xFF => { let shift = field_mask.trailing_zeros(); let getter = quote! { @@ -572,15 +576,15 @@ pub mod rust { fn generate_struct_ctor( &self, - class: &Class, - name: &str, + _class: &Class, + _name: &str, fields: &Vec<(&ClassField, Cow, String)>, ) -> TokenStream { let fields_defs = fields.iter().map(|(_, name, ty)| quote! {#name: #ty}); - let this_field_asignments = fields.iter().map(|(_, name, ty)| { + let this_field_asignments = fields.iter().map(|(_, name, _ty)| { let setter = format_ident!("set_{}", name); - quote! {this.setter(#name);} + quote! {this.#setter(#name);} }); // FIXME: handle super struct fields aswell, ARK doesnt seem to have those anyways. @@ -638,13 +642,14 @@ pub mod rust { } fn generate_find_object(name: &str) -> TokenStream { + let not_found = format!("static object \"{name}\" not found!"); quote! { static OBJECT: ::once_cell::sync::OnceCell<::core::option::Option> = ::once_cell::sync::OnceCell::new(); OBJECT.get_or_init(|| { - match find_object(::obfstr::obfstr!("#name")) { + match find_object(::obfstr::obfstr!(#name)) { object @ Some(_) => {object}, None => { - ::log::error!("{}", obfstr::obfstr!("static object #name not found!")); + ::log::error!("{}", ::obfstr::obfstr!(#not_found)); } } }) @@ -714,6 +719,8 @@ pub mod rust { #impls + #(#super_traits)* + #methods #field_trait @@ -725,12 +732,7 @@ pub mod rust { // TODO: canonicalize_name(&pkg.name); let pkg_name = "PACKAGE_NAME_PLACEHOLDER".to_string(); - for (id, ty) in &pkg.types { - let name = self - .type_name_cache - .get(id) - .expect("type name was not cached."); - + for (_id, ty) in &pkg.types { let tokens = match ty { UnrealType::Class(class) | UnrealType::Actor(class)