Struct cranelift_isle::sema::Rule
source · pub struct Rule {
pub id: RuleId,
pub root_term: TermId,
pub args: Vec<Pattern>,
pub iflets: Vec<IfLet>,
pub rhs: Expr,
pub vars: Vec<BoundVar>,
pub prio: i64,
pub pos: Pos,
}
Expand description
A term rewrite rule.
Fields§
§id: RuleId
This rule’s id.
root_term: TermId
The left-hand side pattern that this rule matches.
args: Vec<Pattern>
Patterns to test against the root term’s arguments.
iflets: Vec<IfLet>
Any subpattern “if-let” clauses.
rhs: Expr
The right-hand side expression that this rule evaluates upon successful match.
vars: Vec<BoundVar>
Variable names used in this rule, indexed by VarId.
prio: i64
The priority of this rule, defaulted to 0 if it was missing in the source.
pos: Pos
The source position where this rule is defined.
Implementations§
source§impl Rule
impl Rule
sourcepub fn visit<V: RuleVisitor>(&self, visitor: &mut V, termenv: &TermEnv) -> V::Expr
pub fn visit<V: RuleVisitor>(&self, visitor: &mut V, termenv: &TermEnv) -> V::Expr
Recursively visit every pattern and expression in this rule. Returns the RuleVisitor::Expr that was returned from RuleVisitor::add_expr when that function was called on the rule’s right-hand side.
Examples found in repository?
More examples
src/trie_again.rs (line 296)
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
fn add_rule(&mut self, rule: &sema::Rule, termenv: &sema::TermEnv, errors: &mut Vec<Error>) {
self.current_rule.pos = rule.pos;
self.current_rule.prio = rule.prio;
self.current_rule.result = rule.visit(self, termenv);
self.normalize_equivalence_classes();
let rule = std::mem::take(&mut self.current_rule);
if self.unreachable.is_empty() {
self.rules.rules.push(rule);
} else {
// If this rule can never match, drop it so it doesn't affect overlap checking.
errors.extend(
self.unreachable
.drain(..)
.map(|err| Error::UnreachableError {
msg: format!(
"rule requires binding to match both {:?} and {:?}",
err.constraint_a, err.constraint_b
),
span: Span::new_single(err.pos),
}),
)
}
}