36 lines
961 B
Python
36 lines
961 B
Python
from tree_sitter import Parser
|
|
|
|
from .engines import get_engine
|
|
from .mappings import get_language, get_mapping
|
|
|
|
|
|
def check_ast(code: str, language: str, rules: list[dict]) -> tuple[bool, list[dict]]:
|
|
if not rules:
|
|
return True, []
|
|
|
|
ts_language = get_language(language)
|
|
if ts_language is None:
|
|
return True, []
|
|
|
|
mapping = get_mapping(language)
|
|
|
|
try:
|
|
parser = Parser(ts_language)
|
|
tree = parser.parse(code.encode("utf-8"))
|
|
except Exception:
|
|
return True, []
|
|
|
|
results = []
|
|
all_passed = True
|
|
for rule in rules:
|
|
engine = get_engine(rule.get("engine", ""))
|
|
if engine is None:
|
|
continue
|
|
errors = engine.check(tree, rule, language, mapping)
|
|
passed = len(errors) == 0
|
|
if not passed:
|
|
all_passed = False
|
|
results.append({"description": engine.describe(rule, language, mapping), "passed": passed})
|
|
|
|
return all_passed, results
|