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