Compare commits

...

14 Commits

Author SHA1 Message Date
Shunsuke Shibayama 5eb9db3b8a build: update version (v0.0.41) 2023-08-24 14:58:57 +09:00
Shunsuke Shibayama ebc7eaf929 build: update version (v0.0.40) 2023-08-10 08:37:50 +09:00
Shunsuke Shibayama 3a82bb0392 build: update version (v0.0.39) 2023-07-28 23:37:10 +09:00
Shunsuke Shibayama 8e8fc8eb29 fix: shadowing bug 2023-07-28 23:29:23 +09:00
Shunsuke Shibayama 6f65d113b5 build: update deps 2023-07-28 23:23:41 +09:00
Shunsuke Shibayama a94a51aac8 build: update version (v0.0.38) 2023-07-26 01:48:18 +09:00
Shunsuke Shibayama e7f3931d64 build: update version (v0.0.37) 2023-07-07 01:27:29 +09:00
Shunsuke Shibayama bbe3bc39ab build: update deps & internal changes 2023-07-07 01:19:28 +09:00
Shunsuke Shibayama b1988b73b1 build: update version (v0.0.36) 2023-07-03 22:45:27 +09:00
Shunsuke Shibayama 3a55f989da build: update version (v0.0.35) 2023-07-03 20:18:54 +09:00
Shunsuke Shibayama 51dbe6d7ec build: update version (v0.0.34) 2023-07-03 01:06:17 +09:00
Shunsuke Shibayama 7384e17243 build: update version (v0.0.33) 2023-06-30 23:31:59 +09:00
Shunsuke Shibayama f505c18f74 build: update version (v0.0.32) 2023-06-26 14:00:48 +09:00
Shunsuke Shibayama db79b8b233 build: update deps 2023-06-26 13:34:42 +09:00
10 changed files with 378 additions and 160 deletions

288
Cargo.lock generated
View File

@ -4,9 +4,9 @@ version = 3
[[package]] [[package]]
name = "addr2line" name = "addr2line"
version = "0.19.0" version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
dependencies = [ dependencies = [
"gimli", "gimli",
] ]
@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "1.0.1" version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -75,9 +75,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.67" version = "0.3.69"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
dependencies = [ dependencies = [
"addr2line", "addr2line",
"cc", "cc",
@ -172,9 +172,12 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.79" version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
@ -199,9 +202,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.15" version = "0.8.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
] ]
@ -246,15 +249,15 @@ dependencies = [
[[package]] [[package]]
name = "either" name = "either"
version = "1.8.1" version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]] [[package]]
name = "els" name = "els"
version = "0.1.26-nightly.4" version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c5a0e259df10904a6f0a16a63ad896cebfcbd46086c3cec3de72de82087460e" checksum = "17769c569be9b7c6b52b254651ad6e98e5c144d1e08a58c0dca94d3398b576a7"
dependencies = [ dependencies = [
"erg_common", "erg_common",
"erg_compiler", "erg_compiler",
@ -274,21 +277,20 @@ dependencies = [
[[package]] [[package]]
name = "erg_common" name = "erg_common"
version = "0.6.14-nightly.4" version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d198aa66805c129d8bf54ac2a6b141146f01a01b03b3b02777fb2bc88613578" checksum = "ac8819e38222e0a4e971b0835b83f02d5f990ab83a6912cbcd0e924aa0187fec"
dependencies = [ dependencies = [
"backtrace-on-stack-overflow", "backtrace-on-stack-overflow",
"hermit-abi", "parking_lot",
"libc", "thread_local",
"winapi",
] ]
[[package]] [[package]]
name = "erg_compiler" name = "erg_compiler"
version = "0.6.14-nightly.4" version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1297cb7c6aacd21439a038ca8a4cdcc650fa1b92a23cb1ac902cb2d17dc4e1a4" checksum = "ce0197836e3ac1e09da5584543d3157d5ee3a7d151fe099c478008359d3cd879"
dependencies = [ dependencies = [
"erg_common", "erg_common",
"erg_parser", "erg_parser",
@ -296,9 +298,9 @@ dependencies = [
[[package]] [[package]]
name = "erg_parser" name = "erg_parser"
version = "0.6.14-nightly.4" version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac57a120256d58782ca7d0d336969894af7396918909b14cda8ddbf1bcd3a845" checksum = "da7dba865dc494c8348497e1917491a8f9efcd6908d1edff5f90b22aae70a214"
dependencies = [ dependencies = [
"erg_common", "erg_common",
"unicode-xid 0.2.4", "unicode-xid 0.2.4",
@ -318,9 +320,9 @@ checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33"
[[package]] [[package]]
name = "form_urlencoded" name = "form_urlencoded"
version = "1.1.0" version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
dependencies = [ dependencies = [
"percent-encoding", "percent-encoding",
] ]
@ -353,9 +355,9 @@ dependencies = [
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.27.2" version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
@ -368,9 +370,9 @@ dependencies = [
[[package]] [[package]]
name = "idna" name = "idna"
version = "0.3.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
dependencies = [ dependencies = [
"unicode-bidi", "unicode-bidi",
"unicode-normalization", "unicode-normalization",
@ -387,9 +389,9 @@ dependencies = [
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.6" version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]] [[package]]
name = "lalrpop" name = "lalrpop"
@ -430,18 +432,25 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.144" version = "0.2.147"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
[[package]]
name = "lock_api"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
dependencies = [
"autocfg 1.1.0",
"scopeguard",
]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.17" version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
dependencies = [
"cfg-if",
]
[[package]] [[package]]
name = "lsp-types" name = "lsp-types"
@ -473,9 +482,9 @@ dependencies = [
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.6.2" version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
dependencies = [ dependencies = [
"adler", "adler",
] ]
@ -522,22 +531,28 @@ dependencies = [
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.15" version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
dependencies = [ dependencies = [
"autocfg 1.1.0", "autocfg 1.1.0",
] ]
[[package]] [[package]]
name = "object" name = "object"
version = "0.30.3" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "once_cell"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
[[package]] [[package]]
name = "opaque-debug" name = "opaque-debug"
version = "0.2.3" version = "0.2.3"
@ -551,10 +566,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063"
[[package]] [[package]]
name = "percent-encoding" name = "parking_lot"
version = "2.2.0" version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.3.5",
"smallvec",
"windows-targets",
]
[[package]]
name = "percent-encoding"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
[[package]] [[package]]
name = "petgraph" name = "petgraph"
@ -593,16 +631,16 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.58" version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "py2erg" name = "py2erg"
version = "0.0.31" version = "0.0.41"
dependencies = [ dependencies = [
"erg_common", "erg_common",
"erg_compiler", "erg_compiler",
@ -611,7 +649,7 @@ dependencies = [
[[package]] [[package]]
name = "pylyzer" name = "pylyzer"
version = "0.0.31" version = "0.0.41"
dependencies = [ dependencies = [
"els", "els",
"erg_common", "erg_common",
@ -622,9 +660,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.27" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -750,6 +788,15 @@ version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
[[package]]
name = "redox_syscall"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
dependencies = [
"bitflags",
]
[[package]] [[package]]
name = "redox_users" name = "redox_users"
version = "0.3.5" version = "0.3.5"
@ -757,19 +804,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
dependencies = [ dependencies = [
"getrandom", "getrandom",
"redox_syscall", "redox_syscall 0.1.57",
"rust-argon2", "rust-argon2",
] ]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.8.1" version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
"regex-syntax 0.7.1", "regex-automata",
"regex-syntax 0.7.4",
]
[[package]]
name = "regex-automata"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax 0.7.4",
] ]
[[package]] [[package]]
@ -780,9 +839,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.7.1" version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
[[package]] [[package]]
name = "rust-argon2" name = "rust-argon2"
@ -820,24 +879,30 @@ dependencies = [
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.13" version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.163" version = "1.0.186"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.163" version = "1.0.186"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -846,9 +911,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.96" version = "1.0.105"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -857,9 +922,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_repr" name = "serde_repr"
version = "0.1.12" version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -884,6 +949,12 @@ version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
[[package]]
name = "smallvec"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
[[package]] [[package]]
name = "string_cache" name = "string_cache"
version = "0.7.5" version = "0.7.5"
@ -926,9 +997,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.16" version = "2.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -946,6 +1017,16 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "thread_local"
version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
dependencies = [
"cfg-if",
"once_cell",
]
[[package]] [[package]]
name = "tinyvec" name = "tinyvec"
version = "1.6.0" version = "1.6.0"
@ -1027,9 +1108,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.8" version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
[[package]] [[package]]
name = "unicode-normalization" name = "unicode-normalization"
@ -1060,9 +1141,9 @@ checksum = "87d6678d7916394abad0d4b19df4d3802e1fd84abd7d701f39b75ee71b9e8cf1"
[[package]] [[package]]
name = "url" name = "url"
version = "2.3.1" version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
dependencies = [ dependencies = [
"form_urlencoded", "form_urlencoded",
"idna", "idna",
@ -1097,3 +1178,60 @@ name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-targets"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"

View File

@ -15,16 +15,16 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.0.31" version = "0.0.41"
authors = ["Shunsuke Shibayama <sbym1346@gmail.com>"] authors = ["Shunsuke Shibayama <sbym1346@gmail.com>"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2021" edition = "2021"
repository = "https://github.com/mtshiba/pylyzer" repository = "https://github.com/mtshiba/pylyzer"
[workspace.dependencies] [workspace.dependencies]
erg_common = { version = "0.6.14-nightly.4", features = ["py_compat", "els"] } erg_common = { version = "0.6.19", features = ["py_compat", "els"] }
erg_compiler = { version = "0.6.14-nightly.4", features = ["py_compat", "els"] } erg_compiler = { version = "0.6.19", features = ["py_compat", "els"] }
els = { version = "0.1.26-nightly.4", features = ["py_compat"] } els = { version = "0.1.31", features = ["py_compat"] }
rustpython-parser = "0.1.2" rustpython-parser = "0.1.2"
# erg_compiler = { git = "https://github.com/erg-lang/erg", branch = "main", features = ["py_compat", "els"] } # 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"] } # erg_common = { git = "https://github.com/erg-lang/erg", branch = "main", features = ["py_compat", "els"] }
@ -45,7 +45,7 @@ erg_compiler = { workspace = true }
erg_common = { workspace = true } erg_common = { workspace = true }
els = { workspace = true } els = { workspace = true }
rustpython-parser = { workspace = true } rustpython-parser = { workspace = true }
py2erg = { version = "0.0.31", path = "./crates/py2erg" } py2erg = { version = "0.0.41", path = "./crates/py2erg" }
[lib] [lib]
path = "src/lib.rs" path = "src/lib.rs"

View File

@ -2,7 +2,7 @@ use std::path::Path;
use erg_common::config::ErgConfig; use erg_common::config::ErgConfig;
use erg_common::dict::Dict as HashMap; use erg_common::dict::Dict as HashMap;
use erg_common::fresh::fresh_varname; use erg_common::fresh::FRESH_GEN;
use erg_common::set::Set as HashSet; use erg_common::set::Set as HashSet;
use erg_common::traits::{Locational, Stream}; use erg_common::traits::{Locational, Stream};
use erg_common::{log, set}; use erg_common::{log, set};
@ -19,7 +19,7 @@ use erg_compiler::erg_parser::ast::{
VisModifierSpec, VisModifierSpec,
}; };
use erg_compiler::erg_parser::desugar::Desugarer; use erg_compiler::erg_parser::desugar::Desugarer;
use erg_compiler::erg_parser::token::{Token, TokenKind, AS, DOT, EQUAL}; use erg_compiler::erg_parser::token::{Token, TokenKind, AS, COLON, DOT, EQUAL};
use erg_compiler::erg_parser::Parser; use erg_compiler::erg_parser::Parser;
use erg_compiler::error::{CompileError, CompileErrors}; use erg_compiler::error::{CompileError, CompileErrors};
use rustpython_parser::ast::{ use rustpython_parser::ast::{
@ -34,6 +34,21 @@ use crate::error::*;
pub const ARROW: Token = Token::dummy(TokenKind::FuncArrow, "->"); pub const ARROW: Token = Token::dummy(TokenKind::FuncArrow, "->");
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CanShadow {
Yes,
No,
}
impl CanShadow {
pub const fn is_yes(&self) -> bool {
matches!(self, Self::Yes)
}
pub const fn is_no(&self) -> bool {
matches!(self, Self::No)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum NameKind { pub enum NameKind {
Variable, Variable,
@ -225,7 +240,7 @@ pub struct ASTConverter {
block_id_counter: usize, block_id_counter: usize,
block_ids: Vec<usize>, block_ids: Vec<usize>,
/// Erg does not allow variables to be defined multiple times, so rename them using this /// Erg does not allow variables to be defined multiple times, so rename them using this
names: HashMap<String, NameInfo>, names: Vec<HashMap<String, NameInfo>>,
warns: CompileErrors, warns: CompileErrors,
errs: CompileErrors, errs: CompileErrors,
} }
@ -238,18 +253,46 @@ impl ASTConverter {
namespace: vec![String::from("<module>")], namespace: vec![String::from("<module>")],
block_id_counter: 0, block_id_counter: 0,
block_ids: vec![0], block_ids: vec![0],
names: HashMap::new(), names: vec![HashMap::new()],
warns: CompileErrors::empty(), warns: CompileErrors::empty(),
errs: CompileErrors::empty(), errs: CompileErrors::empty(),
} }
} }
fn get_name(&self, name: &str) -> Option<&NameInfo> { fn get_name(&self, name: &str) -> Option<&NameInfo> {
self.names.get(name) for ns in self.names.iter().rev() {
if let Some(ni) = ns.get(name) {
return Some(ni);
}
}
None
} }
fn get_mut_name(&mut self, name: &str) -> Option<&mut NameInfo> { fn get_mut_name(&mut self, name: &str) -> Option<&mut NameInfo> {
self.names.get_mut(name) for ns in self.names.iter_mut().rev() {
if let Some(ni) = ns.get_mut(name) {
return Some(ni);
}
}
None
}
fn define_name(&mut self, name: String, info: NameInfo) {
self.names.last_mut().unwrap().insert(name, info);
}
fn declare_name(&mut self, name: String, info: NameInfo) {
self.names.first_mut().unwrap().insert(name, info);
}
fn grow(&mut self, namespace: String) {
self.namespace.push(namespace);
self.names.push(HashMap::new());
}
fn pop(&mut self) {
self.namespace.pop();
self.names.pop();
} }
fn cur_block_id(&self) -> usize { fn cur_block_id(&self) -> usize {
@ -260,14 +303,21 @@ impl ASTConverter {
self.namespace.join(".") self.namespace.join(".")
} }
fn register_name_info(&mut self, name: &str, kind: NameKind) { fn register_name_info(&mut self, name: &str, kind: NameKind) -> CanShadow {
let cur_namespace = self.cur_namespace(); let cur_namespace = self.cur_namespace();
if let Some(name_info) = self.names.get_mut(name) { let cur_block_id = self.cur_block_id();
if name_info.defined_in == cur_namespace { if let Some(name_info) = self.get_mut_name(name) {
if name_info.defined_in == cur_namespace && name_info.defined_block_id == cur_block_id {
name_info.defined_times += 1; name_info.defined_times += 1;
} else if name_info.defined_in.is_unknown() { }
if name_info.defined_in.is_unknown() {
name_info.defined_in = DefinedPlace::Known(cur_namespace); name_info.defined_in = DefinedPlace::Known(cur_namespace);
name_info.defined_times += 1; name_info.defined_times += 1; // 0 -> 1
}
if name_info.defined_block_id == cur_block_id {
CanShadow::Yes
} else {
CanShadow::No
} }
} else { } else {
// In Erg, classes can only be defined in uppercase // In Erg, classes can only be defined in uppercase
@ -279,7 +329,8 @@ impl ASTConverter {
}; };
let defined_in = DefinedPlace::Known(self.cur_namespace()); let defined_in = DefinedPlace::Known(self.cur_namespace());
let info = NameInfo::new(rename, defined_in, self.cur_block_id(), 1); let info = NameInfo::new(rename, defined_in, self.cur_block_id(), 1);
self.names.insert(String::from(name), info); self.define_name(String::from(name), info);
CanShadow::Yes
} }
} }
@ -320,7 +371,7 @@ impl ASTConverter {
}; };
let mut info = NameInfo::new(None, defined_in, cur_block_id, 0); let mut info = NameInfo::new(None, defined_in, cur_block_id, 0);
info.add_referrer(cur_namespace); info.add_referrer(cur_namespace);
self.names.insert(name.clone(), info); self.declare_name(name.clone(), info);
name name
}; };
let token = Token::new( let token = Token::new(
@ -357,6 +408,7 @@ impl ASTConverter {
Identifier::new(VisModifierSpec::Public(dot), name) Identifier::new(VisModifierSpec::Public(dot), name)
} }
// Duplicate param names will result in an error at the parser. So we don't need to check it here.
fn convert_param_pattern(&mut self, arg: String, loc: PyLocation) -> ParamPattern { fn convert_param_pattern(&mut self, arg: String, loc: PyLocation) -> ParamPattern {
self.register_name_info(&arg, NameKind::Variable); self.register_name_info(&arg, NameKind::Variable);
let ident = self.convert_ident(arg, loc); let ident = self.convert_ident(arg, loc);
@ -444,9 +496,8 @@ impl ASTConverter {
(self.convert_for_param(name, expr.location), vec![]) (self.convert_for_param(name, expr.location), vec![])
} }
ExpressionType::Tuple { elements } => { ExpressionType::Tuple { elements } => {
let tmp = fresh_varname(); let tmp = FRESH_GEN.fresh_varname();
let tmp_name = let tmp_name = VarName::from_str_and_line(tmp, expr.location.row() as u32);
VarName::from_str_and_line((&tmp).into(), expr.location.row() as u32);
let tmp_expr = Expr::Accessor(Accessor::Ident(Identifier::new( let tmp_expr = Expr::Accessor(Accessor::Ident(Identifier::new(
VisModifierSpec::Public(DOT), VisModifierSpec::Public(DOT),
tmp_name.clone(), tmp_name.clone(),
@ -1055,10 +1106,10 @@ impl ASTConverter {
Expr::BinOp(BinOp::new(op, lhs, rhs)) Expr::BinOp(BinOp::new(op, lhs, rhs))
} }
ExpressionType::Lambda { args, body } => { ExpressionType::Lambda { args, body } => {
self.namespace.push("<lambda>".to_string()); self.grow("<lambda>".to_string());
let params = self.convert_params(*args); let params = self.convert_params(*args);
let body = vec![self.convert_expr(*body)]; let body = vec![self.convert_expr(*body)];
self.namespace.pop(); self.pop();
let sig = LambdaSignature::new(params, None, TypeBoundSpecs::empty()); let sig = LambdaSignature::new(params, None, TypeBoundSpecs::empty());
let op = Token::from_str(TokenKind::FuncArrow, "->"); let op = Token::from_str(TokenKind::FuncArrow, "->");
Expr::Lambda(Lambda::new(sig, op, Block::new(body), DefId(0))) Expr::Lambda(Lambda::new(sig, op, Block::new(body), DefId(0)))
@ -1263,7 +1314,9 @@ impl ASTConverter {
self.namespace.last().unwrap().into(), self.namespace.last().unwrap().into(),
sig.ln_begin().unwrap_or(0), sig.ln_begin().unwrap_or(0),
); );
let class_expr = Expr::Accessor(Accessor::Ident(class_ident.clone()));
let class_spec = TypeSpec::mono(class_ident); let class_spec = TypeSpec::mono(class_ident);
let class_spec = TypeSpecWithOp::new(COLON, class_spec, class_expr);
let sig = Signature::Subr(SubrSignature::new( let sig = Signature::Subr(SubrSignature::new(
set! { Decorator(Expr::static_local("Override")) }, set! { Decorator(Expr::static_local("Override")) },
call_ident, call_ident,
@ -1287,7 +1340,9 @@ impl ASTConverter {
let params = Params::new(vec![], None, vec![], None); let params = Params::new(vec![], None, vec![], None);
let class_ident = let class_ident =
Identifier::public_with_line(DOT, self.namespace.last().unwrap().into(), line as u32); Identifier::public_with_line(DOT, self.namespace.last().unwrap().into(), line as u32);
let class_expr = Expr::Accessor(Accessor::Ident(class_ident.clone()));
let class_spec = TypeSpec::mono(class_ident); let class_spec = TypeSpec::mono(class_ident);
let class_spec = TypeSpecWithOp::new(COLON, class_spec, class_expr);
let sig = Signature::Subr(SubrSignature::new( let sig = Signature::Subr(SubrSignature::new(
set! { Decorator(Expr::static_local("Override")) }, set! { Decorator(Expr::static_local("Override")) },
call_ident, call_ident,
@ -1322,8 +1377,7 @@ impl ASTConverter {
if def if def
.sig .sig
.ident() .ident()
.map(|id| &id.inspect()[..] == "__init__") .is_some_and(|id| &id.inspect()[..] == "__init__")
.unwrap_or(false)
{ {
if let Some(call_def) = self.extract_init(&mut base_type, def) { if let Some(call_def) = self.extract_init(&mut base_type, def) {
attrs.insert(0, ClassAttr::Def(call_def)); attrs.insert(0, ClassAttr::Def(call_def));
@ -1406,15 +1460,11 @@ impl ASTConverter {
loc: PyLocation, loc: PyLocation,
) -> Expr { ) -> Expr {
// if reassigning of a function referenced by other functions is occurred, it is an error // if reassigning of a function referenced by other functions is occurred, it is an error
if self if self.get_name(&name).is_some_and(|info| {
.get_name(&name) info.defined_times > 0
.map(|info| { && info.defined_in == DefinedPlace::Known(self.cur_namespace())
info.defined_times > 0 && !info.referenced.difference(&set! {name.clone()}).is_empty()
&& info.defined_in == DefinedPlace::Known(self.cur_namespace()) }) {
&& !info.referenced.difference(&set! {name.clone()}).is_empty()
})
.unwrap_or(false)
{
let err = reassign_func_error( let err = reassign_func_error(
self.cfg.input.clone(), self.cfg.input.clone(),
pyloc_to_ergloc(loc, name.len()), pyloc_to_ergloc(loc, name.len()),
@ -1431,9 +1481,13 @@ impl ASTConverter {
self.register_name_info(&name, NameKind::Function); self.register_name_info(&name, NameKind::Function);
let func_name_loc = PyLocation::new(loc.row(), loc.column() + 4); let func_name_loc = PyLocation::new(loc.row(), loc.column() + 4);
let ident = self.convert_ident(name, func_name_loc); let ident = self.convert_ident(name, func_name_loc);
self.namespace.push(ident.inspect().to_string()); self.grow(ident.inspect().to_string());
let params = self.convert_params(params); let params = self.convert_params(params);
let return_t = returns.map(|ret| self.convert_type_spec(ret)); let return_t = returns.map(|ret| {
let t_spec = self.convert_type_spec(clone_loc_expr(&ret));
let expr = self.convert_expr(ret);
TypeSpecWithOp::new(COLON, t_spec, expr)
});
let sig = Signature::Subr(SubrSignature::new( let sig = Signature::Subr(SubrSignature::new(
decos, decos,
ident, ident,
@ -1444,7 +1498,7 @@ impl ASTConverter {
let block = self.convert_block(body, BlockKind::Function); let block = self.convert_block(body, BlockKind::Function);
let body = DefBody::new(EQUAL, block, DefId(0)); let body = DefBody::new(EQUAL, block, DefId(0));
let def = Def::new(sig, body); let def = Def::new(sig, body);
self.namespace.pop(); self.pop();
Expr::Def(def) Expr::Def(def)
} }
} }
@ -1484,7 +1538,7 @@ impl ASTConverter {
let class_name_loc = PyLocation::new(loc.row(), loc.column() + 6); let class_name_loc = PyLocation::new(loc.row(), loc.column() + 6);
let ident = self.convert_ident(name, class_name_loc); let ident = self.convert_ident(name, class_name_loc);
let sig = Signature::Var(VarSignature::new(VarPattern::Ident(ident.clone()), None)); let sig = Signature::Var(VarSignature::new(VarPattern::Ident(ident.clone()), None));
self.namespace.push(ident.inspect().to_string()); self.grow(ident.inspect().to_string());
let (base_type, methods) = self.extract_method_list(ident, body, inherit); let (base_type, methods) = self.extract_method_list(ident, body, inherit);
let classdef = if inherit { let classdef = if inherit {
// TODO: multiple inheritance // TODO: multiple inheritance
@ -1519,7 +1573,7 @@ impl ASTConverter {
let def = Def::new(sig, body); let def = Def::new(sig, body);
ClassDef::new(def, methods) ClassDef::new(def, methods)
}; };
self.namespace.pop(); self.pop();
Expr::ClassDef(classdef) Expr::ClassDef(classdef)
} }
@ -1599,11 +1653,9 @@ impl ASTConverter {
Expr::ReDef(adef) Expr::ReDef(adef)
} }
ExpressionType::Tuple { elements } => { ExpressionType::Tuple { elements } => {
let tmp = fresh_varname(); let tmp = FRESH_GEN.fresh_varname();
let tmp_name = VarName::from_str_and_line( let tmp_name =
(&tmp).into(), VarName::from_str_and_line(tmp, stmt.location.row() as u32);
stmt.location.row() as u32,
);
let tmp_ident = Identifier::new(VisModifierSpec::Public(DOT), tmp_name); let tmp_ident = Identifier::new(VisModifierSpec::Public(DOT), tmp_name);
let tmp_expr = Expr::Accessor(Accessor::Ident(tmp_ident.clone())); let tmp_expr = Expr::Accessor(Accessor::Ident(tmp_ident.clone()));
let sig = Signature::Var(VarSignature::new( let sig = Signature::Var(VarSignature::new(

View File

@ -1,5 +1,5 @@
use erg_common::config::Input;
use erg_common::error::{ErrorCore, ErrorKind, Location, SubMessage}; use erg_common::error::{ErrorCore, ErrorKind, Location, SubMessage};
use erg_common::io::Input;
use erg_common::switch_lang; use erg_common::switch_lang;
use erg_compiler::error::CompileError; use erg_compiler::error::CompileError;

View File

@ -1,8 +1,9 @@
use std::fs::File; use std::fs::File;
use std::io::{BufWriter, Write}; use std::io::{BufWriter, Write};
use erg_common::config::Input; use erg_common::io::Input;
use erg_common::log; use erg_common::log;
use erg_common::traits::LimitedDisplay;
use erg_compiler::context::register::{CheckStatus, PylyzerStatus}; use erg_compiler::context::register::{CheckStatus, PylyzerStatus};
use erg_compiler::hir::{Expr, HIR}; use erg_compiler::hir::{Expr, HIR};
use erg_compiler::ty::value::{GenTypeObj, TypeObj}; use erg_compiler::ty::value::{GenTypeObj, TypeObj};
@ -25,23 +26,21 @@ pub struct DeclFileGenerator {
impl DeclFileGenerator { impl DeclFileGenerator {
pub fn new(input: &Input, status: CheckStatus) -> Self { pub fn new(input: &Input, status: CheckStatus) -> Self {
let (timestamp, hash) = if let Some(py_file_path) = input.path() { let (timestamp, hash) = {
let py_file_path = input.path();
let metadata = std::fs::metadata(py_file_path).unwrap(); let metadata = std::fs::metadata(py_file_path).unwrap();
let dummy_hash = metadata.len(); let dummy_hash = metadata.len();
(metadata.modified().unwrap(), dummy_hash) (metadata.modified().unwrap(), dummy_hash)
} else {
let now = std::time::SystemTime::now();
(now, now.elapsed().unwrap().as_secs())
}; };
let status = PylyzerStatus { let status = PylyzerStatus {
status, status,
file: input.unescaped_path().into(), file: input.path().into(),
timestamp, timestamp,
hash, hash,
}; };
let code = format!("{status}\n"); let code = format!("{status}\n");
Self { Self {
filename: input.unescaped_filename().replace(".py", ".d.er"), filename: input.filename().replace(".py", ".d.er"),
namespace: "".to_string(), namespace: "".to_string(),
code, code,
} }
@ -68,7 +67,7 @@ impl DeclFileGenerator {
.replace('\0', "") .replace('\0', "")
.replace('%', "___"); .replace('%', "___");
let ref_t = def.sig.ident().ref_t(); let ref_t = def.sig.ident().ref_t();
let typ = ref_t.replace_failure().to_string(); let typ = ref_t.replace_failure().to_string_unabbreviated();
let typ = escape_type(typ); let typ = escape_type(typ);
// Erg can automatically import nested modules // Erg can automatically import nested modules
// `import http.client` => `http = pyimport "http"` // `import http.client` => `http = pyimport "http"`
@ -97,7 +96,7 @@ impl DeclFileGenerator {
self.code += &decl; self.code += &decl;
self.code.push('\n'); self.code.push('\n');
if let GenTypeObj::Subclass(class) = &def.obj { if let GenTypeObj::Subclass(class) = &def.obj {
let sup = class.sup.as_ref().typ().to_string(); let sup = class.sup.as_ref().typ().to_string_unabbreviated();
let sup = escape_type(sup); let sup = escape_type(sup);
let decl = format!(".{class_name} <: {sup}\n"); let decl = format!(".{class_name} <: {sup}\n");
self.code += &decl; self.code += &decl;
@ -108,7 +107,7 @@ impl DeclFileGenerator {
}) = def.obj.base_or_sup() }) = def.obj.base_or_sup()
{ {
for (attr, t) in rec.iter() { for (attr, t) in rec.iter() {
let typ = escape_type(t.to_string()); let typ = escape_type(t.to_string_unabbreviated());
let decl = format!("{}.{}: {typ}\n", self.namespace, attr.symbol); let decl = format!("{}.{}: {typ}\n", self.namespace, attr.symbol);
self.code += &decl; self.code += &decl;
} }
@ -119,7 +118,7 @@ impl DeclFileGenerator {
}) = def.obj.additional() }) = def.obj.additional()
{ {
for (attr, t) in rec.iter() { for (attr, t) in rec.iter() {
let typ = escape_type(t.to_string()); let typ = escape_type(t.to_string_unabbreviated());
let decl = format!("{}.{}: {typ}\n", self.namespace, attr.symbol); let decl = format!("{}.{}: {typ}\n", self.namespace, attr.symbol);
self.code += &decl; self.code += &decl;
} }
@ -147,7 +146,7 @@ pub fn reserve_decl_er(input: Input) {
if !pycache_dir.exists() { if !pycache_dir.exists() {
std::fs::create_dir(pycache_dir).unwrap(); std::fs::create_dir(pycache_dir).unwrap();
} }
let filename = input.unescaped_filename(); let filename = input.filename();
let mut path = pycache_dir.join(filename); let mut path = pycache_dir.join(filename);
path.set_extension("d.er"); path.set_extension("d.er");
if !path.exists() { if !path.exists() {

View File

@ -7,8 +7,10 @@ use erg_common::Str;
use erg_compiler::artifact::{BuildRunnable, Buildable, CompleteArtifact, IncompleteArtifact}; use erg_compiler::artifact::{BuildRunnable, Buildable, CompleteArtifact, IncompleteArtifact};
use erg_compiler::context::register::CheckStatus; use erg_compiler::context::register::CheckStatus;
use erg_compiler::context::ModuleContext; use erg_compiler::context::ModuleContext;
use erg_compiler::erg_parser::ast::{Module, AST}; use erg_compiler::erg_parser::ast::AST;
use erg_compiler::erg_parser::error::ParseErrors; use erg_compiler::erg_parser::error::{
CompleteArtifact as PCompleteArtifact, IncompleteArtifact as PIncompleteArtifact, ParseErrors,
};
use erg_compiler::erg_parser::parse::Parsable; use erg_compiler::erg_parser::parse::Parsable;
use erg_compiler::error::{CompileError, CompileErrors}; use erg_compiler::error::{CompileError, CompileErrors};
use erg_compiler::lower::ASTLowerer; use erg_compiler::lower::ASTLowerer;
@ -21,7 +23,7 @@ use crate::handle_err;
pub struct SimplePythonParser {} pub struct SimplePythonParser {}
impl Parsable for SimplePythonParser { impl Parsable for SimplePythonParser {
fn parse(code: String) -> Result<Module, ParseErrors> { fn parse(code: String) -> Result<PCompleteArtifact, PIncompleteArtifact> {
let py_program = parser::parse_program(&code).map_err(|_err| ParseErrors::empty())?; let py_program = parser::parse_program(&code).map_err(|_err| ParseErrors::empty())?;
let shadowing = if cfg!(feature = "debug") { let shadowing = if cfg!(feature = "debug") {
ShadowingMode::Visible ShadowingMode::Visible
@ -29,11 +31,18 @@ impl Parsable for SimplePythonParser {
ShadowingMode::Invisible ShadowingMode::Invisible
}; };
let converter = py2erg::ASTConverter::new(ErgConfig::default(), shadowing); let converter = py2erg::ASTConverter::new(ErgConfig::default(), shadowing);
let IncompleteArtifact{ object: Some(erg_module), errors, .. } = converter.convert_program(py_program) else { unreachable!() }; let art = converter.convert_program(py_program);
if errors.is_empty() { if art.errors.is_empty() {
Ok(erg_module) Ok(PCompleteArtifact::new(
art.object.unwrap(),
art.warns.into(),
))
} else { } else {
Err(ParseErrors::empty()) Err(PIncompleteArtifact::new(
art.object,
art.errors.into(),
art.warns.into(),
))
} }
} }
} }
@ -155,11 +164,11 @@ impl PythonAnalyzer {
} }
pub fn run(&mut self) { pub fn run(&mut self) {
if self.cfg.output_dir.is_some() { if self.cfg.dist_dir.is_some() {
reserve_decl_er(self.cfg.input.clone()); reserve_decl_er(self.cfg.input.clone());
} }
let py_code = self.cfg.input.read(); let py_code = self.cfg.input.read();
let filename = self.cfg.input.unescaped_filename(); let filename = self.cfg.input.filename();
println!("{BLUE}Start checking{RESET}: {filename}"); println!("{BLUE}Start checking{RESET}: {filename}");
match self.analyze(py_code, "exec") { match self.analyze(py_code, "exec") {
Ok(artifact) => { Ok(artifact) => {
@ -167,15 +176,12 @@ impl PythonAnalyzer {
println!( println!(
"{YELLOW}Found {} warnings{RESET}: {}", "{YELLOW}Found {} warnings{RESET}: {}",
artifact.warns.len(), artifact.warns.len(),
self.cfg.input.unescaped_filename() self.cfg.input.filename()
); );
artifact.warns.fmt_all_stderr(); artifact.warns.write_all_stderr();
} }
println!( println!("{GREEN}All checks OK{RESET}: {}", self.cfg.input.filename());
"{GREEN}All checks OK{RESET}: {}", if self.cfg.dist_dir.is_some() {
self.cfg.input.unescaped_filename()
);
if self.cfg.output_dir.is_some() {
dump_decl_er( dump_decl_er(
self.cfg.input.clone(), self.cfg.input.clone(),
artifact.object, artifact.object,
@ -190,27 +196,24 @@ impl PythonAnalyzer {
println!( println!(
"{YELLOW}Found {} warnings{RESET}: {}", "{YELLOW}Found {} warnings{RESET}: {}",
artifact.warns.len(), artifact.warns.len(),
self.cfg.input.unescaped_filename() self.cfg.input.filename()
); );
artifact.warns.fmt_all_stderr(); artifact.warns.write_all_stderr();
} }
let code = if artifact.errors.is_empty() { let code = if artifact.errors.is_empty() {
println!( println!("{GREEN}All checks OK{RESET}: {}", self.cfg.input.filename());
"{GREEN}All checks OK{RESET}: {}",
self.cfg.input.unescaped_filename()
);
0 0
} else { } else {
println!( println!(
"{RED}Found {} errors{RESET}: {}", "{RED}Found {} errors{RESET}: {}",
artifact.errors.len(), artifact.errors.len(),
self.cfg.input.unescaped_filename() self.cfg.input.filename()
); );
artifact.errors.fmt_all_stderr(); artifact.errors.write_all_stderr();
1 1
}; };
// Even if type checking fails, some APIs are still valid, so generate a file // Even if type checking fails, some APIs are still valid, so generate a file
if self.cfg.output_dir.is_some() { if self.cfg.dist_dir.is_some() {
dump_decl_er( dump_decl_er(
self.cfg.input.clone(), self.cfg.input.clone(),
artifact.object.unwrap(), artifact.object.unwrap(),

View File

@ -2,7 +2,8 @@ use std::env;
use std::path::PathBuf; use std::path::PathBuf;
use std::str::FromStr; use std::str::FromStr;
use erg_common::config::{ErgConfig, ErgMode, Input}; use erg_common::config::{ErgConfig, ErgMode};
use erg_common::io::Input;
use erg_common::switch_lang; use erg_common::switch_lang;
fn command_message() -> &'static str { fn command_message() -> &'static str {
@ -94,7 +95,7 @@ pub(crate) fn parse_args() -> ErgConfig {
cfg.quiet_repl = true; cfg.quiet_repl = true;
} }
"--dump-decl" => { "--dump-decl" => {
cfg.output_dir = Some(""); cfg.dist_dir = Some("");
} }
"--verbose" => { "--verbose" => {
cfg.verbose = args cfg.verbose = args

View File

@ -10,3 +10,8 @@ def g(x: int):
if True: if True:
x = "a" # ERR x = "a" # ERR
return x return x
def h(x: str):
if True:
x = "a" # OK
return x

14
tests/shadowing.py Normal file
View File

@ -0,0 +1,14 @@
i: int = 0
i: str = "a" # OK
if True:
i = 1 # ERR
else:
i = 2 # ERR
while False:
i = 3 # ERR
def f(x: int):
i = 1 # OK
return x + i

View File

@ -1,6 +1,7 @@
use std::path::PathBuf; use std::path::PathBuf;
use erg_common::config::{ErgConfig, Input}; use erg_common::config::ErgConfig;
use erg_common::io::Input;
use erg_common::spawn::exec_new_thread; use erg_common::spawn::exec_new_thread;
use erg_common::traits::Stream; use erg_common::traits::Stream;
use erg_compiler::artifact::{CompleteArtifact, IncompleteArtifact}; use erg_compiler::artifact::{CompleteArtifact, IncompleteArtifact};
@ -103,3 +104,8 @@ fn exec_collections() {
fn exec_call() { fn exec_call() {
expect("tests/call.py", 0, 3); expect("tests/call.py", 0, 3);
} }
#[test]
fn exec_shadowing() {
expect("tests/shadowing.py", 0, 3);
}