@@ -14,9 +14,10 @@ use crate::{
14
14
ast:: { CInteger , FloatSize , IntegerSign , Param , Type , TypeKind } ,
15
15
c:: {
16
16
ast:: {
17
- AlignmentSpecifierKind , DeclarationSpecifiers , Declarator , DeclaratorKind , Decorator ,
18
- Decorators , FunctionQualifier , FunctionSpecifier , ParameterDeclarationCore ,
19
- StorageClassSpecifier , TypeQualifierKind , TypeSpecifierKind , TypeSpecifierQualifier ,
17
+ AbstractDeclarator , AbstractDeclaratorKind , AlignmentSpecifierKind ,
18
+ DeclarationSpecifiers , Declarator , DeclaratorKind , Decorator , Decorators ,
19
+ FunctionQualifier , FunctionSpecifier , ParameterDeclarationCore , StorageClassSpecifier ,
20
+ TypeQualifierKind , TypeSpecifierKind , TypeSpecifierQualifier ,
20
21
} ,
21
22
parser:: { error:: ParseErrorKind , ParseError } ,
22
23
} ,
@@ -169,14 +170,12 @@ pub fn build_type_specifier_qualifier(
169
170
builder. concrete ( make_anonymous_enum ( ctx. ast_file , enumeration) ?, ts. source ) ?
170
171
}
171
172
TypeSpecifierKind :: TypedefName ( typedef_name) => {
172
- let ast_type = ctx
173
- . typedefs
174
- . get ( & typedef_name. name )
175
- . expect ( "typedef exists" )
176
- . ast_type
177
- . clone ( ) ;
178
-
179
- builder. concrete ( ast_type. kind , typedef_name. source ) ?
173
+ let Some ( typedef) = ctx. typedefs . get ( & typedef_name. name ) else {
174
+ return Err ( ParseErrorKind :: UndeclaredType ( typedef_name. name . clone ( ) )
175
+ . at ( typedef_name. source ) ) ;
176
+ } ;
177
+
178
+ builder. concrete ( typedef. ast_type . kind . clone ( ) , typedef_name. source ) ?
180
179
}
181
180
} ,
182
181
TypeSpecifierQualifier :: TypeQualifier ( tq) => match & tq. kind {
@@ -286,3 +285,56 @@ fn get_name_and_decorators(
286
285
}
287
286
}
288
287
}
288
+
289
+ fn get_decorators (
290
+ ctx : & mut TranslateCtx ,
291
+ abstract_declarator : & AbstractDeclarator ,
292
+ ) -> Result < Decorators , ParseError > {
293
+ match & abstract_declarator. kind {
294
+ AbstractDeclaratorKind :: Nothing => Ok ( Decorators :: default ( ) ) ,
295
+ AbstractDeclaratorKind :: Pointer ( inner, pointer) => {
296
+ let mut decorators = get_decorators ( ctx, inner) ?;
297
+ decorators. then_pointer ( pointer. clone ( ) ) ;
298
+ Ok ( decorators)
299
+ }
300
+ AbstractDeclaratorKind :: Function ( inner, parameter_type_list) => {
301
+ let mut decorators = get_decorators ( ctx, inner) ?;
302
+ let mut params = Vec :: with_capacity ( parameter_type_list. parameter_declarations . len ( ) ) ;
303
+
304
+ if has_parameters ( parameter_type_list) {
305
+ for parameter in parameter_type_list. parameter_declarations . iter ( ) {
306
+ let ( param_name, param_type) = match & parameter. core {
307
+ ParameterDeclarationCore :: Declarator ( declarator) => {
308
+ let declarator_info = get_name_and_type (
309
+ ctx,
310
+ declarator,
311
+ & parameter. declaration_specifiers ,
312
+ true ,
313
+ ) ?;
314
+ ( declarator_info. name , declarator_info. ast_type )
315
+ }
316
+ ParameterDeclarationCore :: AbstractDeclarator ( _) => todo ! ( ) ,
317
+ ParameterDeclarationCore :: Nothing => {
318
+ todo ! ( )
319
+ }
320
+ } ;
321
+
322
+ params. push ( Param :: named ( param_name, param_type) ) ;
323
+ }
324
+ }
325
+
326
+ decorators. then_function ( FunctionQualifier {
327
+ params,
328
+ source : abstract_declarator. source ,
329
+ is_cstyle_variadic : parameter_type_list. is_variadic ,
330
+ } ) ;
331
+
332
+ Ok ( decorators)
333
+ }
334
+ AbstractDeclaratorKind :: Array ( inner, array_qualifier) => {
335
+ let mut decorators = get_decorators ( ctx, inner) ?;
336
+ decorators. then_array ( array_qualifier. clone ( ) ) ;
337
+ Ok ( decorators)
338
+ }
339
+ }
340
+ }
0 commit comments