11use 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 } ;
55use rusty_variant:: Variant ;
66
77use 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