diff --git a/Cargo.lock b/Cargo.lock index b96d94f5..e753df39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1522,6 +1522,7 @@ dependencies = [ name = "ts-rs-macros" version = "12.0.1" dependencies = [ + "indexmap", "proc-macro2", "quote", "syn 2.0.90", diff --git a/macros/Cargo.toml b/macros/Cargo.toml index 954b4cb5..87d76752 100644 --- a/macros/Cargo.toml +++ b/macros/Cargo.toml @@ -16,6 +16,7 @@ no-serde-warnings = [] proc-macro = true [dependencies] +indexmap = "2" proc-macro2 = "1" quote = "1" syn = { version = "2.0.28", features = ["full", "extra-traits"] } diff --git a/macros/src/deps.rs b/macros/src/deps.rs index ef61084a..23edcdcc 100644 --- a/macros/src/deps.rs +++ b/macros/src/deps.rs @@ -1,4 +1,6 @@ -use std::{collections::HashSet, rc::Rc}; +use std::rc::Rc; + +use indexmap::IndexSet; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; @@ -6,8 +8,8 @@ use syn::{Path, Type}; pub struct Dependencies { crate_rename: Rc, - dependencies: HashSet, - types: HashSet>, + dependencies: IndexSet, + types: IndexSet>, } #[derive(Hash, Eq, PartialEq)] @@ -30,9 +32,9 @@ enum Dependency { impl Dependencies { pub fn new(crate_rename: Path) -> Self { Self { - dependencies: HashSet::new(), + dependencies: IndexSet::new(), crate_rename: Rc::new(crate_rename), - types: HashSet::new(), + types: IndexSet::new(), } } diff --git a/macros/src/lib.rs b/macros/src/lib.rs index b54e588e..1bc32712 100644 --- a/macros/src/lib.rs +++ b/macros/src/lib.rs @@ -1,7 +1,9 @@ #![macro_use] #![deny(unused)] -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; + +use indexmap::IndexSet; use proc_macro2::{Ident, TokenStream}; use quote::{format_ident, quote}; @@ -442,7 +444,7 @@ fn generate_where_clause( let used_types = { let is_type_param = |id: &Ident| generics.type_params().any(|p| &p.ident == id); - let mut used_types = HashSet::new(); + let mut used_types = IndexSet::new(); for ty in dependencies.used_types() { used_type_params(&mut used_types, ty, is_type_param); } @@ -459,7 +461,7 @@ fn generate_where_clause( // Associated types of a type parameter are extracted as well. // Note: This will not extract `I` from `I::Item`, but just `I::Item`! fn used_type_params<'ty, 'out>( - out: &'out mut HashSet<&'ty Type>, + out: &'out mut IndexSet<&'ty Type>, ty: &'ty Type, is_type_param: impl Fn(&'ty Ident) -> bool + Copy + 'out, ) {