From 6655b8c1af76e18dd45332da345779ed90bd0254 Mon Sep 17 00:00:00 2001 From: DuhPesky Date: Sat, 1 Jul 2023 16:47:23 -0700 Subject: [PATCH] remove unused generics/phantomdata in generated code --- .../can_generate_generic_struct/input.rs | 20 ++++++++++----- .../can_generate_generic_struct/output.kt | 10 ++++++++ .../can_generate_generic_struct/output.scala | 7 ++++++ .../can_generate_generic_struct/output.swift | 14 +++++++++++ .../can_generate_generic_struct/output.ts | 8 ++++++ core/src/lib.rs | 1 - core/src/parser.rs | 25 +++++++++++++++++-- 7 files changed, 76 insertions(+), 9 deletions(-) diff --git a/core/data/tests/can_generate_generic_struct/input.rs b/core/data/tests/can_generate_generic_struct/input.rs index 2e18eca9..dfd5a5e5 100644 --- a/core/data/tests/can_generate_generic_struct/input.rs +++ b/core/data/tests/can_generate_generic_struct/input.rs @@ -1,23 +1,31 @@ #[typeshare] pub struct GenericStruct { field_a: A, - field_b: Vec + field_b: Vec, } +#[typeshare] +pub struct UnusedGenericsStruct { + field_a: f32, + field_b: f32, + _phantom_data: std::marker::PhantomData, +} + +#[typeshare] +pub struct UnusedGenericsEmptyStruct {} + #[typeshare] #[serde(tag = "type", content = "content")] -pub enum EnumUsingGenericStruct{ +pub enum EnumUsingGenericStruct { VariantA(GenericStruct), VariantB(GenericStruct<&'static str, i32>), VariantC(GenericStruct<&'static str, bool>), - VariantD(GenericStructUsingGenericStruct<()>) + VariantD(GenericStructUsingGenericStruct<()>), } #[typeshare] pub struct GenericStructUsingGenericStruct { struct_field: GenericStruct, second_struct_field: GenericStruct, - third_struct_field: GenericStruct> + third_struct_field: GenericStruct>, } - - diff --git a/core/data/tests/can_generate_generic_struct/output.kt b/core/data/tests/can_generate_generic_struct/output.kt index 77016d2d..81e8a3ef 100644 --- a/core/data/tests/can_generate_generic_struct/output.kt +++ b/core/data/tests/can_generate_generic_struct/output.kt @@ -11,6 +11,16 @@ data class GenericStruct ( val field_b: List ) +@Serializable +data class UnusedGenericsStruct ( + val field_a: Float, + val field_b: Float +) + +@Serializable +data class UnusedGenericsEmptyStruct ( +) + @Serializable data class GenericStructUsingGenericStruct ( val struct_field: GenericStruct, diff --git a/core/data/tests/can_generate_generic_struct/output.scala b/core/data/tests/can_generate_generic_struct/output.scala index 1dad189e..d666e1e9 100644 --- a/core/data/tests/can_generate_generic_struct/output.scala +++ b/core/data/tests/can_generate_generic_struct/output.scala @@ -7,6 +7,13 @@ case class GenericStruct[A, B] ( field_b: Vector[B] ) +case class UnusedGenericsStruct ( + field_a: Float, + field_b: Float +) + +case class UnusedGenericsEmptyStruct () + case class GenericStructUsingGenericStruct[T] ( struct_field: GenericStruct[String, T], second_struct_field: GenericStruct[T, String], diff --git a/core/data/tests/can_generate_generic_struct/output.swift b/core/data/tests/can_generate_generic_struct/output.swift index 0b8c79ae..65fb17ed 100644 --- a/core/data/tests/can_generate_generic_struct/output.swift +++ b/core/data/tests/can_generate_generic_struct/output.swift @@ -10,6 +10,20 @@ public struct CoreGenericStruct: Codable { } } +public struct CoreUnusedGenericsStruct: Codable { + public let field_a: Float + public let field_b: Float + + public init(field_a: Float, field_b: Float) { + self.field_a = field_a + self.field_b = field_b + } +} + +public struct CoreUnusedGenericsEmptyStruct: Codable { + public init() {} +} + public struct CoreGenericStructUsingGenericStruct: Codable { public let struct_field: CoreGenericStruct public let second_struct_field: CoreGenericStruct diff --git a/core/data/tests/can_generate_generic_struct/output.ts b/core/data/tests/can_generate_generic_struct/output.ts index 38a129b9..d19b199c 100644 --- a/core/data/tests/can_generate_generic_struct/output.ts +++ b/core/data/tests/can_generate_generic_struct/output.ts @@ -3,6 +3,14 @@ export interface GenericStruct { field_b: B[]; } +export interface UnusedGenericsStruct { + field_a: number; + field_b: number; +} + +export interface UnusedGenericsEmptyStruct { +} + export interface GenericStructUsingGenericStruct { struct_field: GenericStruct; second_struct_field: GenericStruct; diff --git a/core/src/lib.rs b/core/src/lib.rs index 65a8c8c3..73d7294e 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,6 +1,5 @@ //! The core library for typeshare. //! Contains the parser and language converters. - use language::Language; use std::io::Write; use thiserror::Error; diff --git a/core/src/parser.rs b/core/src/parser.rs index 54b21d37..db08ffcd 100644 --- a/core/src/parser.rs +++ b/core/src/parser.rs @@ -158,13 +158,15 @@ fn parse_struct(s: &ItemStruct) -> Result { })); } + let mut used_generic_types = Vec::new(); + Ok(match &s.fields { // Structs Fields::Named(f) => { let fields = f .named .iter() - .filter(|field| !is_skipped(&field.attrs)) + .filter(|field| !is_skipped(&field.attrs) && !is_phantom_data(&field.ty)) .map(|f| { let ty = if let Some(ty) = get_field_type_override(&f.attrs) { ty.parse()? @@ -172,6 +174,12 @@ fn parse_struct(s: &ItemStruct) -> Result { RustType::try_from(&f.ty)? }; + for generic_type in &generic_types { + if ty.contains_type(generic_type) { + used_generic_types.push(generic_type.clone()); + } + } + if serde_flatten(&f.attrs) { return Err(ParseError::SerdeFlattenNotAllowed); } @@ -191,7 +199,10 @@ fn parse_struct(s: &ItemStruct) -> Result { RustItem::Struct(RustStruct { id: get_ident(Some(&s.ident), &s.attrs, &None), - generic_types, + generic_types: generic_types + .into_iter() + .filter(|gt| used_generic_types.contains(gt)) + .collect(), fields, comments: parse_comment_attrs(&s.attrs), decorators: get_decorators(&s.attrs), @@ -724,6 +735,16 @@ fn is_skipped(attrs: &[syn::Attribute]) -> bool { }) } +fn is_phantom_data(ty: &syn::Type) -> bool { + if let syn::Type::Path(path) = ty { + if let Some(segment) = path.path.segments.last() { + return segment.ident == "PhantomData"; + } + } + + false +} + #[test] fn test_rename_all_to_case() { let test_word = "test_case";