diff --git a/Cargo.lock b/Cargo.lock index 014c256..436d94d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -252,9 +252,9 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "els" -version = "0.1.24-nightly.3" +version = "0.1.24-nightly.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f3764c26581de3f7c346d73429ccccb8bc644c04590c426e6a762ef4b306b6" +checksum = "f74cdce8d05df8b4a6090cc892e34a30ab6880f5ed8786e9346fe4d4fb4c47d5" dependencies = [ "erg_common", "erg_compiler", @@ -274,9 +274,9 @@ dependencies = [ [[package]] name = "erg_common" -version = "0.6.12-nightly.3" +version = "0.6.12-nightly.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0af4f3dd859b94446be12295a587c1a0315772da8f4782c6e412c7b0ee6e6619" +checksum = "07cc57d02fe5520b0f0a42d30be2604edafa71a35074a35f579f2ca91533d965" dependencies = [ "backtrace-on-stack-overflow", "hermit-abi", @@ -286,9 +286,9 @@ dependencies = [ [[package]] name = "erg_compiler" -version = "0.6.12-nightly.3" +version = "0.6.12-nightly.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6058e923f99ab3f901256d4c005e675a9bd66b5b7c502535f27d41d66afc3c0" +checksum = "101a854704b5bda829d4fa6005d590b2f426ce6624b8361118b4949c7d90c859" dependencies = [ "erg_common", "erg_parser", @@ -296,9 +296,9 @@ dependencies = [ [[package]] name = "erg_parser" -version = "0.6.12-nightly.3" +version = "0.6.12-nightly.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecdcb02393d790e952ac55c9e49eb1e7485c86199bc770659915512e7647d9b3" +checksum = "43fe0229517462ba79374a8eb1b16a183f0854744af6d4ebfcd4b2ff05539121" dependencies = [ "erg_common", "unicode-xid 0.2.4", diff --git a/Cargo.toml b/Cargo.toml index 1d481de..86540bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,9 @@ edition = "2021" repository = "https://github.com/mtshiba/pylyzer" [workspace.dependencies] -erg_common = { version = "0.6.12-nightly.3", features = ["py_compat", "els"] } -erg_compiler = { version = "0.6.12-nightly.3", features = ["py_compat", "els"] } -els = { version = "0.1.24-nightly.3", features = ["py_compat"] } +erg_common = { version = "0.6.12-nightly.4", features = ["py_compat", "els"] } +erg_compiler = { version = "0.6.12-nightly.4", features = ["py_compat", "els"] } +els = { version = "0.1.24-nightly.4", features = ["py_compat"] } rustpython-parser = "0.1.2" # erg_compiler = { git = "https://github.com/erg-lang/erg", branch = "main", features = ["py_compat", "els"] } # erg_common = { git = "https://github.com/erg-lang/erg", branch = "main", features = ["py_compat", "els"] } diff --git a/crates/py2erg/convert.rs b/crates/py2erg/convert.rs index 6529e75..72507fb 100644 --- a/crates/py2erg/convert.rs +++ b/crates/py2erg/convert.rs @@ -12,7 +12,7 @@ use erg_compiler::erg_parser::ast::{ Dict, Dummy, Expr, Identifier, KeyValue, KwArg, Lambda, LambdaSignature, Literal, Methods, Module, NonDefaultParamSignature, NormalArray, NormalDict, NormalRecord, NormalSet, NormalTuple, ParamPattern, Params, PosArg, PreDeclTypeSpec, ReDef, Record, RecordAttrs, Set, - Signature, SimpleTypeSpec, SubrSignature, Tuple, TypeAscription, TypeBoundSpecs, TypeSpec, + Signature, SubrSignature, Tuple, TypeAscription, TypeBoundSpecs, TypeSpec, TypeSpecWithOp, UnaryOp, VarName, VarPattern, VarRecordAttr, VarRecordAttrs, VarRecordPattern, VarSignature, VisModifierSpec, ConstPosArg, ConstDict, ConstKeyValue, TupleTypeSpec, }; @@ -495,8 +495,8 @@ impl ASTConverter { Lambda::new(sig, op, Block::new(body), DefId(0)) } - fn convert_ident_type_spec(&mut self, name: String, loc: PyLocation) -> SimpleTypeSpec { - SimpleTypeSpec::new(self.convert_ident(name, loc), ConstArgs::empty()) + fn convert_ident_type_spec(&mut self, name: String, loc: PyLocation) -> TypeSpec { + TypeSpec::mono(self.convert_ident(name, loc)) } fn gen_dummy_type_spec(loc: PyLocation) -> TypeSpec { @@ -527,10 +527,7 @@ impl ASTConverter { let loc = args.location; let t = self.convert_type_spec(args); let ident = Identifier::private_with_line("NoneType".into(), loc.row() as u32); - let none = TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple(SimpleTypeSpec::new( - ident, - ConstArgs::empty(), - ))); + let none = TypeSpec::mono(ident); TypeSpec::or(t, none) } "Literal" => { @@ -612,15 +609,11 @@ impl ASTConverter { fn convert_type_spec(&mut self, expr: Located) -> TypeSpec { #[allow(clippy::collapsible_match)] match expr.node { - ExpressionType::Identifier { name } => TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple( - self.convert_ident_type_spec(name, expr.location), - )), - ExpressionType::None => TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple( - self.convert_ident_type_spec("NoneType".into(), expr.location), - )), + ExpressionType::Identifier { name } => self.convert_ident_type_spec(name, expr.location), + ExpressionType::None => self.convert_ident_type_spec("NoneType".into(), expr.location), ExpressionType::Attribute { value, name } => { let namespace = Box::new(self.convert_expr(*value)); - let t = self.convert_ident_type_spec(name, expr.location); + let t = self.convert_ident(name, expr.location); let predecl = PreDeclTypeSpec::Attr { namespace, t }; TypeSpec::PreDeclTy(predecl) } @@ -1029,9 +1022,7 @@ impl ASTConverter { param_typ_name.into(), attr.obj.ln_begin().unwrap_or(0), ); - let param_typ_spec = TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple( - SimpleTypeSpec::new(param_typ_ident.clone(), ConstArgs::empty()), - )); + let param_typ_spec = TypeSpec::mono(param_typ_ident.clone()); let expr = Expr::Accessor(Accessor::Ident(param_typ_ident.clone())); let param_typ_spec = TypeSpecWithOp::new(AS, param_typ_spec, expr); let arg_typ_ident = Identifier::public_with_line( @@ -1082,10 +1073,7 @@ impl ASTConverter { self.namespace.last().unwrap().into(), sig.ln_begin().unwrap_or(0), ); - let class_spec = TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple(SimpleTypeSpec::new( - class_ident, - ConstArgs::empty(), - ))); + let class_spec = TypeSpec::mono(class_ident); let sig = Signature::Subr(SubrSignature::new( set! { Decorator(Expr::static_local("Override")) }, call_ident, @@ -1109,10 +1097,7 @@ impl ASTConverter { let params = Params::new(vec![], None, vec![], None); let class_ident = Identifier::public_with_line(DOT, self.namespace.last().unwrap().into(), line as u32); - let class_spec = TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple(SimpleTypeSpec::new( - class_ident, - ConstArgs::empty(), - ))); + let class_spec = TypeSpec::mono(class_ident); let sig = Signature::Subr(SubrSignature::new( set! { Decorator(Expr::static_local("Override")) }, call_ident, @@ -1214,10 +1199,7 @@ impl ASTConverter { body: Vec>, inherit: bool, ) -> (Option, Vec) { - let class = TypeSpec::PreDeclTy(PreDeclTypeSpec::Simple(SimpleTypeSpec::new( - ident.clone(), - ConstArgs::empty(), - ))); + let class = TypeSpec::mono(ident.clone()); let class_as_expr = Expr::Accessor(Accessor::Ident(ident)); let (base_type, attrs) = self.extract_method(body, inherit); let methods = Methods::new(class, class_as_expr, VisModifierSpec::Public(DOT), attrs); @@ -1704,6 +1686,7 @@ impl ASTConverter { } Expr::Dummy(Dummy::new(None, imports)) } + // from module import foo, bar StatementType::ImportFrom { level: _, module, @@ -1712,13 +1695,11 @@ impl ASTConverter { let import_acc = Expr::Accessor(Accessor::Ident( self.convert_ident("__import__".to_string(), stmt.location), )); + let module = module + .unwrap_or_else(|| names[0].symbol.clone()) + .replace('.', "/"); // from . import foo ==> import "./foo" - let cont = format!( - "\"{}\"", - module - .unwrap_or_else(|| names[0].symbol.clone()) - .replace('.', "/") - ); + let cont = format!("\"{module}\""); let mod_name = Expr::Literal(Literal::new(Token::new( TokenKind::StrLit, cont, @@ -1728,17 +1709,32 @@ impl ASTConverter { let args = Args::new(vec![PosArg::new(mod_name)], None, vec![], None); let call = import_acc.call_expr(args); let mut imports = vec![]; + // `from module import ` + let mut loc = PyLocation::new(stmt.location.row(), stmt.location.column() + 5 + module.len() + 8); for name in names { - let true_name = self.convert_ident(name.symbol.clone(), stmt.location); + let true_name = self.convert_ident(name.symbol.clone(), loc); let alias = if let Some(alias) = name.alias { + // ` as ` + for _ in 0..name.symbol.len() + 4 { + loc.go_right(); + } self.register_name_info(&alias, NameKind::Variable); + let alias_len = alias.len(); + let ident = self.convert_ident(alias, loc); + // `, ` + for _ in 0..alias_len + 2 { + loc.go_right(); + } VarSignature::new( - VarPattern::Ident(self.convert_ident(alias, stmt.location)), + VarPattern::Ident(ident), None, ) } else { self.register_name_info(&name.symbol, NameKind::Variable); - let ident = self.convert_ident(name.symbol.clone(), stmt.location); + let ident = self.convert_ident(name.symbol.clone(), loc); + for _ in 0..name.symbol.len() + 2 { + loc.go_right(); + } VarSignature::new(VarPattern::Ident(ident), None) }; imports.push(VarRecordAttr::new(true_name, alias));