@@ -10,12 +10,17 @@ import rustc::front::attr;
10
10
import core:: tuple;
11
11
12
12
export crate_attrs, fn_attrs, arg_attrs;
13
- export parse_crate, parse_fn;
13
+ export parse_crate, parse_mod , parse_fn;
14
14
15
15
type crate_attrs = {
16
16
name : option < str >
17
17
} ;
18
18
19
+ type mod_attrs = {
20
+ brief : option < str > ,
21
+ desc : option < str >
22
+ } ;
23
+
19
24
type fn_attrs = {
20
25
brief : option < str > ,
21
26
desc : option < str > ,
@@ -80,51 +85,121 @@ fn should_not_extract_crate_name_if_no_name_value_in_link_attribute() {
80
85
assert attrs. name == none;
81
86
}
82
87
83
- fn parse_fn (
84
- attrs : [ ast:: attribute ]
85
- ) -> fn_attrs {
88
+ fn parse_mod ( attrs : [ ast:: attribute ] ) -> mod_attrs {
89
+ parse_short_doc_or (
90
+ attrs,
91
+ { |desc|
92
+ {
93
+ brief: none,
94
+ desc: desc
95
+ }
96
+ } ,
97
+ parse_mod_long_doc
98
+ )
99
+ }
86
100
87
- let no_attrs = {
88
- brief: none,
89
- desc: none,
90
- args: [ ] ,
91
- return : none
92
- } ;
101
+ fn parse_mod_long_doc (
102
+ _items : [ @ast:: meta_item ] ,
103
+ brief : option < str > ,
104
+ desc : option < str >
105
+ ) -> mod_attrs {
106
+ {
107
+ brief: brief,
108
+ desc: desc
109
+ }
110
+ }
93
111
94
- ret alt doc_meta ( attrs) {
112
+ #[ test]
113
+ fn parse_mod_should_handle_undocumented_mods ( ) {
114
+ let source = "" ;
115
+ let attrs = test:: parse_attributes ( source) ;
116
+ let attrs = parse_mod ( attrs) ;
117
+ assert attrs. brief == none;
118
+ assert attrs. desc == none;
119
+ }
120
+
121
+ #[ test]
122
+ fn parse_mod_should_parse_simple_doc_attributes ( ) {
123
+ let source = "#[doc = \" basic\" ]" ;
124
+ let attrs = test:: parse_attributes ( source) ;
125
+ let attrs = parse_mod ( attrs) ;
126
+ assert attrs. desc == some ( "basic" ) ;
127
+ }
128
+
129
+ #[ test]
130
+ fn parse_mod_should_parse_the_brief_description ( ) {
131
+ let source = "#[doc(brief = \" short\" )]" ;
132
+ let attrs = test:: parse_attributes ( source) ;
133
+ let attrs = parse_mod ( attrs) ;
134
+ assert attrs. brief == some ( "short" ) ;
135
+ }
136
+
137
+ #[ test]
138
+ fn parse_mod_should_parse_the_long_description ( ) {
139
+ let source = "#[doc(desc = \" description\" )]" ;
140
+ let attrs = test:: parse_attributes ( source) ;
141
+ let attrs = parse_mod ( attrs) ;
142
+ assert attrs. desc == some ( "description" ) ;
143
+ }
144
+
145
+ fn parse_short_doc_or < T > (
146
+ attrs : [ ast:: attribute ] ,
147
+ handle_short : fn & (
148
+ short_desc : option < str >
149
+ ) -> T ,
150
+ parse_long : fn & (
151
+ doc_items : [ @ast:: meta_item ] ,
152
+ brief : option < str > ,
153
+ desc : option < str >
154
+ ) -> T
155
+ ) -> T {
156
+ alt doc_meta ( attrs) {
95
157
some ( meta) {
96
158
alt attr:: get_meta_item_value_str ( meta) {
97
- some ( desc) {
98
- {
99
- brief: none,
100
- desc: some ( desc) ,
101
- args: [ ] ,
102
- return : none
103
- }
104
- }
159
+ some ( desc) { handle_short ( some ( desc) ) }
105
160
none. {
106
161
alt attr :: get_meta_item_list( meta) {
107
162
some ( list) {
108
- parse_fn_ ( list)
163
+ let brief = attr:: meta_item_value_from_list ( list, "brief" ) ;
164
+ let desc = attr:: meta_item_value_from_list ( list, "desc" ) ;
165
+ parse_long ( list, brief, desc)
109
166
}
110
167
none. {
111
- no_attrs
168
+ handle_short ( none )
112
169
}
113
170
}
114
171
}
115
172
}
116
173
}
117
174
none. {
118
- no_attrs
175
+ handle_short ( none )
119
176
}
120
- } ;
177
+ }
178
+ }
179
+
180
+ fn parse_fn (
181
+ attrs : [ ast:: attribute ]
182
+ ) -> fn_attrs {
183
+
184
+ parse_short_doc_or (
185
+ attrs,
186
+ { |desc|
187
+ {
188
+ brief: none,
189
+ desc: desc,
190
+ args: [ ] ,
191
+ return : none
192
+ }
193
+ } ,
194
+ parse_fn_long_doc
195
+ )
121
196
}
122
197
123
- fn parse_fn_ (
124
- items : [ @ast:: meta_item ]
198
+ fn parse_fn_long_doc (
199
+ items : [ @ast:: meta_item ] ,
200
+ brief : option < str > ,
201
+ desc : option < str >
125
202
) -> fn_attrs {
126
- let brief = attr:: meta_item_value_from_list ( items, "brief" ) ;
127
- let desc = attr:: meta_item_value_from_list ( items, "desc" ) ;
128
203
let return = attr:: meta_item_value_from_list ( items, "return" ) ;
129
204
130
205
let args = alt attr:: meta_item_list_from_list ( items, "args" ) {
@@ -149,6 +224,58 @@ fn parse_fn_(
149
224
}
150
225
}
151
226
227
+ #[ test]
228
+ fn parse_fn_should_handle_undocumented_functions ( ) {
229
+ let source = "" ;
230
+ let attrs = test:: parse_attributes ( source) ;
231
+ let attrs = parse_fn ( attrs) ;
232
+ assert attrs. brief == none;
233
+ assert attrs. desc == none;
234
+ assert attrs. return == none;
235
+ assert vec:: len ( attrs. args ) == 0 u;
236
+ }
237
+
238
+ #[ test]
239
+ fn parse_fn_should_parse_simple_doc_attributes ( ) {
240
+ let source = "#[doc = \" basic\" ]" ;
241
+ let attrs = test:: parse_attributes ( source) ;
242
+ let attrs = parse_fn ( attrs) ;
243
+ assert attrs. desc == some ( "basic" ) ;
244
+ }
245
+
246
+ #[ test]
247
+ fn parse_fn_should_parse_the_brief_description ( ) {
248
+ let source = "#[doc(brief = \" short\" )]" ;
249
+ let attrs = test:: parse_attributes ( source) ;
250
+ let attrs = parse_fn ( attrs) ;
251
+ assert attrs. brief == some ( "short" ) ;
252
+ }
253
+
254
+ #[ test]
255
+ fn parse_fn_should_parse_the_long_description ( ) {
256
+ let source = "#[doc(desc = \" description\" )]" ;
257
+ let attrs = test:: parse_attributes ( source) ;
258
+ let attrs = parse_fn ( attrs) ;
259
+ assert attrs. desc == some ( "description" ) ;
260
+ }
261
+
262
+ #[ test]
263
+ fn parse_fn_should_parse_the_return_value_description ( ) {
264
+ let source = "#[doc(return = \" return value\" )]" ;
265
+ let attrs = test:: parse_attributes ( source) ;
266
+ let attrs = parse_fn ( attrs) ;
267
+ assert attrs. return == some ( "return value" ) ;
268
+ }
269
+
270
+ #[ test]
271
+ fn parse_fn_should_parse_the_argument_descriptions ( ) {
272
+ let source = "#[doc(args(a = \" arg a\" , b = \" arg b\" ))]" ;
273
+ let attrs = test:: parse_attributes ( source) ;
274
+ let attrs = parse_fn ( attrs) ;
275
+ assert attrs. args [ 0 ] == { name: "a" , desc: "arg a" } ;
276
+ assert attrs. args [ 1 ] == { name: "b", desc: " arg b"};
277
+ }
278
+
152
279
#[cfg(test)]
153
280
mod test {
154
281
@@ -169,56 +296,4 @@ mod test {
169
296
170
297
parser:: parse_outer_attributes ( parser)
171
298
}
172
-
173
- #[ test]
174
- fn parse_fn_should_handle_undocumented_functions ( ) {
175
- let source = "" ;
176
- let attrs = parse_attributes ( source) ;
177
- let attrs = parse_fn ( attrs) ;
178
- assert attrs. brief == none;
179
- assert attrs. desc == none;
180
- assert attrs. return == none;
181
- assert vec:: len ( attrs. args ) == 0 u;
182
- }
183
-
184
- #[ test]
185
- fn parse_fn_should_parse_simple_doc_attributes ( ) {
186
- let source = "#[doc = \" basic\" ]" ;
187
- let attrs = parse_attributes ( source) ;
188
- let attrs = parse_fn ( attrs) ;
189
- assert attrs. desc == some ( "basic" ) ;
190
- }
191
-
192
- #[ test]
193
- fn parse_fn_should_parse_the_brief_description ( ) {
194
- let source = "#[doc(brief = \" short\" )]" ;
195
- let attrs = parse_attributes ( source) ;
196
- let attrs = parse_fn ( attrs) ;
197
- assert attrs. brief == some ( "short" ) ;
198
- }
199
-
200
- #[ test]
201
- fn parse_fn_should_parse_the_long_description ( ) {
202
- let source = "#[doc(desc = \" description\" )]" ;
203
- let attrs = parse_attributes ( source) ;
204
- let attrs = parse_fn ( attrs) ;
205
- assert attrs. desc == some ( "description" ) ;
206
- }
207
-
208
- #[ test]
209
- fn parse_fn_should_parse_the_return_value_description ( ) {
210
- let source = "#[doc(return = \" return value\" )]" ;
211
- let attrs = parse_attributes ( source) ;
212
- let attrs = parse_fn ( attrs) ;
213
- assert attrs. return == some ( "return value" ) ;
214
- }
215
-
216
- #[ test]
217
- fn parse_fn_should_parse_the_argument_descriptions ( ) {
218
- let source = "#[doc(args(a = \" arg a\" , b = \" arg b\" ))]" ;
219
- let attrs = parse_attributes ( source) ;
220
- let attrs = parse_fn ( attrs) ;
221
- assert attrs. args [ 0 ] == { name: "a" , desc: "arg a" } ;
222
- assert attrs. args [ 1 ] == { name: "b", desc: " arg b"} ;
223
- }
224
299
}
0 commit comments