Skip to content

Commit 8208773

Browse files
volsaghaith
authored andcommitted
refactor: Deduplicat code
1 parent 9ea498d commit 8208773

File tree

1 file changed

+31
-53
lines changed

1 file changed

+31
-53
lines changed

compiler/plc_driver/src/pipelines/participant.rs

Lines changed: 31 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,17 @@
55
//!
66
77
use std::{
8-
collections::{HashMap, HashSet},
8+
collections::HashMap,
99
env, fs,
1010
path::{Path, PathBuf},
1111
sync::{Arc, Mutex, RwLock},
1212
};
1313

14-
use ast::ast::{DataType, DataTypeDeclaration, Identifier, UserTypeDeclaration};
14+
use ast::ast::{DataType, DataTypeDeclaration, UserTypeDeclaration};
1515
use ast::{ast::Variable, provider::IdProvider};
1616
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,
2319
};
2420
use plc_diagnostics::diagnostics::Diagnostic;
2521
use plc_lowering::inheritance::InheritanceLowerer;
@@ -296,77 +292,46 @@ impl VTableIndexer {
296292
Self { id_provider }
297293
}
298294

299-
fn get_vtable_name(name: &str) -> String {
295+
fn generate_vtable_name(name: &str) -> String {
300296
format!("__vtable_{name}")
301297
}
302298

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();
305301
for pou in index.get_pous().values().filter(|pou| pou.is_function_block() || pou.is_class()) {
306302
let mut variables = Vec::new();
307303

308304
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));
319306
}
320307

321308
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));
332310
}
333311

334312
for method in index.get_methods_local(pou.get_name()) {
335313
variables.push(VTableIndexer::create_void_pointer(method.get_name()));
336314
}
337315

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));
340317
}
341318

342319
vtables
343320
}
344321

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();
347324
for interface in index.get_interfaces().values() {
348325
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));
360328
}
361329

362330
for method in interface.get_declared_methods(index) {
363331
variables.push(VTableIndexer::create_void_pointer(method.get_name()));
364332
}
365333

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));
370335
}
371336

372337
vtables
@@ -386,10 +351,23 @@ impl VTableIndexer {
386351
}
387352
}
388353

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+
389367
/// Creates a vtable with the given member variables and a mangled name of the form `__vtable_<name>`
390368
fn create_vtable(name: &str, variables: Vec<Variable>) -> UserTypeDeclaration {
391369
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 },
393371
initializer: None,
394372
location: SourceLocation::internal(),
395373
scope: Some(name.to_string()),
@@ -406,8 +384,8 @@ impl PipelineParticipantMut for VTableIndexer {
406384
let vtables_intf = VTableIndexer::create_vtables_for_interfaces(&index);
407385

408386
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);
411389
}
412390

413391
project.index(self.id_provider.clone())

0 commit comments

Comments
 (0)