From dbee021cd147b40caf9b650e24a4ff1c1c03a945 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 3 Nov 2026 22:01:24 +0800 Subject: [PATCH] fix(lsp): walk assignment target bases for name diagnostics `_x.a = 1`, `_x.a += 2`, `_x[0] = 3` and `_x.a: T = v` only visited the assigned value, so an unresolved target base never produced the unknown-name warning. --- App/lib/lsp/LspChecks.vp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/App/lib/lsp/LspChecks.vp b/App/lib/lsp/LspChecks.vp index 983d50f..8621ee3 100644 --- a/App/lib/lsp/LspChecks.vp +++ b/App/lib/lsp/LspChecks.vp @@ -1582,6 +1582,12 @@ def _WalkChecks(pool: memhub.MemManager*, doc: LspDocuments.LspDocument*, or dst.kind == LspTypes.LT_AGG or dst.kind == LspTypes.LT_UNKNOWN): _EmitTypeError(pool, doc, an.value, "a pointer/`own` value cannot be stored into a value-typed variable; declare the target as `own T` / `T*`, or dereference explicitly (`*p`)", errors) + if an.target is not None and an.target.kind() == ast.ASTKind.Attribute: + _WalkChecksExprs(pool, doc, a, ws, table_pool, ast.Attribute*(an.target).value, errors) + elif an.target is not None and an.target.kind() == ast.ASTKind.Subscript: + sb_an: ast.Subscript* = ast.Subscript*(an.target) + _WalkChecksExprs(pool, doc, a, ws, table_pool, sb_an.value, errors) + _WalkChecksExprs(pool, doc, a, ws, table_pool, sb_an.slice, errors) if an.target is not None and an.target.kind() == ast.ASTKind.Name: tn: ast.Name* = ast.Name*(an.target) if tn.id is not None: @@ -1599,7 +1605,17 @@ def _WalkChecks(pool: memhub.MemManager*, doc: LspDocuments.LspDocument*, while ti < int(len(asn.targets)): tgt: ast.AST* = asn.targets.get(sizet(ti)) ti += 1 - if tgt is None or tgt.kind() != ast.ASTKind.Name: + if tgt is None: + continue + if tgt.kind() == ast.ASTKind.Attribute: + _WalkChecksExprs(pool, doc, a, ws, table_pool, ast.Attribute*(tgt).value, errors) + continue + if tgt.kind() == ast.ASTKind.Subscript: + sb_t: ast.Subscript* = ast.Subscript*(tgt) + _WalkChecksExprs(pool, doc, a, ws, table_pool, sb_t.value, errors) + _WalkChecksExprs(pool, doc, a, ws, table_pool, sb_t.slice, errors) + continue + if tgt.kind() != ast.ASTKind.Name: continue tt: LspIndex.LspTarget* = _TargetAtNode(ws, pool, table_pool, a, doc, tgt) if tt is None or tt.detail is None: @@ -1639,6 +1655,12 @@ def _WalkChecks(pool: memhub.MemManager*, doc: LspDocuments.LspDocument*, continue if k == ast.ASTKind.AugAssign: ag: ast.AugAssign* = ast.AugAssign*(s) + if ag.target is not None and ag.target.kind() == ast.ASTKind.Attribute: + _WalkChecksExprs(pool, doc, a, ws, table_pool, ast.Attribute*(ag.target).value, errors) + elif ag.target is not None and ag.target.kind() == ast.ASTKind.Subscript: + sb_ag: ast.Subscript* = ast.Subscript*(ag.target) + _WalkChecksExprs(pool, doc, a, ws, table_pool, sb_ag.value, errors) + _WalkChecksExprs(pool, doc, a, ws, table_pool, sb_ag.slice, errors) if ag.target is not None and ag.value is not None: tt_a: LspIndex.LspTarget* = _TargetAtNode(ws, pool, table_pool, a, doc, ag.target) if tt_a is not None and tt_a.detail is not None: