@@ -40,35 +40,11 @@ struct Extractor<'a> {
4040 steps : Vec < ExtractionStep > ,
4141}
4242
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 ( )
7248}
7349fn emit_hir_fn (
7450 trap : & mut TrapFile ,
@@ -78,162 +54,113 @@ fn emit_hir_fn(
7854 is_async : bool ,
7955 is_const : bool ,
8056 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) ;
8359
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 {
11764 id : trap:: TrapId :: Star ,
118- abi : None ,
11965 is_async,
12066 is_const,
12167 is_unsafe,
122- param_list : Some ( params) ,
123- ret_type : Some ( ret) ,
68+ self_type,
69+ ret_type,
70+ params,
71+ has_varargs : false ,
12472 } )
12573}
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 > {
12775 match ty {
128- TypeRef :: Never => Some (
129- trap . emit ( generated:: NeverTypeRepr {
76+ TypeRef :: Never => trap
77+ . emit ( generated:: NeverType {
13078 id : trap:: TrapId :: Star ,
13179 } )
13280 . into ( ) ,
133- ) ,
134- TypeRef :: Placeholder => Some (
135- trap . emit ( generated:: InferTypeRepr {
81+
82+ TypeRef :: Placeholder => trap
83+ . emit ( generated:: PlaceholderType {
13684 id : trap:: TrapId :: Star ,
13785 } )
13886 . into ( ) ,
139- ) ,
87+
14088 TypeRef :: Tuple ( fields) => {
14189 let fields = fields
14290 . iter ( )
143- . flat_map ( |field| emit_hir_typeref ( trap, field) )
91+ . map ( |field| emit_hir_typeref ( trap, field) )
14492 . 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 ( )
15299 }
153100 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 ( )
164109 }
165110 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 ( )
182120 }
183121 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) ;
185123 // 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 ( )
195129 }
196130 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 ( )
205137 }
206138 TypeRef :: Fn ( params, _, is_unsafe, _symbol) => {
207139 let ( ret_type, params) = params. split_last ( ) . unwrap ( ) ;
208140 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,
220149 )
150+ . into ( )
221151 }
222152 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 ( )
232159 }
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 ( ) ,
237164 }
238165}
239166
@@ -246,10 +173,9 @@ fn emit_variant_data(
246173 let mut types = Vec :: new ( ) ;
247174 let mut fields = Vec :: new ( ) ;
248175 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) ;
253179 }
254180 Some ( trap. emit ( generated:: VariantData {
255181 id : trap:: TrapId :: Star ,
@@ -509,23 +435,21 @@ impl<'a> Extractor<'a> {
509435 }
510436 ModuleDefId :: ConstId ( konst) => {
511437 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+ } ) ) ;
519444 }
520445 ModuleDefId :: StaticId ( statik) => {
521446 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+ } ) ) ;
529453 }
530454 ModuleDefId :: EnumVariantId ( variant_id) => {
531455 let variant: Variant = variant_id. into ( ) ;
@@ -548,7 +472,7 @@ impl<'a> Extractor<'a> {
548472 let variant_data = db. enum_variant_data ( variant_id) ;
549473 let type_ = match variant_data. variant_data . as_ref ( ) {
550474 ra_ap_hir_def:: data:: adt:: VariantData :: Unit => {
551- emit_hir_typeref ( trap, & ret_type)
475+ Some ( emit_hir_typeref ( trap, & ret_type) )
552476 }
553477 ra_ap_hir_def:: data:: adt:: VariantData :: Tuple ( arena) => {
554478 let params: Vec < _ > =
0 commit comments