Skip to main content

compiler/
lib.rs

1pub mod infer;
2mod symbol;
3use dynamic::{Dynamic, Type};
4use parser::{BinaryOp, Expr, ExprKind, Parser, Pattern, PatternKind, Span, Stmt, StmtKind};
5use std::{
6    collections::{BTreeMap, BTreeSet},
7    path::{Path, PathBuf},
8    sync::Arc,
9};
10pub use symbol::{Symbol, SymbolTable, eval_const_int_type, substitute_type};
11
12#[derive(Clone)]
13enum FnInferRet {
14    Pending(Option<Type>),
15    Done(Type),
16}
17
18#[derive(Clone)]
19pub struct Compiler {
20    pub symbols: SymbolTable,
21    pub frames: Vec<usize>,
22    pub tys: Vec<Type>,
23    pub consts: Vec<Dynamic>,
24    names: Vec<SmolStr>,
25    fns: BTreeMap<u32, Vec<(Vec<Type>, Vec<Type>, FnInferRet)>>,
26    infer_stack: Vec<(u32, Vec<Type>, Vec<Type>)>,
27    importing_paths: BTreeSet<PathBuf>,
28}
29
30fn impl_target_name(target: &Type) -> anyhow::Result<SmolStr> {
31    match target {
32        Type::Ident { name, .. } => Ok(name.clone()),
33        _ => anyhow::bail!("impl 目标类型暂不支持: {:?}", target),
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::{Compiler, Symbol};
40    use dynamic::Type;
41
42    #[test]
43    fn inferred_function_return_type_is_written_back_to_symbol() -> anyhow::Result<()> {
44        let mut compiler = Compiler::new();
45        compiler.import_code(
46            "compiler_infer_return",
47            br#"
48            pub fn is_alive() {
49                true
50            }
51
52            pub fn can_act() {
53                is_alive() && true && is_alive()
54            }
55            "#
56            .to_vec(),
57        )?;
58
59        let is_alive = compiler.symbols.get_id("compiler_infer_return::is_alive")?;
60        assert_eq!(compiler.infer_fn(is_alive, &[])?, Type::Bool);
61
62        let (_, symbol) = compiler.symbols.get_symbol(is_alive)?;
63        let Symbol::Fn { ty: Type::Fn { ret, .. }, .. } = symbol else {
64            panic!("is_alive should be a function symbol");
65        };
66        assert_eq!(ret.as_ref(), &Type::Bool);
67
68        let can_act = compiler.symbols.get_id("compiler_infer_return::can_act")?;
69        assert_eq!(compiler.infer_fn(can_act, &[])?, Type::Bool);
70        Ok(())
71    }
72
73    #[test]
74    fn top_level_const_composite_resolves_const_idents() -> anyhow::Result<()> {
75        let mut compiler = Compiler::new();
76        compiler.import_code(
77            "compiler_const_table",
78            br#"
79            pub const GEM_ATK = "atk";
80            pub const GEM_DEF = "def";
81            pub const GEM_TABLE = [
82                { key: GEM_ATK, score: 3i32 },
83                { key: GEM_DEF, score: 1i32 },
84            ];
85            "#
86            .to_vec(),
87        )?;
88
89        let table = compiler.symbols.get_id("compiler_const_table::GEM_TABLE")?;
90        let (_, symbol) = compiler.symbols.get_symbol(table)?;
91        let Symbol::Const { value, .. } = symbol else {
92            panic!("GEM_TABLE should be a const symbol");
93        };
94
95        let first = value.get_idx(0).expect("first table row");
96        assert_eq!(first.get_dynamic("key").expect("key").as_str(), "atk");
97        assert_eq!(first.get_dynamic("score").expect("score").as_int(), Some(3));
98        Ok(())
99    }
100
101    #[test]
102    fn const_unary_neg_handles_min_integer_literal() -> anyhow::Result<()> {
103        let mut compiler = Compiler::new();
104        compiler.import_code(
105            "compiler_const_min_int",
106            br#"
107            pub const MIN_I32: i32 = -2147483648i32;
108            "#
109            .to_vec(),
110        )?;
111
112        let id = compiler.symbols.get_id("compiler_const_min_int::MIN_I32")?;
113        let (_, symbol) = compiler.symbols.get_symbol(id)?;
114        let Symbol::Const { value, .. } = symbol else {
115            panic!("MIN_I32 should be a const symbol");
116        };
117        assert_eq!(value.as_int(), Some(i32::MIN as i64));
118        Ok(())
119    }
120
121    #[test]
122    fn return_check_resolves_function_args_before_body_compile() -> anyhow::Result<()> {
123        let mut compiler = Compiler::new();
124        compiler.import_code(
125            "compiler_return_check_args",
126            br#"
127            pub fn no_value_return(flag: bool) {
128                if flag {
129                    return;
130                }
131            }
132
133            pub fn tail_if(flag: bool) {
134                if flag {
135                    1
136                } else {
137                    2
138                }
139            }
140
141            pub fn loop_index(low: i64, high: i64) {
142                let total = 0i64;
143                for i in low..high {
144                    total += i;
145                }
146                total
147            }
148
149            pub fn closure_capture() {
150                let base = 10i32;
151                let add_base = |value: i32| {
152                    value + base
153                };
154                add_base(1i32)
155            }
156
157            pub fn destructured_names() {
158                let (left, right) = (3i32, 4i32);
159                let [first, second] = [5i32, 6i32];
160                let _ = first;
161                left + right + second
162            }
163            "#
164            .to_vec(),
165        )?;
166
167        let no_value_return = compiler.symbols.get_id("compiler_return_check_args::no_value_return")?;
168        assert_eq!(compiler.infer_fn(no_value_return, &[Type::Bool])?, Type::Void);
169
170        let tail_if = compiler.symbols.get_id("compiler_return_check_args::tail_if")?;
171        assert_eq!(compiler.infer_fn(tail_if, &[Type::Bool])?, Type::I32);
172
173        let loop_index = compiler.symbols.get_id("compiler_return_check_args::loop_index")?;
174        assert_eq!(compiler.infer_fn(loop_index, &[Type::I64, Type::I64])?, Type::I64);
175
176        Ok(())
177    }
178
179    #[test]
180    fn forward_function_call_in_bool_condition_infers_callee_first() -> anyhow::Result<()> {
181        let mut compiler = Compiler::new();
182        compiler.import_code(
183            "compiler_forward_bool",
184            br#"
185            pub fn can_start() {
186                if is_ready() {
187                    return true;
188                }
189                false
190            }
191
192            pub fn is_ready() {
193                true
194            }
195            "#
196            .to_vec(),
197        )?;
198
199        let can_start = compiler.symbols.get_id("compiler_forward_bool::can_start")?;
200        assert_eq!(compiler.infer_fn(can_start, &[])?, Type::Bool);
201
202        let is_ready = compiler.symbols.get_id("compiler_forward_bool::is_ready")?;
203        assert_eq!(compiler.infer_fn(is_ready, &[])?, Type::Bool);
204        Ok(())
205    }
206
207    #[test]
208    fn inferred_return_cache_keeps_pending_separate_from_any() -> anyhow::Result<()> {
209        let mut compiler = Compiler::new();
210        compiler.import_code(
211            "compiler_pending_any",
212            br#"
213            pub fn dynamic_value(value) {
214                value
215            }
216
217            pub fn bool_value() {
218                true
219            }
220            "#
221            .to_vec(),
222        )?;
223
224        let dynamic_value = compiler.symbols.get_id("compiler_pending_any::dynamic_value")?;
225        assert_eq!(compiler.infer_fn(dynamic_value, &[Type::Any])?, Type::Any);
226
227        let bool_value = compiler.symbols.get_id("compiler_pending_any::bool_value")?;
228        assert_eq!(compiler.infer_fn(bool_value, &[])?, Type::Bool);
229        Ok(())
230    }
231
232    #[test]
233    fn recursive_function_uses_inferred_return_seed() -> anyhow::Result<()> {
234        let mut compiler = Compiler::new();
235        compiler.import_code(
236            "compiler_recursive_return",
237            br#"
238            pub fn factorial(n: i64) {
239                if n <= 1 {
240                    return 1;
241                }
242                n * factorial(n - 1)
243            }
244
245            pub fn factorial_reversed(n: i64) {
246                if n > 1 {
247                    return n * factorial_reversed(n - 1);
248                }
249                1
250            }
251            "#
252            .to_vec(),
253        )?;
254
255        let factorial = compiler.symbols.get_id("compiler_recursive_return::factorial")?;
256        assert_eq!(compiler.infer_fn(factorial, &[Type::I64])?, Type::I64);
257
258        let factorial_reversed = compiler.symbols.get_id("compiler_recursive_return::factorial_reversed")?;
259        assert_eq!(compiler.infer_fn(factorial_reversed, &[Type::I64])?, Type::I64);
260        Ok(())
261    }
262
263    #[test]
264    fn assignment_target_type_keeps_dynamic_index_sum_static() -> anyhow::Result<()> {
265        let mut compiler = Compiler::new();
266        compiler.import_code(
267            "compiler_dynamic_index_sum",
268            br#"
269            pub fn sum_list(n: i64) {
270                let l = [];
271                for i in 0..n {
272                    l.push(i);
273                }
274                let sum = 0i64;
275                for i in 0..n {
276                    sum = sum + l.get_idx(i);
277                }
278                sum
279            }
280            "#
281            .to_vec(),
282        )?;
283
284        let sum_list = compiler.symbols.get_id("compiler_dynamic_index_sum::sum_list")?;
285        assert_eq!(compiler.infer_fn(sum_list, &[Type::I64])?, Type::I64);
286        Ok(())
287    }
288
289    #[test]
290    fn return_map_and_struct_is_type_error() -> anyhow::Result<()> {
291        let mut compiler = Compiler::new();
292        let err = match compiler.import_code(
293            "compiler_return_map_struct",
294            br#"
295            struct S {
296                hp: i32,
297            }
298
299            pub fn make_s_or_error(flag: i32) {
300                if flag == 0 {
301                    return { error: "bad" };
302                }
303                S{hp: 123}
304            }
305            "#
306            .to_vec(),
307        ) {
308            Ok(_) => panic!("expected mismatched return types to fail"),
309            Err(err) => err,
310        };
311
312        assert!(format!("{err:#}").contains("返回类型不一致"));
313        Ok(())
314    }
315}
316
317fn has_unresolved_generic_param(ty: &Type) -> bool {
318    match ty {
319        Type::Ident { name, params } => {
320            if params.is_empty() {
321                name.chars().next().map(|ch| ch.is_ascii_uppercase()).unwrap_or(false)
322            } else {
323                params.iter().any(has_unresolved_generic_param)
324            }
325        }
326        Type::Struct { params, fields } => params.iter().any(has_unresolved_generic_param) || fields.iter().any(|(_, ty)| has_unresolved_generic_param(ty)),
327        Type::Tuple(items) => items.iter().any(has_unresolved_generic_param),
328        Type::Vec(elem, _) | Type::Array(elem, _) => has_unresolved_generic_param(elem),
329        Type::ArrayParam(elem, len) => has_unresolved_generic_param(elem) || has_unresolved_generic_param(len),
330        Type::Fn { tys, ret } => tys.iter().any(has_unresolved_generic_param) || has_unresolved_generic_param(ret),
331        Type::Symbol { params, .. } => params.iter().any(has_unresolved_generic_param),
332        Type::ConstBinary { left, right, .. } => has_unresolved_generic_param(left) || has_unresolved_generic_param(right),
333        _ => false,
334    }
335}
336
337fn is_top_level_import_expr(expr: &Expr) -> bool {
338    matches!(
339        &expr.kind,
340        ExprKind::Call { obj, .. } if matches!(&obj.kind, ExprKind::Ident(name) if name.as_str() == "import")
341    )
342}
343
344fn string_value(expr: &Expr) -> Option<&str> {
345    if let ExprKind::Value(Dynamic::String(value)) = &expr.kind { Some(value.as_str()) } else { None }
346}
347
348fn import_decl(stmt: &Stmt) -> Option<(SmolStr, SmolStr)> {
349    let StmtKind::Expr(expr, _) = &stmt.kind else {
350        return None;
351    };
352    let ExprKind::Call { obj, params } = &expr.kind else {
353        return None;
354    };
355    let ExprKind::Ident(name) = &obj.kind else {
356        return None;
357    };
358    if name.as_str() != "import" {
359        return None;
360    }
361
362    match params.as_slice() {
363        [module, path] => Some((string_value(module)?.into(), string_value(path)?.into())),
364        [module] => match &module.kind {
365            ExprKind::Value(Dynamic::String(value)) => Some((value.clone(), format!("{value}.zs").into())),
366            ExprKind::Ident(value) => Some((value.clone(), format!("{value}.zs").into())),
367            _ => None,
368        },
369        _ => None,
370    }
371}
372
373fn generic_arg_for_name<'a>(name: &str, params: &'a [Type], args: &'a [Type]) -> Option<&'a Type> {
374    params.iter().position(|param| matches!(param, Type::Ident { name: param_name, params } if params.is_empty() && param_name == name)).and_then(|idx| args.get(idx))
375}
376
377pub fn infer_generic_args_from_types(generic_params: &[Type], decl_tys: &[Type], arg_tys: &[Type]) -> Vec<Type> {
378    if generic_params.is_empty() {
379        return Vec::new();
380    }
381    let mut inferred = vec![None; generic_params.len()];
382    for (decl, actual) in decl_tys.iter().zip(arg_tys.iter()) {
383        infer_generic_arg_from_type(generic_params, decl, actual, &mut inferred);
384    }
385    if inferred.iter().all(|item| item.is_some()) {
386        return inferred.into_iter().map(Option::unwrap).collect();
387    }
388    if let Some(Type::Struct { params, .. }) = arg_tys.iter().find(|ty| matches!(ty, Type::Struct { params, .. } if params.len() == generic_params.len())) {
389        return params.clone();
390    }
391    for (decl, actual) in decl_tys.iter().zip(arg_tys.iter()) {
392        if let (Type::Ident { params: decl_params, .. }, Type::Ident { params: actual_params, .. }) = (decl, actual)
393            && decl_params.len() == actual_params.len()
394            && decl_params.iter().any(|param| generic_params.contains(param))
395        {
396            return actual_params.clone();
397        }
398    }
399    Vec::new()
400}
401
402fn infer_generic_arg_from_type(generic_params: &[Type], decl: &Type, actual: &Type, inferred: &mut [Option<Type>]) {
403    if let Some(idx) = generic_params.iter().position(|param| param == decl) {
404        inferred[idx] = Some(actual.clone());
405        return;
406    }
407
408    match (decl, actual) {
409        (Type::Vec(decl_elem, decl_len), Type::Vec(actual_elem, actual_len)) | (Type::Array(decl_elem, decl_len), Type::Array(actual_elem, actual_len)) => {
410            infer_generic_arg_from_type(generic_params, decl_elem, actual_elem, inferred);
411            infer_generic_arg_from_type(generic_params, &Type::ConstInt(*decl_len as i64), &Type::ConstInt(*actual_len as i64), inferred);
412        }
413        (Type::ArrayParam(decl_elem, decl_len), Type::Array(actual_elem, actual_len)) => {
414            infer_generic_arg_from_type(generic_params, decl_elem, actual_elem, inferred);
415            infer_generic_arg_from_type(generic_params, decl_len, &Type::ConstInt(*actual_len as i64), inferred);
416        }
417        (Type::Ident { params: decl_params, .. }, Type::Ident { params: actual_params, .. })
418        | (Type::Ident { params: decl_params, .. }, Type::Symbol { params: actual_params, .. })
419        | (Type::Symbol { params: decl_params, .. }, Type::Symbol { params: actual_params, .. })
420        | (Type::Symbol { params: decl_params, .. }, Type::Ident { params: actual_params, .. })
421        | (Type::Struct { params: decl_params, .. }, Type::Struct { params: actual_params, .. }) => {
422            for (decl, actual) in decl_params.iter().zip(actual_params.iter()) {
423                infer_generic_arg_from_type(generic_params, decl, actual, inferred);
424            }
425        }
426        _ => {}
427    }
428}
429
430fn substitute_pattern(pattern: &Pattern, params: &[Type], args: &[Type]) -> Pattern {
431    let kind = match &pattern.kind {
432        PatternKind::Ident { name, ty } => PatternKind::Ident { name: name.clone(), ty: substitute_type(ty, params, args) },
433        PatternKind::Var { idx, ty } => PatternKind::Var { idx: *idx, ty: substitute_type(ty, params, args) },
434        PatternKind::Tuple(items) => PatternKind::Tuple(items.iter().map(|item| substitute_pattern(item, params, args)).collect()),
435        PatternKind::List { elems, has_rest } => PatternKind::List { elems: elems.iter().map(|item| substitute_pattern(item, params, args)).collect(), has_rest: *has_rest },
436        other => other.clone(),
437    };
438    Pattern { kind, span: pattern.span }
439}
440
441fn substitute_expr(expr: &Expr, params: &[Type], args: &[Type]) -> Expr {
442    let kind = match &expr.kind {
443        ExprKind::Ident(name) => match generic_arg_for_name(name, params, args) {
444            Some(Type::ConstInt(value)) => ExprKind::Value(Dynamic::I32(*value as i32)),
445            Some(ty) => eval_const_int_type(ty).map(|value| ExprKind::Value(Dynamic::I32(value as i32))).unwrap_or_else(|| expr.kind.clone()),
446            _ => expr.kind.clone(),
447        },
448        ExprKind::Typed { value, ty } => ExprKind::Typed { value: Box::new(substitute_expr(value, params, args)), ty: substitute_type(ty, params, args) },
449        ExprKind::Unary { op, value } => ExprKind::Unary { op: op.clone(), value: Box::new(substitute_expr(value, params, args)) },
450        ExprKind::Binary { left, op, right } => ExprKind::Binary { left: Box::new(substitute_expr(left, params, args)), op: op.clone(), right: Box::new(substitute_expr(right, params, args)) },
451        ExprKind::Assoc { ty, name } => ExprKind::Assoc { ty: substitute_type(ty, params, args), name: name.clone() },
452        ExprKind::TypedMethod { obj, ty, name } => ExprKind::TypedMethod { obj: Box::new(substitute_expr(obj, params, args)), ty: substitute_type(ty, params, args), name: name.clone() },
453        ExprKind::AssocId { id, params: nested } => ExprKind::AssocId { id: *id, params: nested.iter().map(|param| substitute_type(param, params, args)).collect() },
454        ExprKind::Tuple(items) => ExprKind::Tuple(items.iter().map(|item| substitute_expr(item, params, args)).collect()),
455        ExprKind::List(items) => ExprKind::List(items.iter().map(|item| substitute_expr(item, params, args)).collect()),
456        ExprKind::Repeat { value, len } => ExprKind::Repeat { value: Box::new(substitute_expr(value, params, args)), len: substitute_type(len, params, args) },
457        ExprKind::Dict(items) => ExprKind::Dict(items.iter().map(|(name, value)| (name.clone(), substitute_expr(value, params, args))).collect()),
458        ExprKind::Range { start, stop, inclusive } => ExprKind::Range { start: Box::new(substitute_expr(start, params, args)), stop: Box::new(substitute_expr(stop, params, args)), inclusive: *inclusive },
459        ExprKind::Call { obj, params: call_params } => ExprKind::Call { obj: Box::new(substitute_expr(obj, params, args)), params: call_params.iter().map(|param| substitute_expr(param, params, args)).collect() },
460        ExprKind::Stmt(stmt) => ExprKind::Stmt(Box::new(substitute_stmt(stmt, params, args))),
461        ExprKind::Closure { args: closure_args, body } => {
462            ExprKind::Closure { args: closure_args.iter().map(|(name, ty)| (name.clone(), substitute_type(ty, params, args))).collect(), body: Box::new(substitute_stmt(body, params, args)) }
463        }
464        _ => expr.kind.clone(),
465    };
466    Expr::new(kind, expr.span)
467}
468
469pub fn substitute_stmt(stmt: &Stmt, params: &[Type], args: &[Type]) -> Stmt {
470    let kind = match &stmt.kind {
471        StmtKind::Let { pat, value } => StmtKind::Let { pat: substitute_pattern(pat, params, args), value: Box::new(substitute_stmt(value, params, args)) },
472        StmtKind::Expr(expr, close) => StmtKind::Expr(substitute_expr(expr, params, args), *close),
473        StmtKind::Block(stmts) => StmtKind::Block(stmts.iter().map(|stmt| substitute_stmt(stmt, params, args)).collect()),
474        StmtKind::Return(expr) => StmtKind::Return(expr.as_ref().map(|expr| substitute_expr(expr, params, args))),
475        StmtKind::While { cond, body } => StmtKind::While { cond: substitute_expr(cond, params, args), body: Box::new(substitute_stmt(body, params, args)) },
476        StmtKind::Loop(body) => StmtKind::Loop(Box::new(substitute_stmt(body, params, args))),
477        StmtKind::For { pat, range, body } => StmtKind::For { pat: substitute_pattern(pat, params, args), range: substitute_expr(range, params, args), body: Box::new(substitute_stmt(body, params, args)) },
478        StmtKind::Fn { name, generic_params, args: fn_args, body, is_pub } => StmtKind::Fn {
479            name: name.clone(),
480            generic_params: generic_params.iter().map(|param| substitute_type(param, params, args)).collect(),
481            args: fn_args.iter().map(|(name, ty)| (name.clone(), substitute_type(ty, params, args))).collect(),
482            body: Box::new(substitute_stmt(body, params, args)),
483            is_pub: *is_pub,
484        },
485        StmtKind::Struct { name, def, is_pub } => StmtKind::Struct { name: name.clone(), def: substitute_type(def, params, args), is_pub: *is_pub },
486        StmtKind::Impl { target, body } => StmtKind::Impl { target: substitute_type(target, params, args), body: Box::new(substitute_stmt(body, params, args)) },
487        StmtKind::If { cond, then_body, else_body } => StmtKind::If {
488            cond: substitute_expr(cond, params, args),
489            then_body: Box::new(substitute_stmt(then_body, params, args)),
490            else_body: else_body.as_ref().map(|body| Box::new(substitute_stmt(body, params, args))),
491        },
492        StmtKind::Static { name, ty, value, is_pub } => {
493            StmtKind::Static { name: name.clone(), ty: substitute_type(ty, params, args), value: value.as_ref().map(|value| substitute_expr(value, params, args)), is_pub: *is_pub }
494        }
495        StmtKind::Const { name, ty, value, is_pub } => StmtKind::Const { name: name.clone(), ty: substitute_type(ty, params, args), value: substitute_expr(value, params, args), is_pub: *is_pub },
496        other => other.clone(),
497    };
498    Stmt::new(kind, stmt.span)
499}
500
501#[derive(Debug, Clone, Default)]
502pub struct Capture {
503    pub names: Vec<(SmolStr, Type)>,
504    pub vars: Vec<usize>,
505}
506
507impl Capture {
508    pub fn new(names: Vec<(SmolStr, Type)>) -> Self {
509        Self { names, vars: Vec::new() }
510    }
511
512    pub fn get(&mut self, name: &str) -> Option<usize> {
513        if let Some(idx) = self.names.iter().position(|n| n.0 == name) {
514            if let Some(pos) = self.vars.iter().position(|v| *v == idx) {
515                Some(pos)
516            } else {
517                self.vars.push(idx);
518                Some(self.vars.len() - 1)
519            }
520        } else {
521            None
522        }
523    }
524
525    pub fn get_type(&self, idx: u32) -> Option<Type> {
526        self.names.get(idx as usize).map(|(_, ty)| ty.clone())
527    }
528}
529
530use anyhow::{Context, Result, anyhow};
531use smol_str::SmolStr;
532use thiserror::Error;
533
534#[derive(Debug, Error)]
535#[error("{message}")]
536pub struct SpannedCompilerError {
537    pub message: String,
538    pub span: Span,
539}
540
541#[derive(Debug, Clone)]
542pub struct CompilerDiagnostic {
543    pub message: String,
544    pub span: Span,
545}
546
547impl Compiler {
548    pub fn clear(&mut self) {
549        self.frames.clear();
550        self.names.clear();
551        self.tys.clear();
552    }
553
554    pub fn take_local_state(&mut self) -> (Vec<usize>, Vec<SmolStr>, Vec<Type>) {
555        (std::mem::take(&mut self.frames), std::mem::take(&mut self.names), std::mem::take(&mut self.tys))
556    }
557
558    pub fn restore_local_state(&mut self, state: (Vec<usize>, Vec<SmolStr>, Vec<Type>)) {
559        self.frames = state.0;
560        self.names = state.1;
561        self.tys = state.2;
562    }
563
564    pub fn get_value(&self, expr: &Expr) -> Option<Dynamic> {
565        match &expr.kind {
566            ExprKind::Value(v) => Some(v.clone()),
567            ExprKind::Const(idx) => self.consts.get(*idx).cloned(),
568            _ => None,
569        }
570    }
571
572    pub fn get_const(&mut self, value: Dynamic) -> usize {
573        self.consts.iter().position(|c| c == &value).unwrap_or_else(|| {
574            self.consts.push(value);
575            self.consts.len() - 1
576        })
577    }
578
579    pub fn top(&self) -> usize {
580        self.frames.last().copied().unwrap_or(0)
581    }
582
583    fn add_name(&mut self, name: SmolStr) -> u32 {
584        self.names.push(name);
585        (self.names.len() - self.top() - 1) as u32
586    }
587
588    fn add_ty(&mut self, ty: Type) -> u32 {
589        self.tys.push(ty);
590        (self.tys.len() - self.top() - 1) as u32
591    }
592
593    fn set_ty(&mut self, idx: u32, ty: Type) {
594        let pos = idx as usize + self.top();
595        if pos < self.tys.len() {
596            self.tys[pos] = ty;
597        } else if pos == self.tys.len() {
598            self.tys.push(ty);
599        } else {
600            self.tys.resize(pos + 1, Type::Any);
601            self.tys[pos] = ty;
602        }
603    }
604
605    pub fn add_symbol(&mut self, name: &str, s: Symbol) -> u32 {
606        self.symbols.add(name.into(), s)
607    }
608
609    pub fn new() -> Self {
610        let symbols = SymbolTable::default();
611        Self { symbols, tys: Vec::new(), names: Vec::new(), consts: Vec::with_capacity(10240), frames: Vec::new(), fns: BTreeMap::new(), infer_stack: Vec::new(), importing_paths: BTreeSet::new() }
612    }
613
614    fn byte_to_line_col(src: &[u8], pos: usize) -> (usize, usize) {
615        let mut line = 1;
616        let mut col = 1;
617        for &b in src.iter().take(pos.min(src.len())) {
618            if b == b'\n' {
619                line += 1;
620                col = 1;
621            } else {
622                col += 1;
623            }
624        }
625        (line, col)
626    }
627
628    fn line_snippet(code: &[u8], span: Span) -> String {
629        let pos = span.start.min(code.len());
630        let line_start = code[..pos].iter().rposition(|&b| b == b'\n').map(|idx| idx + 1).unwrap_or(0);
631        let line_end = code[pos..].iter().position(|&b| b == b'\n').map(|idx| pos + idx).unwrap_or(code.len());
632        String::from_utf8_lossy(&code[line_start..line_end]).into_owned()
633    }
634
635    fn semantic_error(span: Span, message: impl Into<String>) -> anyhow::Error {
636        SpannedCompilerError { message: message.into(), span }.into()
637    }
638
639    fn format_compile_error(code: &[u8], err: anyhow::Error) -> anyhow::Error {
640        if let Some(err) = err.downcast_ref::<SpannedCompilerError>() {
641            let pos = err.span.start.min(code.len());
642            let (line, col) = Self::byte_to_line_col(code, pos);
643            let snippet = Self::line_snippet(code, err.span);
644            anyhow!("语义错误:第 {line} 行,第 {col} 列(字节偏移 {pos}):{}\n{}", err.message, snippet)
645        } else {
646            err
647        }
648    }
649
650    pub fn parse_code(code: Vec<u8>) -> Result<Vec<Stmt>> {
651        let mut p = Parser::new(code.clone());
652        let mut stmts = Vec::new();
653        loop {
654            match p.stmt(false) {
655                Ok(stmt) => stmts.push(stmt),
656                Err(e) => {
657                    if p.is_eof() {
658                        return Ok(stmts);
659                    }
660                    let pos = p.current_pos();
661                    let (line, col) = Self::byte_to_line_col(&code, pos);
662                    return Err(anyhow!("解析错误:第 {line} 行,第 {col} 列(字节偏移 {pos}):{e:#}\n{}", p.error_stmt()));
663                }
664            }
665        }
666    }
667
668    pub fn import_code(&mut self, name: &str, code: Vec<u8>) -> Result<Vec<u32>> {
669        self.import_code_with_base_dir(name, code, None)
670    }
671
672    pub fn import_code_from_path(&mut self, name: &str, code: Vec<u8>, path: impl AsRef<Path>) -> Result<Vec<u32>> {
673        self.import_code_with_base_dir(name, code, path.as_ref().parent())
674    }
675
676    pub fn import_file(&mut self, name: &str, path: impl AsRef<Path>) -> Result<Vec<u32>> {
677        let path = path.as_ref();
678        let canonical = std::fs::canonicalize(path).with_context(|| format!("failed to resolve import path {}", path.display()))?;
679        if !self.importing_paths.insert(canonical.clone()) {
680            return Ok(Vec::new());
681        }
682        let code = std::fs::read(&canonical).with_context(|| format!("failed to read import path {}", canonical.display()))?;
683        let result = self.import_code_from_path(name, code, &canonical);
684        self.importing_paths.remove(&canonical);
685        result
686    }
687
688    fn import_code_with_base_dir(&mut self, name: &str, code: Vec<u8>, base_dir: Option<&Path>) -> Result<Vec<u32>> {
689        let stmts = Self::parse_code(code.clone())?;
690        log::info!("func->{}", name);
691        for s in stmts.iter() {
692            log::info!("{}", s);
693        }
694        self.resolve_imports(&stmts, base_dir).map_err(|err| Self::format_compile_error(&code, err))?;
695        self.clear();
696        self.compile(name.into(), stmts).map_err(|err| Self::format_compile_error(&code, err))
697    }
698
699    pub fn resolve_imports(&mut self, stmts: &[Stmt], base_dir: Option<&Path>) -> Result<()> {
700        for stmt in stmts {
701            let Some((module, path)) = import_decl(stmt) else {
702                continue;
703            };
704            if !self.symbols.symbol(module.as_str()).is_empty() {
705                continue;
706            }
707            let path = Path::new(path.as_str());
708            let resolved = if path.is_absolute() {
709                path.to_path_buf()
710            } else if let Some(base_dir) = base_dir {
711                base_dir.join(path)
712            } else {
713                std::env::current_dir()?.join(path)
714            };
715            self.import_file(module.as_str(), &resolved).with_context(|| format!("failed to import {module} from {}", resolved.display()))?;
716        }
717        Ok(())
718    }
719
720    pub fn check_code(name: &str, code: Vec<u8>) -> Vec<CompilerDiagnostic> {
721        let mut parser = Parser::new(code.clone());
722        let mut stmts = Vec::new();
723        loop {
724            match parser.stmt(false) {
725                Ok(stmt) => stmts.push(stmt),
726                Err(err) => {
727                    if parser.is_eof() {
728                        break;
729                    }
730                    return vec![CompilerDiagnostic { message: format!("解析错误:{err:#}"), span: Span::empty(parser.current_pos()) }];
731                }
732            }
733        }
734
735        let mut compiler = Self::new();
736        compiler.clear();
737        match compiler.compile(name.into(), stmts) {
738            Ok(_) => Vec::new(),
739            Err(err) => {
740                if let Some(err) = err.downcast_ref::<SpannedCompilerError>() {
741                    vec![CompilerDiagnostic { message: err.message.clone(), span: err.span }]
742                } else {
743                    vec![CompilerDiagnostic { message: format!("{err:#}"), span: Span::default() }]
744                }
745            }
746        }
747    }
748
749    pub fn get_field(&self, ty: &Type, name: &str) -> Result<(usize, Type)> {
750        self.symbols.get_field(ty, name)
751    }
752
753    pub fn get_ident(&mut self, ident: &str, span: Span) -> Result<Expr> {
754        for idx in (self.top()..self.names.len()).rev() {
755            if self.names[idx].eq(ident) {
756                return Ok(Expr::new(ExprKind::Var((idx - self.top()) as u32), span));
757            }
758        }
759        let id = self.symbols.get_id(ident).map_err(|_| Self::semantic_error(span, format!("未找到标识符 {}", ident)))?;
760        let s = self.symbols.get_symbol(id).map(|(_, v)| v.clone()).unwrap();
761        if let Symbol::Const { value, ty, .. } = s {
762            let c = self.get_const(value);
763            return Ok(Expr::new(ExprKind::Typed { value: Box::new(Expr::new(ExprKind::Const(c), span)), ty }, span));
764        } else if let Symbol::Static { value, ty, .. } = s
765            && let Some(v) = value
766        {
767            let c = self.get_const(v);
768            return Ok(Expr::new(ExprKind::Typed { value: Box::new(Expr::new(ExprKind::Const(c), span)), ty }, span));
769        }
770        Ok(Expr::new(ExprKind::Id(id, None), span))
771    }
772
773    fn field_access_expr(&mut self, left: Expr, idx: usize, ty: Type, key: &str, span: Span) -> Expr {
774        if let Type::Symbol { id, .. } = ty {
775            Expr::new(ExprKind::Id(id, Some(Box::new(left))), span)
776        } else if ty.is_bool() && idx == usize::MAX {
777            Expr::new(ExprKind::Value(Dynamic::Bool(false)), span)
778        } else if ty.is_any() && idx == usize::MAX {
779            let right = Expr::new(ExprKind::Const(self.get_const(Dynamic::String(key.into()))), span);
780            Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(right) }, span)
781        } else {
782            Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(Expr::new(ExprKind::Value(Dynamic::U32(idx as u32)), span)) }, span)
783        }
784    }
785
786    fn literal_field_access_expr(&mut self, left: Expr, key: &str, span: Span) -> Expr {
787        let right = Expr::new(ExprKind::Const(self.get_const(Dynamic::String(key.into()))), span);
788        Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(right) }, span)
789    }
790
791    fn type_field_access_expr(&mut self, left: Expr, key: &str, span: Span, prefer_dynamic_field: bool) -> Option<Expr> {
792        let ty = self.infer_expr(&left).ok()?;
793        if prefer_dynamic_field && ty.is_any() {
794            return Some(self.literal_field_access_expr(left, key, span));
795        }
796        let (idx, field_ty) = self.get_field(&ty, key).ok()?;
797        Some(self.field_access_expr(left, idx, field_ty, key, span))
798    }
799
800    fn global_method_access_expr(&self, left: Expr, method: &str, span: Span) -> Result<Option<Expr>> {
801        let Ok(id) = self.symbols.get_id(method) else {
802            return Ok(None);
803        };
804        if self.symbols.get_symbol(id)?.1.is_fn() { Ok(Some(Expr::new(ExprKind::Id(id, Some(Box::new(left))), span))) } else { Ok(None) }
805    }
806
807    fn method_call_obj_expr(&mut self, obj: &Expr, stmts: &mut Vec<Stmt>, cap: &mut Capture) -> Result<Option<Expr>> {
808        if let ExprKind::TypedMethod { obj: left, ty, name } = &obj.kind {
809            let left = self.eval(left, stmts, cap)?;
810            let base_name = match ty {
811                Type::Ident { name, .. } => name.clone(),
812                Type::Symbol { id, .. } => self.symbols.get_symbol(*id)?.0.clone(),
813                _ => return Err(Self::semantic_error(obj.span, format!("方法调用类型提示必须是类型: {:?}", ty))),
814            };
815            let method = format!("{}::{}", base_name, name);
816            let id = self.symbols.get_id(&method).map_err(|_| Self::semantic_error(obj.span, format!("未找到类型方法 {}", method)))?;
817            return Ok(Some(Expr::new(ExprKind::Id(id, Some(Box::new(left))), obj.span)));
818        }
819
820        let ExprKind::Binary { left, op: BinaryOp::Idx, right } = &obj.kind else {
821            return Ok(None);
822        };
823        let Some(method) = self.get_value(right).and_then(|v| if v.is_str() { Some(v.as_str().to_string()) } else { None }) else {
824            return Ok(None);
825        };
826        let left = self.eval(left, stmts, cap)?;
827        if let Some(field) = self.type_field_access_expr(left.clone(), &method, obj.span, false) {
828            return Ok(Some(field));
829        }
830        if let Some(method_fn) = self.global_method_access_expr(left.clone(), &method, obj.span)? {
831            return Ok(Some(method_fn));
832        }
833        Ok(Some(self.literal_field_access_expr(left, &method, obj.span)))
834    }
835
836    pub fn compile_fn(&mut self, args: &[SmolStr], tys: &mut Vec<Type>, body: Stmt, cap: &mut Capture) -> Result<Vec<Stmt>> {
837        let top = self.tys.len();
838        self.frames.push(top);
839        let result = (|| -> Result<Vec<Stmt>> {
840            for (arg, ty) in args.iter().zip(tys.iter_mut()) {
841                *ty = self.symbols.get_type(ty)?;
842                self.add_name(arg.clone());
843                self.add_ty(ty.clone());
844            }
845            if cap.names.is_empty() && tys.iter().all(|ty| !ty.is_any()) {
846                let saved_state = (self.frames.clone(), self.names.clone(), self.tys.clone());
847                let result = self.check_return_type(&body);
848                self.restore_local_state(saved_state);
849                result?;
850            }
851            let mut compiled = Vec::new();
852            self.compile_stmt(body, &mut compiled, cap)?;
853            if !compiled.last_mut().map(|stmt| stmt.last_return()).unwrap_or(false) {
854                compiled.push(Stmt::new(StmtKind::Return(None), Span::default()));
855            }
856            Ok(compiled)
857        })();
858        if let Some(top) = self.frames.pop() {
859            self.tys.truncate(top);
860            self.names.truncate(top);
861        }
862        result
863    }
864
865    pub fn compile(&mut self, mod_name: SmolStr, stmts: Vec<Stmt>) -> Result<Vec<u32>> {
866        self.symbols.add_module(mod_name.clone());
867        for stmt in stmts {
868            match stmt.kind {
869                StmtKind::Struct { name, def, is_pub } => {
870                    self.symbols.add(name, Symbol::Struct(def, is_pub));
871                }
872                StmtKind::Static { name, ty, value, is_pub } => {
873                    self.symbols.add(name, Symbol::Static { value: value.and_then(|v| v.value().ok()), ty, is_pub });
874                }
875                StmtKind::Const { name, ty, value, is_pub } => {
876                    let value = self.const_expr_value(&value)?;
877                    self.symbols.add(name, Symbol::Const { value, ty, is_pub });
878                }
879                StmtKind::Fn { name, generic_params, args, body, is_pub } => {
880                    let (ty, args) = Type::from_args(args);
881                    self.symbols.add(name, Symbol::Fn { ty, args, generic_params, cap: Capture::default(), body: Arc::new(*body), is_pub });
882                }
883                StmtKind::Impl { target, body } => {
884                    let name = impl_target_name(&target)?;
885                    let def_id = match self.symbols.get_id(&name) {
886                        Ok(id) => id,
887                        Err(_) if name.as_str() == "Vec" => self.symbols.add(name.clone(), Symbol::Struct(Type::Struct { params: Vec::new(), fields: Vec::new() }, true)),
888                        Err(err) => return Err(err),
889                    };
890                    if let StmtKind::Block(fns) = body.kind {
891                        for f in fns {
892                            if let StmtKind::Fn { name: fn_name, generic_params: fn_generic_params, args, body, is_pub } = f.kind {
893                                let (ty, args) = Type::from_args(args);
894                                let mut generic_params = if has_unresolved_generic_param(&target) {
895                                    match &target {
896                                        Type::Ident { params, .. } => params.clone(),
897                                        _ => Vec::new(),
898                                    }
899                                } else {
900                                    Vec::new()
901                                };
902                                for param in fn_generic_params {
903                                    if !generic_params.contains(&param) {
904                                        generic_params.push(param);
905                                    }
906                                }
907                                let fn_id = self.symbols.add(SmolStr::from(format!("{}::{}", name, fn_name)), Symbol::Fn { ty, args, generic_params, cap: Capture::default(), body: Arc::new(*body), is_pub });
908                                if let Symbol::Struct(ty, _) = &mut self.symbols.symbols[def_id as usize] {
909                                    ty.add_field(fn_name.into(), Type::Symbol { id: fn_id, params: Vec::new() })?;
910                                }
911                            } else {
912                                println!("impl 包含非函数语句 {:?}", f);
913                            }
914                        }
915                    }
916                }
917                StmtKind::Expr(expr, _) if is_top_level_import_expr(&expr) => {}
918                _ => {
919                    println!("未知的顶层语句 {:?}", stmt);
920                }
921            }
922        }
923        let mut fn_ids = Vec::new();
924        for (name, id) in self.symbols.symbol(&mod_name) {
925            log::info!("compile symbol {:?}[{}]", name, id);
926            if let Some((_, Symbol::Fn { ty, generic_params, .. })) = self.symbols.get_symbol(id).ok() {
927                let resolved_ty = self.symbols.get_type(ty).unwrap_or_else(|_| ty.clone());
928                if has_unresolved_generic_param(&resolved_ty) || !generic_params.is_empty() {
929                    continue;
930                }
931            }
932            if let Some(s) = self.symbols.get_symbol(id).ok().map(|(_, symbol)| symbol.clone()) {
933                if let Symbol::Fn { ty, args, generic_params, mut cap, body, is_pub } = s {
934                    if let Type::Fn { mut tys, ret } = ty {
935                        let compiled = self.compile_fn(&args, &mut tys, body.as_ref().clone(), &mut cap)?;
936                        for s in compiled.iter() {
937                            log::info!("{}", s);
938                        }
939                        self.symbols.symbols[id as usize] = Symbol::Fn {
940                            ty: Type::Fn { tys, ret },
941                            args,
942                            generic_params,
943                            cap,
944                            body: Arc::new(Stmt::new(StmtKind::Block(compiled), Span::default())),
945                            is_pub,
946                        };
947                        fn_ids.push(id);
948                    }
949                }
950            }
951        }
952        self.symbols.pop_module();
953        Ok(fn_ids)
954    }
955
956    fn pat_to_var(&mut self, pat: Pattern, expr_ty: Type) -> Result<Pattern> {
957        match pat.kind {
958            PatternKind::Var { idx, ty } => Ok(Pattern { kind: PatternKind::Var { idx, ty }, span: pat.span }),
959            PatternKind::Ident { name, ty } => {
960                let ty = self.symbols.get_type(&ty)?;
961                let ty = if ty.is_any() { expr_ty } else { ty };
962                self.add_ty(ty.clone());
963                Ok(Pattern { kind: PatternKind::Var { idx: self.add_name(name), ty }, span: pat.span })
964            }
965            PatternKind::Tuple(pats) => {
966                if let Type::Tuple(tys) = &expr_ty {
967                    let pats: Vec<Pattern> = pats.into_iter().zip(tys).filter_map(|p| self.pat_to_var(p.0, p.1.clone()).ok()).collect();
968                    if pats.len() == tys.len() { Ok(Pattern { kind: PatternKind::Tuple(pats), span: pat.span }) } else { Err(Self::semantic_error(pat.span, format!("模式与元组类型不匹配: {:?}", expr_ty))) }
969                } else {
970                    let pats = pats.into_iter().filter_map(|p| self.pat_to_var(p, Type::Any).ok()).collect();
971                    Ok(Pattern { kind: PatternKind::Tuple(pats), span: pat.span })
972                }
973            }
974            PatternKind::List { elems, has_rest } => {
975                if expr_ty.is_any() {
976                    let elems: Vec<Pattern> = elems.into_iter().filter_map(|p| self.pat_to_var(p, Type::Any).ok()).collect();
977                    Ok(Pattern { kind: PatternKind::List { elems, has_rest }, span: pat.span })
978                } else {
979                    Err(Self::semantic_error(pat.span, format!("列表模式 {:?} 与类型 {:?} 不匹配", elems, expr_ty)))
980                }
981            }
982            PatternKind::Wildcard => {
983                self.add_ty(expr_ty.clone());
984                Ok(Pattern { kind: PatternKind::Var { idx: self.add_name(SmolStr::new_static("")), ty: expr_ty }, span: pat.span })
985            }
986            _ => panic!("未知的模式 {:?}", pat),
987        }
988    }
989
990    fn infer_range_type(&self, range: &Expr) -> Type {
991        if let ExprKind::Range { start, stop, .. } = &range.kind {
992            let start_ty = start.get_type();
993            let stop_ty = stop.get_type();
994            if start_ty.is_any() {
995                stop_ty
996            } else if stop_ty.is_any() {
997                start_ty
998            } else {
999                stop_ty
1000            }
1001        } else {
1002            range.get_type()
1003        }
1004    }
1005
1006    fn dyn_init(&mut self, expr: Expr, stmts: &mut Vec<Stmt>, items: Vec<(Expr, Expr)>, ty: Type) -> Expr {
1007        self.add_name("".into());
1008        let temp = self.add_ty(ty);
1009        let span = expr.span;
1010        stmts.push(Stmt::new(StmtKind::Expr(Expr::new(ExprKind::Binary { left: Box::new(Expr::new(ExprKind::Var(temp), span)), op: BinaryOp::Assign, right: Box::new(expr) }, span), true), span));
1011        for (idx, item) in items {
1012            let item_span = idx.span.merge(item.span);
1013            let left = Expr::new(ExprKind::Binary { left: Box::new(Expr::new(ExprKind::Var(temp), item_span)), op: BinaryOp::Idx, right: Box::new(idx) }, item_span);
1014            stmts.push(Stmt::new(StmtKind::Expr(Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Assign, right: Box::new(item) }, item_span), false), item_span));
1015        }
1016        Expr::new(ExprKind::Var(temp), span)
1017    }
1018
1019    fn static_composite_literal(&self, expr: &Expr) -> Result<Option<Dynamic>> {
1020        match &expr.kind {
1021            ExprKind::List(items) | ExprKind::Tuple(items) => {
1022                let mut values = Vec::with_capacity(items.len());
1023                for item in items {
1024                    let Some(value) = self.static_literal_value(item)? else {
1025                        return Ok(None);
1026                    };
1027                    values.push(value);
1028                }
1029                Ok(Some(Dynamic::list(values)))
1030            }
1031            ExprKind::Dict(items) => {
1032                let mut values = BTreeMap::new();
1033                for (key, item) in items {
1034                    let Some(value) = self.static_literal_value(item)? else {
1035                        return Ok(None);
1036                    };
1037                    values.insert(key.clone(), value);
1038                }
1039                Ok(Some(Dynamic::map(values)))
1040            }
1041            _ => Ok(None),
1042        }
1043    }
1044
1045    fn static_literal_value(&self, expr: &Expr) -> Result<Option<Dynamic>> {
1046        match &expr.kind {
1047            ExprKind::Value(value) => Ok(Some(value.clone())),
1048            ExprKind::Const(idx) => Ok(self.consts.get(*idx).cloned()),
1049            ExprKind::Typed { value, ty } if ty.is_native() => Ok(self.static_literal_value(value)?.map(|value| ty.force(value)).transpose()?),
1050            _ => self.static_composite_literal(expr),
1051        }
1052    }
1053
1054    fn const_expr_value(&self, expr: &Expr) -> Result<Dynamic> {
1055        match &expr.kind {
1056            ExprKind::Value(value) => Ok(value.clone()),
1057            ExprKind::Const(idx) => self.consts.get(*idx).cloned().ok_or_else(|| Self::semantic_error(expr.span, format!("常量索引 {} 不存在", idx))),
1058            ExprKind::Ident(ident) => {
1059                let id = self.symbols.get_id(ident).map_err(|_| Self::semantic_error(expr.span, format!("未找到常量 {}", ident)))?;
1060                match self.symbols.get_symbol(id).map(|(_, symbol)| symbol) {
1061                    Ok(Symbol::Const { value, .. }) => Ok(value.clone()),
1062                    Ok(Symbol::Static { value: Some(value), .. }) => Ok(value.clone()),
1063                    _ => Err(Self::semantic_error(expr.span, format!("{} 不是可用于 const 的静态值", ident))),
1064                }
1065            }
1066            ExprKind::Typed { value, ty } if ty.is_native() => Ok(ty.force(self.const_expr_value(value)?)?),
1067            ExprKind::Typed { value, .. } => self.const_expr_value(value),
1068            ExprKind::List(items) | ExprKind::Tuple(items) => {
1069                let values = items.iter().map(|item| self.const_expr_value(item)).collect::<Result<Vec<_>>>()?;
1070                Ok(Dynamic::list(values))
1071            }
1072            ExprKind::Dict(items) => {
1073                let mut values = BTreeMap::new();
1074                for (key, item) in items {
1075                    values.insert(key.clone(), self.const_expr_value(item)?);
1076                }
1077                Ok(Dynamic::map(values))
1078            }
1079            ExprKind::Unary { op, value } => {
1080                let value = self.const_expr_value(value)?;
1081                match op {
1082                    parser::UnaryOp::Neg => Ok(-value),
1083                    parser::UnaryOp::Not => Ok(!value),
1084                    parser::UnaryOp::Unknow => Err(Self::semantic_error(expr.span, "const 一元表达式无法在编译期求值")),
1085                }
1086            }
1087            ExprKind::Binary { left, op, right } => {
1088                let left = Expr::new(ExprKind::Value(self.const_expr_value(left)?), left.span);
1089                let right = Expr::new(ExprKind::Value(self.const_expr_value(right)?), right.span);
1090                Expr::new(ExprKind::Binary { left: Box::new(left), op: op.clone(), right: Box::new(right) }, expr.span).compact().ok_or_else(|| Self::semantic_error(expr.span, "const 二元表达式无法在编译期求值"))
1091            }
1092            _ => Err(Self::semantic_error(expr.span, "const 只能使用字面量、已声明常量和静态 composite literal")),
1093        }
1094    }
1095
1096    fn eval_stmt_expr(&mut self, stmt: &Stmt, stmts: &mut Vec<Stmt>, cap: &mut Capture, span: Span) -> Result<Expr> {
1097        self.compile_stmt(stmt.clone(), stmts, cap)?;
1098        let expr_ty = if let Some(stmt) = stmts.last() { if let StmtKind::Expr(expr, _) = &stmt.kind { self.infer_expr(expr)? } else { self.infer_stmt(stmt)? } } else { Type::Any };
1099        self.add_name("".into());
1100        let temp = self.add_ty(expr_ty.clone());
1101        let pat = Pattern { kind: PatternKind::Var { idx: temp, ty: expr_ty }, span };
1102        stmts.last_mut().ok_or_else(|| Self::semantic_error(span, "没有生成可求值语句表达式")).and_then(|stmt| stmt.bind_pattern(pat))?;
1103        Ok(Expr::new(ExprKind::Var(temp), span))
1104    }
1105
1106    fn eval(&mut self, expr: &Expr, stmts: &mut Vec<Stmt>, cap: &mut Capture) -> Result<Expr> {
1107        match &expr.kind {
1108            ExprKind::Stmt(stmt) => self.eval_stmt_expr(stmt, stmts, cap, expr.span),
1109            ExprKind::Closure { args, body } => {
1110                let (mut names, mut tys): (Vec<SmolStr>, Vec<Type>) = args.clone().into_iter().unzip();
1111                let cap_vars: Vec<(SmolStr, Type)> = self.names.iter().zip(self.tys.iter()).map(|(n, ty)| (n.clone(), ty.clone())).collect();
1112                let mut local_cap = Capture::new(cap_vars);
1113                let _ = self.compile_fn(names.as_slice(), &mut tys.clone(), *body.clone(), &mut local_cap)?;
1114                for cap_idx in local_cap.vars.iter() {
1115                    names.push(local_cap.names[*cap_idx].0.clone());
1116                    tys.push(local_cap.names[*cap_idx].1.clone());
1117                }
1118                let mut compiled = self.compile_fn(names.as_slice(), &mut tys.clone(), *body.clone(), &mut Capture::default())?;
1119                let (ty, args) = Type::from_args(args.clone());
1120                let body_stmt = if compiled.len() == 1 { compiled.pop().unwrap() } else { Stmt::new(StmtKind::Block(compiled), expr.span) };
1121                let name = SmolStr::from(format!("__closure_{}_{}", expr.span.start, expr.span.end));
1122                let fn_id = self.symbols.add(name, Symbol::Fn { ty, args, generic_params: Vec::new(), cap: local_cap, body: Arc::new(body_stmt), is_pub: false });
1123                Ok(Expr::new(ExprKind::Id(fn_id, None), expr.span))
1124            }
1125            ExprKind::Value(v) => {
1126                if v.is_native() {
1127                    Ok(Expr::new(ExprKind::Value(v.clone()), expr.span))
1128                } else {
1129                    Ok(Expr::new(ExprKind::Const(self.get_const(v.clone())), expr.span))
1130                }
1131            }
1132            ExprKind::Typed { value, ty } => {
1133                let ty = self.symbols.get_type(ty)?;
1134                if let Type::Struct { fields, .. } = &ty
1135                    && let ExprKind::Dict(dict) = &value.kind
1136                {
1137                    let mut items = Vec::new();
1138                    for field in fields {
1139                        if let Some((_, v)) = dict.iter().find(|(name, _)| name == &field.0) {
1140                            items.push(self.eval(v, stmts, cap)?);
1141                        }
1142                    }
1143                    Ok(Expr::new(ExprKind::Typed { value: Box::new(Expr::new(ExprKind::List(items), expr.span)), ty }, expr.span))
1144                } else if let Type::Struct { .. } = &ty
1145                    && let ExprKind::List(list) = &value.kind
1146                {
1147                    let items = list.iter().map(|item| self.eval(item, stmts, cap)).collect::<Result<Vec<_>>>()?;
1148                    Ok(Expr::new(ExprKind::Typed { value: Box::new(Expr::new(ExprKind::List(items), expr.span)), ty }, expr.span))
1149                } else if let Type::Array(_, _) = &ty
1150                    && let ExprKind::List(list) = &value.kind
1151                {
1152                    let items = list.iter().map(|item| self.eval(item, stmts, cap)).collect::<Result<Vec<_>>>()?;
1153                    Ok(Expr::new(ExprKind::Typed { value: Box::new(Expr::new(ExprKind::List(items), expr.span)), ty }, expr.span))
1154                } else if value.is_value() {
1155                    let value = value.clone().value()?;
1156                    if ty.is_str() && value.is_str() {
1157                        log::warn!("常量 String 只能作为动态值使用,已忽略 string 类型约束");
1158                        Ok(Expr::new(ExprKind::Const(self.get_const(value)), expr.span))
1159                    } else {
1160                        Ok(Expr::new(ExprKind::Value(ty.force(value)?), expr.span))
1161                    }
1162                } else {
1163                    Ok(Expr::new(ExprKind::Typed { value: Box::new(self.eval(value, stmts, cap)?), ty }, expr.span))
1164                }
1165            }
1166            ExprKind::Ident(ident) => match self.get_ident(ident, expr.span) {
1167                Ok(id) => Ok(id),
1168                Err(_) => {
1169                    if let Some(idx) = cap.get(ident) {
1170                        Ok(Expr::new(ExprKind::Capture(idx as u32), expr.span))
1171                    } else {
1172                        Err(Self::semantic_error(expr.span, format!("未找到标识符 {}", ident)))
1173                    }
1174                }
1175            },
1176            ExprKind::Assoc { ty, name } => {
1177                let base_name = match ty {
1178                    Type::Ident { name, .. } => name.clone(),
1179                    Type::Symbol { id, .. } => self.symbols.get_symbol(*id)?.0.clone(),
1180                    _ => return Err(Self::semantic_error(expr.span, format!("关联函数目标必须是类型: {:?}", ty))),
1181                };
1182                let id = self.symbols.get_id(&format!("{}::{}", base_name, name)).map_err(|_| Self::semantic_error(expr.span, format!("未找到关联函数 {}::{}", base_name, name)))?;
1183                let params = match ty {
1184                    Type::Ident { params, .. } | Type::Symbol { params, .. } => params.iter().map(|param| self.symbols.get_type(param).unwrap_or_else(|_| param.clone())).collect(),
1185                    _ => Vec::new(),
1186                };
1187                Ok(Expr::new(ExprKind::AssocId { id, params }, expr.span))
1188            }
1189            ExprKind::Unary { op, value } => {
1190                let value = Expr::new(ExprKind::Unary { op: op.clone(), value: Box::new(self.eval(value, stmts, cap)?) }, expr.span);
1191                if let Some(v) = value.compact() { Ok(Expr::new(ExprKind::Value(v), expr.span)) } else { Ok(value) }
1192            }
1193            ExprKind::Binary { left, op, right } => {
1194                let left = self.eval(left, stmts, cap)?;
1195                if *op == BinaryOp::Idx {
1196                    if let Some(key) = self.get_value(right).and_then(|v| if v.is_str() { Some(v.as_str().to_string()) } else { None }) {
1197                        if let Some(field) = self.type_field_access_expr(left.clone(), &key, expr.span, true) {
1198                            return Ok(field);
1199                        }
1200                        return Ok(self.literal_field_access_expr(left, &key, expr.span));
1201                    } else if let Ok(ident) = right.ident() {
1202                        if let Ok(found) = self.get_ident(ident, right.span) {
1203                            return Ok(if let Some(id) = found.id() {
1204                                Expr::new(ExprKind::Id(id, Some(Box::new(left))), expr.span)
1205                            } else {
1206                                Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(found) }, expr.span)
1207                            });
1208                        }
1209                        if let Ok(ty) = self.infer_expr(&left)
1210                            && let Ok((idx, ty)) = self.get_field(&ty, ident)
1211                        {
1212                            return Ok(if let Type::Symbol { id, .. } = ty {
1213                                Expr::new(ExprKind::Id(id, Some(Box::new(left))), expr.span)
1214                            } else if ty.is_bool() && idx == usize::MAX {
1215                                Expr::new(ExprKind::Value(Dynamic::Bool(false)), expr.span)
1216                            } else if ty.is_any() && idx == usize::MAX {
1217                                let right = Expr::new(ExprKind::Const(self.get_const(Dynamic::String(ident.into()))), expr.span);
1218                                Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(right) }, expr.span)
1219                            } else {
1220                                Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(Expr::new(ExprKind::Value(Dynamic::U32(idx as u32)), expr.span)) }, expr.span)
1221                            });
1222                        } else {
1223                            let right = Expr::new(ExprKind::Const(self.get_const(Dynamic::String(ident.into()))), expr.span);
1224                            return Ok(Expr::new(ExprKind::Binary { left: Box::new(left), op: BinaryOp::Idx, right: Box::new(right) }, expr.span));
1225                        }
1226                    }
1227                }
1228                let right = Box::new(self.eval(right, stmts, cap)?);
1229                let value = Expr::new(ExprKind::Binary { left: Box::new(left), op: op.clone(), right }, expr.span);
1230                if let Some(v) = value.compact() { Ok(Expr::new(ExprKind::Value(v), expr.span)) } else { Ok(value) }
1231            }
1232            ExprKind::Call { obj, params } => {
1233                let params: Vec<Expr> = params.iter().map(|p| self.eval(p, stmts, cap)).collect::<Result<Vec<_>>>()?;
1234                let obj_result = if let Some(method_obj) = self.method_call_obj_expr(obj, stmts, cap)? { Ok(method_obj) } else { self.eval(obj, stmts, cap) };
1235                match obj_result {
1236                    Ok(obj) if obj.is_value() && params.is_empty() => Ok(obj),
1237                    Ok(obj) => Ok(Expr::new(ExprKind::Call { obj: Box::new(obj), params }, expr.span)),
1238                    Err(e) => {
1239                        if let ExprKind::Ident(ident) = &obj.kind {
1240                            let fn_id = if ident.contains("::") { self.symbols.add_global(ident.clone(), Symbol::Null) } else { self.symbols.add(ident.clone(), Symbol::Null) };
1241                            Ok(Expr::new(ExprKind::Call { obj: Box::new(Expr::new(ExprKind::Id(fn_id, None), obj.span)), params }, expr.span))
1242                        } else {
1243                            Err(e)
1244                        }
1245                    }
1246                }
1247            }
1248            ExprKind::Range { start, stop, inclusive } => {
1249                let start = Box::new(self.eval(start, stmts, cap)?);
1250                let stop = Box::new(self.eval(stop, stmts, cap)?);
1251                Ok(Expr::new(ExprKind::Range { start, stop, inclusive: *inclusive }, expr.span))
1252            }
1253            ExprKind::List(list) | ExprKind::Tuple(list) => {
1254                if let Some(value) = self.static_composite_literal(expr)? {
1255                    let idx = self.get_const(value);
1256                    return Ok(Expr::new(ExprKind::Const(idx), expr.span));
1257                }
1258                let mut v = Vec::new();
1259                let mut items = Vec::new();
1260                for (idx, item) in list.iter().enumerate() {
1261                    if item.is_value() {
1262                        v.push(item.clone().value().unwrap());
1263                    } else {
1264                        items.push((Expr::new(ExprKind::Value((idx as u32).into()), item.span), self.eval(item, stmts, cap)?));
1265                        v.push(Dynamic::Null);
1266                    }
1267                }
1268                let list = Expr::new(ExprKind::Const(self.get_const(Dynamic::list(v))), expr.span);
1269                Ok(self.dyn_init(list, stmts, items, Type::Any))
1270            }
1271            ExprKind::Repeat { value, len } => {
1272                let len = self.symbols.get_type(len)?;
1273                let Type::ConstInt(len) = len else {
1274                    return Err(Self::semantic_error(expr.span, format!("重复数组长度必须是编译期整数: {:?}", len)));
1275                };
1276                if len < 0 {
1277                    return Err(Self::semantic_error(expr.span, "重复数组长度不能为负数"));
1278                }
1279                Ok(Expr::new(ExprKind::Repeat { value: Box::new(self.eval(value, stmts, cap)?), len: Type::ConstInt(len) }, expr.span))
1280            }
1281            ExprKind::Dict(dict) => {
1282                if let Some(value) = self.static_composite_literal(expr)? {
1283                    let idx = self.get_const(value);
1284                    return Ok(Expr::new(ExprKind::Const(idx), expr.span));
1285                }
1286                let mut dyn_kv = Vec::new();
1287                let mut m = BTreeMap::new();
1288                for (k, v) in dict {
1289                    if v.is_value() {
1290                        m.insert(k.clone(), v.clone().value()?);
1291                    } else {
1292                        let key = Expr::new(ExprKind::Const(self.get_const(Dynamic::String(k.clone()))), v.span);
1293                        dyn_kv.push((key, self.eval(v, stmts, cap)?));
1294                        m.insert(k.clone(), Dynamic::Null);
1295                    }
1296                }
1297                let dict = Expr::new(ExprKind::Const(self.get_const(Dynamic::map(m))), expr.span);
1298                Ok(self.dyn_init(dict, stmts, dyn_kv, Type::Any))
1299            }
1300            ExprKind::Id(_, _) | ExprKind::AssocId { .. } => Ok(expr.clone()),
1301            _ => Ok(expr.clone()),
1302        }
1303    }
1304
1305    fn get_stmt(&mut self, stmt: Stmt, cap: &mut Capture) -> Result<Stmt> {
1306        let span = stmt.span;
1307        let mut stmts = Vec::new();
1308        self.compile_stmt(stmt, &mut stmts, cap)?;
1309        Ok(Stmt::new(StmtKind::Block(stmts), span))
1310    }
1311
1312    fn compile_stmt(&mut self, stmt: Stmt, compiled: &mut Vec<Stmt>, cap: &mut Capture) -> Result<()> {
1313        let stmt_span = stmt.span;
1314        match stmt.kind {
1315            StmtKind::Let { mut pat, value } => {
1316                let value = *value;
1317                let string_literal_constraint = matches!(
1318                    (&pat.kind, &value.kind),
1319                    (
1320                        PatternKind::Ident { ty: Type::Str, .. },
1321                        StmtKind::Expr(
1322                            Expr {
1323                                kind: ExprKind::Value(value),
1324                                ..
1325                            },
1326                            _
1327                        )
1328                    ) if value.is_str()
1329                );
1330                if string_literal_constraint {
1331                    log::warn!("常量 String 只能作为动态值使用,已忽略 string 类型约束");
1332                    if let PatternKind::Ident { ty, .. } = &mut pat.kind {
1333                        *ty = Type::Any;
1334                    }
1335                }
1336                let annotated_ty = if let PatternKind::Ident { ty, .. } = &pat.kind {
1337                    let ty = self.symbols.get_type(ty)?;
1338                    if ty.is_any() { None } else { Some(ty) }
1339                } else {
1340                    None
1341                };
1342                if let Some(ty) = annotated_ty {
1343                    if let StmtKind::Expr(expr, close) = value.kind {
1344                        let span = expr.span;
1345                        let typed = Expr::new(ExprKind::Typed { value: Box::new(expr), ty }, span);
1346                        self.compile_stmt(Stmt::new(StmtKind::Expr(typed, close), value.span), compiled, cap)?;
1347                    } else {
1348                        self.compile_stmt(value, compiled, cap)?;
1349                    }
1350                } else {
1351                    self.compile_stmt(value, compiled, cap)?;
1352                }
1353                let expr_ty = if let Some(stmt) = compiled.last() { if let StmtKind::Expr(expr, _) = &stmt.kind { self.infer_expr(expr)? } else { self.infer_stmt(stmt)? } } else { Type::Any };
1354                let pat = self.pat_to_var(pat, expr_ty)?;
1355                compiled.last_mut().ok_or_else(|| Self::semantic_error(stmt_span, "没有生成可绑定模式的编译语句")).and_then(|stmt| stmt.bind_pattern(pat))?;
1356            }
1357            StmtKind::Expr(expr, close) => {
1358                let e = self.eval(&expr, compiled, cap)?;
1359                compiled.push(Stmt::new(StmtKind::Expr(e, close), stmt_span));
1360            }
1361            StmtKind::Block(stmts) => {
1362                let mut block = Vec::new();
1363                for stmt in stmts {
1364                    self.compile_stmt(stmt, &mut block, cap)?;
1365                }
1366                compiled.push(Stmt::new(StmtKind::Block(block), stmt_span));
1367            }
1368            StmtKind::Fn { name, generic_params, args, body, is_pub } => {
1369                let (ty, args) = Type::from_args(args);
1370                if let Type::Fn { mut tys, ret } = ty {
1371                    let mut fn_cap = Capture::default();
1372                    let compiled_body = self.compile_fn(&args, &mut tys, *body, &mut fn_cap)?;
1373                    self.symbols.add(name, Symbol::Fn { ty: Type::Fn { tys, ret }, args, generic_params, cap: fn_cap, body: Arc::new(Stmt::new(StmtKind::Block(compiled_body), stmt_span)), is_pub });
1374                } else {
1375                    panic!("nested functions are not supported here")
1376                }
1377            }
1378            StmtKind::Return(expr) => {
1379                let expr = expr.and_then(|e| self.eval(&e, compiled, cap).ok());
1380                compiled.push(Stmt::new(StmtKind::Return(expr), stmt_span));
1381            }
1382            StmtKind::If { cond, then_body, else_body } => {
1383                let cond = self.eval(&cond, compiled, cap)?;
1384                if let Some(cond_value) = cond.compact()
1385                    && let Some(cond_bool) = cond_value.as_bool()
1386                {
1387                    if cond_bool {
1388                        self.compile_stmt(*then_body, compiled, cap)?;
1389                    } else if let Some(body) = else_body {
1390                        self.compile_stmt(*body, compiled, cap)?;
1391                    }
1392                } else {
1393                    let then_body = Box::new(self.get_stmt(*then_body, cap)?);
1394                    let else_body = if let Some(body) = else_body { Some(Box::new(self.get_stmt(*body, cap)?)) } else { None };
1395                    compiled.push(Stmt::new(StmtKind::If { cond, then_body, else_body }, stmt_span));
1396                }
1397            }
1398            StmtKind::Loop(body) => {
1399                compiled.push(Stmt::new(StmtKind::Loop(Box::new(self.get_stmt(*body, cap)?)), stmt_span));
1400            }
1401            StmtKind::While { cond, body } => {
1402                let cond = self.eval(&cond, compiled, cap)?;
1403                compiled.push(Stmt::new(StmtKind::While { cond, body: Box::new(self.get_stmt(*body, cap)?) }, stmt_span));
1404            }
1405            StmtKind::For { pat, range, body } => {
1406                let range = self.eval(&range, compiled, cap)?;
1407                let range_ty = self.infer_range_type(&range);
1408                let pat = self.pat_to_var(pat, range_ty)?;
1409                compiled.push(Stmt::new(StmtKind::For { pat, range, body: Box::new(self.get_stmt(*body, cap)?) }, stmt_span));
1410            }
1411            stmt_kind => {
1412                compiled.push(Stmt::new(stmt_kind, stmt_span));
1413            }
1414        }
1415        Ok(())
1416    }
1417}