fix(nll): 补 BoolOp/Compare 的字段递归(if 1==0 or a == 1 曾把整条判据否掉)

_init_ast 里 node.children = None 是**默认值**(只有语句体这类显式赋值的才有子树),所以"认不出的表达式
一律保守"这条策略会被任何未列举的表达式种类触发。新用例的 if 条件 BoolOp(values) 与 Compare(left/comparators)
就是这种。补上后 h 应能降级,报错位置回到真正的泄漏点 return l(第 19 行)。
This commit is contained in:
TermiNexus committed 2026-10-09 21:34:17 +08:00
1 parent 5a10a2ea10
commit 960ecdfd74
1 file changed
+12
+12
View File
@@ -766,6 +766,12 @@ novirtual class StructGenMixin:
bo: ast.BinOp* = ast.BinOp*(node)
if self._NllMentions(bo.left, al) != 0: return 1
return self._NllMentions(bo.right, al)
if k == ast.ASTKind.BoolOp:
return self._NllListMentions(ast.BoolOp*(node).values, al)
if k == ast.ASTKind.Compare:
cp: ast.Compare* = ast.Compare*(node)
if self._NllMentions(cp.left, al) != 0: return 1
return self._NllListMentions(cp.comparators, al)
if k == ast.ASTKind.IfExp:
ie: ast.IfExp* = ast.IfExp*(node)
if self._NllMentions(ie.test, al) != 0: return 1
@@ -847,6 +853,12 @@ novirtual class StructGenMixin:
bo: ast.BinOp* = ast.BinOp*(node)
if self._NllExprUnsafe(bo.left, al) != 0: return 1
return self._NllExprUnsafe(bo.right, al)
if k == ast.ASTKind.BoolOp:
return self._NllListUnsafe(ast.BoolOp*(node).values, al)
if k == ast.ASTKind.Compare:
cp: ast.Compare* = ast.Compare*(node)
if self._NllExprUnsafe(cp.left, al) != 0: return 1
return self._NllListUnsafe(cp.comparators, al)
if k == ast.ASTKind.IfExp:
ie: ast.IfExp* = ast.IfExp*(node)
if self._NllExprUnsafe(ie.test, al) != 0: return 1