@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.
- package/Cargo.toml +51 -0
- package/LICENSE +13 -0
- package/bin/tish-format +0 -0
- package/crates/js_to_tish/Cargo.toml +11 -0
- package/crates/js_to_tish/README.md +18 -0
- package/crates/js_to_tish/src/error.rs +55 -0
- package/crates/js_to_tish/src/lib.rs +11 -0
- package/crates/js_to_tish/src/span_util.rs +35 -0
- package/crates/js_to_tish/src/transform/expr.rs +611 -0
- package/crates/js_to_tish/src/transform/stmt.rs +503 -0
- package/crates/js_to_tish/src/transform.rs +60 -0
- package/crates/tish/Cargo.toml +62 -0
- package/crates/tish/build.rs +21 -0
- package/crates/tish/src/cargo_native_registry.rs +32 -0
- package/crates/tish/src/cli_help.rs +576 -0
- package/crates/tish/src/main.rs +853 -0
- package/crates/tish/src/repl_completion.rs +199 -0
- package/crates/tish/tests/cargo_example_compile.rs +67 -0
- package/crates/tish/tests/error_source_location.rs +36 -0
- package/crates/tish/tests/fixtures/cargo_example_project/Cargo.toml +3 -0
- package/crates/tish/tests/fixtures/cargo_example_project/crates/demo-shim/Cargo.toml +11 -0
- package/crates/tish/tests/fixtures/cargo_example_project/crates/demo-shim/src/lib.rs +12 -0
- package/crates/tish/tests/fixtures/cargo_example_project/package.json +10 -0
- package/crates/tish/tests/fixtures/cargo_example_project/src/main.tish +3 -0
- package/crates/tish/tests/fixtures/runtime_error_location.tish +5 -0
- package/crates/tish/tests/fixtures/trycatch_runtime_errors.tish +15 -0
- package/crates/tish/tests/fixtures/tty_capability.tish +9 -0
- package/crates/tish/tests/integration_test.rs +1406 -0
- package/crates/tish/tests/run_optimize_stdout_parity.rs +50 -0
- package/crates/tish/tests/shortcircuit.rs +65 -0
- package/crates/tish/tests/trycatch_runtime_errors.rs +45 -0
- package/crates/tish/tests/tty_capability.rs +43 -0
- package/crates/tish_ast/Cargo.toml +9 -0
- package/crates/tish_ast/src/ast.rs +649 -0
- package/crates/tish_ast/src/lib.rs +5 -0
- package/crates/tish_build_utils/Cargo.toml +11 -0
- package/crates/tish_build_utils/src/lib.rs +577 -0
- package/crates/tish_builtins/Cargo.toml +22 -0
- package/crates/tish_builtins/src/array.rs +803 -0
- package/crates/tish_builtins/src/collections.rs +481 -0
- package/crates/tish_builtins/src/construct.rs +199 -0
- package/crates/tish_builtins/src/date.rs +538 -0
- package/crates/tish_builtins/src/globals.rs +293 -0
- package/crates/tish_builtins/src/helpers.rs +35 -0
- package/crates/tish_builtins/src/iterator.rs +129 -0
- package/crates/tish_builtins/src/lib.rs +21 -0
- package/crates/tish_builtins/src/math.rs +89 -0
- package/crates/tish_builtins/src/number.rs +96 -0
- package/crates/tish_builtins/src/object.rs +36 -0
- package/crates/tish_builtins/src/string.rs +646 -0
- package/crates/tish_builtins/src/symbol.rs +83 -0
- package/crates/tish_builtins/src/typedarrays.rs +298 -0
- package/crates/tish_bytecode/Cargo.toml +17 -0
- package/crates/tish_bytecode/src/chunk.rs +164 -0
- package/crates/tish_bytecode/src/compiler.rs +2604 -0
- package/crates/tish_bytecode/src/encoding.rs +102 -0
- package/crates/tish_bytecode/src/lib.rs +20 -0
- package/crates/tish_bytecode/src/opcode.rs +185 -0
- package/crates/tish_bytecode/src/peephole.rs +189 -0
- package/crates/tish_bytecode/src/serialize.rs +193 -0
- package/crates/tish_bytecode/tests/break_continue_bytecode.rs +44 -0
- package/crates/tish_bytecode/tests/constant_folding.rs +84 -0
- package/crates/tish_bytecode/tests/sort_optimization.rs +31 -0
- package/crates/tish_compile/Cargo.toml +27 -0
- package/crates/tish_compile/src/check.rs +774 -0
- package/crates/tish_compile/src/codegen.rs +7317 -0
- package/crates/tish_compile/src/infer.rs +1681 -0
- package/crates/tish_compile/src/lib.rs +206 -0
- package/crates/tish_compile/src/resolve.rs +1951 -0
- package/crates/tish_compile/src/types.rs +605 -0
- package/crates/tish_compile_js/Cargo.toml +18 -0
- package/crates/tish_compile_js/examples/jsx_vdom_smoke.tish +8 -0
- package/crates/tish_compile_js/src/codegen.rs +938 -0
- package/crates/tish_compile_js/src/error.rs +20 -0
- package/crates/tish_compile_js/src/lib.rs +26 -0
- package/crates/tish_compile_js/src/tests_jsx.rs +414 -0
- package/crates/tish_compiler_wasm/Cargo.toml +21 -0
- package/crates/tish_compiler_wasm/src/lib.rs +57 -0
- package/crates/tish_compiler_wasm/src/resolve_virtual.rs +473 -0
- package/crates/tish_core/Cargo.toml +32 -0
- package/crates/tish_core/src/console_style.rs +170 -0
- package/crates/tish_core/src/json.rs +430 -0
- package/crates/tish_core/src/lib.rs +20 -0
- package/crates/tish_core/src/macros.rs +36 -0
- package/crates/tish_core/src/shape.rs +85 -0
- package/crates/tish_core/src/uri.rs +118 -0
- package/crates/tish_core/src/value.rs +1350 -0
- package/crates/tish_core/src/vmref.rs +183 -0
- package/crates/tish_cranelift/Cargo.toml +19 -0
- package/crates/tish_cranelift/src/lib.rs +43 -0
- package/crates/tish_cranelift/src/link.rs +130 -0
- package/crates/tish_cranelift/src/lower.rs +85 -0
- package/crates/tish_cranelift_runtime/Cargo.toml +26 -0
- package/crates/tish_cranelift_runtime/src/lib.rs +45 -0
- package/crates/tish_eval/Cargo.toml +51 -0
- package/crates/tish_eval/src/eval.rs +4265 -0
- package/crates/tish_eval/src/http.rs +191 -0
- package/crates/tish_eval/src/lib.rs +99 -0
- package/crates/tish_eval/src/natives.rs +551 -0
- package/crates/tish_eval/src/promise.rs +179 -0
- package/crates/tish_eval/src/regex.rs +299 -0
- package/crates/tish_eval/src/timers.rs +120 -0
- package/crates/tish_eval/src/value.rs +336 -0
- package/crates/tish_eval/src/value_convert.rs +117 -0
- package/crates/tish_ffi/Cargo.toml +26 -0
- package/crates/tish_ffi/src/lib.rs +518 -0
- package/crates/tish_ffi/tests/fixtures/testmod/Cargo.toml +18 -0
- package/crates/tish_ffi/tests/fixtures/testmod/src/lib.rs +46 -0
- package/crates/tish_ffi/tests/loader.rs +65 -0
- package/crates/tish_fmt/Cargo.toml +16 -0
- package/crates/tish_fmt/src/bin/tish-fmt.rs +41 -0
- package/crates/tish_fmt/src/lib.rs +2157 -0
- package/crates/tish_jsx_web/Cargo.toml +9 -0
- package/crates/tish_jsx_web/README.md +5 -0
- package/crates/tish_jsx_web/src/lib.rs +2 -0
- package/crates/tish_lexer/Cargo.toml +9 -0
- package/crates/tish_lexer/src/lib.rs +1104 -0
- package/crates/tish_lexer/src/token.rs +170 -0
- package/crates/tish_lint/Cargo.toml +18 -0
- package/crates/tish_lint/src/bin/tish-lint.rs +195 -0
- package/crates/tish_lint/src/lib.rs +281 -0
- package/crates/tish_llvm/Cargo.toml +13 -0
- package/crates/tish_llvm/src/lib.rs +115 -0
- package/crates/tish_lsp/Cargo.toml +25 -0
- package/crates/tish_lsp/README.md +26 -0
- package/crates/tish_lsp/src/builtin_goto.rs +362 -0
- package/crates/tish_lsp/src/import_goto.rs +564 -0
- package/crates/tish_lsp/src/main.rs +1459 -0
- package/crates/tish_native/Cargo.toml +16 -0
- package/crates/tish_native/src/build.rs +481 -0
- package/crates/tish_native/src/config.rs +48 -0
- package/crates/tish_native/src/lib.rs +416 -0
- package/crates/tish_opt/Cargo.toml +13 -0
- package/crates/tish_opt/src/lib.rs +1046 -0
- package/crates/tish_parser/Cargo.toml +11 -0
- package/crates/tish_parser/src/lib.rs +386 -0
- package/crates/tish_parser/src/parser.rs +2726 -0
- package/crates/tish_pg/Cargo.toml +34 -0
- package/crates/tish_pg/README.md +38 -0
- package/crates/tish_pg/src/error.rs +52 -0
- package/crates/tish_pg/src/lib.rs +955 -0
- package/crates/tish_resolve/Cargo.toml +13 -0
- package/crates/tish_resolve/src/lib.rs +3601 -0
- package/crates/tish_resolve/src/pos.rs +141 -0
- package/crates/tish_runtime/Cargo.toml +100 -0
- package/crates/tish_runtime/src/http.rs +1347 -0
- package/crates/tish_runtime/src/http_fetch.rs +492 -0
- package/crates/tish_runtime/src/http_hyper.rs +441 -0
- package/crates/tish_runtime/src/http_prefork.rs +189 -0
- package/crates/tish_runtime/src/lib.rs +1447 -0
- package/crates/tish_runtime/src/native_promise.rs +15 -0
- package/crates/tish_runtime/src/promise.rs +558 -0
- package/crates/tish_runtime/src/promise_io.rs +38 -0
- package/crates/tish_runtime/src/timers.rs +172 -0
- package/crates/tish_runtime/src/tty.rs +226 -0
- package/crates/tish_runtime/src/ws.rs +778 -0
- package/crates/tish_runtime/tests/fetch_readable_stream.rs +102 -0
- package/crates/tish_ui/Cargo.toml +17 -0
- package/crates/tish_ui/src/jsx.rs +692 -0
- package/crates/tish_ui/src/lib.rs +20 -0
- package/crates/tish_ui/src/runtime/hooks.rs +573 -0
- package/crates/tish_ui/src/runtime/mod.rs +183 -0
- package/crates/tish_vm/Cargo.toml +60 -0
- package/crates/tish_vm/src/jit.rs +1050 -0
- package/crates/tish_vm/src/lib.rs +41 -0
- package/crates/tish_vm/src/vm.rs +3536 -0
- package/crates/tish_vm/tests/concurrent_shared_state.rs +140 -0
- package/crates/tish_vm/tests/fixtures/or_string_cmd.tish +2 -0
- package/crates/tish_vm/tests/lexical_scope_declare.rs +34 -0
- package/crates/tish_vm/tests/peephole_jump_chain_logical_or.rs +150 -0
- package/crates/tish_wasm/Cargo.toml +15 -0
- package/crates/tish_wasm/src/lib.rs +428 -0
- package/crates/tish_wasm_runtime/Cargo.toml +37 -0
- package/crates/tish_wasm_runtime/src/gpu.rs +429 -0
- package/crates/tish_wasm_runtime/src/lib.rs +42 -0
- package/crates/tishlang_cargo_bindgen/Cargo.toml +26 -0
- package/crates/tishlang_cargo_bindgen/src/classify.rs +261 -0
- package/crates/tishlang_cargo_bindgen/src/discover.rs +125 -0
- package/crates/tishlang_cargo_bindgen/src/infer.rs +382 -0
- package/crates/tishlang_cargo_bindgen/src/lib.rs +349 -0
- package/crates/tishlang_cargo_bindgen/src/main.rs +167 -0
- package/crates/tishlang_cargo_bindgen/src/metadata.rs +117 -0
- package/justfile +276 -0
- package/package.json +2 -2
- package/platform/darwin-arm64/tish-fmt +0 -0
- package/platform/darwin-x64/tish-fmt +0 -0
- package/platform/linux-arm64/tish-fmt +0 -0
- package/platform/linux-x64/tish-fmt +0 -0
- package/platform/win32-x64/tish-fmt.exe +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//! Ensure `tish run` and `tish run --no-optimize` agree on stdout for the same program.
|
|
2
|
+
|
|
3
|
+
use std::path::PathBuf;
|
|
4
|
+
use std::process::Command;
|
|
5
|
+
|
|
6
|
+
#[test]
|
|
7
|
+
fn string_or_fixture_stdout_matches_with_and_without_optimize() {
|
|
8
|
+
let tish = PathBuf::from(env!("CARGO_BIN_EXE_tish"));
|
|
9
|
+
let fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
|
10
|
+
.join("..")
|
|
11
|
+
.join("tish_vm")
|
|
12
|
+
.join("tests")
|
|
13
|
+
.join("fixtures")
|
|
14
|
+
.join("or_string_cmd.tish");
|
|
15
|
+
assert!(fixture.is_file(), "missing fixture {}", fixture.display());
|
|
16
|
+
|
|
17
|
+
let out_default = Command::new(&tish)
|
|
18
|
+
.args(["run", "--feature", "process", fixture.to_str().unwrap()])
|
|
19
|
+
.output()
|
|
20
|
+
.expect("spawn tish run");
|
|
21
|
+
assert!(
|
|
22
|
+
out_default.status.success(),
|
|
23
|
+
"stderr: {}",
|
|
24
|
+
String::from_utf8_lossy(&out_default.stderr)
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
let out_noopt = Command::new(&tish)
|
|
28
|
+
.args([
|
|
29
|
+
"run",
|
|
30
|
+
"--no-optimize",
|
|
31
|
+
"--feature",
|
|
32
|
+
"process",
|
|
33
|
+
fixture.to_str().unwrap(),
|
|
34
|
+
])
|
|
35
|
+
.output()
|
|
36
|
+
.expect("spawn tish run --no-optimize");
|
|
37
|
+
assert!(
|
|
38
|
+
out_noopt.status.success(),
|
|
39
|
+
"stderr: {}",
|
|
40
|
+
String::from_utf8_lossy(&out_noopt.stderr)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
assert_eq!(
|
|
44
|
+
out_default.stdout,
|
|
45
|
+
out_noopt.stdout,
|
|
46
|
+
"stdout differs:\n default: {:?}\n noopt: {:?}",
|
|
47
|
+
String::from_utf8_lossy(&out_default.stdout),
|
|
48
|
+
String::from_utf8_lossy(&out_noopt.stdout)
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//! Verify && and || short-circuit (JumpIfFalse before evaluating right side).
|
|
2
|
+
//! Moved from tish_bytecode to break publish cycle (bytecode dev-depends on vm, vm depends on bytecode).
|
|
3
|
+
use std::path::Path;
|
|
4
|
+
use tishlang_bytecode::{compile, compile_unoptimized, Opcode};
|
|
5
|
+
use tishlang_compile::{merge_modules, resolve_project};
|
|
6
|
+
use tishlang_opt;
|
|
7
|
+
use tishlang_parser::parse;
|
|
8
|
+
use tishlang_vm;
|
|
9
|
+
|
|
10
|
+
#[test]
|
|
11
|
+
fn test_and_shortcircuit_emits_jump() {
|
|
12
|
+
let source = "let x = null; let y = x != null && x.foo;";
|
|
13
|
+
let program = parse(source).expect("parse");
|
|
14
|
+
let chunk = compile_unoptimized(&program).expect("compile");
|
|
15
|
+
let code = &chunk.code;
|
|
16
|
+
let has_jump_if_false = code.windows(1).any(|w| w[0] == Opcode::JumpIfFalse as u8);
|
|
17
|
+
assert!(
|
|
18
|
+
has_jump_if_false,
|
|
19
|
+
"And should emit JumpIfFalse for short-circuit"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#[test]
|
|
24
|
+
fn test_and_shortcircuit_runs_unoptimized() {
|
|
25
|
+
let source = "let x = null; let y = x != null && x.foo;";
|
|
26
|
+
let program = parse(source).expect("parse");
|
|
27
|
+
let chunk = compile_unoptimized(&program).expect("compile");
|
|
28
|
+
let result = tishlang_vm::run(&chunk);
|
|
29
|
+
assert!(
|
|
30
|
+
result.is_ok(),
|
|
31
|
+
"Should not throw (short-circuit avoids x.foo): {:?}",
|
|
32
|
+
result.err()
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
#[test]
|
|
37
|
+
fn test_and_shortcircuit_runs_optimized() {
|
|
38
|
+
let source = "let x = null; let y = x != null && x.foo;";
|
|
39
|
+
let program = parse(source).expect("parse");
|
|
40
|
+
let program = tishlang_opt::optimize(&program);
|
|
41
|
+
let chunk = tishlang_bytecode::compile(&program).expect("compile");
|
|
42
|
+
let result = tishlang_vm::run(&chunk);
|
|
43
|
+
assert!(
|
|
44
|
+
result.is_ok(),
|
|
45
|
+
"Should not throw with peephole (short-circuit): {:?}",
|
|
46
|
+
result.err()
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[test]
|
|
51
|
+
fn test_and_shortcircuit_via_resolve_project() {
|
|
52
|
+
let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tests/shortcircuit.tish");
|
|
53
|
+
let path = path.canonicalize().expect("path");
|
|
54
|
+
let project_root = path.parent().unwrap();
|
|
55
|
+
let modules = resolve_project(&path, Some(project_root)).expect("resolve");
|
|
56
|
+
let program = merge_modules(modules).expect("merge").program;
|
|
57
|
+
let program = tishlang_opt::optimize(&program); // Mirror CLI
|
|
58
|
+
let chunk = compile(&program).expect("compile");
|
|
59
|
+
let result = tishlang_vm::run(&chunk);
|
|
60
|
+
assert!(
|
|
61
|
+
result.is_ok(),
|
|
62
|
+
"Should not throw via resolve+merge+opt (CLI path): {:?}",
|
|
63
|
+
result.err()
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//! Issue #60: `try/catch` must catch VM-internal runtime errors (property/method access on
|
|
2
|
+
//! null, calling a non-function) AND `throw`s that propagate across function-call frames,
|
|
3
|
+
//! preserving the thrown value. Verified on the bytecode VM and the tree-walk interpreter
|
|
4
|
+
//! (the two backends #60 targets — the embedded/browser target is the VM, the interpreter is
|
|
5
|
+
//! its oracle). The native backend surfaces these as Rust panics and is tracked separately.
|
|
6
|
+
|
|
7
|
+
use std::path::PathBuf;
|
|
8
|
+
use std::process::Command;
|
|
9
|
+
|
|
10
|
+
const EXPECTED: &str = "\
|
|
11
|
+
A caught
|
|
12
|
+
B caught: boom
|
|
13
|
+
C caught
|
|
14
|
+
D done
|
|
15
|
+
E caught: rethrown
|
|
16
|
+
F ok
|
|
17
|
+
G total: 206
|
|
18
|
+
";
|
|
19
|
+
|
|
20
|
+
fn run(backend: &str, fixture: &str) -> String {
|
|
21
|
+
let tish = PathBuf::from(env!("CARGO_BIN_EXE_tish"));
|
|
22
|
+
let out = Command::new(&tish)
|
|
23
|
+
.args(["run", "--backend", backend, fixture])
|
|
24
|
+
.output()
|
|
25
|
+
.expect("spawn tish run");
|
|
26
|
+
assert!(
|
|
27
|
+
out.status.success(),
|
|
28
|
+
"tish run --backend {backend} failed: {}",
|
|
29
|
+
String::from_utf8_lossy(&out.stderr)
|
|
30
|
+
);
|
|
31
|
+
String::from_utf8_lossy(&out.stdout).into_owned()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[test]
|
|
35
|
+
fn trycatch_catches_runtime_and_cross_frame_errors() {
|
|
36
|
+
let fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
|
37
|
+
.join("tests")
|
|
38
|
+
.join("fixtures")
|
|
39
|
+
.join("trycatch_runtime_errors.tish");
|
|
40
|
+
assert!(fixture.is_file(), "missing fixture {}", fixture.display());
|
|
41
|
+
let fixture = fixture.to_str().unwrap();
|
|
42
|
+
|
|
43
|
+
assert_eq!(run("vm", fixture), EXPECTED, "vm output mismatch");
|
|
44
|
+
assert_eq!(run("interp", fixture), EXPECTED, "interp output mismatch");
|
|
45
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//! Issue #101: the `tish:tty` capability (raw mode, terminal size, key/resize events) is
|
|
2
|
+
//! available on every backend behind the `tty` feature. CI has no real terminal, so this
|
|
3
|
+
//! asserts the module loads and degrades gracefully (size → null, isTTY → a boolean, the
|
|
4
|
+
//! event/raw-mode primitives are functions). Interactive behavior is covered manually.
|
|
5
|
+
|
|
6
|
+
use std::path::PathBuf;
|
|
7
|
+
use std::process::Command;
|
|
8
|
+
|
|
9
|
+
const EXPECTED: &str = "\
|
|
10
|
+
isTTY: boolean
|
|
11
|
+
size: null
|
|
12
|
+
setRawMode: function
|
|
13
|
+
read: function
|
|
14
|
+
readLine: function
|
|
15
|
+
alt: function function
|
|
16
|
+
";
|
|
17
|
+
|
|
18
|
+
fn run(backend: &str, fixture: &str) -> String {
|
|
19
|
+
let tish = PathBuf::from(env!("CARGO_BIN_EXE_tish"));
|
|
20
|
+
let out = Command::new(&tish)
|
|
21
|
+
.args(["run", "--backend", backend, "--feature", "tty", fixture])
|
|
22
|
+
.output()
|
|
23
|
+
.expect("spawn tish run");
|
|
24
|
+
assert!(
|
|
25
|
+
out.status.success(),
|
|
26
|
+
"tish run --backend {backend} failed: {}",
|
|
27
|
+
String::from_utf8_lossy(&out.stderr)
|
|
28
|
+
);
|
|
29
|
+
String::from_utf8_lossy(&out.stdout).into_owned()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#[test]
|
|
33
|
+
fn tty_module_loads_and_degrades_without_a_terminal() {
|
|
34
|
+
let fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
|
35
|
+
.join("tests")
|
|
36
|
+
.join("fixtures")
|
|
37
|
+
.join("tty_capability.tish");
|
|
38
|
+
assert!(fixture.is_file(), "missing fixture {}", fixture.display());
|
|
39
|
+
let fixture = fixture.to_str().unwrap();
|
|
40
|
+
|
|
41
|
+
assert_eq!(run("vm", fixture), EXPECTED, "vm output mismatch");
|
|
42
|
+
assert_eq!(run("interp", fixture), EXPECTED, "interp output mismatch");
|
|
43
|
+
}
|