diff --git a/crates/py2erg/convert.rs b/crates/py2erg/convert.rs index 2cd9b02..544d5c4 100644 --- a/crates/py2erg/convert.rs +++ b/crates/py2erg/convert.rs @@ -2177,6 +2177,7 @@ impl ASTConverter { imports.push(VarRecordAttr::new(true_name, alias)); } } + let no_import = imports.is_empty(); let attrs = VarRecordAttrs::new(imports); let pat = VarRecordPattern::new(Token::DUMMY, attrs, Token::DUMMY); let var = VarSignature::new(VarPattern::Record(pat), None); @@ -2184,7 +2185,9 @@ impl ASTConverter { Signature::Var(var), DefBody::new(EQUAL, Block::new(vec![call]), DefId(0)), )); - if exprs.is_empty() { + if no_import { + Expr::Dummy(Dummy::new(None, exprs)) + } else if exprs.is_empty() { def } else { exprs.push(def); diff --git a/crates/py2erg/gen_decl.rs b/crates/py2erg/gen_decl.rs index bb6f27c..bdd20c4 100644 --- a/crates/py2erg/gen_decl.rs +++ b/crates/py2erg/gen_decl.rs @@ -70,10 +70,9 @@ impl DeclFileGenerator { .ident() .inspect() .replace('\0', "") - .replace('%', "___"); + .replace(['%', '*'], "___"); let ref_t = def.sig.ident().ref_t(); - let typ = ref_t.replace_failure().to_string_unabbreviated(); - let typ = escape_type(typ); + let typ = escape_type(ref_t.replace_failure().to_string_unabbreviated()); // Erg can automatically import nested modules // `import http.client` => `http = pyimport "http"` let decl = if ref_t.is_py_module() { @@ -104,14 +103,19 @@ impl DeclFileGenerator { .ident() .inspect() .replace('\0', "") - .replace('%', "___"); + .replace(['%', '*'], "___"); let src = format!("{}.{class_name}", self.namespace); let stash = std::mem::replace(&mut self.namespace, src); let decl = format!(".{class_name}: ClassType"); self.code += &decl; self.code.push('\n'); if let GenTypeObj::Subclass(class) = &def.obj { - let sup = class.sup.as_ref().typ().to_string_unabbreviated(); + let sup = class + .sup + .as_ref() + .typ() + .replace_failure() + .to_string_unabbreviated(); let sup = escape_type(sup); let decl = format!(".{class_name} <: {sup}\n"); self.code += &decl; @@ -122,7 +126,7 @@ impl DeclFileGenerator { }) = def.obj.base_or_sup() { for (attr, t) in rec.iter() { - let typ = escape_type(t.to_string_unabbreviated()); + let typ = escape_type(t.replace_failure().to_string_unabbreviated()); let decl = format!("{}.{}: {typ}\n", self.namespace, attr.symbol); self.code += &decl; } @@ -133,7 +137,7 @@ impl DeclFileGenerator { }) = def.obj.additional() { for (attr, t) in rec.iter() { - let typ = escape_type(t.to_string_unabbreviated()); + let typ = escape_type(t.replace_failure().to_string_unabbreviated()); let decl = format!("{}.{}: {typ}\n", self.namespace, attr.symbol); self.code += &decl; } diff --git a/tests/import.py b/tests/import.py index bf64c73..51f49bc 100644 --- a/tests/import.py +++ b/tests/import.py @@ -1,5 +1,6 @@ import export import foo +from . import foo from foo import bar from foo import baz import random