diff --git a/ast_checker/engines/function_call.py b/ast_checker/engines/function_call.py index 09bd020..3d107a6 100644 --- a/ast_checker/engines/function_call.py +++ b/ast_checker/engines/function_call.py @@ -47,6 +47,9 @@ class MustNotCallFunctionEngine(_FunctionCallBase): class CountFunctionCallEngine(_FunctionCallBase): def _message(self, rule, count): target = rule["target"] + exact = rule.get("exact") + if exact is not None and count != exact: + return rule.get("message") or f"{target}() 需要调用 {exact} 次,当前 {count} 次" min_count = rule.get("min") max_count = rule.get("max") if min_count is not None and count < min_count: @@ -62,13 +65,14 @@ class CountFunctionCallEngine(_FunctionCallBase): def describe(self, rule, language, mapping): target = rule["target"] - min_count = rule.get("min") - max_count = rule.get("max") if rule.get("message"): return rule["message"] + exact = rule.get("exact") + if exact is not None: + return f"{target}() 调用 {exact} 次" parts = [] - if min_count is not None: - parts.append(f"至少 {min_count} 次") - if max_count is not None: - parts.append(f"至多 {max_count} 次") + if rule.get("min") is not None: + parts.append(f"至少 {rule['min']} 次") + if rule.get("max") is not None: + parts.append(f"至多 {rule['max']} 次") return f"{target}() " + "、".join(parts) diff --git a/ast_checker/engines/node_count.py b/ast_checker/engines/node_count.py index a68a83e..8aebdcb 100644 --- a/ast_checker/engines/node_count.py +++ b/ast_checker/engines/node_count.py @@ -4,12 +4,12 @@ from ast_checker.labels import label class CountNodeEngine(BaseEngine): def _message(self, rule, count): - target = rule["target"] - name = rule.get("label") or label(target) + name = rule.get("label") or label(rule["target"]) + exact = rule.get("exact") + if exact is not None and count != exact: + return rule.get("message") or f"{name} 需要出现 {exact} 次,当前 {count} 次" min_count = rule.get("min") max_count = rule.get("max") - if min_count is not None and min_count == max_count and count != min_count: - return rule.get("message") or f"{name} 需要出现 {min_count} 次,当前 {count} 次" if min_count is not None and count < min_count: return rule.get("message") or f"{name} 至少出现 {min_count} 次,当前 {count} 次" if max_count is not None and count > max_count: @@ -24,17 +24,15 @@ class CountNodeEngine(BaseEngine): return [msg] if msg else [] def describe(self, rule, language, mapping): - target = rule["target"] - name = rule.get("label") or label(target) - min_count = rule.get("min") - max_count = rule.get("max") + name = rule.get("label") or label(rule["target"]) if rule.get("message"): return rule["message"] - if min_count is not None and min_count == max_count: - return f"{name} 出现 {min_count} 次" + exact = rule.get("exact") + if exact is not None: + return f"{name} 出现 {exact} 次" parts = [] - if min_count is not None: - parts.append(f"至少 {min_count} 次") - if max_count is not None: - parts.append(f"至多 {max_count} 次") + if rule.get("min") is not None: + parts.append(f"至少 {rule['min']} 次") + if rule.get("max") is not None: + parts.append(f"至多 {rule['max']} 次") return f"{name} " + "、".join(parts)