@@ -11,16 +11,15 @@ use std::{
11
11
sync:: { Arc , Mutex , RwLock } ,
12
12
} ;
13
13
14
- use ast:: ast:: { DataType , DataTypeDeclaration , UserTypeDeclaration } ;
15
- use ast:: { ast:: Variable , provider:: IdProvider } ;
14
+ use ast:: provider:: IdProvider ;
16
15
use plc:: {
17
- codegen:: GeneratedModule , index :: Index , lowering:: calls:: AggregateTypeLowerer , output:: FormatOption ,
18
- typesystem :: VOID_POINTER_TYPE , ConfigFormat , OnlineChange , Target ,
16
+ codegen:: GeneratedModule , lowering:: calls:: AggregateTypeLowerer , output:: FormatOption ,
17
+ vtable :: VTableIndexer , ConfigFormat , OnlineChange , Target ,
19
18
} ;
20
19
use plc_diagnostics:: diagnostics:: Diagnostic ;
21
20
use plc_lowering:: inheritance:: InheritanceLowerer ;
22
21
use project:: { object:: Object , project:: LibraryInformation } ;
23
- use source_code:: { source_location :: SourceLocation , SourceContainer } ;
22
+ use source_code:: SourceContainer ;
24
23
25
24
use super :: { AnnotatedProject , AnnotatedUnit , GeneratedProject , IndexedProject , ParsedProject } ;
26
25
@@ -283,98 +282,6 @@ impl PipelineParticipantMut for AggregateTypeLowerer {
283
282
}
284
283
}
285
284
286
- pub struct VTableIndexer {
287
- id_provider : IdProvider ,
288
- }
289
-
290
- impl VTableIndexer {
291
- pub fn new ( id_provider : IdProvider ) -> Self {
292
- Self { id_provider }
293
- }
294
-
295
- fn generate_vtable_name ( name : & str ) -> String {
296
- format ! ( "__vtable_{name}" )
297
- }
298
-
299
- fn create_vtables_for_pous ( index : & Index ) -> Vec < UserTypeDeclaration > {
300
- let mut vtables = Vec :: new ( ) ;
301
- for pou in index. get_pous ( ) . values ( ) . filter ( |pou| pou. is_function_block ( ) || pou. is_class ( ) ) {
302
- let mut variables = Vec :: new ( ) ;
303
-
304
- if let Some ( parent) = pou. get_super_class ( ) {
305
- variables. push ( VTableIndexer :: create_vtable_reference ( parent) ) ;
306
- }
307
-
308
- for interface in pou. get_interfaces ( ) {
309
- variables. push ( VTableIndexer :: create_vtable_reference ( interface) ) ;
310
- }
311
-
312
- for method in index. get_methods_local ( pou. get_name ( ) ) {
313
- variables. push ( VTableIndexer :: create_void_pointer ( method. get_name ( ) ) ) ;
314
- }
315
-
316
- vtables. push ( VTableIndexer :: create_vtable ( pou. get_name ( ) , variables) ) ;
317
- }
318
-
319
- vtables
320
- }
321
-
322
- fn create_vtables_for_interfaces ( index : & Index ) -> Vec < UserTypeDeclaration > {
323
- let mut vtables = Vec :: new ( ) ;
324
- for interface in index. get_interfaces ( ) . values ( ) {
325
- let mut variables = Vec :: new ( ) ;
326
- for extension in & interface. extensions {
327
- variables. push ( VTableIndexer :: create_vtable_reference ( & extension. name ) ) ;
328
- }
329
-
330
- for method in interface. get_declared_methods ( index) {
331
- variables. push ( VTableIndexer :: create_void_pointer ( method. get_name ( ) ) ) ;
332
- }
333
-
334
- vtables. push ( VTableIndexer :: create_vtable ( interface. get_name ( ) , variables) ) ;
335
- }
336
-
337
- vtables
338
- }
339
-
340
- /// Creates a void pointer variable with the given name and location
341
- fn create_void_pointer ( name : & str ) -> Variable {
342
- Variable {
343
- name : name. to_string ( ) ,
344
- data_type_declaration : DataTypeDeclaration :: Reference {
345
- referenced_type : VOID_POINTER_TYPE . into ( ) ,
346
- location : SourceLocation :: internal ( ) ,
347
- } ,
348
- initializer : None ,
349
- address : None ,
350
- location : SourceLocation :: internal ( ) ,
351
- }
352
- }
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
-
367
- /// Creates a vtable with the given member variables and a mangled name of the form `__vtable_<name>`
368
- fn create_vtable ( name : & str , variables : Vec < Variable > ) -> UserTypeDeclaration {
369
- UserTypeDeclaration {
370
- data_type : DataType :: StructType { name : Some ( Self :: generate_vtable_name ( name) ) , variables } ,
371
- initializer : None ,
372
- location : SourceLocation :: internal ( ) ,
373
- scope : Some ( name. to_string ( ) ) ,
374
- }
375
- }
376
- }
377
-
378
285
impl PipelineParticipantMut for VTableIndexer {
379
286
// TODO: Don't track overridden methods in vtable, as they're part of the parent instance (same for interfaces)
380
287
fn post_index ( & mut self , indexed_project : IndexedProject ) -> IndexedProject {
0 commit comments