@@ -64,26 +64,46 @@ fn verify_variables_used(msg_span: Span, message_str: &str, variant: Option<&Var
6464
6565fn variable_references < ' a > ( msg : & fluent_syntax:: ast:: Message < & ' a str > ) -> Vec < & ' a str > {
6666 let mut refs = vec ! [ ] ;
67+
6768 if let Some ( Pattern { elements } ) = & msg. value {
6869 for elt in elements {
69- if let PatternElement :: Placeable {
70- expression : Expression :: Inline ( InlineExpression :: VariableReference { id } ) ,
71- } = elt
72- {
73- refs. push ( id. name ) ;
74- }
70+ traverse_pattern ( elt, & mut refs) ;
7571 }
7672 }
7773 for attr in & msg. attributes {
7874 for elt in & attr. value . elements {
79- if let PatternElement :: Placeable {
80- expression : Expression :: Inline ( InlineExpression :: VariableReference { id } ) ,
81- } = elt
82- {
83- refs. push ( id. name ) ;
75+ traverse_pattern ( elt, & mut refs) ;
76+ }
77+ }
78+
79+ fn traverse_pattern < ' a > ( elem : & PatternElement < & ' a str > , refs : & mut Vec < & ' a str > ) {
80+ match elem {
81+ PatternElement :: TextElement { .. } => { }
82+ PatternElement :: Placeable { expression } => traverse_expression ( expression, refs) ,
83+ }
84+ }
85+ fn traverse_expression < ' a > ( expr : & Expression < & ' a str > , refs : & mut Vec < & ' a str > ) {
86+ match expr {
87+ Expression :: Select { selector, variants } => {
88+ traverse_inline_expr ( selector, refs) ;
89+ for variant in variants {
90+ for pattern in & variant. value . elements {
91+ traverse_pattern ( pattern, refs) ;
92+ }
93+ }
94+ }
95+ Expression :: Inline ( expr) => {
96+ traverse_inline_expr ( expr, refs) ;
8497 }
8598 }
8699 }
100+ fn traverse_inline_expr < ' a > ( elem : & InlineExpression < & ' a str > , refs : & mut Vec < & ' a str > ) {
101+ match elem {
102+ InlineExpression :: VariableReference { id } => refs. push ( id. name ) ,
103+ _ => { }
104+ }
105+ }
106+
87107 refs
88108}
89109
0 commit comments