5
5
//!
6
6
7
7
use std:: {
8
- collections:: { HashMap , HashSet } ,
8
+ collections:: HashMap ,
9
9
env, fs,
10
10
path:: { Path , PathBuf } ,
11
11
sync:: { Arc , Mutex , RwLock } ,
12
12
} ;
13
13
14
- use ast:: ast:: { DataType , DataTypeDeclaration , Identifier , UserTypeDeclaration } ;
14
+ use ast:: ast:: { DataType , DataTypeDeclaration , UserTypeDeclaration } ;
15
15
use ast:: { ast:: Variable , provider:: IdProvider } ;
16
16
use plc:: {
17
- codegen:: GeneratedModule ,
18
- index:: { Index , PouIndexEntry } ,
19
- lowering:: calls:: AggregateTypeLowerer ,
20
- output:: FormatOption ,
21
- typesystem:: { VOID_INTERNAL_NAME , VOID_POINTER_TYPE } ,
22
- ConfigFormat , OnlineChange , Target ,
17
+ codegen:: GeneratedModule , index:: Index , lowering:: calls:: AggregateTypeLowerer , output:: FormatOption ,
18
+ typesystem:: VOID_POINTER_TYPE , ConfigFormat , OnlineChange , Target ,
23
19
} ;
24
20
use plc_diagnostics:: diagnostics:: Diagnostic ;
25
21
use plc_lowering:: inheritance:: InheritanceLowerer ;
@@ -296,77 +292,46 @@ impl VTableIndexer {
296
292
Self { id_provider }
297
293
}
298
294
299
- fn get_vtable_name ( name : & str ) -> String {
295
+ fn generate_vtable_name ( name : & str ) -> String {
300
296
format ! ( "__vtable_{name}" )
301
297
}
302
298
303
- fn create_vtables_for_pous ( index : & Index ) -> HashMap < String , UserTypeDeclaration > {
304
- let mut vtables = HashMap :: new ( ) ;
299
+ fn create_vtables_for_pous ( index : & Index ) -> Vec < UserTypeDeclaration > {
300
+ let mut vtables = Vec :: new ( ) ;
305
301
for pou in index. get_pous ( ) . values ( ) . filter ( |pou| pou. is_function_block ( ) || pou. is_class ( ) ) {
306
302
let mut variables = Vec :: new ( ) ;
307
303
308
304
if let Some ( parent) = pou. get_super_class ( ) {
309
- variables. push ( Variable {
310
- name : VTableIndexer :: get_vtable_name ( parent) ,
311
- data_type_declaration : DataTypeDeclaration :: Reference {
312
- referenced_type : VTableIndexer :: get_vtable_name ( parent) ,
313
- location : SourceLocation :: internal ( ) ,
314
- } ,
315
- initializer : None ,
316
- address : None ,
317
- location : SourceLocation :: internal ( ) ,
318
- } ) ;
305
+ variables. push ( VTableIndexer :: create_vtable_reference ( parent) ) ;
319
306
}
320
307
321
308
for interface in pou. get_interfaces ( ) {
322
- variables. push ( Variable {
323
- name : VTableIndexer :: get_vtable_name ( interface) ,
324
- data_type_declaration : DataTypeDeclaration :: Reference {
325
- referenced_type : VTableIndexer :: get_vtable_name ( interface) ,
326
- location : SourceLocation :: internal ( ) ,
327
- } ,
328
- initializer : None ,
329
- address : None ,
330
- location : SourceLocation :: internal ( ) ,
331
- } ) ;
309
+ variables. push ( VTableIndexer :: create_vtable_reference ( interface) ) ;
332
310
}
333
311
334
312
for method in index. get_methods_local ( pou. get_name ( ) ) {
335
313
variables. push ( VTableIndexer :: create_void_pointer ( method. get_name ( ) ) ) ;
336
314
}
337
315
338
- vtables
339
- . insert ( pou. get_name ( ) . to_string ( ) , VTableIndexer :: create_vtable ( pou. get_name ( ) , variables) ) ;
316
+ vtables. push ( VTableIndexer :: create_vtable ( pou. get_name ( ) , variables) ) ;
340
317
}
341
318
342
319
vtables
343
320
}
344
321
345
- fn create_vtables_for_interfaces ( index : & Index ) -> HashMap < String , UserTypeDeclaration > {
346
- let mut vtables = HashMap :: new ( ) ;
322
+ fn create_vtables_for_interfaces ( index : & Index ) -> Vec < UserTypeDeclaration > {
323
+ let mut vtables = Vec :: new ( ) ;
347
324
for interface in index. get_interfaces ( ) . values ( ) {
348
325
let mut variables = Vec :: new ( ) ;
349
- for Identifier { name, location } in & interface. extensions {
350
- variables. push ( Variable {
351
- name : VTableIndexer :: get_vtable_name ( name) ,
352
- data_type_declaration : DataTypeDeclaration :: Reference {
353
- referenced_type : VTableIndexer :: get_vtable_name ( name) ,
354
- location : location. clone ( ) ,
355
- } ,
356
- initializer : None ,
357
- address : None ,
358
- location : SourceLocation :: internal ( ) ,
359
- } ) ;
326
+ for extension in & interface. extensions {
327
+ variables. push ( VTableIndexer :: create_vtable_reference ( & extension. name ) ) ;
360
328
}
361
329
362
330
for method in interface. get_declared_methods ( index) {
363
331
variables. push ( VTableIndexer :: create_void_pointer ( method. get_name ( ) ) ) ;
364
332
}
365
333
366
- vtables. insert (
367
- interface. get_name ( ) . to_string ( ) ,
368
- VTableIndexer :: create_vtable ( interface. get_name ( ) , variables) ,
369
- ) ;
334
+ vtables. push ( VTableIndexer :: create_vtable ( interface. get_name ( ) , variables) ) ;
370
335
}
371
336
372
337
vtables
@@ -386,10 +351,23 @@ impl VTableIndexer {
386
351
}
387
352
}
388
353
354
+ fn create_vtable_reference ( name : & str ) -> Variable {
355
+ Variable {
356
+ name : VTableIndexer :: generate_vtable_name ( name) ,
357
+ data_type_declaration : DataTypeDeclaration :: Reference {
358
+ referenced_type : VTableIndexer :: generate_vtable_name ( name) ,
359
+ location : SourceLocation :: internal ( ) ,
360
+ } ,
361
+ initializer : None ,
362
+ address : None ,
363
+ location : SourceLocation :: internal ( ) ,
364
+ }
365
+ }
366
+
389
367
/// Creates a vtable with the given member variables and a mangled name of the form `__vtable_<name>`
390
368
fn create_vtable ( name : & str , variables : Vec < Variable > ) -> UserTypeDeclaration {
391
369
UserTypeDeclaration {
392
- data_type : DataType :: StructType { name : Some ( Self :: get_vtable_name ( name) ) , variables } ,
370
+ data_type : DataType :: StructType { name : Some ( Self :: generate_vtable_name ( name) ) , variables } ,
393
371
initializer : None ,
394
372
location : SourceLocation :: internal ( ) ,
395
373
scope : Some ( name. to_string ( ) ) ,
@@ -406,8 +384,8 @@ impl PipelineParticipantMut for VTableIndexer {
406
384
let vtables_intf = VTableIndexer :: create_vtables_for_interfaces ( & index) ;
407
385
408
386
if let Some ( unit) = project. units . first_mut ( ) {
409
- unit. user_types . extend ( vtables_pou. into_iter ( ) . map ( | ( _ , vtable ) | vtable ) ) ;
410
- unit. user_types . extend ( vtables_intf. into_iter ( ) . map ( | ( _ , vtable ) | vtable ) ) ;
387
+ unit. user_types . extend ( vtables_pou) ;
388
+ unit. user_types . extend ( vtables_intf) ;
411
389
}
412
390
413
391
project. index ( self . id_provider . clone ( ) )
0 commit comments