Skip to content

Commit 20fa338

Browse files
committed
refactor: Implement visitor pattern for constant_map
1 parent 791572b commit 20fa338

4 files changed

Lines changed: 28 additions & 33 deletions

File tree

rusty_linter/src/pre_linter/const_rules.rs

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
1-
use crate::core::ConstLookup;
2-
use rusty_common::CaseInsensitiveString;
3-
use rusty_parser::BareName;
4-
use rusty_variant::Variant;
51
use std::collections::HashMap;
62

3+
use rusty_common::{AtPos, CaseInsensitiveString, Positioned};
4+
use rusty_parser::{BareName, Constant, Name};
5+
use rusty_variant::Variant;
6+
7+
use crate::core::*;
8+
79
pub type ConstantMap = HashMap<BareName, Variant>;
810

911
impl ConstLookup for ConstantMap {
1012
fn get_resolved_constant(&self, name: &CaseInsensitiveString) -> Option<&Variant> {
1113
self.get(name)
1214
}
1315
}
16+
17+
impl Visitor<Constant> for ConstantMap {
18+
// calculate global constant values
19+
fn visit(&mut self, element: &Constant) -> VisitResult {
20+
let (name_pos, expression_pos) = element.into();
21+
let Positioned { element: name, pos } = name_pos;
22+
let bare_name: &BareName = name.bare_name();
23+
(match self.get(bare_name) {
24+
Some(_) => Err(LintError::DuplicateDefinition.at(pos)),
25+
_ => Ok(()),
26+
})
27+
.and_then(|_| self.resolve_const(expression_pos))
28+
.and_then(|v| match name {
29+
Name::Bare(_) => Ok(v),
30+
Name::Qualified(_, qualifier) => v.cast(*qualifier).map_err(|e| e.at(expression_pos)),
31+
})
32+
.map(|casted| {
33+
self.insert(bare_name.clone(), casted);
34+
})
35+
}
36+
}

rusty_linter/src/pre_linter/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::core::*;
2-
use crate::pre_linter::const_rules::global_const;
32
use crate::pre_linter::sub_program_context::SubprogramContext;
43
use crate::pre_linter::{ConstantMap, PreLinterResult};
54
use rusty_common::*;
@@ -116,7 +115,7 @@ impl Visitor<SubImplementation> for MainContext {
116115
impl Visitor<Statement> for MainContext {
117116
fn visit(&mut self, s: &Statement) -> VisitResult {
118117
match s {
119-
Statement::Const(c) => global_const(&mut self.global_constants, c),
118+
Statement::Const(c) => self.global_constants.visit(c),
120119
_ => Ok(()),
121120
}
122121
}

rusty_linter/src/pre_linter/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
mod const_rules;
21
mod constant_map;
32
mod main;
43
mod pre_linter_result;

0 commit comments

Comments
 (0)