@tishlang/tish-format 1.0.13 → 2.0.2

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 (108) hide show
  1. package/Cargo.toml +2 -0
  2. package/bin/tish-format +0 -0
  3. package/crates/js_to_tish/src/transform/expr.rs +1 -0
  4. package/crates/tish/Cargo.toml +10 -2
  5. package/crates/tish/build.rs +21 -0
  6. package/crates/tish/src/cli_help.rs +15 -4
  7. package/crates/tish/src/main.rs +93 -21
  8. package/crates/tish/src/repl_completion.rs +0 -1
  9. package/crates/tish/tests/error_source_location.rs +36 -0
  10. package/crates/tish/tests/fixtures/runtime_error_location.tish +5 -0
  11. package/crates/tish/tests/fixtures/trycatch_runtime_errors.tish +15 -0
  12. package/crates/tish/tests/fixtures/tty_capability.tish +9 -0
  13. package/crates/tish/tests/integration_test.rs +402 -91
  14. package/crates/tish/tests/trycatch_runtime_errors.rs +45 -0
  15. package/crates/tish/tests/tty_capability.rs +43 -0
  16. package/crates/tish_ast/src/ast.rs +37 -8
  17. package/crates/tish_builtins/Cargo.toml +2 -0
  18. package/crates/tish_builtins/src/array.rs +375 -13
  19. package/crates/tish_builtins/src/collections.rs +481 -0
  20. package/crates/tish_builtins/src/construct.rs +59 -19
  21. package/crates/tish_builtins/src/date.rs +538 -0
  22. package/crates/tish_builtins/src/globals.rs +86 -6
  23. package/crates/tish_builtins/src/iterator.rs +129 -0
  24. package/crates/tish_builtins/src/lib.rs +5 -0
  25. package/crates/tish_builtins/src/number.rs +96 -0
  26. package/crates/tish_builtins/src/object.rs +2 -2
  27. package/crates/tish_builtins/src/string.rs +19 -20
  28. package/crates/tish_builtins/src/symbol.rs +1 -1
  29. package/crates/tish_builtins/src/typedarrays.rs +298 -0
  30. package/crates/tish_bytecode/src/chunk.rs +69 -1
  31. package/crates/tish_bytecode/src/compiler.rs +933 -89
  32. package/crates/tish_bytecode/src/encoding.rs +2 -0
  33. package/crates/tish_bytecode/src/lib.rs +2 -1
  34. package/crates/tish_bytecode/src/opcode.rs +47 -4
  35. package/crates/tish_bytecode/src/serialize.rs +31 -1
  36. package/crates/tish_compile/Cargo.toml +1 -0
  37. package/crates/tish_compile/src/check.rs +774 -0
  38. package/crates/tish_compile/src/codegen.rs +2334 -349
  39. package/crates/tish_compile/src/infer.rs +1395 -6
  40. package/crates/tish_compile/src/lib.rs +50 -8
  41. package/crates/tish_compile/src/resolve.rs +584 -21
  42. package/crates/tish_compile/src/types.rs +106 -2
  43. package/crates/tish_compile_js/src/codegen.rs +67 -0
  44. package/crates/tish_compile_js/src/tests_jsx.rs +64 -0
  45. package/crates/tish_core/Cargo.toml +7 -1
  46. package/crates/tish_core/src/console_style.rs +11 -1
  47. package/crates/tish_core/src/json.rs +81 -38
  48. package/crates/tish_core/src/lib.rs +3 -0
  49. package/crates/tish_core/src/shape.rs +85 -0
  50. package/crates/tish_core/src/value.rs +679 -25
  51. package/crates/tish_core/src/vmref.rs +13 -8
  52. package/crates/tish_cranelift/src/link.rs +17 -4
  53. package/crates/tish_cranelift_runtime/Cargo.toml +1 -0
  54. package/crates/tish_eval/Cargo.toml +6 -0
  55. package/crates/tish_eval/src/eval.rs +665 -117
  56. package/crates/tish_eval/src/http.rs +4 -1
  57. package/crates/tish_eval/src/natives.rs +165 -13
  58. package/crates/tish_eval/src/value.rs +31 -13
  59. package/crates/tish_eval/src/value_convert.rs +10 -4
  60. package/crates/tish_ffi/Cargo.toml +26 -0
  61. package/crates/tish_ffi/src/lib.rs +518 -0
  62. package/crates/tish_ffi/tests/fixtures/testmod/Cargo.toml +18 -0
  63. package/crates/tish_ffi/tests/fixtures/testmod/src/lib.rs +46 -0
  64. package/crates/tish_ffi/tests/loader.rs +65 -0
  65. package/crates/tish_fmt/Cargo.toml +1 -1
  66. package/crates/tish_fmt/src/lib.rs +61 -5
  67. package/crates/tish_lexer/src/lib.rs +397 -9
  68. package/crates/tish_lexer/src/token.rs +7 -0
  69. package/crates/tish_lint/src/lib.rs +2 -10
  70. package/crates/tish_lsp/src/import_goto.rs +2 -0
  71. package/crates/tish_lsp/src/main.rs +439 -26
  72. package/crates/tish_native/src/build.rs +55 -1
  73. package/crates/tish_opt/src/lib.rs +126 -23
  74. package/crates/tish_parser/src/lib.rs +55 -1
  75. package/crates/tish_parser/src/parser.rs +456 -34
  76. package/crates/tish_pg/src/lib.rs +3 -3
  77. package/crates/tish_resolve/src/lib.rs +99 -59
  78. package/crates/tish_runtime/Cargo.toml +4 -0
  79. package/crates/tish_runtime/src/http.rs +66 -17
  80. package/crates/tish_runtime/src/http_fetch.rs +29 -8
  81. package/crates/tish_runtime/src/http_hyper.rs +25 -2
  82. package/crates/tish_runtime/src/lib.rs +299 -44
  83. package/crates/tish_runtime/src/promise.rs +328 -18
  84. package/crates/tish_runtime/src/timers.rs +13 -7
  85. package/crates/tish_runtime/src/tty.rs +226 -0
  86. package/crates/tish_runtime/src/ws.rs +35 -18
  87. package/crates/tish_runtime/tests/fetch_readable_stream.rs +2 -2
  88. package/crates/tish_ui/src/jsx.rs +10 -0
  89. package/crates/tish_ui/src/runtime/hooks.rs +19 -15
  90. package/crates/tish_ui/src/runtime/mod.rs +15 -12
  91. package/crates/tish_vm/Cargo.toml +14 -1
  92. package/crates/tish_vm/src/jit.rs +1050 -0
  93. package/crates/tish_vm/src/lib.rs +2 -0
  94. package/crates/tish_vm/src/vm.rs +1546 -202
  95. package/crates/tish_vm/tests/concurrent_shared_state.rs +140 -0
  96. package/crates/tish_wasm/src/lib.rs +6 -2
  97. package/crates/tish_wasm_runtime/src/gpu.rs +17 -1
  98. package/crates/tishlang_cargo_bindgen/src/classify.rs +1 -3
  99. package/crates/tishlang_cargo_bindgen/src/lib.rs +2 -2
  100. package/crates/tishlang_cargo_bindgen/src/metadata.rs +1 -1
  101. package/justfile +8 -0
  102. package/package.json +2 -2
  103. package/platform/darwin-arm64/tish-fmt +0 -0
  104. package/platform/darwin-x64/tish-fmt +0 -0
  105. package/platform/linux-arm64/tish-fmt +0 -0
  106. package/platform/linux-x64/tish-fmt +0 -0
  107. package/platform/win32-x64/tish-fmt.exe +0 -0
  108. package/README.md +0 -138
@@ -2,11 +2,14 @@
2
2
  //!
3
3
  //! Emits Rust source that links to tishlang_runtime.
4
4
 
5
+ mod check;
5
6
  mod codegen;
6
7
  mod infer;
7
8
  mod resolve;
8
9
  mod types;
9
10
 
11
+ pub use check::{check_program, TypeDiagnostic};
12
+
10
13
  /// How generated Rust is linked (desktop binary vs embedded iOS staticlib).
11
14
  #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
12
15
  pub enum NativeEmitMode {
@@ -26,7 +29,8 @@ pub use resolve::{
26
29
  cargo_export_fn_name, compute_native_build_artifacts, detect_cycles, ensure_tish_canvas_module,
27
30
  export_name_to_rust_ident, extract_native_import_features, format_rust_dependencies_toml,
28
31
  generate_native_wrapper_rs, has_external_native_imports, has_native_imports,
29
- infer_native_module_exports, is_builtin_native_spec, is_cargo_native_spec, is_native_import,
32
+ ffi_native_specs, infer_native_module_exports, is_builtin_native_spec, is_cargo_native_spec,
33
+ is_ffi_native_spec, is_native_import,
30
34
  merge_modules, normalize_builtin_spec, program_uses_document, read_project_tish_config,
31
35
  resolve_bare_spec, resolve_native_modules, resolve_project, resolve_project_from_stdin,
32
36
  MergedProgram, NativeBuildArtifacts, NativeModuleInit, ResolvedNativeModule,
@@ -40,9 +44,9 @@ mod tests {
40
44
 
41
45
  #[test]
42
46
  fn typed_assign_conversion() {
43
- // With the inference pass and native emit, `total: number = 0` becomes f64.
44
- // Assignment `total = total + n` (where n comes from ForOf over a Value::Array)
45
- // emits a native f64 assignment that unboxes the Value result via from_value_expr.
47
+ // Typed rest-param `...args: number[]` lowers to a native `Vec<f64>` (M3), so the ForOf
48
+ // element `n` is `f64`, `total = total + n` stays native, and `total` is NOT demoted — the
49
+ // whole reduction compiles to native f64 with the return wrapping `total` back to `Value`.
46
50
  let src = r#"
47
51
  fn sum(...args: number[]): number {
48
52
  let total: number = 0
@@ -52,12 +56,33 @@ fn sum(...args: number[]): number {
52
56
  "#;
53
57
  let program = parse(src).unwrap();
54
58
  let rust = compile(&program).unwrap();
55
- // total should be declared as f64
56
- assert!(rust.contains("let mut total: f64"), "expected total: f64");
57
- // The return value of run() should convert total back to Value
59
+ assert!(
60
+ rust.contains("let mut total: f64"),
61
+ "typed rest-param `Vec<f64>` keeps `total` native f64 (no demotion)"
62
+ );
63
+ assert!(
64
+ rust.contains("Value::Number(total)"),
65
+ "f64 total is wrapped back to Value at the return boundary"
66
+ );
67
+
68
+ // When every reassignment is provably numeric, the `number` local stays native `f64` and
69
+ // is wrapped back to `Value` only at the return boundary.
70
+ let src_native = r#"
71
+ fn count(): number {
72
+ let total: number = 0
73
+ for (let i: number = 0; i < 10; i = i + 1) { total = total + i }
74
+ return total
75
+ }
76
+ "#;
77
+ let program = parse(src_native).unwrap();
78
+ let rust = compile(&program).unwrap();
79
+ assert!(
80
+ rust.contains("let mut total: f64"),
81
+ "numeric-only reassignment keeps `total` native f64"
82
+ );
58
83
  assert!(
59
84
  rust.contains("Value::Number(total)"),
60
- "expected Value::Number(total) wrapping"
85
+ "f64 total is wrapped back to Value at the return boundary"
61
86
  );
62
87
  }
63
88
 
@@ -162,3 +187,20 @@ fn factory() {
162
187
  );
163
188
  }
164
189
  }
190
+
191
+ #[cfg(test)]
192
+ mod monomorphization_tests {
193
+ use super::*;
194
+ use tishlang_parser::parse;
195
+
196
+ /// `Box<number>` monomorphizes to a synthetic concrete alias whose field is a native `f64`,
197
+ /// not a boxed `Value` — generic structs participate in native lowering.
198
+ #[test]
199
+ fn generic_struct_is_native() {
200
+ let src = "type Box<T> = { value: T }\nlet b: Box<number> = { value: 42 }\nconsole.log(b.value + 1)";
201
+ let rust = compile(&parse(src).unwrap()).unwrap();
202
+ // Box<number> must monomorphize to a struct with a native f64 field (not Value).
203
+ assert!(rust.contains("value: f64"), "expected native f64 field; got:\n{}",
204
+ rust.lines().filter(|l| l.contains("struct") || l.contains("value")).take(6).collect::<Vec<_>>().join("\n"));
205
+ }
206
+ }