diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_mbe/src/mbe_expander.rs | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/crates/ra_mbe/src/mbe_expander.rs b/crates/ra_mbe/src/mbe_expander.rs index 0a4d73dda..3c00e3b64 100644 --- a/crates/ra_mbe/src/mbe_expander.rs +++ b/crates/ra_mbe/src/mbe_expander.rs | |||
@@ -20,18 +20,20 @@ fn expand_rules(rules: &[crate::Rule], input: &tt::Subtree) -> ExpandResult<tt:: | |||
20 | for rule in rules { | 20 | for rule in rules { |
21 | let ExpandResult(new_match, bindings_err) = matcher::match_(&rule.lhs, input); | 21 | let ExpandResult(new_match, bindings_err) = matcher::match_(&rule.lhs, input); |
22 | if bindings_err.is_none() { | 22 | if bindings_err.is_none() { |
23 | // if we find a rule that applies without errors, we're done | 23 | // If we find a rule that applies without errors, we're done. |
24 | // Unconditionally returning the transcription here makes the | ||
25 | // `test_repeat_bad_var` test fail. | ||
24 | let ExpandResult(res, transcribe_err) = | 26 | let ExpandResult(res, transcribe_err) = |
25 | transcriber::transcribe(&rule.rhs, &new_match.bindings); | 27 | transcriber::transcribe(&rule.rhs, &new_match.bindings); |
26 | if transcribe_err.is_none() { | 28 | if transcribe_err.is_none() { |
27 | return ExpandResult::ok(res); | 29 | return ExpandResult::ok(res); |
28 | } | 30 | } |
29 | } | 31 | } |
30 | // use the rule if we matched more tokens, or had fewer patterns left | 32 | // Use the rule if we matched more tokens, or had fewer patterns left, |
33 | // or had no error | ||
31 | if let Some((prev_match, _)) = &match_ { | 34 | if let Some((prev_match, _)) = &match_ { |
32 | if new_match.unmatched_tokens < prev_match.unmatched_tokens | 35 | if (new_match.unmatched_tokens, new_match.unmatched_patterns) |
33 | || new_match.unmatched_tokens == prev_match.unmatched_tokens | 36 | < (prev_match.unmatched_tokens, prev_match.unmatched_patterns) |
34 | && new_match.unmatched_patterns < prev_match.unmatched_patterns | ||
35 | || err.is_some() && bindings_err.is_none() | 37 | || err.is_some() && bindings_err.is_none() |
36 | { | 38 | { |
37 | match_ = Some((new_match, rule)); | 39 | match_ = Some((new_match, rule)); |