Skip to content

Commit

Permalink
dedup dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
kamadorueda committed Apr 2, 2024
1 parent 22d03fc commit 0207f5e
Showing 1 changed file with 44 additions and 14 deletions.
58 changes: 44 additions & 14 deletions macros/src/deps.rs
Original file line number Diff line number Diff line change
@@ -1,54 +1,84 @@
use std::collections::HashSet;

use proc_macro2::TokenStream;
use quote::{quote, ToTokens};
use syn::{Path, Type};

pub struct Dependencies {
dependencies: Vec<TokenStream>,
crate_rename: Path,
dependencies: HashSet<Operation>,
pub types: Vec<Type>,
}

#[derive(Hash, Eq, PartialEq)]
enum Operation {
ExtendByDependencyTypes { crate_rename: Path, ty: Type },
ExtendGenerics { crate_rename: Path, ty: Type },
PushType(Type),
}

impl Dependencies {
pub fn new(crate_rename: Path) -> Self {
Self {
dependencies: Vec::default(),
dependencies: HashSet::default(),
crate_rename,
types: Vec::default(),
}
}

/// Adds all dependencies from the given type
pub fn append_from(&mut self, ty: &Type) {
let crate_rename = &self.crate_rename;
self.dependencies
.push(quote![.extend(<#ty as #crate_rename::TS>::dependency_types())]);
.insert(Operation::ExtendByDependencyTypes {
crate_rename: self.crate_rename.clone(),
ty: ty.clone(),
});

self.types.push(ty.clone());
}

/// Adds the given type.
pub fn push(&mut self, ty: &Type) {
let crate_rename = &self.crate_rename;
self.dependencies.push(quote![.push::<#ty>()]);
self.dependencies.push(quote![
.extend(<#ty as #crate_rename::TS>::generics())
]);
self.dependencies.insert(Operation::PushType(ty.clone()));
self.dependencies.insert(Operation::ExtendGenerics {
crate_rename: self.crate_rename.clone(),
ty: ty.clone(),
});
self.types.push(ty.clone());
}

pub fn append(&mut self, mut other: Dependencies) {
if !other.dependencies.is_empty() {
self.dependencies.push(quote![.extend(#other)]);
self.dependencies.extend(other.dependencies);

if !other.types.is_empty() {
self.types.append(&mut other.types);
}
self.types.append(&mut other.types);
}
}

impl ToTokens for Dependencies {
fn to_tokens(&self, tokens: &mut TokenStream) {
let crate_rename = &self.crate_rename;
let lines = &self.dependencies;

let lines = self
.dependencies
.iter()
.map(|operation| match operation {
Operation::PushType(ty) => quote![.push::<#ty>()],
Operation::ExtendByDependencyTypes { crate_rename, ty } => {
quote![.extend(<#ty as #crate_rename::TS>::dependency_types())]
}
Operation::ExtendGenerics { crate_rename, ty } => {
quote![
.extend(<#ty as #crate_rename::TS>::generics())
]
}
})
.collect::<Vec<_>>();

tokens.extend(quote![{
use #crate_rename::typelist::TypeList;
()#(#lines)*
}])
}]);
}
}

0 comments on commit 0207f5e

Please sign in to comment.