diff --git a/Cargo.lock b/Cargo.lock index a445aa0..0dfda80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,9 +52,9 @@ dependencies = [ [[package]] name = "backtrace-on-stack-overflow" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51cef6be4d7cb70701727ca9662b5b428833918c13c4095220763ba385ac9bd" +checksum = "7fd2d70527f3737a1ad17355e260706c1badebabd1fa06a7a053407380df841b" dependencies = [ "backtrace", "libc", @@ -73,22 +73,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "cc" version = "1.0.83" @@ -110,15 +94,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - [[package]] name = "crunchy" version = "0.2.2" @@ -138,15 +113,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "either" version = "1.9.0" @@ -155,9 +121,7 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "els" -version = "0.1.34-nightly.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936f90087d4e2af16d8a6253c5c54447413088ad85308c108b9103a1e223f484" +version = "0.1.36" dependencies = [ "erg_common", "erg_compiler", @@ -181,9 +145,7 @@ dependencies = [ [[package]] name = "erg_common" -version = "0.6.22-nightly.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829b2830ee83e14ab2a07eac8cf693c4235e6a94dbdedb9dd7291aa623414e18" +version = "0.6.24" dependencies = [ "backtrace-on-stack-overflow", "parking_lot", @@ -192,9 +154,7 @@ dependencies = [ [[package]] name = "erg_compiler" -version = "0.6.22-nightly.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4f85efd95a0322cd27e8332bfc6020516a5dc17911facdd36c2138f8eb7186" +version = "0.6.24" dependencies = [ "erg_common", "erg_parser", @@ -202,9 +162,7 @@ dependencies = [ [[package]] name = "erg_parser" -version = "0.6.22-nightly.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1baa48eca2a9f1c2231fea0611cba222e096d46dcd9c3fb15f8a8442daf27481" +version = "0.6.24" dependencies = [ "erg_common", "unicode-xid", @@ -219,27 +177,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "gimli" version = "0.28.0" @@ -271,18 +208,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.9.0" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] @@ -293,15 +230,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - [[package]] name = "lalrpop-util" version = "0.20.0" @@ -310,15 +238,15 @@ checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" [[package]] name = "libc" -version = "0.2.148" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -345,9 +273,9 @@ dependencies = [ [[package]] name = "malachite" -version = "0.3.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cf7f4730c30071ba374fac86ad35b1cb7a0716f774737768667ea3fa1828e3" +checksum = "220cb36c52aa6eff45559df497abe0e2a4c1209f92279a746a399f622d7b95c7" dependencies = [ "malachite-base", "malachite-nz", @@ -356,22 +284,19 @@ dependencies = [ [[package]] name = "malachite-base" -version = "0.3.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b06bfa98a4b4802af5a4263b4ad4660e28e51e8490f6354eb9336c70767e1c5" +checksum = "6538136c5daf04126d6be4899f7fe4879b7f8de896dd1b4210fe6de5b94f2555" dependencies = [ - "itertools 0.9.0", - "rand 0.7.3", - "rand_chacha", + "itertools 0.11.0", "ryu", - "sha3", ] [[package]] name = "malachite-bigint" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5110aee54537b0cef214efbebdd7df79b7408db8eef4f6a4b6db9d0d8fc01b" +checksum = "76c3eca3b5df299486144c8423c45c24bdf9e82e2452c8a1eeda547c4d8b5d41" dependencies = [ "derive_more", "malachite", @@ -382,22 +307,22 @@ dependencies = [ [[package]] name = "malachite-nz" -version = "0.3.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e21c64b7af5be3dc8cef16f786243faf59459fe4ba93b44efdeb264e5ade4" +checksum = "5f0b05577b7a3f09433106460b10304f97fc572f0baabf6640e6cb1e23f5fc52" dependencies = [ "embed-doc-image", - "itertools 0.9.0", + "itertools 0.11.0", "malachite-base", ] [[package]] name = "malachite-q" -version = "0.3.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3755e541d5134b5016594c9043094172c4dda9259b3ce824a7b8101941850360" +checksum = "a1cfdb4016292e6acd832eaee261175f3af8bbee62afeefe4420ebce4c440cb5" dependencies = [ - "itertools 0.9.0", + "itertools 0.11.0", "malachite-base", "malachite-nz", ] @@ -428,9 +353,9 @@ dependencies = [ [[package]] name = "molc" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b41715c0dba18256b97ed045313b93baf8de0a665280220247390a7e801842" +checksum = "94e83b17c033b7b617f21f4a9ba52520dd473bb73a4e9132710c48aee5669095" dependencies = [ "lsp-types", "serde", @@ -462,9 +387,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -484,12 +409,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "parking_lot" version = "0.12.1" @@ -502,9 +421,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", @@ -551,7 +470,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", - "rand 0.8.5", + "rand", ] [[package]] @@ -574,17 +493,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -620,45 +533,13 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom", - "libc", - "rand_chacha", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom", + "rand_core", ] [[package]] @@ -667,20 +548,11 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags", ] @@ -777,35 +649,35 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -814,25 +686,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer", - "digest", - "keccak", - "opaque-debug", + "syn 2.0.38", ] [[package]] @@ -866,9 +726,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", @@ -909,12 +769,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - [[package]] name = "unic-char-property" version = "0.9.0" @@ -1012,18 +866,6 @@ dependencies = [ "serde", ] -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "windows-targets" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index 9122325..9a5e1ad 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.22-nightly.1", features = ["py_compat", "els"] } -erg_compiler = { version = "0.6.22-nightly.1", features = ["py_compat", "els"] } -els = { version = "0.1.34-nightly.1", features = ["py_compat"] } +# erg_common = { version = "0.6.22-nightly.1", features = ["py_compat", "els"] } +# erg_compiler = { version = "0.6.22-nightly.1", features = ["py_compat", "els"] } +# els = { version = "0.1.34-nightly.1", features = ["py_compat"] } rustpython-parser = { version = "0.3.0", features = ["all-nodes-with-ranges", "location"] } rustpython-ast = { version = "0.3.0", features = ["all-nodes-with-ranges", "location"] } # rustpython-parser = { git = "https://github.com/RustPython/Parser", version = "0.3.0", features = ["all-nodes-with-ranges", "location"] } @@ -32,9 +32,9 @@ rustpython-ast = { version = "0.3.0", features = ["all-nodes-with-ranges", "loca # 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"] } # els = { git = "https://github.com/erg-lang/erg", branch = "main", features = ["py_compat"] } -# erg_compiler = { path = "../erg/crates/erg_compiler", features = ["py_compat", "els"] } -# erg_common = { path = "../erg/crates/erg_common", features = ["py_compat", "els"] } -# els = { path = "../erg/crates/els", features = ["py_compat"] } +erg_compiler = { path = "../erg/crates/erg_compiler", features = ["py_compat", "els"] } +erg_common = { path = "../erg/crates/erg_common", features = ["py_compat", "els"] } +els = { path = "../erg/crates/els", features = ["py_compat"] } [features] debug = ["erg_compiler/debug", "erg_common/debug", "py2erg/debug"] diff --git a/crates/py2erg/convert.rs b/crates/py2erg/convert.rs index 4478624..d31e3bf 100644 --- a/crates/py2erg/convert.rs +++ b/crates/py2erg/convert.rs @@ -1510,7 +1510,8 @@ impl ASTConverter { 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); + self.block_id_counter += 1; + let methods = Methods::new(DefId(self.block_id_counter), class, class_as_expr, VisModifierSpec::Public(DOT), attrs); (base_type, vec![methods]) } diff --git a/src/analyze.rs b/src/analyze.rs index 2ee787d..4f9aafe 100644 --- a/src/analyze.rs +++ b/src/analyze.rs @@ -2,36 +2,63 @@ use erg_common::config::ErgConfig; use erg_common::error::{ErrorCore, ErrorKind, MultiErrorDisplay}; use erg_common::style::colors::{BLUE, GREEN, RED, YELLOW}; use erg_common::style::RESET; -use erg_common::traits::{ExitStatus, Runnable, Stream}; +use erg_common::traits::{New, ExitStatus, Runnable, Stream}; use erg_common::Str; +use erg_compiler::GenericHIRBuilder; use erg_compiler::artifact::{BuildRunnable, Buildable, CompleteArtifact, IncompleteArtifact}; +use erg_compiler::build_package::GenericPackageBuilder; use erg_compiler::context::register::CheckStatus; use erg_compiler::context::ModuleContext; use erg_compiler::erg_parser::ast::{Module, AST}; +use erg_compiler::erg_parser::build_ast::ASTBuildable; use erg_compiler::erg_parser::error::{ - CompleteArtifact as ParseArtifact, IncompleteArtifact as IncompleteParseArtifact, ParseErrors, + CompleteArtifact as ParseArtifact, IncompleteArtifact as IncompleteParseArtifact, ParseErrors, ParserRunnerErrors, }; use erg_compiler::erg_parser::parse::Parsable; use erg_compiler::error::{CompileError, CompileErrors}; -use erg_compiler::lower::ASTLowerer; use erg_compiler::module::SharedCompilerResource; use py2erg::{dump_decl_er, reserve_decl_er, ShadowingMode}; -use rustpython_ast::source_code::RandomLocator; +use rustpython_ast::source_code::{RandomLocator, SourceRange}; use rustpython_ast::{Fold, ModModule}; use rustpython_parser::{Parse, ParseErrorType}; use crate::handle_err; -pub struct SimplePythonParser {} +#[derive(Debug, Default)] +pub struct SimplePythonParser { + cfg: ErgConfig, +} impl Parsable for SimplePythonParser { fn parse(code: String) -> Result> { - let py_program = ModModule::parse(&code, "").map_err(|_err| ParseErrors::empty())?; - let mut locator = RandomLocator::new(&code); - // let mut locator = LinearLocator::new(&code); - let py_program = locator - .fold(py_program) - .map_err(|_err| ParseErrors::empty())?; + let mut slf = Self::new(ErgConfig::string(code.clone())); + slf.build_ast(code) + .map(|art| { + ParseArtifact::new(art.ast.module, art.warns.into()) + }) + .map_err(|iart| { + IncompleteParseArtifact::new( + iart.ast.map(|art| art.module), + iart.errors.into(), + iart.warns.into(), + ) + }) + } +} + +impl New for SimplePythonParser { + fn new(cfg: ErgConfig) -> Self { + Self { cfg } + } +} + +impl ASTBuildable for SimplePythonParser { + fn build_ast( + &mut self, + code: String, + ) -> Result, IncompleteParseArtifact> { + let filename = self.cfg.input.filename(); + let py_program = self.parse_py_code(code)?; let shadowing = if cfg!(feature = "debug") { ShadowingMode::Visible } else { @@ -39,32 +66,68 @@ impl Parsable for SimplePythonParser { }; let converter = py2erg::ASTConverter::new(ErgConfig::default(), shadowing); let IncompleteArtifact{ object: Some(erg_module), errors, warns } = converter.convert_program(py_program) else { unreachable!() }; + let erg_ast = AST::new(erg_common::Str::rc(&filename), erg_module); if errors.is_empty() { - Ok(ParseArtifact::new(erg_module, warns.into())) + Ok(ParseArtifact::new(erg_ast, warns.into())) } else { Err(IncompleteParseArtifact::new( - Some(erg_module), - warns.into(), + Some(erg_ast), errors.into(), + warns.into(), )) } } } +impl SimplePythonParser { + pub fn parse_py_code(&self, code: String) -> Result, IncompleteParseArtifact>{ + let py_program = ModModule::parse(&code, "").map_err(|err| { + let mut locator = RandomLocator::new(&code); + // let mut locator = LinearLocator::new(&py_code); + let err = locator.locate_error::<_, ParseErrorType>(err); + let msg = err.to_string(); + let loc = err.location.unwrap(); + let core = ErrorCore::new( + vec![], + msg, + 0, + ErrorKind::SyntaxError, + erg_common::error::Location::range( + loc.row.get(), + loc.column.to_zero_indexed(), + loc.row.get(), + loc.column.to_zero_indexed(), + ), + ); + let err = CompileError::new(core, self.cfg.input.clone(), "".into()); + IncompleteParseArtifact::new(None, ParserRunnerErrors::from(err), ParserRunnerErrors::empty()) + })?; + let mut locator = RandomLocator::new(&code); + // let mut locator = LinearLocator::new(&code); + let module = locator + .fold(py_program) + .map_err(|_err| ParserRunnerErrors::empty())?; + Ok(module) + } +} + #[derive(Debug, Default)] pub struct PythonAnalyzer { pub cfg: ErgConfig, - checker: ASTLowerer, + checker: GenericPackageBuilder>, +} + +impl New for PythonAnalyzer { + fn new(cfg: ErgConfig) -> Self { + let checker = GenericPackageBuilder::new(cfg.clone(), SharedCompilerResource::new(cfg.clone())); + Self { checker, cfg } + } } impl Runnable for PythonAnalyzer { type Err = CompileError; type Errs = CompileErrors; const NAME: &'static str = "Python Analyzer"; - fn new(cfg: ErgConfig) -> Self { - let checker = ASTLowerer::new(cfg.clone()); - Self { checker, cfg } - } #[inline] fn cfg(&self) -> &ErgConfig { &self.cfg @@ -95,17 +158,30 @@ impl Buildable for PythonAnalyzer { let mod_name = Str::rc(&cfg.input.file_stem()); Self { cfg: cfg.copy(), - checker: ASTLowerer::new_with_cache(cfg, mod_name, shared), + checker: GenericPackageBuilder::new_with_cache(cfg, mod_name, shared), + } + } + fn inherit_with_name(cfg: ErgConfig, mod_name: Str, shared: SharedCompilerResource) -> Self { + Self { + cfg: cfg.copy(), + checker: GenericPackageBuilder::new_with_cache(cfg, mod_name, shared), } } fn build(&mut self, code: String, mode: &str) -> Result { self.analyze(code, mode) } + fn build_from_ast( + &mut self, + ast: AST, + mode: &str, + ) -> Result, IncompleteArtifact> { + self.check(ast, CompileErrors::empty(), CompileErrors::empty(), mode) + } fn pop_context(&mut self) -> Option { - self.checker.pop_mod_ctx() + self.checker.pop_context() } fn get_context(&self) -> Option<&ModuleContext> { - Some(self.checker.get_mod_ctx()) + self.checker.get_context() } } @@ -113,53 +189,15 @@ impl BuildRunnable for PythonAnalyzer {} impl PythonAnalyzer { pub fn new(cfg: ErgConfig) -> Self { - Runnable::new(cfg) + New::new(cfg) } - pub fn analyze( - &mut self, - py_code: String, - mode: &str, - ) -> Result { - let filename = self.cfg.input.filename(); - let py_program = ModModule::parse(&py_code, &filename).map_err(|err| { - let mut locator = RandomLocator::new(&py_code); - // let mut locator = LinearLocator::new(&py_code); - let err = locator.locate_error::<_, ParseErrorType>(err); - let msg = err.to_string(); - let loc = err.location.unwrap(); - let core = ErrorCore::new( - vec![], - msg, - 0, - ErrorKind::SyntaxError, - erg_common::error::Location::range( - loc.row.get(), - loc.column.to_zero_indexed(), - loc.row.get(), - loc.column.to_zero_indexed(), - ), - ); - let err = CompileError::new(core, self.cfg.input.clone(), "".into()); - IncompleteArtifact::new(None, CompileErrors::from(err), CompileErrors::empty()) - })?; - let mut locator = RandomLocator::new(&py_code); - // let mut locator = LinearLocator::new(&py_code); - let py_program = locator.fold(py_program).unwrap(); - let shadowing = if cfg!(feature = "debug") { - ShadowingMode::Visible - } else { - ShadowingMode::Invisible - }; - let converter = py2erg::ASTConverter::new(self.cfg.copy(), shadowing); - let IncompleteArtifact{ object: Some(erg_module), mut errors, mut warns } = converter.convert_program(py_program) else { unreachable!() }; - let erg_ast = AST::new(erg_common::Str::rc(&filename), erg_module); - erg_common::log!("AST:\n{erg_ast}"); - match self.checker.lower(erg_ast, mode) { + fn check(&mut self, erg_ast: AST, mut errors: CompileErrors, mut warns: CompileErrors, mode: &str) -> Result { + match self.checker.build_module(erg_ast, mode) { Ok(mut artifact) => { artifact.warns.extend(warns); artifact.warns = - handle_err::filter_errors(self.checker.get_mod_ctx(), artifact.warns); + handle_err::filter_errors(self.get_context().unwrap(), artifact.warns); if errors.is_empty() { Ok(artifact) } else { @@ -172,14 +210,41 @@ impl PythonAnalyzer { } Err(iart) => { errors.extend(iart.errors); - let errors = handle_err::filter_errors(self.checker.get_mod_ctx(), errors); + let errors = handle_err::filter_errors(self.get_context().unwrap(), errors); warns.extend(iart.warns); - let warns = handle_err::filter_errors(self.checker.get_mod_ctx(), warns); + let warns = handle_err::filter_errors(self.get_context().unwrap(), warns); Err(IncompleteArtifact::new(iart.object, errors, warns)) } } } + pub fn analyze( + &mut self, + py_code: String, + mode: &str, + ) -> Result { + let filename = self.cfg.input.filename(); + let parser = SimplePythonParser::new(self.cfg.copy()); + let py_program = parser.parse_py_code(py_code) + .map_err(|iart| { + IncompleteArtifact::new( + None, + iart.errors.into(), + iart.warns.into(), + ) + })?; + let shadowing = if cfg!(feature = "debug") { + ShadowingMode::Visible + } else { + ShadowingMode::Invisible + }; + let converter = py2erg::ASTConverter::new(self.cfg.copy(), shadowing); + let IncompleteArtifact{ object: Some(erg_module), errors, warns } = converter.convert_program(py_program) else { unreachable!() }; + let erg_ast = AST::new(erg_common::Str::rc(&filename), erg_module); + erg_common::log!("AST:\n{erg_ast}"); + self.check(erg_ast, errors, warns, mode) + } + pub fn run(&mut self) { if self.cfg.dist_dir.is_some() { reserve_decl_er(self.cfg.input.clone());