in src/models/source_code_unit.rs [134:181]
fn _apply_rule(
&mut self, rule: InstantiatedRule, rule_store: &mut RuleStore, parser: &mut Parser,
scope_query: &Option<CGPattern>,
) -> bool {
let scope_node = self.get_scope_node(scope_query, rule_store);
let mut query_again = false;
// When rule is a "rewrite" rule :
// Update the first match of the rewrite rule
// Add mappings to the substitution
// Propagate each applied edit. The next rule will be applied relative to the application of this edit.
if !rule.rule().is_match_only_rule() {
if let Some(edit) = self.get_edit(&rule, rule_store, scope_node, true) {
self.rewrites_mut().push(edit.clone());
query_again = true;
// Add all the (code_snippet, tag) mapping to the substitution table.
self.substitutions.extend(edit.p_match().matches().clone());
// Apply edit_1
let applied_ts_edit = self.apply_edit(&edit, parser);
self.propagate(get_replace_range(applied_ts_edit), rule, rule_store, parser);
}
}
// When rule is a "match-only" rule :
// Get all the matches
// Add mappings to the substitution
// Propagate each match. Note that, we pass a identity edit (where old range == new range) in to the propagate logic.
// The next edit will be applied relative to the identity edit.
else {
for m in self.get_matches(&rule, rule_store, scope_node, true) {
self.matches_mut().push((rule.name(), m.clone()));
// In this scenario we pass the match and replace range as the range of the match `m`
// This is equivalent to propagating an identity rule
// i.e. a rule that replaces the matched code with itself
// Note that, here we DO NOT invoke the `_apply_edit` method and only update the `substitutions`
// By NOT invoking this we simulate the application of an identity rule
//
self.substitutions.extend(m.matches().clone());
self.propagate(*m.range(), rule.clone(), rule_store, parser);
}
}
query_again
}