Files
bux-lang/tools/smoke_lsp_rename_deep.sh
dimgigov 00195e2d98 feat(lsp): method, type, and self-receiver rename (0.10)
Add rtkMethod so .Method( call sites rename with the method decl, improve
type renames across extend/annotations, and clip self to the enclosing
method body.

- Len→Length includes self.Len(); Point→Vec2 hits extend + types
- self→this stays within one method (textual func bounds)
- smoke_lsp_rename_method + test-lsp wiring
2026-07-19 23:27:21 +03:00

92 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Smoke: deeper rename — struct fields + enum variants (bux-lsp 0.7)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
LSP="$ROOT/tools/bux-lsp"
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
if [[ ! -x "$LSP" ]]; then
(cd "$ROOT" && make lsp >/dev/null)
fi
cat > "$TMP/Main.bux" <<'EOF'
struct Point {
x: int;
y: int;
}
enum Color {
Red,
Green,
Blue,
}
func Main() -> int {
let p: Point = Point { x: 1, y: 2 };
let a: int = p.x;
let c: Color = Color::Red;
let x: int = 99;
return a + x;
}
EOF
rpc() {
local body="$1"
local len
len=$(printf '%s' "$body" | wc -c)
printf 'Content-Length: %s\r\n\r\n%s' "$len" "$body"
}
CONTENT_JSON=$(python3 -c 'import json,sys; print(json.dumps(open(sys.argv[1]).read()))' "$TMP/Main.bux")
URI="file://$TMP/Main.bux"
{
rpc '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"capabilities":{},"rootUri":"file://'"$TMP"'"}}'
rpc '{"jsonrpc":"2.0","method":"initialized","params":{}}'
rpc '{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"'"$URI"'","languageId":"bux","version":1,"text":'"$CONTENT_JSON"'}}}'
# rename field x on decl line 1 col 4 (struct field `x`)
rpc '{"jsonrpc":"2.0","id":2,"method":"textDocument/rename","params":{"textDocument":{"uri":"'"$URI"'"},"position":{"line":1,"character":4},"newName":"px"}}'
# rename Color::Red variant — position on Red in enum (line 5)
rpc '{"jsonrpc":"2.0","id":3,"method":"textDocument/rename","params":{"textDocument":{"uri":"'"$URI"'"},"position":{"line":5,"character":4},"newName":"Crimson"}}'
# rename local x (line 11) should NOT rename p.x field — use "xx"
rpc '{"jsonrpc":"2.0","id":4,"method":"textDocument/rename","params":{"textDocument":{"uri":"'"$URI"'"},"position":{"line":11,"character":8},"newName":"xx"}}'
rpc '{"jsonrpc":"2.0","id":5,"method":"shutdown","params":null}'
rpc '{"jsonrpc":"2.0","method":"exit","params":null}'
} | "$LSP" 2>/dev/null | tr '\r' '\n' > "$TMP/out.txt"
if ! grep -qE '0\.(7|8|9|10)\.0' "$TMP/out.txt"; then
echo "WARN: unexpected bux-lsp version"
fi
# Field rename x → px: expect ≥3 (decl, init x:, access p.x)
px_count=$(grep -o '"newText":"px"' "$TMP/out.txt" | wc -l)
if [[ "$px_count" -lt 3 ]]; then
echo "FAIL: field rename x→px expected ≥3 edits, got $px_count"
cat "$TMP/out.txt"
exit 1
fi
echo " field x→px edits: $px_count"
# Variant Red → Crimson: decl + Color::Red
cr_count=$(grep -o '"newText":"Crimson"' "$TMP/out.txt" | wc -l)
if [[ "$cr_count" -lt 2 ]]; then
echo "FAIL: variant Red→Crimson expected ≥2 edits, got $cr_count"
cat "$TMP/out.txt"
exit 1
fi
echo " variant Red→Crimson edits: $cr_count"
# Local x→xx: should be small (decl + use in return), not include field
xx_count=$(grep -o '"newText":"xx"' "$TMP/out.txt" | wc -l)
if [[ "$xx_count" -lt 1 ]]; then
echo "FAIL: local x→xx expected edits"
exit 1
fi
if [[ "$xx_count" -gt 3 ]]; then
echo "FAIL: local x→xx too many edits ($xx_count) — may have hit fields"
cat "$TMP/out.txt"
exit 1
fi
echo " local x→xx edits: $xx_count"
echo "PASS: LSP deeper rename (field + variant + local shadowing)"