mirror of
https://github.com/colbymchenry/codegraph.git
synced 2026-10-25 20:12:11 +08:00
The Windows kernels read the `!` of every `try!` as a logical not, so `try! Message2(data: d)` became a call of `! Message2` that never resolves, and a call through a receiver lost it: `try! Settings.Defaults.load()` was a bare `load`. The cause is the grammar's C, not the walker. tree-sitter-swift 0.7.3's external scanner steps aside for the `!` of `try!` through a 64-bit mask whose entry is built as `1UL << FAKE_TRY_BANG`, bit 32. `unsigned long` is 32 bits on Windows and MSVC folds the overflowing shift to 0 (warning C4293), so the scanner never stepped aside: `try` parsed alone, then a prefix `!` on the callee. macOS and Linux have 64-bit longs, and clang's wasm32 build folds the shift to bit 31 (`_directive_endif`, valid at every expression start), so the wasm and the other kernels have always read `try!` right. The kernel now compiles the crate tarball's src/ itself, from codegraph-kernel/grammars/swift, with upstream 0.7.4's one-line fix (`1ULL`), as it already does for the Kotlin, Lua, Scala and Dart grammars. The patch and its provenance are in docs/grammars/tree-sitter-swift.patch and .md. parser.c is unchanged, so the node-kind and field tables still match the wasm, which is untouched. TortureTry.swift pins calls after try!, try? and try on both engines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 lines
493 B
Diff
14 lines
493 B
Diff
--- a/src/scanner.c 2026-10-09 00:00:00
|
|
+++ b/src/scanner.c 2026-10-09 00:00:00
|
|
@@ -128,7 +128,9 @@
|
|
0, // EQ_EQ,
|
|
0, // PLUS_THEN_WS,
|
|
0, // MINUS_THEN_WS,
|
|
- 1UL << FAKE_TRY_BANG, // BANG,
|
|
+ // 1ULL, as upstream has it from 0.7.4: 1UL << 32 overflows where unsigned
|
|
+ // long is 32 bits (MSVC), and `try!` lost its `!`. (codegraph patch)
|
|
+ 1ULL << FAKE_TRY_BANG, // BANG,
|
|
0, // THROWS_KEYWORD,
|
|
0, // RETHROWS_KEYWORD,
|
|
0, // DEFAULT_KEYWORD,
|