@@ -9,7 +9,6 @@ use std::sync::Arc;
9
9
10
10
use common:: DirectiveName ;
11
11
use common:: Location ;
12
- use common:: PointerAddress ;
13
12
use common:: WithLocation ;
14
13
use fnv:: FnvHashMap ;
15
14
use graphql_ir:: Directive ;
@@ -47,14 +46,11 @@ pub fn generate_typename(program: &Program, is_for_codegen: bool) -> Program {
47
46
. replace_or_else ( || program. clone ( ) )
48
47
}
49
48
50
- // Note on correctness: the PointerAddress here is calculated from addresses of the input
51
- // context. Because those value are still referenced, that memory cannot be freed/
52
- // reused for the lifetime of the transform.
53
- type Seen =FnvHashMap < PointerAddress , Transformed < Selection > > ;
49
+ type Seen < ' a > =FnvHashMap < & ' a InlineFragment , Transformed < Selection > > ;
54
50
55
51
struct GenerateTypenameTransform < ' s > {
56
52
program : & ' s Program ,
57
- seen : Seen ,
53
+ seen : Seen < ' s > ,
58
54
is_for_codegen : bool ,
59
55
parent_type : Option < Type > ,
60
56
}
@@ -70,22 +66,22 @@ impl<'s> GenerateTypenameTransform<'s> {
70
66
}
71
67
}
72
68
73
- impl < ' s > Transformer < ' _ > for GenerateTypenameTransform < ' s > {
69
+ impl < ' s > Transformer < ' s > for GenerateTypenameTransform < ' s > {
74
70
const NAME : & ' static str ="GenerateTypenameTransform" ;
75
71
const VISIT_ARGUMENTS : bool =false ;
76
72
const VISIT_DIRECTIVES : bool =false ;
77
73
78
74
fn transform_operation (
79
75
& mut self ,
80
- operation : & OperationDefinition ,
76
+ operation : & ' s OperationDefinition ,
81
77
) ->Transformed < OperationDefinition > {
82
78
self . parent_type =Some ( operation. type_ ) ;
83
79
self . default_transform_operation ( operation)
84
80
}
85
81
86
82
fn transform_fragment (
87
83
& mut self ,
88
- fragment : & FragmentDefinition ,
84
+ fragment : & ' s FragmentDefinition ,
89
85
) ->Transformed < FragmentDefinition > {
90
86
self . parent_type =Some ( fragment. type_condition ) ;
91
87
let schema =& self . program . schema ;
@@ -115,7 +111,7 @@ impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
115
111
}
116
112
}
117
113
118
- fn transform_linked_field ( & mut self , field : & LinkedField ) ->Transformed < Selection > {
114
+ fn transform_linked_field ( & mut self , field : & ' s LinkedField ) ->Transformed < Selection > {
119
115
let schema =& self . program . schema ;
120
116
let field_definition = schema. field ( field. definition . item ) ;
121
117
let parent_type =self . parent_type ;
@@ -154,12 +150,14 @@ impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
154
150
}
155
151
}
156
152
157
- fn transform_inline_fragment ( & mut self , fragment : & InlineFragment ) ->Transformed < Selection > {
158
- let key =PointerAddress :: new ( fragment) ;
159
- if let Some ( prev) =self . seen . get ( & key) {
153
+ fn transform_inline_fragment (
154
+ & mut self ,
155
+ fragment : & ' s InlineFragment ,
156
+ ) ->Transformed < Selection > {
157
+ if let Some ( prev) =self . seen . get ( fragment) {
160
158
return prev. clone ( ) ;
161
159
}
162
- self . seen . insert ( key , Transformed :: Delete ) ;
160
+ self . seen . insert ( fragment , Transformed :: Delete ) ;
163
161
let parent_type =self . parent_type ;
164
162
if fragment. type_condition . is_some ( ) {
165
163
self . parent_type = fragment. type_condition ;
@@ -204,7 +202,7 @@ impl<'s> Transformer<'_> for GenerateTypenameTransform<'s> {
204
202
} ) ) )
205
203
}
206
204
} ;
207
- self . seen . insert ( key , result. clone ( ) ) ;
205
+ self . seen . insert ( fragment , result. clone ( ) ) ;
208
206
result
209
207
}
210
208