Skip to content

Commit f664c82

Browse files
committed
Do not use anonymous fields in names module
1 parent 7f87d1f commit f664c82

4 files changed

Lines changed: 62 additions & 45 deletions

File tree

rusty_linter/src/names/compacts.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ use crate::names::traits::SingleNameTrait;
1010
/// With compact variables, it's possible to have the same name
1111
/// but with different types e.g. `A$` and `A%`.
1212
#[derive(Default)]
13-
pub struct Compacts(HashMap<TypeQualifier, VariableInfo>);
13+
pub struct Compacts {
14+
map: HashMap<TypeQualifier, VariableInfo>,
15+
}
1416

1517
impl SingleNameTrait for Compacts {
1618
fn get_compact(&self, qualifier: TypeQualifier) -> Option<&VariableInfo> {
17-
self.0.get(&qualifier)
19+
self.map.get(&qualifier)
1820
}
1921

2022
fn get_extended(&self) -> Option<&VariableInfo> {
@@ -26,7 +28,7 @@ impl SingleNameTrait for Compacts {
2628
}
2729

2830
fn collect_var_info(&self, only_shared: bool) -> Vec<(BuiltInStyle, &VariableInfo)> {
29-
self.0
31+
self.map
3032
.values()
3133
.filter(|v| v.shared || !only_shared)
3234
.map(|v| (BuiltInStyle::Compact, v))
@@ -40,7 +42,7 @@ impl SingleNameTrait for Compacts {
4042
.expect("Should be resolved");
4143

4244
// if it already exists, it should be a REDIM
43-
debug_assert!(match self.0.get(&q) {
45+
debug_assert!(match self.map.get(&q) {
4446
Some(existing_v) => {
4547
existing_v.redim_info.is_some()
4648
}
@@ -49,6 +51,6 @@ impl SingleNameTrait for Compacts {
4951
}
5052
});
5153

52-
self.0.insert(q, variable_info);
54+
self.map.insert(q, variable_info);
5355
}
5456
}

rusty_linter/src/names/main.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ pub struct Names {
4141
/// TODO merge [ImplicitVars] into [NamesInner]
4242
/// TODO use bi_tuple macro
4343
#[derive(Default)]
44-
struct NamesOneLevel(NamesInner, ImplicitVars);
44+
struct NamesOneLevel {
45+
names: NamesInner,
46+
implicit_vars: ImplicitVars,
47+
}
4548

4649
impl Names {
4750
pub fn new() -> Self {
@@ -63,22 +66,22 @@ impl Names {
6366
}
6467

6568
pub fn get_implicit_vars_mut(&mut self) -> &mut ImplicitVars {
66-
&mut self.current_data_mut().1
69+
&mut self.current_data_mut().implicit_vars
6770
}
6871

6972
pub fn names(&self) -> &NamesInner {
70-
&self.current_data().0
73+
&self.current_data().names
7174
}
7275

7376
pub fn names_mut(&mut self) -> &mut NamesInner {
74-
&mut self.current_data_mut().0
77+
&mut self.current_data_mut().names
7578
}
7679

7780
/// Returns the global names, but only if we are currently within a sub program.
7881
fn global_names(&self) -> Option<&NamesInner> {
7982
match &self.current_scope_name {
8083
ScopeName::Global => None,
81-
_ => self.data.get(&ScopeName::Global).map(|x| &x.0),
84+
_ => self.data.get(&ScopeName::Global).map(|x| &x.names),
8285
}
8386
}
8487

@@ -210,7 +213,7 @@ impl Names {
210213
.data
211214
.get(scope_name)
212215
.unwrap_or_else(|| panic!("Subprogram {:?} should be resolved", scope_name));
213-
match one_level.0.get_variable_info_by_name(name) {
216+
match one_level.names.get_variable_info_by_name(name) {
214217
Some(i) => i,
215218
None => {
216219
if scope_name != &ScopeName::Global {
@@ -219,7 +222,7 @@ impl Names {
219222
.data
220223
.get(&ScopeName::Global)
221224
.expect("Global name scope missing!")
222-
.0
225+
.names
223226
.get_variable_info_by_name(name)
224227
.unwrap_or_else(|| {
225228
panic!("Could not resolve {} even in global namespace", name)

rusty_linter/src/names/name_info.rs

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,92 +6,102 @@ use crate::names::traits::SingleNameTrait;
66

77
/// Stores information about a constant or variable name.
88
/// The name itself isn't stored here.
9-
pub struct NameInfo(NameInfoInner);
9+
pub struct NameInfo {
10+
inner: NameInfoInner,
11+
}
1012

1113
impl NameInfo {
1214
pub fn constant(v: Variant) -> Self {
13-
Self(NameInfoInner::Constant(v))
15+
Self {
16+
inner: NameInfoInner::Constant { value: v },
17+
}
1418
}
1519

1620
pub fn compacts() -> Self {
17-
Self(NameInfoInner::Compacts(Compacts::default()))
21+
Self {
22+
inner: NameInfoInner::Compacts {
23+
compacts: Compacts::default(),
24+
},
25+
}
1826
}
1927

2028
pub fn extended(variable_info: VariableInfo) -> Self {
21-
Self(NameInfoInner::Extended(variable_info))
29+
Self {
30+
inner: NameInfoInner::Extended { variable_info },
31+
}
2232
}
2333
}
2434

2535
impl SingleNameTrait for NameInfo {
2636
fn get_compact(&self, qualifier: TypeQualifier) -> Option<&VariableInfo> {
27-
self.0.get_compact(qualifier)
37+
self.inner.get_compact(qualifier)
2838
}
2939

3040
fn get_extended(&self) -> Option<&VariableInfo> {
31-
self.0.get_extended()
41+
self.inner.get_extended()
3242
}
3343

3444
fn get_const_value(&self) -> Option<&Variant> {
35-
self.0.get_const_value()
45+
self.inner.get_const_value()
3646
}
3747

3848
fn collect_var_info(&self, only_shared: bool) -> Vec<(BuiltInStyle, &VariableInfo)> {
39-
self.0.collect_var_info(only_shared)
49+
self.inner.collect_var_info(only_shared)
4050
}
4151

4252
fn insert_compact(&mut self, variable_info: VariableInfo) {
43-
self.0.insert_compact(variable_info);
53+
self.inner.insert_compact(variable_info);
4454
}
4555
}
4656

4757
/// Nested enum for [NameInfo].
4858
/// The external struct is preventing direct access to the enum members
4959
/// outside of the module.
5060
enum NameInfoInner {
51-
Constant(Variant),
52-
Compacts(Compacts),
53-
Extended(VariableInfo),
61+
Constant { value: Variant },
62+
Compacts { compacts: Compacts },
63+
Extended { variable_info: VariableInfo },
5464
}
5565

5666
impl SingleNameTrait for NameInfoInner {
5767
fn get_compact(&self, qualifier: TypeQualifier) -> Option<&VariableInfo> {
5868
match self {
59-
Self::Compacts(compacts) => compacts.get_compact(qualifier),
69+
Self::Compacts { compacts } => compacts.get_compact(qualifier),
6070
_ => None,
6171
}
6272
}
6373

6474
fn get_extended(&self) -> Option<&VariableInfo> {
6575
match self {
66-
Self::Extended(v) => Some(v),
76+
Self::Extended { variable_info } => Some(variable_info),
6777
_ => None,
6878
}
6979
}
7080

7181
fn get_const_value(&self) -> Option<&Variant> {
7282
match self {
73-
Self::Constant(v) => Some(v),
83+
Self::Constant { value } => Some(value),
7484
_ => None,
7585
}
7686
}
7787

7888
fn collect_var_info(&self, only_shared: bool) -> Vec<(BuiltInStyle, &VariableInfo)> {
7989
match self {
80-
Self::Compacts(compacts) => compacts.collect_var_info(only_shared),
81-
Self::Extended(v) => {
82-
if v.shared || !only_shared {
83-
vec![(BuiltInStyle::Extended, v)]
90+
Self::Compacts { compacts } => compacts.collect_var_info(only_shared),
91+
Self::Extended { variable_info } => {
92+
if variable_info.shared || !only_shared {
93+
vec![(BuiltInStyle::Extended, variable_info)]
8494
} else {
8595
vec![]
8696
}
8797
}
88-
Self::Constant(_) => vec![],
98+
Self::Constant { .. } => vec![],
8999
}
90100
}
91101

92102
fn insert_compact(&mut self, variable_info: VariableInfo) {
93103
match self {
94-
Self::Compacts(compacts) => compacts.insert_compact(variable_info),
104+
Self::Compacts { compacts } => compacts.insert_compact(variable_info),
95105
_ => panic!("Cannot insert compact because it already exists as CONST or extended"),
96106
}
97107
}

rusty_linter/src/names/names_inner.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,27 @@ use crate::names::traits::{ManyNamesTrait, SingleNameTrait};
1010
/// Stores information about multiple constants or variable names.
1111
/// This struct does not support multiple levels (e.g. `FUNCTION` or `SUB`).
1212
#[derive(Default)]
13-
pub struct NamesInner(HashMap<BareName, NameInfo>);
13+
pub struct NamesInner {
14+
map: HashMap<BareName, NameInfo>,
15+
}
1416

1517
impl NamesInner {
1618
/// Returns true if this name is a constant, or an extended variable,
1719
/// or a compact variable. In the case of compact variables, multiple may
1820
/// exist with the same bare name, e.g. `A$` and `A%`.
1921
pub fn contains_key(&self, bare_name: &BareName) -> bool {
20-
self.0.contains_key(bare_name)
22+
self.map.contains_key(bare_name)
2123
}
2224

2325
pub fn insert_const(&mut self, bare_name: BareName, v: Variant) {
24-
debug_assert!(!self.0.contains_key(&bare_name));
25-
self.0.insert(bare_name, NameInfo::constant(v));
26+
debug_assert!(!self.map.contains_key(&bare_name));
27+
self.map.insert(bare_name, NameInfo::constant(v));
2628
}
2729

2830
pub fn insert_extended(&mut self, bare_name: BareName, variable_context: VariableInfo) {
2931
// if it exists as REDIM extended, it's okay
3032
// all other cases where it already exists are not okay
31-
debug_assert!(match self.0.get(&bare_name) {
33+
debug_assert!(match self.map.get(&bare_name) {
3234
Some(name_info) => {
3335
match name_info.get_extended() {
3436
Some(e) => e.redim_info.is_some(),
@@ -39,7 +41,7 @@ impl NamesInner {
3941
true
4042
}
4143
});
42-
self.0
44+
self.map
4345
.insert(bare_name, NameInfo::extended(variable_context));
4446
}
4547

@@ -58,21 +60,21 @@ impl NamesInner {
5860

5961
impl ConstLookup for NamesInner {
6062
fn get_const_value(&self, bare_name: &BareName) -> Option<&rusty_variant::Variant> {
61-
self.0
63+
self.map
6264
.get(bare_name)
6365
.and_then(|name_info| name_info.get_const_value())
6466
}
6567
}
6668

6769
impl ManyNamesTrait for NamesInner {
6870
fn get_compact(&self, bare_name: &BareName, qualifier: TypeQualifier) -> Option<&VariableInfo> {
69-
self.0
71+
self.map
7072
.get(bare_name)
7173
.and_then(|name_info| name_info.get_compact(qualifier))
7274
}
7375

7476
fn get_extended(&self, bare_name: &BareName) -> Option<&VariableInfo> {
75-
self.0
77+
self.map
7678
.get(bare_name)
7779
.and_then(|name_info| name_info.get_extended())
7880
}
@@ -82,21 +84,21 @@ impl ManyNamesTrait for NamesInner {
8284
bare_name: &BareName,
8385
only_shared: bool,
8486
) -> Vec<(rusty_parser::BuiltInStyle, &VariableInfo)> {
85-
self.0
87+
self.map
8688
.get(bare_name)
8789
.map(|name_info| name_info.collect_var_info(only_shared))
8890
.unwrap_or_default()
8991
}
9092

9193
fn insert_compact(&mut self, bare_name: BareName, variable_info: VariableInfo) {
92-
match self.0.get_mut(&bare_name) {
94+
match self.map.get_mut(&bare_name) {
9395
Some(name_info) => {
9496
name_info.insert_compact(variable_info);
9597
}
9698
None => {
9799
let mut name_info = NameInfo::compacts();
98100
name_info.insert_compact(variable_info);
99-
self.0.insert(bare_name, name_info);
101+
self.map.insert(bare_name, name_info);
100102
}
101103
}
102104
}

0 commit comments

Comments
 (0)