Skip to content

Commit a6bbbd1

Browse files
authored
Fix non-deterministic proc-macro output by replacing HashSet with IndexSet (#488)
1 parent 7182ad8 commit a6bbbd1

4 files changed

Lines changed: 14 additions & 8 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

macros/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ no-serde-warnings = []
1616
proc-macro = true
1717

1818
[dependencies]
19+
indexmap = "2"
1920
proc-macro2 = "1"
2021
quote = "1"
2122
syn = { version = "2.0.28", features = ["full", "extra-traits"] }

macros/src/deps.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
use std::{collections::HashSet, rc::Rc};
1+
use std::rc::Rc;
2+
3+
use indexmap::IndexSet;
24

35
use proc_macro2::TokenStream;
46
use quote::{quote, ToTokens};
57
use syn::{Path, Type};
68

79
pub struct Dependencies {
810
crate_rename: Rc<Path>,
9-
dependencies: HashSet<Dependency>,
10-
types: HashSet<Rc<Type>>,
11+
dependencies: IndexSet<Dependency>,
12+
types: IndexSet<Rc<Type>>,
1113
}
1214

1315
#[derive(Hash, Eq, PartialEq)]
@@ -30,9 +32,9 @@ enum Dependency {
3032
impl Dependencies {
3133
pub fn new(crate_rename: Path) -> Self {
3234
Self {
33-
dependencies: HashSet::new(),
35+
dependencies: IndexSet::new(),
3436
crate_rename: Rc::new(crate_rename),
35-
types: HashSet::new(),
37+
types: IndexSet::new(),
3638
}
3739
}
3840

macros/src/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#![macro_use]
22
#![deny(unused)]
33

4-
use std::collections::{HashMap, HashSet};
4+
use std::collections::HashMap;
5+
6+
use indexmap::IndexSet;
57

68
use proc_macro2::{Ident, TokenStream};
79
use quote::{format_ident, quote};
@@ -442,7 +444,7 @@ fn generate_where_clause(
442444
let used_types = {
443445
let is_type_param = |id: &Ident| generics.type_params().any(|p| &p.ident == id);
444446

445-
let mut used_types = HashSet::new();
447+
let mut used_types = IndexSet::new();
446448
for ty in dependencies.used_types() {
447449
used_type_params(&mut used_types, ty, is_type_param);
448450
}
@@ -459,7 +461,7 @@ fn generate_where_clause(
459461
// Associated types of a type parameter are extracted as well.
460462
// Note: This will not extract `I` from `I::Item`, but just `I::Item`!
461463
fn used_type_params<'ty, 'out>(
462-
out: &'out mut HashSet<&'ty Type>,
464+
out: &'out mut IndexSet<&'ty Type>,
463465
ty: &'ty Type,
464466
is_type_param: impl Fn(&'ty Ident) -> bool + Copy + 'out,
465467
) {

0 commit comments

Comments
 (0)