1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
use super::scope::NS_PARAM;
use super::{Declaration, Declarations, Scope};
use crate::ast::*;
use crate::error::Span;
#[derive(Default, Serialize, Deserialize, Clone)]
pub struct Context {
pub(crate) scope: Scope,
pub(crate) declarations: Declarations,
}
impl Context {
pub fn declare(&mut self, dec: Declaration, span: Option<Span>) -> usize {
self.declarations.0.push((dec, span));
self.declarations.0.len() - 1
}
pub fn declare_func(&mut self, func_def: FuncDef) -> usize {
let name = func_def.name.clone();
let span = func_def.body.span;
let id = self.declare(Declaration::Function(func_def), span);
self.scope.add_function(name, id);
id
}
pub fn declare_table(&mut self, t: &mut TableRef) {
let name = t.alias.clone().unwrap_or_else(|| t.name.clone());
let decl = Declaration::Table(name.clone());
let table_id = self.declare(decl, None);
t.declared_at = Some(table_id);
let var_name = format!("{name}.*");
self.scope.add(var_name, table_id);
}
pub fn declare_func_param(&mut self, node: &Node) -> usize {
let name = match &node.item {
Item::Ident(ident) => ident.clone(),
Item::NamedArg(NamedExpr { name, .. }) => name.clone(),
_ => unreachable!(),
};
let decl = Box::new(Item::Ident("".to_string()).into());
let id = self.declare(Declaration::Expression(decl), None);
self.scope.add(format!("{NS_PARAM}.{name}"), id);
id
}
}
impl From<Declaration> for anyhow::Error {
fn from(dec: Declaration) -> Self {
anyhow::anyhow!("Unexpected declaration type: {dec:?}")
}
}
impl Debug for Context {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "{:?}", self.declarations)
}
}