@@ -40,35 +40,11 @@ struct Extractor<'a> {
40
40
steps : Vec < ExtractionStep > ,
41
41
}
42
42
43
- fn emit_hir_path (
44
- trap : & mut TrapFile ,
45
- path : & ra_ap_hir_def:: path:: Path ,
46
- ) -> trap:: Label < generated:: Path > {
47
- let part = path. segments ( ) . last ( ) . map ( |segment| {
48
- let name_ref = trap. emit ( generated:: NameRef {
49
- id : trap:: TrapId :: Star ,
50
- text : Some ( segment. name . as_str ( ) . to_owned ( ) ) ,
51
- } ) ;
52
- trap. emit ( generated:: PathSegment {
53
- id : trap:: TrapId :: Star ,
54
- generic_arg_list : None ,
55
- name_ref : Some ( name_ref) ,
56
- param_list : None ,
57
- path_type : None ,
58
- ret_type : None ,
59
- return_type_syntax : None ,
60
- type_repr : None ,
61
- } )
62
- } ) ;
63
- let qualifier = path
64
- . mod_path ( )
65
- . filter ( |p| !p. segments ( ) . is_empty ( ) )
66
- . and_then ( |_| path. qualifier ( ) . as_ref ( ) . map ( |p| emit_hir_path ( trap, p) ) ) ;
67
- trap. emit ( generated:: Path {
68
- id : trap:: TrapId :: Star ,
69
- qualifier,
70
- part,
71
- } )
43
+ fn emit_hir_path ( path : & ra_ap_hir_def:: path:: Path ) -> Vec < String > {
44
+ path. segments ( )
45
+ . iter ( )
46
+ . map ( |x| x. name . as_str ( ) . to_owned ( ) )
47
+ . collect ( )
72
48
}
73
49
fn emit_hir_fn (
74
50
trap : & mut TrapFile ,
@@ -78,162 +54,113 @@ fn emit_hir_fn(
78
54
is_async : bool ,
79
55
is_const : bool ,
80
56
is_unsafe : bool ,
81
- ) -> trap:: Label < generated:: FnPtrTypeRepr > {
82
- let ret = emit_hir_typeref ( trap, ret_type) ;
57
+ ) -> trap:: Label < generated:: FunctionType > {
58
+ let ret_type = emit_hir_typeref ( trap, ret_type) ;
83
59
84
- let ret = trap. emit ( generated:: RetTypeRepr {
85
- id : trap:: TrapId :: Star ,
86
- type_repr : ret,
87
- } ) ;
88
- let self_param = self_type. map ( |ty| {
89
- let type_repr = emit_hir_typeref ( trap, ty) ;
90
- trap. emit ( generated:: SelfParam {
91
- id : trap:: TrapId :: Star ,
92
- attrs : vec ! [ ] ,
93
- type_repr,
94
- is_mut : false ,
95
- lifetime : None ,
96
- name : None ,
97
- } )
98
- } ) ;
99
- let params = params
100
- . iter ( )
101
- . map ( |t| {
102
- let type_repr = emit_hir_typeref ( trap, t) ;
103
- trap. emit ( generated:: Param {
104
- id : trap:: TrapId :: Star ,
105
- attrs : vec ! [ ] ,
106
- type_repr,
107
- pat : None ,
108
- } )
109
- } )
110
- . collect ( ) ;
111
- let params = trap. emit ( generated:: ParamList {
112
- id : trap:: TrapId :: Star ,
113
- params,
114
- self_param,
115
- } ) ;
116
- trap. emit ( generated:: FnPtrTypeRepr {
60
+ let self_type = self_type. map ( |ty| emit_hir_typeref ( trap, ty) ) ;
61
+ let params = params. iter ( ) . map ( |t| emit_hir_typeref ( trap, t) ) . collect ( ) ;
62
+
63
+ trap. emit ( generated:: FunctionType {
117
64
id : trap:: TrapId :: Star ,
118
- abi : None ,
119
65
is_async,
120
66
is_const,
121
67
is_unsafe,
122
- param_list : Some ( params) ,
123
- ret_type : Some ( ret) ,
68
+ self_type,
69
+ ret_type,
70
+ params,
71
+ has_varargs : false ,
124
72
} )
125
73
}
126
- fn emit_hir_typeref ( trap : & mut TrapFile , ty : & TypeRef ) -> Option < trap:: Label < generated:: TypeRepr > > {
74
+ fn emit_hir_typeref ( trap : & mut TrapFile , ty : & TypeRef ) -> trap:: Label < generated:: Type > {
127
75
match ty {
128
- TypeRef :: Never => Some (
129
- trap . emit ( generated:: NeverTypeRepr {
76
+ TypeRef :: Never => trap
77
+ . emit ( generated:: NeverType {
130
78
id : trap:: TrapId :: Star ,
131
79
} )
132
80
. into ( ) ,
133
- ) ,
134
- TypeRef :: Placeholder => Some (
135
- trap . emit ( generated:: InferTypeRepr {
81
+
82
+ TypeRef :: Placeholder => trap
83
+ . emit ( generated:: PlaceholderType {
136
84
id : trap:: TrapId :: Star ,
137
85
} )
138
86
. into ( ) ,
139
- ) ,
87
+
140
88
TypeRef :: Tuple ( fields) => {
141
89
let fields = fields
142
90
. iter ( )
143
- . flat_map ( |field| emit_hir_typeref ( trap, field) )
91
+ . map ( |field| emit_hir_typeref ( trap, field) )
144
92
. collect ( ) ;
145
- Some (
146
- trap. emit ( generated:: TupleTypeRepr {
147
- id : trap:: TrapId :: Star ,
148
- fields,
149
- } )
150
- . into ( ) ,
151
- )
93
+
94
+ trap. emit ( generated:: TupleType {
95
+ id : trap:: TrapId :: Star ,
96
+ fields,
97
+ } )
98
+ . into ( )
152
99
}
153
100
TypeRef :: RawPtr ( type_ref, mutability) => {
154
- let type_repr = emit_hir_typeref ( trap, type_ref) ;
155
- Some (
156
- trap. emit ( generated:: PtrTypeRepr {
157
- id : trap:: TrapId :: Star ,
158
- is_const : mutability. is_shared ( ) ,
159
- is_mut : mutability. is_mut ( ) ,
160
- type_repr,
161
- } )
162
- . into ( ) ,
163
- )
101
+ let type_ = emit_hir_typeref ( trap, type_ref) ;
102
+
103
+ trap. emit ( generated:: RawPtrType {
104
+ id : trap:: TrapId :: Star ,
105
+ is_mut : mutability. is_mut ( ) ,
106
+ type_,
107
+ } )
108
+ . into ( )
164
109
}
165
110
TypeRef :: Reference ( type_ref, lifetime_ref, mutability) => {
166
- let type_repr = emit_hir_typeref ( trap, type_ref) ;
167
- let lifetime = lifetime_ref. as_ref ( ) . map ( |x| {
168
- trap. emit ( generated:: Lifetime {
169
- id : trap:: TrapId :: Star ,
170
- text : Some ( x. name . as_str ( ) . to_owned ( ) ) ,
171
- } )
172
- } ) ;
173
- Some (
174
- trap. emit ( generated:: RefTypeRepr {
175
- id : trap:: TrapId :: Star ,
176
- is_mut : mutability. is_mut ( ) ,
177
- type_repr,
178
- lifetime,
179
- } )
180
- . into ( ) ,
181
- )
111
+ let type_ = emit_hir_typeref ( trap, type_ref) ;
112
+ let lifetime = lifetime_ref. as_ref ( ) . map ( |x|x. name . as_str ( ) . to_owned ( ) ) ;
113
+ trap. emit ( generated:: ReferenceType {
114
+ id : trap:: TrapId :: Star ,
115
+ is_mut : mutability. is_mut ( ) ,
116
+ type_,
117
+ lifetime,
118
+ } )
119
+ . into ( )
182
120
}
183
121
TypeRef :: Array ( type_ref, _const_ref) => {
184
- let element_type_repr = emit_hir_typeref ( trap, type_ref) ;
122
+ let type_ = emit_hir_typeref ( trap, type_ref) ;
185
123
// TODO: handle array size constant
186
- let const_arg = None ;
187
- Some (
188
- trap. emit ( generated:: ArrayTypeRepr {
189
- id : trap:: TrapId :: Star ,
190
- element_type_repr,
191
- const_arg,
192
- } )
193
- . into ( ) ,
194
- )
124
+ trap. emit ( generated:: ArrayType {
125
+ id : trap:: TrapId :: Star ,
126
+ type_,
127
+ } )
128
+ . into ( )
195
129
}
196
130
TypeRef :: Slice ( type_ref) => {
197
- let type_repr = emit_hir_typeref ( trap, type_ref) ;
198
- Some (
199
- trap. emit ( generated:: SliceTypeRepr {
200
- id : trap:: TrapId :: Star ,
201
- type_repr,
202
- } )
203
- . into ( ) ,
204
- )
131
+ let type_ = emit_hir_typeref ( trap, type_ref) ;
132
+ trap. emit ( generated:: SliceType {
133
+ id : trap:: TrapId :: Star ,
134
+ type_,
135
+ } )
136
+ . into ( )
205
137
}
206
138
TypeRef :: Fn ( params, _, is_unsafe, _symbol) => {
207
139
let ( ret_type, params) = params. split_last ( ) . unwrap ( ) ;
208
140
let params: Vec < _ > = params. as_ref ( ) . iter ( ) . map ( |x| & x. 1 ) . collect ( ) ;
209
- Some (
210
- emit_hir_fn (
211
- trap,
212
- None ,
213
- & params[ ..] ,
214
- & ret_type. 1 ,
215
- false ,
216
- false ,
217
- * is_unsafe,
218
- )
219
- . into ( ) ,
141
+ emit_hir_fn (
142
+ trap,
143
+ None ,
144
+ & params[ ..] ,
145
+ & ret_type. 1 ,
146
+ false ,
147
+ false ,
148
+ * is_unsafe,
220
149
)
150
+ . into ( )
221
151
}
222
152
TypeRef :: Path ( path) => {
223
- let path = Some ( emit_hir_path ( trap, path) ) ;
224
-
225
- Some (
226
- trap. emit ( generated:: PathTypeRepr {
227
- id : trap:: TrapId :: Star ,
228
- path,
229
- } )
230
- . into ( ) ,
231
- )
153
+ let path = emit_hir_path ( path) ;
154
+ trap. emit ( generated:: PathType {
155
+ id : trap:: TrapId :: Star ,
156
+ path,
157
+ } )
158
+ . into ( )
232
159
}
233
- TypeRef :: ImplTrait ( _) => None , // TODO handle impl
234
- TypeRef :: DynTrait ( _) => None , // TODO handle dyn
235
- TypeRef :: Macro ( _) => None ,
236
- TypeRef :: Error => None ,
160
+ TypeRef :: ImplTrait ( _) | // TODO handle impl
161
+ TypeRef :: DynTrait ( _) | // TODO handle dyn
162
+ TypeRef :: Macro ( _) |
163
+ TypeRef :: Error => trap . emit ( generated :: ErrorType { id : trap :: TrapId :: Star , } ) . into ( ) ,
237
164
}
238
165
}
239
166
@@ -246,10 +173,9 @@ fn emit_variant_data(
246
173
let mut types = Vec :: new ( ) ;
247
174
let mut fields = Vec :: new ( ) ;
248
175
for field in field_data. values ( ) {
249
- if let Some ( tp) = emit_hir_typeref ( trap, & field. type_ref ) {
250
- fields. push ( field. name . as_str ( ) . to_owned ( ) ) ;
251
- types. push ( tp) ;
252
- }
176
+ let tp = emit_hir_typeref ( trap, & field. type_ref ) ;
177
+ fields. push ( field. name . as_str ( ) . to_owned ( ) ) ;
178
+ types. push ( tp) ;
253
179
}
254
180
Some ( trap. emit ( generated:: VariantData {
255
181
id : trap:: TrapId :: Star ,
@@ -509,23 +435,21 @@ impl<'a> Extractor<'a> {
509
435
}
510
436
ModuleDefId :: ConstId ( konst) => {
511
437
let konst = db. const_data ( konst) ;
512
- if let Some ( type_) = emit_hir_typeref ( trap, & konst. type_ref ) {
513
- values. push ( trap. emit ( generated:: ValueItem {
514
- id : trap:: TrapId :: Star ,
515
- name : name. as_str ( ) . to_owned ( ) ,
516
- type_,
517
- } ) ) ;
518
- }
438
+ let type_ = emit_hir_typeref ( trap, & konst. type_ref ) ;
439
+ values. push ( trap. emit ( generated:: ValueItem {
440
+ id : trap:: TrapId :: Star ,
441
+ name : name. as_str ( ) . to_owned ( ) ,
442
+ type_,
443
+ } ) ) ;
519
444
}
520
445
ModuleDefId :: StaticId ( statik) => {
521
446
let statik = db. static_data ( statik) ;
522
- if let Some ( type_) = emit_hir_typeref ( trap, & statik. type_ref ) {
523
- values. push ( trap. emit ( generated:: ValueItem {
524
- id : trap:: TrapId :: Star ,
525
- name : name. as_str ( ) . to_owned ( ) ,
526
- type_,
527
- } ) ) ;
528
- }
447
+ let type_ = emit_hir_typeref ( trap, & statik. type_ref ) ;
448
+ values. push ( trap. emit ( generated:: ValueItem {
449
+ id : trap:: TrapId :: Star ,
450
+ name : name. as_str ( ) . to_owned ( ) ,
451
+ type_,
452
+ } ) ) ;
529
453
}
530
454
ModuleDefId :: EnumVariantId ( variant_id) => {
531
455
let variant: Variant = variant_id. into ( ) ;
@@ -548,7 +472,7 @@ impl<'a> Extractor<'a> {
548
472
let variant_data = db. enum_variant_data ( variant_id) ;
549
473
let type_ = match variant_data. variant_data . as_ref ( ) {
550
474
ra_ap_hir_def:: data:: adt:: VariantData :: Unit => {
551
- emit_hir_typeref ( trap, & ret_type)
475
+ Some ( emit_hir_typeref ( trap, & ret_type) )
552
476
}
553
477
ra_ap_hir_def:: data:: adt:: VariantData :: Tuple ( arena) => {
554
478
let params: Vec < _ > =
0 commit comments