diff --git a/compiler/erg_common/python_util.rs b/compiler/erg_common/python_util.rs index 80659611..d7bae2c2 100644 --- a/compiler/erg_common/python_util.rs +++ b/compiler/erg_common/python_util.rs @@ -6,7 +6,8 @@ use std::process::Command; use crate::serialize::get_magic_num_from_bytes; #[cfg(unix)] -pub const BUILTIN_PYTHON_MODS: [&str; 18] = [ +pub const BUILTIN_PYTHON_MODS: [&str; 19] = [ + "datetime", "glob", "http", "importlib", @@ -27,7 +28,8 @@ pub const BUILTIN_PYTHON_MODS: [&str; 18] = [ "zipfile", ]; #[cfg(not(unix))] -pub const BUILTIN_PYTHON_MODS: [&str; 17] = [ +pub const BUILTIN_PYTHON_MODS: [&str; 18] = [ + "datetime", "glob", "http", "importlib", diff --git a/compiler/erg_compiler/context/initialize/mod.rs b/compiler/erg_compiler/context/initialize/mod.rs index c6dc1467..22698bec 100644 --- a/compiler/erg_compiler/context/initialize/mod.rs +++ b/compiler/erg_compiler/context/initialize/mod.rs @@ -130,8 +130,13 @@ impl Context { } } - fn register_builtin_immutable_private_var(&mut self, name: &'static str, t: Type) { - self.register_builtin_impl(name, t, Immutable, Private); + fn register_builtin_immutable_private_var( + &mut self, + name: &'static str, + t: Type, + py_name: Option<&'static str>, + ) { + self.register_builtin_py_impl(name, t, Immutable, Private, py_name); } fn register_builtin_const(&mut self, name: &str, vis: Visibility, obj: ValueObj) { @@ -359,10 +364,22 @@ impl Context { fn init_builtin_consts(&mut self) { // TODO: this is not a const, but a special property - self.register_builtin_immutable_private_var("__name__", Str); - self.register_builtin_immutable_private_var("license", mono("_sitebuiltins._Printer")); - self.register_builtin_immutable_private_var("credits", mono("_sitebuiltins._Printer")); - self.register_builtin_immutable_private_var("copyright", mono("_sitebuiltins._Printer")); + self.register_builtin_immutable_private_var("__name__", Str, Some("__name__")); + self.register_builtin_immutable_private_var( + "license", + mono("_sitebuiltins._Printer"), + Some("license"), + ); + self.register_builtin_immutable_private_var( + "credits", + mono("_sitebuiltins._Printer"), + Some("credits"), + ); + self.register_builtin_immutable_private_var( + "copyright", + mono("_sitebuiltins._Printer"), + Some("copyright"), + ); } /// see std/prelude.er diff --git a/compiler/erg_compiler/context/register.rs b/compiler/erg_compiler/context/register.rs index b6438409..2d258c2b 100644 --- a/compiler/erg_compiler/context/register.rs +++ b/compiler/erg_compiler/context/register.rs @@ -165,7 +165,17 @@ impl Context { }; // already defined as const if sig.is_const() { - let vi = self.decls.remove(ident.inspect()).unwrap(); + let vi = self.decls.remove(ident.inspect()).unwrap_or_else(|| { + VarInfo::new( + body_t.clone(), + Mutability::Const, + sig.vis(), + VarKind::Declared, + None, + self.impl_of(), + py_name, + ) + }); self.locals.insert(ident.name.clone(), vi); return Ok(()); } diff --git a/compiler/erg_compiler/lib/pystd/datetime.d.er b/compiler/erg_compiler/lib/pystd/datetime.d.er new file mode 100644 index 00000000..93424db1 --- /dev/null +++ b/compiler/erg_compiler/lib/pystd/datetime.d.er @@ -0,0 +1,11 @@ +.Date = 'date': ClassType +.Date.today!: () => .Date +.Date.min: .Date +.Date.max: .Date +.Time = 'time': ClassType +.DateTime = 'dateTime': ClassType +.DateTime.today!: () => .DateTime +.DateTime.now!: (tz := .TZInfo or NoneType) => .DateTime +.TimeDelta = 'timedelta': ClassType +.TZInfo = 'tzinfo': ClassType +.TimeZone = 'timezone': ClassType