@tishlang/tish-format 1.0.12 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/Cargo.toml +51 -0
  2. package/LICENSE +13 -0
  3. package/bin/tish-format +0 -0
  4. package/crates/js_to_tish/Cargo.toml +11 -0
  5. package/crates/js_to_tish/README.md +18 -0
  6. package/crates/js_to_tish/src/error.rs +55 -0
  7. package/crates/js_to_tish/src/lib.rs +11 -0
  8. package/crates/js_to_tish/src/span_util.rs +35 -0
  9. package/crates/js_to_tish/src/transform/expr.rs +611 -0
  10. package/crates/js_to_tish/src/transform/stmt.rs +503 -0
  11. package/crates/js_to_tish/src/transform.rs +60 -0
  12. package/crates/tish/Cargo.toml +62 -0
  13. package/crates/tish/build.rs +21 -0
  14. package/crates/tish/src/cargo_native_registry.rs +32 -0
  15. package/crates/tish/src/cli_help.rs +576 -0
  16. package/crates/tish/src/main.rs +853 -0
  17. package/crates/tish/src/repl_completion.rs +199 -0
  18. package/crates/tish/tests/cargo_example_compile.rs +67 -0
  19. package/crates/tish/tests/error_source_location.rs +36 -0
  20. package/crates/tish/tests/fixtures/cargo_example_project/Cargo.toml +3 -0
  21. package/crates/tish/tests/fixtures/cargo_example_project/crates/demo-shim/Cargo.toml +11 -0
  22. package/crates/tish/tests/fixtures/cargo_example_project/crates/demo-shim/src/lib.rs +12 -0
  23. package/crates/tish/tests/fixtures/cargo_example_project/package.json +10 -0
  24. package/crates/tish/tests/fixtures/cargo_example_project/src/main.tish +3 -0
  25. package/crates/tish/tests/fixtures/runtime_error_location.tish +5 -0
  26. package/crates/tish/tests/fixtures/trycatch_runtime_errors.tish +15 -0
  27. package/crates/tish/tests/fixtures/tty_capability.tish +9 -0
  28. package/crates/tish/tests/integration_test.rs +1406 -0
  29. package/crates/tish/tests/run_optimize_stdout_parity.rs +50 -0
  30. package/crates/tish/tests/shortcircuit.rs +65 -0
  31. package/crates/tish/tests/trycatch_runtime_errors.rs +45 -0
  32. package/crates/tish/tests/tty_capability.rs +43 -0
  33. package/crates/tish_ast/Cargo.toml +9 -0
  34. package/crates/tish_ast/src/ast.rs +649 -0
  35. package/crates/tish_ast/src/lib.rs +5 -0
  36. package/crates/tish_build_utils/Cargo.toml +11 -0
  37. package/crates/tish_build_utils/src/lib.rs +577 -0
  38. package/crates/tish_builtins/Cargo.toml +22 -0
  39. package/crates/tish_builtins/src/array.rs +803 -0
  40. package/crates/tish_builtins/src/collections.rs +481 -0
  41. package/crates/tish_builtins/src/construct.rs +199 -0
  42. package/crates/tish_builtins/src/date.rs +538 -0
  43. package/crates/tish_builtins/src/globals.rs +293 -0
  44. package/crates/tish_builtins/src/helpers.rs +35 -0
  45. package/crates/tish_builtins/src/iterator.rs +129 -0
  46. package/crates/tish_builtins/src/lib.rs +21 -0
  47. package/crates/tish_builtins/src/math.rs +89 -0
  48. package/crates/tish_builtins/src/number.rs +96 -0
  49. package/crates/tish_builtins/src/object.rs +36 -0
  50. package/crates/tish_builtins/src/string.rs +646 -0
  51. package/crates/tish_builtins/src/symbol.rs +83 -0
  52. package/crates/tish_builtins/src/typedarrays.rs +298 -0
  53. package/crates/tish_bytecode/Cargo.toml +17 -0
  54. package/crates/tish_bytecode/src/chunk.rs +164 -0
  55. package/crates/tish_bytecode/src/compiler.rs +2604 -0
  56. package/crates/tish_bytecode/src/encoding.rs +102 -0
  57. package/crates/tish_bytecode/src/lib.rs +20 -0
  58. package/crates/tish_bytecode/src/opcode.rs +185 -0
  59. package/crates/tish_bytecode/src/peephole.rs +189 -0
  60. package/crates/tish_bytecode/src/serialize.rs +193 -0
  61. package/crates/tish_bytecode/tests/break_continue_bytecode.rs +44 -0
  62. package/crates/tish_bytecode/tests/constant_folding.rs +84 -0
  63. package/crates/tish_bytecode/tests/sort_optimization.rs +31 -0
  64. package/crates/tish_compile/Cargo.toml +27 -0
  65. package/crates/tish_compile/src/check.rs +774 -0
  66. package/crates/tish_compile/src/codegen.rs +7317 -0
  67. package/crates/tish_compile/src/infer.rs +1681 -0
  68. package/crates/tish_compile/src/lib.rs +206 -0
  69. package/crates/tish_compile/src/resolve.rs +1951 -0
  70. package/crates/tish_compile/src/types.rs +605 -0
  71. package/crates/tish_compile_js/Cargo.toml +18 -0
  72. package/crates/tish_compile_js/examples/jsx_vdom_smoke.tish +8 -0
  73. package/crates/tish_compile_js/src/codegen.rs +938 -0
  74. package/crates/tish_compile_js/src/error.rs +20 -0
  75. package/crates/tish_compile_js/src/lib.rs +26 -0
  76. package/crates/tish_compile_js/src/tests_jsx.rs +414 -0
  77. package/crates/tish_compiler_wasm/Cargo.toml +21 -0
  78. package/crates/tish_compiler_wasm/src/lib.rs +57 -0
  79. package/crates/tish_compiler_wasm/src/resolve_virtual.rs +473 -0
  80. package/crates/tish_core/Cargo.toml +32 -0
  81. package/crates/tish_core/src/console_style.rs +170 -0
  82. package/crates/tish_core/src/json.rs +430 -0
  83. package/crates/tish_core/src/lib.rs +20 -0
  84. package/crates/tish_core/src/macros.rs +36 -0
  85. package/crates/tish_core/src/shape.rs +85 -0
  86. package/crates/tish_core/src/uri.rs +118 -0
  87. package/crates/tish_core/src/value.rs +1350 -0
  88. package/crates/tish_core/src/vmref.rs +183 -0
  89. package/crates/tish_cranelift/Cargo.toml +19 -0
  90. package/crates/tish_cranelift/src/lib.rs +43 -0
  91. package/crates/tish_cranelift/src/link.rs +130 -0
  92. package/crates/tish_cranelift/src/lower.rs +85 -0
  93. package/crates/tish_cranelift_runtime/Cargo.toml +26 -0
  94. package/crates/tish_cranelift_runtime/src/lib.rs +45 -0
  95. package/crates/tish_eval/Cargo.toml +51 -0
  96. package/crates/tish_eval/src/eval.rs +4265 -0
  97. package/crates/tish_eval/src/http.rs +191 -0
  98. package/crates/tish_eval/src/lib.rs +99 -0
  99. package/crates/tish_eval/src/natives.rs +551 -0
  100. package/crates/tish_eval/src/promise.rs +179 -0
  101. package/crates/tish_eval/src/regex.rs +299 -0
  102. package/crates/tish_eval/src/timers.rs +120 -0
  103. package/crates/tish_eval/src/value.rs +336 -0
  104. package/crates/tish_eval/src/value_convert.rs +117 -0
  105. package/crates/tish_ffi/Cargo.toml +26 -0
  106. package/crates/tish_ffi/src/lib.rs +518 -0
  107. package/crates/tish_ffi/tests/fixtures/testmod/Cargo.toml +18 -0
  108. package/crates/tish_ffi/tests/fixtures/testmod/src/lib.rs +46 -0
  109. package/crates/tish_ffi/tests/loader.rs +65 -0
  110. package/crates/tish_fmt/Cargo.toml +16 -0
  111. package/crates/tish_fmt/src/bin/tish-fmt.rs +41 -0
  112. package/crates/tish_fmt/src/lib.rs +2157 -0
  113. package/crates/tish_jsx_web/Cargo.toml +9 -0
  114. package/crates/tish_jsx_web/README.md +5 -0
  115. package/crates/tish_jsx_web/src/lib.rs +2 -0
  116. package/crates/tish_lexer/Cargo.toml +9 -0
  117. package/crates/tish_lexer/src/lib.rs +1104 -0
  118. package/crates/tish_lexer/src/token.rs +170 -0
  119. package/crates/tish_lint/Cargo.toml +18 -0
  120. package/crates/tish_lint/src/bin/tish-lint.rs +195 -0
  121. package/crates/tish_lint/src/lib.rs +281 -0
  122. package/crates/tish_llvm/Cargo.toml +13 -0
  123. package/crates/tish_llvm/src/lib.rs +115 -0
  124. package/crates/tish_lsp/Cargo.toml +25 -0
  125. package/crates/tish_lsp/README.md +26 -0
  126. package/crates/tish_lsp/src/builtin_goto.rs +362 -0
  127. package/crates/tish_lsp/src/import_goto.rs +564 -0
  128. package/crates/tish_lsp/src/main.rs +1459 -0
  129. package/crates/tish_native/Cargo.toml +16 -0
  130. package/crates/tish_native/src/build.rs +481 -0
  131. package/crates/tish_native/src/config.rs +48 -0
  132. package/crates/tish_native/src/lib.rs +416 -0
  133. package/crates/tish_opt/Cargo.toml +13 -0
  134. package/crates/tish_opt/src/lib.rs +1046 -0
  135. package/crates/tish_parser/Cargo.toml +11 -0
  136. package/crates/tish_parser/src/lib.rs +386 -0
  137. package/crates/tish_parser/src/parser.rs +2726 -0
  138. package/crates/tish_pg/Cargo.toml +34 -0
  139. package/crates/tish_pg/README.md +38 -0
  140. package/crates/tish_pg/src/error.rs +52 -0
  141. package/crates/tish_pg/src/lib.rs +955 -0
  142. package/crates/tish_resolve/Cargo.toml +13 -0
  143. package/crates/tish_resolve/src/lib.rs +3601 -0
  144. package/crates/tish_resolve/src/pos.rs +141 -0
  145. package/crates/tish_runtime/Cargo.toml +100 -0
  146. package/crates/tish_runtime/src/http.rs +1347 -0
  147. package/crates/tish_runtime/src/http_fetch.rs +492 -0
  148. package/crates/tish_runtime/src/http_hyper.rs +441 -0
  149. package/crates/tish_runtime/src/http_prefork.rs +189 -0
  150. package/crates/tish_runtime/src/lib.rs +1447 -0
  151. package/crates/tish_runtime/src/native_promise.rs +15 -0
  152. package/crates/tish_runtime/src/promise.rs +558 -0
  153. package/crates/tish_runtime/src/promise_io.rs +38 -0
  154. package/crates/tish_runtime/src/timers.rs +172 -0
  155. package/crates/tish_runtime/src/tty.rs +226 -0
  156. package/crates/tish_runtime/src/ws.rs +778 -0
  157. package/crates/tish_runtime/tests/fetch_readable_stream.rs +102 -0
  158. package/crates/tish_ui/Cargo.toml +17 -0
  159. package/crates/tish_ui/src/jsx.rs +692 -0
  160. package/crates/tish_ui/src/lib.rs +20 -0
  161. package/crates/tish_ui/src/runtime/hooks.rs +573 -0
  162. package/crates/tish_ui/src/runtime/mod.rs +183 -0
  163. package/crates/tish_vm/Cargo.toml +60 -0
  164. package/crates/tish_vm/src/jit.rs +1050 -0
  165. package/crates/tish_vm/src/lib.rs +41 -0
  166. package/crates/tish_vm/src/vm.rs +3536 -0
  167. package/crates/tish_vm/tests/concurrent_shared_state.rs +140 -0
  168. package/crates/tish_vm/tests/fixtures/or_string_cmd.tish +2 -0
  169. package/crates/tish_vm/tests/lexical_scope_declare.rs +34 -0
  170. package/crates/tish_vm/tests/peephole_jump_chain_logical_or.rs +150 -0
  171. package/crates/tish_wasm/Cargo.toml +15 -0
  172. package/crates/tish_wasm/src/lib.rs +428 -0
  173. package/crates/tish_wasm_runtime/Cargo.toml +37 -0
  174. package/crates/tish_wasm_runtime/src/gpu.rs +429 -0
  175. package/crates/tish_wasm_runtime/src/lib.rs +42 -0
  176. package/crates/tishlang_cargo_bindgen/Cargo.toml +26 -0
  177. package/crates/tishlang_cargo_bindgen/src/classify.rs +261 -0
  178. package/crates/tishlang_cargo_bindgen/src/discover.rs +125 -0
  179. package/crates/tishlang_cargo_bindgen/src/infer.rs +382 -0
  180. package/crates/tishlang_cargo_bindgen/src/lib.rs +349 -0
  181. package/crates/tishlang_cargo_bindgen/src/main.rs +167 -0
  182. package/crates/tishlang_cargo_bindgen/src/metadata.rs +117 -0
  183. package/justfile +276 -0
  184. package/package.json +2 -2
  185. package/platform/darwin-arm64/tish-fmt +0 -0
  186. package/platform/darwin-x64/tish-fmt +0 -0
  187. package/platform/linux-arm64/tish-fmt +0 -0
  188. package/platform/linux-x64/tish-fmt +0 -0
  189. package/platform/win32-x64/tish-fmt.exe +0 -0
@@ -0,0 +1,44 @@
1
+ //! Regression: C-style `for` `continue` must jump forward to the update clause (not JumpBack).
2
+
3
+ use std::fs;
4
+
5
+ use tishlang_bytecode::{compile, compile_unoptimized};
6
+ use tishlang_vm::run;
7
+
8
+ #[test]
9
+ fn break_continue_fixture_runs_on_vm() {
10
+ let path = format!(
11
+ "{}/../../tests/core/break_continue.tish",
12
+ env!("CARGO_MANIFEST_DIR")
13
+ );
14
+ let src = fs::read_to_string(&path).unwrap();
15
+ let prog = tishlang_parser::parse(&src).expect("parse");
16
+ let chunk = compile_unoptimized(&prog).expect("compile");
17
+ run(&chunk).expect("VM run");
18
+ }
19
+
20
+ #[test]
21
+ fn mutation_vm_ast_opt_without_peephole() {
22
+ let path = format!(
23
+ "{}/../../tests/core/mutation.tish",
24
+ env!("CARGO_MANIFEST_DIR")
25
+ );
26
+ let src = fs::read_to_string(&path).unwrap();
27
+ let mut prog = tishlang_parser::parse(&src).expect("parse");
28
+ tishlang_opt::optimize(&mut prog);
29
+ let chunk = compile_unoptimized(&prog).expect("compile");
30
+ run(&chunk).expect("VM");
31
+ }
32
+
33
+ #[test]
34
+ fn mutation_vm_ast_opt_with_peephole() {
35
+ let path = format!(
36
+ "{}/../../tests/core/mutation.tish",
37
+ env!("CARGO_MANIFEST_DIR")
38
+ );
39
+ let src = fs::read_to_string(&path).unwrap();
40
+ let mut prog = tishlang_parser::parse(&src).expect("parse");
41
+ tishlang_opt::optimize(&mut prog);
42
+ let chunk = compile(&prog).expect("compile");
43
+ run(&chunk).expect("VM");
44
+ }
@@ -0,0 +1,84 @@
1
+ //! Verify AST optimization (constant folding) yields expected bytecode.
2
+ //! Uses tishlang_opt::optimize before compile to match the pipeline used by run/compile.
3
+
4
+ use tishlang_bytecode::{compile, Chunk, Opcode};
5
+ use tishlang_parser::parse;
6
+
7
+ fn chunk_contains_opcode(chunk: &Chunk, op: u8) -> bool {
8
+ if chunk.code.contains(&op) {
9
+ return true;
10
+ }
11
+ for nested in &chunk.nested {
12
+ if chunk_contains_opcode(nested, op) {
13
+ return true;
14
+ }
15
+ }
16
+ false
17
+ }
18
+
19
+ /// 1 + 2 should fold to constant 3; no BinOp in bytecode.
20
+ #[test]
21
+ fn constant_fold_binary_no_binop() {
22
+ let source = "1 + 2";
23
+ let program = parse(source).expect("parse");
24
+ let optimized = tishlang_opt::optimize(&program);
25
+ let chunk = compile(&optimized).expect("compile");
26
+ assert!(
27
+ !chunk_contains_opcode(&chunk, Opcode::BinOp as u8),
28
+ "Expected no BinOp for 1+2 after constant folding"
29
+ );
30
+ assert!(
31
+ chunk.constants.iter().any(|c| matches!(c, tishlang_bytecode::Constant::Number(n) if (*n - 3.0).abs() < f64::EPSILON)),
32
+ "Expected constant 3 in chunk"
33
+ );
34
+ }
35
+
36
+ /// Peephole: Dup+Pop should be removed (replaced with Nop Nop).
37
+ /// Compile a program that may emit Dup+Pop; verify it runs and chunk has no consecutive Dup,Pop.
38
+ fn chunk_has_dup_pop_sequence(code: &[u8]) -> bool {
39
+ let dup = Opcode::Dup as u8;
40
+ let pop = Opcode::Pop as u8;
41
+ for i in 0..code.len().saturating_sub(1) {
42
+ if code[i] == dup && code[i + 1] == pop {
43
+ return true;
44
+ }
45
+ }
46
+ false
47
+ }
48
+
49
+ fn chunk_contains_dup_pop(chunk: &Chunk) -> bool {
50
+ if chunk_has_dup_pop_sequence(&chunk.code) {
51
+ return true;
52
+ }
53
+ for nested in &chunk.nested {
54
+ if chunk_contains_dup_pop(nested) {
55
+ return true;
56
+ }
57
+ }
58
+ false
59
+ }
60
+
61
+ #[test]
62
+ fn peephole_remove_dup_pop() {
63
+ let source = "let o = {a:1}; o?.a";
64
+ let program = parse(source).expect("parse");
65
+ let optimized = tishlang_opt::optimize(&program);
66
+ let chunk = compile(&optimized).expect("compile");
67
+ assert!(
68
+ !chunk_contains_dup_pop(&chunk),
69
+ "Peephole should remove Dup+Pop sequences"
70
+ );
71
+ }
72
+
73
+ /// -42 should fold to constant -42; no UnaryOp in bytecode.
74
+ #[test]
75
+ fn constant_fold_unary_no_unaryop() {
76
+ let source = "-42";
77
+ let program = parse(source).expect("parse");
78
+ let optimized = tishlang_opt::optimize(&program);
79
+ let chunk = compile(&optimized).expect("compile");
80
+ assert!(
81
+ !chunk_contains_opcode(&chunk, Opcode::UnaryOp as u8),
82
+ "Expected no UnaryOp for -42 after constant folding"
83
+ );
84
+ }
@@ -0,0 +1,31 @@
1
+ //! Verify arr.sort((a,b)=>a-b) compiles to ArraySortNumeric (opcode 31).
2
+
3
+ use tishlang_bytecode::{compile, Opcode};
4
+ use tishlang_parser::parse;
5
+
6
+ fn chunk_contains_opcode(chunk: &tishlang_bytecode::Chunk, op: u8) -> bool {
7
+ if chunk.code.contains(&op) {
8
+ return true;
9
+ }
10
+ for nested in &chunk.nested {
11
+ if chunk_contains_opcode(nested, op) {
12
+ return true;
13
+ }
14
+ }
15
+ false
16
+ }
17
+
18
+ #[test]
19
+ fn test_numeric_sort_uses_array_sort_numeric() {
20
+ let source = r#"
21
+ let x = [3, 1, 2];
22
+ x.sort((a, b) => a - b);
23
+ console.log(x);
24
+ "#;
25
+ let program = parse(source).expect("parse");
26
+ let chunk = compile(&program).expect("compile");
27
+ assert!(
28
+ chunk_contains_opcode(&chunk, Opcode::ArraySortNumeric as u8),
29
+ "Expected ArraySortNumeric (31) in bytecode for x.sort((a,b)=>a-b)"
30
+ );
31
+ }
@@ -0,0 +1,27 @@
1
+ [package]
2
+ name = "tishlang_compile"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ description = "Tish native compiler backend"
6
+
7
+ license-file = { workspace = true }
8
+ repository = { workspace = true }
9
+ [features]
10
+ default = []
11
+ http = []
12
+ timers = []
13
+ fs = []
14
+ process = []
15
+ regex = []
16
+ ws = []
17
+ tty = []
18
+
19
+ [dependencies]
20
+ tishlang_ast = { path = "../tish_ast", version = ">=0.1" }
21
+ tishlang_opt = { path = "../tish_opt", version = ">=0.1" }
22
+ tishlang_parser = { path = "../tish_parser", version = ">=0.1" }
23
+ tishlang_ui = { path = "../tish_ui", version = ">=0.1", default-features = false, features = ["compiler"] }
24
+ serde_json = "1.0"
25
+
26
+ [dev-dependencies]
27
+ tempfile = "3"