This commit is contained in:
2026-05-25 22:24:53 -06:00
parent ed8a2f575f
commit c6b368dc82
8 changed files with 116 additions and 40 deletions

View File

@@ -19,29 +19,56 @@ class _FunctionCallBase(BaseEngine):
class MustCallFunctionEngine(_FunctionCallBase):
def _message(self, rule):
return rule.get("message") or f"必须调用 {rule['target']}()"
def check(self, tree, rule, language, mapping):
target = rule["target"]
if not self._find_function_calls(tree.root_node, target, language):
return [rule.get("message", f"必须调用 {target}()")]
if not self._find_function_calls(tree.root_node, rule["target"], language):
return [self._message(rule)]
return []
def describe(self, rule, language, mapping):
return self._message(rule)
class MustNotCallFunctionEngine(_FunctionCallBase):
def _message(self, rule):
return rule.get("message") or f"不能调用 {rule['target']}()"
def check(self, tree, rule, language, mapping):
target = rule["target"]
if self._find_function_calls(tree.root_node, target, language):
return [rule.get("message", f"不能调用 {target}()")]
if self._find_function_calls(tree.root_node, rule["target"], language):
return [self._message(rule)]
return []
def describe(self, rule, language, mapping):
return self._message(rule)
class CountFunctionCallEngine(_FunctionCallBase):
def check(self, tree, rule, language, mapping):
def _message(self, rule, count):
target = rule["target"]
count = len(self._find_function_calls(tree.root_node, target, language))
min_count = rule.get("min")
max_count = rule.get("max")
if min_count is not None and count < min_count:
return [rule.get("message", f"{target}() 至少调用 {min_count} 次,当前 {count}")]
return rule.get("message") or f"{target}() 至少调用 {min_count} 次,当前 {count}"
if max_count is not None and count > max_count:
return [rule.get("message", f"{target}() 至多调用 {max_count} 次,当前 {count}")]
return []
return rule.get("message") or f"{target}() 至多调用 {max_count} 次,当前 {count}"
return None
def check(self, tree, rule, language, mapping):
count = len(self._find_function_calls(tree.root_node, rule["target"], language))
msg = self._message(rule, count)
return [msg] if msg else []
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"]
parts = []
if min_count is not None:
parts.append(f"至少 {min_count}")
if max_count is not None:
parts.append(f"至多 {max_count}")
return f"{target}() " + "".join(parts)