From 01b40ae057c63e075ed7165b43d365aebe18a0ba Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Sat, 11 Jan 2020 01:25:45 -0600 Subject: [PATCH] im going to bed --- Cargo.lock | 763 +++++++++++++++++++++++++++ Cargo.toml | 2 +- enterprise-compiler/Cargo.toml | 7 + enterprise-compiler/src/lib.rs | 6 + enterprise-macros/Cargo.toml | 6 + enterprise-macros/build.rs | 3 + enterprise-macros/src/ast.rs | 20 + enterprise-macros/src/flatten.rs | 127 +++++ enterprise-macros/src/lib.rs | 84 ++- enterprise-macros/src/old_parser.rs | 188 +++++++ enterprise-macros/src/parser.lalrpop | 123 +++++ src/component.rs | 0 src/lib.rs | 1 + src/widgets/mod.rs | 3 - todomvc/Cargo.toml | 7 +- todomvc/build.rs | 6 + todomvc/components/mod.rs | 24 + todomvc/src/Counter.en | 0 todomvc/src/main.rs | 25 - todomvc/src/yolo.rs | 47 ++ 20 files changed, 1405 insertions(+), 37 deletions(-) create mode 100644 enterprise-compiler/Cargo.toml create mode 100644 enterprise-compiler/src/lib.rs create mode 100644 enterprise-macros/build.rs create mode 100644 enterprise-macros/src/ast.rs create mode 100644 enterprise-macros/src/flatten.rs create mode 100644 enterprise-macros/src/old_parser.rs create mode 100644 enterprise-macros/src/parser.lalrpop create mode 100644 src/component.rs delete mode 100644 src/widgets/mod.rs create mode 100644 todomvc/build.rs create mode 100644 todomvc/components/mod.rs create mode 100644 todomvc/src/Counter.en create mode 100644 todomvc/src/yolo.rs diff --git a/Cargo.lock b/Cargo.lock index 28d6e3e..b2c9d77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,16 +1,386 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "arrayref" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ascii-canvas" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "autocfg" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "backtrace" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "backtrace-sys" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "base64" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bit-set" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bit-vec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "blake2b_simd" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "byteorder" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cc" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-utils" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "diff" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "docopt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "either" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ena" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "enterprise" version = "0.1.0" +[[package]] +name = "enterprise-compiler" +version = "0.1.0" + [[package]] name = "enterprise-macros" version = "0.1.0" dependencies = [ + "lalrpop 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lalrpop-util 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "failure" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "failure_derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "fixedbitset" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "generic-array" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hermit-abi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lalrpop" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ascii-canvas 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "diff 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ena 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lalrpop-util 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)", + "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lalrpop-util" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.66" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "memchr" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ordermap" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "petgraph" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_generator" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_shared" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "proc-macro2" version = "1.0.7" @@ -27,20 +397,413 @@ dependencies = [ "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "redox_syscall" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "redox_users" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rust-argon2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_derive" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "siphasher" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "string_cache" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "new_debug_unreachable 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "string_cache_codegen" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "string_cache_shared" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "syn" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "synstructure" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "term" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "todomvc" version = "0.1.0" dependencies = [ "enterprise 0.1.0", + "enterprise-compiler 0.1.0", "enterprise-macros 0.1.0", ] +[[package]] +name = "typenum" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [metadata] +"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" +"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" +"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" +"checksum ascii-canvas 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8eb72df928aafb99fe5d37b383f2fe25bd2a765e3e5f7c365916b6f2463a29" +"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" +"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" +"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +"checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80" +"checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" +"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +"checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" +"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120" +"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" +"checksum diff 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" +"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +"checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +"checksum docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f525a586d310c87df72ebcd98009e57f1cc030c8c268305287a476beb653969" +"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +"checksum ena 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8944dc8fa28ce4a38f778bd46bf7d923fe73eed5a439398507246c8e017e6f36" +"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" +"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" +"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +"checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" +"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" +"checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +"checksum lalrpop 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "64dc3698e75d452867d9bd86f4a723f452ce9d01fe1d55990b79f0c790aa67db" +"checksum lalrpop-util 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c277d18683b36349ab5cd030158b54856fca6bb2d5dc5263b06288f486958b7c" +"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" +"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" +"checksum new_debug_unreachable 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +"checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" +"checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" +"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" +"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" +"checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" "checksum proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0319972dcae462681daf4da1adeeaa066e3ebd29c69be96c6abb1259d2ee2bcc" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" +"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +"checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d" +"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87" +"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90" +"checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf" +"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" +"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" +"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" +"checksum string_cache 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "89c058a82f9fd69b1becf8c274f412281038877c553182f1d02eb027045a2d67" +"checksum string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6" +"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" +"checksum strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +"checksum syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4ff033220a41d1a57d8125eab57bf5263783dfdcc18688b1dacc6ce9651ef8" +"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" +"checksum term 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42" +"checksum thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6f357d1814b33bc2dc221243f8424104bfe72dbe911d5b71b3816a2dff1c977e" +"checksum thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2e25d25307eb8436894f727aba8f65d07adf02e5b35a13cebed48bd282bfef" +"checksum thread_local 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88ddf1ad580c7e3d1efff877d972bcc93f995556b9087a5a259630985c88ceab" +"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index b9679e8..f6d6967 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,6 @@ authors = ["Michael Zhang "] edition = "2018" [workspace] -members = ["enterprise-macros", "todomvc"] +members = ["enterprise-compiler", "enterprise-macros", "todomvc"] [dependencies] diff --git a/enterprise-compiler/Cargo.toml b/enterprise-compiler/Cargo.toml new file mode 100644 index 0000000..4c62645 --- /dev/null +++ b/enterprise-compiler/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "enterprise-compiler" +version = "0.1.0" +authors = ["Michael Zhang "] +edition = "2018" + +[dependencies] diff --git a/enterprise-compiler/src/lib.rs b/enterprise-compiler/src/lib.rs new file mode 100644 index 0000000..a5a345b --- /dev/null +++ b/enterprise-compiler/src/lib.rs @@ -0,0 +1,6 @@ +#[derive(Debug)] +pub enum Error {} + +pub fn process_root() -> Result<(), Error> { + Ok(()) +} diff --git a/enterprise-macros/Cargo.toml b/enterprise-macros/Cargo.toml index 2adde7c..0908eb0 100644 --- a/enterprise-macros/Cargo.toml +++ b/enterprise-macros/Cargo.toml @@ -7,5 +7,11 @@ edition = "2018" [lib] proc-macro = true +[build-dependencies] +lalrpop = "0.17.2" + [dependencies] +proc-macro2 = { version = "1.0.7", features = ["span-locations"] } quote = "1.0.2" +thiserror = "1.0.9" +lalrpop-util = "0.17.2" diff --git a/enterprise-macros/build.rs b/enterprise-macros/build.rs new file mode 100644 index 0000000..ca5c283 --- /dev/null +++ b/enterprise-macros/build.rs @@ -0,0 +1,3 @@ +fn main() { + lalrpop::process_root().unwrap(); +} diff --git a/enterprise-macros/src/ast.rs b/enterprise-macros/src/ast.rs new file mode 100644 index 0000000..40f9994 --- /dev/null +++ b/enterprise-macros/src/ast.rs @@ -0,0 +1,20 @@ +#[derive(Debug)] +pub enum Toplevel { + Use(Use), + Component(Component), +} + +#[derive(Debug)] +pub struct Use(pub Vec); + +#[derive(Debug)] +pub struct Component { + pub name: String, +} + +#[derive(Debug)] +pub enum ComponentBody { + Constructor(), + View(), + Fn(), +} diff --git a/enterprise-macros/src/flatten.rs b/enterprise-macros/src/flatten.rs new file mode 100644 index 0000000..f2162c8 --- /dev/null +++ b/enterprise-macros/src/flatten.rs @@ -0,0 +1,127 @@ +use std::fmt; + +use lalrpop_util::ParseError; +use proc_macro2::{ + Delimiter, Group, Ident, LineColumn, Literal, Punct, Spacing, Span as Span2, TokenStream, + TokenTree, +}; + +use crate::parser::parser::__ToTriple; + +macro_rules! generate_token { + ([$($keyword_name:ident: $keyword:ident),* $(,)?]) => { + #[derive(Debug, Clone)] + pub enum TokenType { + Ident(Ident), + Punct(char, Punct), + Literal(Literal), + + $($keyword_name(Span),)* + } + + impl fmt::Display for TokenType { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use TokenType::*; + match self { + Ident(ident) => ident.fmt(f), + Punct(_, punct) => punct.fmt(f), + Literal(literal) => literal.fmt(f), + $($keyword_name(_) => f.write_str(stringify!($keyword)),)* + } + } + } + + impl TokenType { + pub fn span(&self) -> Span { + use TokenType::*; + match self { + Ident(ident) => Span(ident.span()), + Punct(_, punct) => Span(punct.span()), + Literal(literal) => Span(literal.span()), + + $($keyword_name(span) => *span,)* + } + } + } + + fn flatten_tree(token_tree: TokenTree) -> Vec { + match token_tree { + TokenTree::Group(group) => { + use Delimiter::*; + let mut result = flatten(group.stream()); + let surround = match group.delimiter() { + Brace => Some(construct_group_tokens('{', '}', group)), + Parenthesis => Some(construct_group_tokens('(', ')', group)), + Bracket => Some(construct_group_tokens('[', ']', group)), + None => Option::None, + }; + if let Some((start, end)) = surround { + result.insert(0, start); + result.push(end); + } + result + }, + TokenTree::Ident(ident) => { + let token = match ident.to_string().as_ref() { + $(stringify!($keyword) => TokenType::$keyword_name(Span(ident.span())),)* + _ => TokenType::Ident(ident), + }; + vec![construct_token(token)] + } + TokenTree::Punct(punct) => { + let token = TokenType::Punct(punct.as_char(), punct); + vec![construct_token(token)] + } + TokenTree::Literal(literal) => { + let token = TokenType::Literal(literal); + vec![construct_token(token)] + } + } + } + } +} + +generate_token!([ + Component: component, + Constructor: constructor, + Fn: fn, + Use: use, + View: view, +]); + +pub type Token = Result<(Span, TokenType, Span), ()>; + +pub fn flatten(token_stream: TokenStream) -> Vec { + token_stream.into_iter().flat_map(flatten_tree).collect() +} + +fn construct_group_tokens(left: char, right: char, group: Group) -> (Token, Token) { + let mut left_punct = Punct::new(left, Spacing::Alone); + left_punct.set_span(group.span_open()); + let mut right_punct = Punct::new(right, Spacing::Alone); + right_punct.set_span(group.span_close()); + ( + construct_token(TokenType::Punct(left, left_punct)), + construct_token(TokenType::Punct(right, right_punct)), + ) +} + +fn construct_token(token: TokenType) -> Token { + let span = token.span(); + Ok((span, token, span)) +} + +#[derive(Copy, Clone, Debug)] +pub struct Span(pub Span2); + +impl fmt::Display for Span { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +impl Default for Span { + fn default() -> Self { + Span(Span2::call_site()) + } +} diff --git a/enterprise-macros/src/lib.rs b/enterprise-macros/src/lib.rs index 7cd84d3..a00a847 100644 --- a/enterprise-macros/src/lib.rs +++ b/enterprise-macros/src/lib.rs @@ -1,11 +1,83 @@ extern crate proc_macro; +#[macro_use] +extern crate thiserror; +#[macro_use] +extern crate lalrpop_util; +mod ast; +mod flatten; + +mod parser { + lalrpop_mod!(pub parser); +} + +use std::fmt; + +use proc_macro2::TokenStream; use quote::quote; -use proc_macro::TokenStream; + +use crate::flatten::{Span, Token, TokenType}; +use crate::parser::parser::*; #[proc_macro] -pub fn component(input_tokens: TokenStream) -> TokenStream { - let tokens = quote! { - }; - tokens.into() -} \ No newline at end of file +pub fn component(input_tokens: proc_macro::TokenStream) -> proc_macro::TokenStream { + let input_tokens: TokenStream = input_tokens.into(); + let input_as_str = input_tokens.to_string(); + let tokens = flatten::flatten(input_tokens); + + eprintln!("Tokens:"); + for token in tokens.iter() { + eprintln!("- {:?}", token); + } + eprintln!(); + + let parser = ProgramParser::new(); + let result = parser.parse(tokens); + match result { + Ok(result) => eprintln!("success: {:?}", result), + Err(err) => { + use lalrpop_util::ParseError::*; + match err { + User { ref error } => print!("user error"), + InvalidToken { ref location } => print!("Invalid token at {}", location), + UnrecognizedEOF { + ref location, + ref expected, + } => { + print!("Unrecognized EOF found at {}", location); + fmt_expected(expected) + } + UnrecognizedToken { + token: (ref start, ref token, ref end), + ref expected, + } => { + print!("Unrecognized token `{}` found at {}:{}", token, start, end); + fmt_expected(expected) + } + ExtraToken { + token: (ref start, ref token, ref end), + } => print!("Extra token {} found at {}:{}", token, start, end), + } + } + } + panic!(); + + let result = quote! {}; + result.into() +} + +/// Format a list of expected tokens. +fn fmt_expected(expected: &[String]) { + if !expected.is_empty() { + println!(); + for (i, e) in expected.iter().enumerate() { + let sep = match i { + 0 => "Expected one of", + _ if i < expected.len() - 1 => ",", + // Last expected message to be written + _ => " or", + }; + print!("{} {}", sep, e); + } + } +} diff --git a/enterprise-macros/src/old_parser.rs b/enterprise-macros/src/old_parser.rs new file mode 100644 index 0000000..da7e015 --- /dev/null +++ b/enterprise-macros/src/old_parser.rs @@ -0,0 +1,188 @@ +use std::iter::Peekable; + +use proc_macro2::{token_stream::IntoIter, Group, Ident, Literal, Punct, TokenStream, TokenTree}; + +type TokenIter = Peekable; + +#[derive(Debug, Error)] +pub enum ParseError { + #[error("Expected token type {0:?}, found {1:?}.")] + ExpectedTokenType(TokenType, TokenType), + + #[error("Expected idents {0:?}, found {1:?}")] + ExpectedIdents(Vec<&'static str>, String), + + #[error("Unexpected end of file")] + UnexpectedEndOfFile, +} + +#[derive(Debug)] +pub enum TokenType { + Group, + Ident, + Punct, + Literal, +} + +impl TokenType { + fn from_tree(token_tree: &TokenTree) -> Self { + match token_tree { + TokenTree::Group(_) => TokenType::Group, + TokenTree::Ident(_) => TokenType::Ident, + TokenTree::Punct(_) => TokenType::Punct, + TokenTree::Literal(_) => TokenType::Literal, + } + } +} + +#[derive(Debug)] +pub enum Toplevel { + Use(UseStatement), + Component(Component), +} + +#[derive(Debug)] +pub struct UseStatement; + +#[derive(Debug)] +pub struct Component { + name: String, +} + +pub fn parse(tokens: TokenStream) -> Result, ParseError> { + // TODO: maybe don't need to cloen? + let mut token_iter = tokens.clone().into_iter().peekable(); + + let mut toplevels = Vec::new(); + while let Some(toplevel) = expect_toplevel(&mut token_iter)? { + toplevels.push(toplevel); + } + + Ok(toplevels) +} + +fn expect_toplevel(token_iter: &mut TokenIter) -> Result, ParseError> { + let ident = consume_expect_ident(token_iter, Some(&["use", "component"]))?; + let ident_string = ident.to_string(); + + match ident_string.as_ref() { + "use" => Ok(Some(Toplevel::Use(UseStatement))), + "component" => { + let component = expect_component(token_iter)?; + Ok(Some(Toplevel::Component(component))) + } + _ => Err(ParseError::ExpectedIdents( + vec!["use", "component"], + ident_string, + )), + } +} + +fn expect_component(token_iter: &mut TokenIter) -> Result { + let name_ident = expect_ident(token_iter, None)?; + let name = name_ident.to_string(); + + expect_component_body(token_iter, name) +} + +fn expect_component_body( + token_iter: &mut TokenIter, + name: String, +) -> Result { + expect_group(token_iter)?; + Ok(Component { name }) +} + +////// + +fn optional( + token_iter: &mut TokenIter, + arg: T, + func: impl Fn(&mut TokenIter, T) -> Result, +) { + match func(token_iter, arg) { + } +} + +macro_rules! expect_token_tree { + ($peek_fn_name:ident, $consume_fn_name:ident, $ty:ident) => { + #[allow(dead_code)] + fn $peek_fn_name<'a>(token_iter: &'a mut TokenIter) -> Result<&'a $ty, ParseError> { + match token_iter.peek() { + Some(TokenTree::$ty(value)) => Ok(value), + Some(other_tree) => Err(ParseError::ExpectedTokenType( + TokenType::Ident, + TokenType::from_tree(&other_tree), + )), + None => Err(ParseError::UnexpectedEndOfFile), + } + } + #[allow(dead_code)] + fn $consume_fn_name<'a>(token_iter: &'a mut TokenIter) -> Result<$ty, ParseError> { + match token_iter.next() { + Some(TokenTree::$ty(value)) => Ok(value), + Some(other_tree) => Err(ParseError::ExpectedTokenType( + TokenType::Ident, + TokenType::from_tree(&other_tree), + )), + None => Err(ParseError::UnexpectedEndOfFile), + } + } + }; +} + +expect_token_tree!(peek_expect_group, consume_expect_group, Group); +expect_token_tree!(peek_expect_punct, consume_expect_punct, Punct); +expect_token_tree!(peek_expect_literal, consume_expect_literal, Literal); + +fn peek_expect_ident<'a>( + token_iter: &'a mut TokenIter, + possible: Option<&[&'static str]>, +) -> Result<&'a Ident, ParseError> { + match token_iter.peek() { + Some(TokenTree::Ident(ident)) => { + if let Some(possible) = possible { + let ident_string = ident.to_string(); + for expected in possible { + if *expected == ident_string.as_str() { + return Ok(ident); + } + } + Err(ParseError::ExpectedIdents(possible.into(), ident_string)) + } else { + Ok(ident) + } + } + Some(other_tree) => Err(ParseError::ExpectedTokenType( + TokenType::Ident, + TokenType::from_tree(&other_tree), + )), + None => Err(ParseError::UnexpectedEndOfFile), + } +} + +fn consume_expect_ident<'a>( + token_iter: &'a mut TokenIter, + possible: Option<&[&'static str]>, +) -> Result { + match token_iter.next() { + Some(TokenTree::Ident(ident)) => { + if let Some(possible) = possible { + let ident_string = ident.to_string(); + for expected in possible { + if *expected == ident_string.as_str() { + return Ok(ident); + } + } + Err(ParseError::ExpectedIdents(possible.into(), ident_string)) + } else { + Ok(ident) + } + } + Some(other_tree) => Err(ParseError::ExpectedTokenType( + TokenType::Ident, + TokenType::from_tree(&other_tree), + )), + None => Err(ParseError::UnexpectedEndOfFile), + } +} diff --git a/enterprise-macros/src/parser.lalrpop b/enterprise-macros/src/parser.lalrpop new file mode 100644 index 0000000..b267de1 --- /dev/null +++ b/enterprise-macros/src/parser.lalrpop @@ -0,0 +1,123 @@ +use std::iter::FromIterator; + +use proc_macro2::{Ident, Punct, TokenTree, Delimiter, TokenStream, Group, Spacing, Literal}; + +use crate::{TokenType, Span}; +use crate::ast::*; + +grammar; + +pub Program: Vec = Toplevel*; + +pub Toplevel: Toplevel = { + Component => Toplevel::Component(<>), + Use => Toplevel::Use(<>), +}; + +Use: Use = { + "use" > ";" => Use(path.into_iter().map(|ident| ident.to_string()).collect()), +}; + +Component: Component = { + "component" > => { + Component { + name: name.to_string(), + } + } +}; + +ComponentBody: ComponentBody = { + "constructor" "(" ")" BraceGrouper => { + ComponentBody::Constructor() + }, + "view" BraceGrouper => { + ComponentBody::View() + }, + "fn" Ident "(" Delim ")" BraceGrouper => { + ComponentBody::Fn() + }, +}; + +// TODO: finish this +Arg: () = { + Punct Ident Ident => {}, + Ident ":" Ident => {}, +}; + +// + +pub ArbitraryBlocks: Vec = AnyToken*; + +Grouper: TokenTree = { + BraceGrouper => <>, + "(" ")" => TokenTree::Group(Group::new(Delimiter::Parenthesis, TokenStream::from_iter(b.into_iter()))), + "[" "]" => TokenTree::Group(Group::new(Delimiter::Bracket, TokenStream::from_iter(b.into_iter()))), +}; + +BraceGrouper: TokenTree = { + "{" "}" => TokenTree::Group(Group::new(Delimiter::Brace, TokenStream::from_iter(b.into_iter()))), +}; + +AnyToken: TokenTree = { + Grouper => <>, + + "component" => TokenTree::Ident(Ident::new("component", <>.0)), + "constructor" => TokenTree::Ident(Ident::new("constructor", <>.0)), + "fn" => TokenTree::Ident(Ident::new("fn", <>.0)), + "use" => TokenTree::Ident(Ident::new("use", <>.0)), + "view" => TokenTree::Ident(Ident::new("view", <>.0)), + + ":" => TokenTree::Punct(Punct::new(':', Spacing::Alone)), + ";" => TokenTree::Punct(Punct::new(';', Spacing::Alone)), + "," => TokenTree::Punct(Punct::new(',', Spacing::Alone)), + + Ident => TokenTree::Ident(<>), + Punct => TokenTree::Punct(<>), + Literal => TokenTree::Literal(<>), +}; + +Body: T = { + "{" "}" => body, +}; + +Delim: Vec = { + => { + let mut vec = Vec::new(); + if let Some((initial, rest)) = all { + vec.push(initial); + if let Some((rest, _)) = rest { + for (_, item) in rest { + vec.push(item); + } + } + } + vec + }, +}; + +extern { + type Location = Span; + type Error = (); + + enum TokenType { + "component" => TokenType::Component(), + "constructor" => TokenType::Constructor(), + "fn" => TokenType::Fn(), + "use" => TokenType::Use(), + "view" => TokenType::View(), + + ":" => TokenType::Punct(':', _), + ";" => TokenType::Punct(';', _), + "," => TokenType::Punct(',', _), + "{" => TokenType::Punct('{', _), + "}" => TokenType::Punct('}', _), + "(" => TokenType::Punct('(', _), + ")" => TokenType::Punct(')', _), + "[" => TokenType::Punct('[', _), + "]" => TokenType::Punct(']', _), + + Punct => TokenType::Punct(_, ), + Ident => TokenType::Ident(), + Literal => TokenType::Literal(), + } +} \ No newline at end of file diff --git a/src/component.rs b/src/component.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/lib.rs b/src/lib.rs index e69de29..8b13789 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -0,0 +1 @@ + diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs deleted file mode 100644 index d81dbc6..0000000 --- a/src/widgets/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub trait Widget { - -} \ No newline at end of file diff --git a/todomvc/Cargo.toml b/todomvc/Cargo.toml index 3ef4f5c..8d8807c 100644 --- a/todomvc/Cargo.toml +++ b/todomvc/Cargo.toml @@ -4,6 +4,9 @@ version = "0.1.0" authors = ["Michael Zhang "] edition = "2018" +[build-dependencies] +enterprise-compiler = { path = "../enterprise-compiler" } +enterprise-macros = { path = "../enterprise-macros" } + [dependencies] -enterprise = { path = ".." } -enterprise-macros = { path = "../enterprise-macros" } \ No newline at end of file +enterprise = { path = ".." } \ No newline at end of file diff --git a/todomvc/build.rs b/todomvc/build.rs new file mode 100644 index 0000000..e7a636f --- /dev/null +++ b/todomvc/build.rs @@ -0,0 +1,6 @@ +#[macro_use] +extern crate enterprise_macros; + +mod components; + +fn main() {} diff --git a/todomvc/components/mod.rs b/todomvc/components/mod.rs new file mode 100644 index 0000000..e6b9394 --- /dev/null +++ b/todomvc/components/mod.rs @@ -0,0 +1,24 @@ +component! { + use enterprise::event::ClickEvent; + use enterprise::components::Button; + + component Counter { + constructor() { + count: u32 = 0u32, + } + + view { + + } + + fn handleClick(&mut self, _: ClickEvent) { + self.count += 1; + } + } + + component Other { + + } +} diff --git a/todomvc/src/Counter.en b/todomvc/src/Counter.en new file mode 100644 index 0000000..e69de29 diff --git a/todomvc/src/main.rs b/todomvc/src/main.rs index 723e724..e7a11a9 100644 --- a/todomvc/src/main.rs +++ b/todomvc/src/main.rs @@ -1,28 +1,3 @@ -use enterprise_macros::component; - -component! { - data { - - } - - markup { -
-

Todos

- -
- - {#if items.length > 0} -
- - {#for item in items} - {/for} - -
- {/if} - } -} - fn main() { println!("Hello, world!"); } diff --git a/todomvc/src/yolo.rs b/todomvc/src/yolo.rs new file mode 100644 index 0000000..6d71475 --- /dev/null +++ b/todomvc/src/yolo.rs @@ -0,0 +1,47 @@ +struct YourFuckingMap; + +struct Options { + shit_you_get_from_the_net: EnumA, + other_shit: EnumB, + number: f32, +} + +impl Component for YourFuckingMap { + type Context = Options; + + fn view(&self, context: Self::Context) -> Vec { + // in here + let mut node = B::Markup::empty(); + if context.number > 0.5 { + node += this; + } + + match context.shit_you_get_from_the_net { + A => node += that, + B => node += ehtis, + } + + [node] + } +} + + +/////// + + => { + let listeners = span.listeners(); + } + + =>view(&self) -> B::Markup { + let button = (...); + + let mut data2 = Markup::empty(); + for row in ctx.data { + match row { + A => data2 += span.render(), + B => data2 + } + } + + [button, data2] + } \ No newline at end of file