Rewrite: C++ → Rust, Lexer + Error system complete
全量 Rust 重写 Fig 编译器前端。 Lexer: 43 个测试,千行压力测试通过,完整 UTF-8 支持(中文标识符/字符串),运算符最长匹配打表,单行/多行注释 + 错误恢复。 Error System: Diagnostic trait + Warning/Error/Critical 三级严重度,源码上下文渲染(Unicode 波浪线、中英双语 i18n),SourcePosition/SourceRange 为 LSP 准备,Related 关联信息,thrower 宏追踪编译器源码位置。 Build: cargo + build.rs(git hash + 编译时间戳)。 删除全部 C++ 源码。
This commit is contained in:
63
build.rs
Normal file
63
build.rs
Normal file
@@ -0,0 +1,63 @@
|
||||
use std::process::Command;
|
||||
|
||||
fn main() {
|
||||
let hash = Command::new("git")
|
||||
.args(["rev-parse", "--short=7", "HEAD"])
|
||||
.output()
|
||||
.ok()
|
||||
.and_then(|o| String::from_utf8(o.stdout).ok())
|
||||
.unwrap_or_default()
|
||||
.trim()
|
||||
.to_string();
|
||||
|
||||
println!("cargo:rustc-env=GIT_HASH={}", hash);
|
||||
println!("cargo:rustc-env=BUILD_TIME={}", chrono_build_time());
|
||||
|
||||
// 编译器 ID:macOS 上用 clang/LLVM,Linux 上用 GCC,Windows 上用 MSVC
|
||||
#[cfg(target_os = "macos")]
|
||||
{ println!("cargo:rustc-env=FIG_COMPILER_ID=LLVM"); }
|
||||
#[cfg(target_os = "linux")]
|
||||
{ println!("cargo:rustc-env=FIG_COMPILER_ID=GCC"); }
|
||||
#[cfg(target_os = "windows")]
|
||||
{ println!("cargo:rustc-env=FIG_COMPILER_ID=MSVC"); }
|
||||
#[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))]
|
||||
{ println!("cargo:rustc-env=FIG_COMPILER_ID=unknown"); }
|
||||
}
|
||||
|
||||
// chrono 还没引入,先用简单方式
|
||||
fn chrono_build_time() -> String {
|
||||
// RFC 3339 without nanoseconds: "2026-07-23T13:14:00+08:00"
|
||||
// 但纯 std 拿不到时区,用环境变量 SOURCE_DATE_EPOCH 或 UTC
|
||||
let now = std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap_or_default()
|
||||
.as_secs();
|
||||
|
||||
let secs = now % 86400;
|
||||
let days = now / 86400;
|
||||
|
||||
// 简单计算 UTC 时间,避免引入 chrono
|
||||
let hour = (secs / 3600) % 24;
|
||||
let min = (secs / 60) % 60;
|
||||
let sec = secs % 60;
|
||||
|
||||
// 粗略日期计算(从 1970-01-01 开始)
|
||||
let (y, mo, d) = civil_from_days(days as i64);
|
||||
|
||||
format!("{y:04}-{mo:02}-{d:02} {hour:02}:{min:02}:{sec:02} UTC")
|
||||
}
|
||||
|
||||
// 从 Unix epoch 天数反算年月日
|
||||
fn civil_from_days(days: i64) -> (i64, u32, u32) {
|
||||
let z = days + 719468;
|
||||
let era = if z >= 0 { z } else { z - 146096 } / 146097;
|
||||
let doe = (z - era * 146097) as u32;
|
||||
let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
|
||||
let y = yoe as i64 + era * 400;
|
||||
let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
|
||||
let mp = (5 * doy + 2) / 153;
|
||||
let d = doy - (153 * mp + 2) / 5 + 1;
|
||||
let m = if mp < 10 { mp + 3 } else { mp - 9 };
|
||||
let y = if m <= 2 { y + 1 } else { y };
|
||||
(y, m, d)
|
||||
}
|
||||
Reference in New Issue
Block a user