Implement `import from` statement conversion

This commit is contained in:
Shunsuke Shibayama 2022-12-20 19:49:39 +09:00
parent a350da5142
commit 59c3bb16ac
2 changed files with 46 additions and 22 deletions

44
Cargo.lock generated
View File

@ -226,8 +226,8 @@ dependencies = [
[[package]]
name = "erg_common"
version = "0.6.0-beta.2"
source = "git+https://github.com/erg-lang/erg?branch=main#e7d82ecf4ac1b4338e56e44acbc287e28210499c"
version = "0.6.0-beta.3"
source = "git+https://github.com/erg-lang/erg?branch=main#7d25c1b54d4a24e9ff3de17ea00aeb8697f6b4b6"
dependencies = [
"hermit-abi",
"libc",
@ -236,8 +236,8 @@ dependencies = [
[[package]]
name = "erg_compiler"
version = "0.6.0-beta.2"
source = "git+https://github.com/erg-lang/erg?branch=main#e7d82ecf4ac1b4338e56e44acbc287e28210499c"
version = "0.6.0-beta.3"
source = "git+https://github.com/erg-lang/erg?branch=main#7d25c1b54d4a24e9ff3de17ea00aeb8697f6b4b6"
dependencies = [
"erg_common",
"erg_parser",
@ -245,8 +245,8 @@ dependencies = [
[[package]]
name = "erg_parser"
version = "0.6.0-beta.2"
source = "git+https://github.com/erg-lang/erg?branch=main#e7d82ecf4ac1b4338e56e44acbc287e28210499c"
version = "0.6.0-beta.3"
source = "git+https://github.com/erg-lang/erg?branch=main#7d25c1b54d4a24e9ff3de17ea00aeb8697f6b4b6"
dependencies = [
"erg_common",
"unicode-xid 0.2.4",
@ -329,9 +329,9 @@ dependencies = [
[[package]]
name = "itoa"
version = "1.0.4"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
[[package]]
name = "lalrpop"
@ -495,9 +495,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]]
name = "proc-macro2"
version = "1.0.47"
version = "1.0.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5"
dependencies = [
"unicode-ident",
]
@ -524,9 +524,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.21"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
dependencies = [
"proc-macro2",
]
@ -710,9 +710,9 @@ dependencies = [
[[package]]
name = "ryu"
version = "1.0.11"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
[[package]]
name = "serde"
@ -736,9 +736,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.89"
version = "1.0.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db"
checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883"
dependencies = [
"itoa",
"ryu",
@ -747,9 +747,9 @@ dependencies = [
[[package]]
name = "serde_repr"
version = "0.1.9"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca"
checksum = "9a5ec9fa74a20ebbe5d9ac23dac1fc96ba0ecfe9f50f2843b52e537b10fbcb4e"
dependencies = [
"proc-macro2",
"quote",
@ -816,9 +816,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "syn"
version = "1.0.105"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
dependencies = [
"proc-macro2",
"quote",
@ -917,9 +917,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
[[package]]
name = "unicode-ident"
version = "1.0.5"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
[[package]]
name = "unicode-normalization"

View File

@ -636,6 +636,30 @@ impl ASTConverter {
}
Expr::Dummy(Dummy::new(imports))
}
StatementType::ImportFrom { level: _, module, names } => {
let import_acc = Expr::Accessor(Accessor::Ident(Self::convert_ident("__import__".to_string(), stmt.location)));
let cont = format!("\"{}\"", module.clone().unwrap());
let mod_name = Expr::Lit(Literal::new(Token::new(TokenKind::StrLit, cont, stmt.location.row(), stmt.location.column() - 1)));
let args = Args::new(vec![PosArg::new(mod_name)], vec![], None);
let call = import_acc.call_expr(args);
let mod_ident = Self::convert_ident(module.unwrap(), stmt.location);
let mod_expr = Expr::Accessor(Accessor::Ident(mod_ident.clone()));
let var = VarSignature::new(VarPattern::Ident(mod_ident), None);
let moddef = Expr::Def(Def::new(Signature::Var(var), DefBody::new(EQUAL, Block::new(vec![call]), DefId(0))));
let mut imports = vec![];
for name in names {
let var = if let Some(alias) = name.alias {
VarSignature::new(VarPattern::Ident(Self::convert_ident(alias, stmt.location)), None)
} else {
VarSignature::new(VarPattern::Ident(Self::convert_ident(name.symbol.clone(), stmt.location)), None)
};
let attr = mod_expr.clone().attr_expr(Self::convert_ident(name.symbol, stmt.location));
let def = Def::new(Signature::Var(var), DefBody::new(EQUAL, Block::new(vec![attr]), DefId(0)));
imports.push(Expr::Def(def));
}
let imports = Dummy::new(vec![moddef].into_iter().chain(imports.into_iter()).collect());
Expr::Dummy(imports)
}
_other => {
erg_common::log!(err "unimplemented: {:?}", _other);
Expr::Dummy(Dummy::empty())