Skip to content

Commit 69cac0e

Browse files
committed
refactor: Use small functions to improve constant_map readability
1 parent d925d0b commit 69cac0e

1 file changed

Lines changed: 35 additions & 15 deletions

File tree

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::HashMap;
22

3-
use rusty_common::{AtPos, CaseInsensitiveString, Positioned};
4-
use rusty_parser::{AsBareName, BareName, Constant};
3+
use rusty_common::{AtPos, CaseInsensitiveString, HasPos};
4+
use rusty_parser::{AsBareName, BareName, Constant, Name};
55
use rusty_variant::Variant;
66

77
use crate::core::*;
@@ -19,19 +19,39 @@ impl Visitor<Constant> for ConstantMap {
1919
// calculate global constant values
2020
fn visit(&mut self, element: &Constant) -> VisitResult {
2121
let (name_pos, expression_pos) = element.into();
22-
let Positioned { element: name, pos } = name_pos;
23-
let bare_name: &BareName = name.as_bare_name();
24-
(match self.0.get(bare_name) {
25-
Some(_) => Err(LintError::DuplicateDefinition.at(pos)),
22+
self.ensure_is_not_already_defined(name_pos)
23+
.and_then(|_| self.resolve_const(expression_pos))
24+
.and_then(|v| {
25+
Self::cast_resolved_value_to_declared_type(v, &name_pos.element, expression_pos)
26+
})
27+
.map(|casted| {
28+
self.store_resolved_value(name_pos, casted);
29+
})
30+
}
31+
}
32+
33+
impl ConstantMap {
34+
fn ensure_is_not_already_defined(&self, name: &(impl AsBareName + HasPos)) -> VisitResult {
35+
match self.0.get(name.as_bare_name()) {
36+
Some(_) => Err(LintError::DuplicateDefinition.at(name)),
2637
_ => Ok(()),
27-
})
28-
.and_then(|_| self.resolve_const(expression_pos))
29-
.and_then(|v| match name.qualifier() {
30-
Some(qualifier) => v.cast(qualifier).map_err(|e| e.at(expression_pos)),
31-
_ => Ok(v),
32-
})
33-
.map(|casted| {
34-
self.0.insert(bare_name.clone(), casted);
35-
})
38+
}
39+
}
40+
41+
fn cast_resolved_value_to_declared_type(
42+
resolved_value: Variant,
43+
name: &Name,
44+
expression_pos: &impl HasPos,
45+
) -> Result<Variant, LintErrorPos> {
46+
match name.qualifier() {
47+
Some(qualifier) => resolved_value
48+
.cast(qualifier)
49+
.map_err(|e| e.at(expression_pos)),
50+
_ => Ok(resolved_value),
51+
}
52+
}
53+
54+
fn store_resolved_value(&mut self, name: &impl AsBareName, resolved_value: Variant) {
55+
self.0.insert(name.as_bare_name().clone(), resolved_value);
3656
}
3757
}

0 commit comments

Comments
 (0)