From 74194112439bb745632bdb2b447e353405f8234a Mon Sep 17 00:00:00 2001 From: Shunsuke Shibayama Date: Fri, 24 Mar 2023 18:47:45 +0900 Subject: [PATCH] fix: module resolution bug --- crates/py2erg/convert.rs | 1 + crates/py2erg/gen_decl.rs | 34 ++++++++++++++++++++++++++++------ tests/export.py | 2 ++ tests/import.py | 1 + 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/crates/py2erg/convert.rs b/crates/py2erg/convert.rs index 475a0e2..e9bd0b4 100644 --- a/crates/py2erg/convert.rs +++ b/crates/py2erg/convert.rs @@ -78,6 +78,7 @@ fn escape_name(name: String) -> String { "str" => "Str".into(), "bool" => "Bool".into(), "list" => "GenericArray".into(), + "bytes" => "Bytes".into(), // "range" => "GenericRange".into(), "dict" => "GenericDict".into(), "set" => "GenericSet".into(), diff --git a/crates/py2erg/gen_decl.rs b/crates/py2erg/gen_decl.rs index f3cf260..3918c09 100644 --- a/crates/py2erg/gen_decl.rs +++ b/crates/py2erg/gen_decl.rs @@ -56,17 +56,34 @@ pub fn gen_decl_er(input: &Input, hir: HIR, status: CheckStatus) -> DeclFile { fn gen_chunk_decl(namespace: &str, chunk: Expr, code: &mut String) { match chunk { Expr::Def(def) => { - let name = def.sig.ident().inspect().replace('\0', ""); - if name.starts_with('%') { - return; - } + let mut name = def + .sig + .ident() + .inspect() + .replace('\0', "") + .replace('%', "___"); let typ = def.sig.ident().ref_t().to_string(); let typ = escape_type(typ); - let decl = format!("{namespace}.{name}: {typ}"); + // Erg can automatically import nested modules + // `import http.client` => `http = pyimport "http"` + let decl = if def.sig.ident().ref_t().is_py_module() { + name = name.split('.').next().unwrap().to_string(); + format!( + "{namespace}.{name} = pyimport {}", + def.sig.ident().ref_t().typarams()[0] + ) + } else { + format!("{namespace}.{name}: {typ}") + }; *code += &decl; } Expr::ClassDef(def) => { - let class_name = def.sig.ident().inspect().replace('\0', ""); + let class_name = def + .sig + .ident() + .inspect() + .replace('\0', "") + .replace('%', "___"); let namespace = format!("{namespace}.{class_name}"); let decl = format!(".{class_name}: ClassType"); *code += &decl; @@ -103,6 +120,11 @@ fn gen_chunk_decl(namespace: &str, chunk: Expr, code: &mut String) { gen_chunk_decl(&namespace, attr, code); } } + Expr::Dummy(dummy) => { + for chunk in dummy.into_iter() { + gen_chunk_decl(namespace, chunk, code); + } + } _ => {} } code.push('\n'); diff --git a/tests/export.py b/tests/export.py index e4f901f..e35f78d 100644 --- a/tests/export.py +++ b/tests/export.py @@ -1,3 +1,5 @@ +import http.client + test = 1 def add(a, b): diff --git a/tests/import.py b/tests/import.py index 5d7563f..5c4c5ad 100644 --- a/tests/import.py +++ b/tests/import.py @@ -33,3 +33,4 @@ max_delta = timedelta.max assert dt.datetime.max == max_date Resp = http.client.HTTPResponse +assert export.http.client.HTTPResponse == Resp