Skip to main content

dada_ir_sym/check/
generics.rs

1use dada_ir_ast::ast::{AstWhereClause, AstWhereClauseKind};
2
3use crate::ir::generics::{SymWhereClause, SymWhereClauseKind};
4
5use super::{CheckTyInEnv, env::Env};
6
7pub async fn symbolify_ast_where_clause<'db>(
8    env: &mut Env<'db>,
9    ast_where_clause: AstWhereClause<'db>,
10    output: &mut Vec<SymWhereClause<'db>>,
11) {
12    let db = env.db();
13    let subject = ast_where_clause.subject(db).check_in_env(env).await;
14    let mut push_kind =
15        |kind: SymWhereClauseKind| output.push(SymWhereClause::new(db, subject, kind));
16
17    for kind in ast_where_clause.kinds(db) {
18        match kind {
19            AstWhereClauseKind::Reference(_) => {
20                push_kind(SymWhereClauseKind::Shared);
21                push_kind(SymWhereClauseKind::Lent);
22            }
23            AstWhereClauseKind::Mutable(_) => {
24                push_kind(SymWhereClauseKind::Unique);
25                push_kind(SymWhereClauseKind::Lent);
26            }
27            AstWhereClauseKind::Shared(_) => {
28                push_kind(SymWhereClauseKind::Shared);
29            }
30            AstWhereClauseKind::Owned(_) => {
31                push_kind(SymWhereClauseKind::Owned);
32            }
33            AstWhereClauseKind::Lent(_) => {
34                push_kind(SymWhereClauseKind::Lent);
35            }
36            AstWhereClauseKind::Unique(_) => {
37                push_kind(SymWhereClauseKind::Unique);
38            }
39        }
40    }
41}