def test_exprs() -> None: subexpression1 = [ BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern4"), None, "p4"), BooleanRuleExpression(OPERATORS.AND, PatternId("pattern2"), None, "p2"), ] subexpression2 = [ BooleanRuleExpression(OPERATORS.AND_NOT_INSIDE, PatternId("pattern4"), None, "p4"), BooleanRuleExpression(OPERATORS.AND, PatternId("pattern1"), None, "p1"), ] expression = BooleanRuleExpression( OPERATORS.AND_ALL, None, [ BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern3"), None, "p3"), BooleanRuleExpression( OPERATORS.AND_EITHER, None, [ BooleanRuleExpression(OPERATORS.AND_ALL, PatternId("someid"), subexpression1), BooleanRuleExpression(OPERATORS.AND_ALL, PatternId("someid2"), subexpression2), ], ), ], ) flat = list(enumerate_patterns_in_boolean_expression(expression)) # print(flat) expected = [ BooleanRuleExpression(OPERATORS.AND_ALL, None, None, None), BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern3"), None, "p3"), BooleanRuleExpression(OPERATORS.AND_EITHER, None, None, None), BooleanRuleExpression(OPERATORS.AND_ALL, None, None, None), BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern4"), None, "p4"), BooleanRuleExpression(OPERATORS.AND, PatternId("pattern2"), None, "p2"), BooleanRuleExpression(OPERATORS.AND_ALL, None, None, None), BooleanRuleExpression(OPERATORS.AND_NOT_INSIDE, PatternId("pattern4"), None, "p4"), BooleanRuleExpression(OPERATORS.AND, PatternId("pattern1"), None, "p1"), ] assert flat == expected, f"flat: {flat}"
def _flatten_rule_patterns(self, rules: List[Rule]) -> Iterator[Pattern]: """ Convert list of rules to format understandable by semgrep core """ for rule_index, rule in enumerate(rules): flat_expressions = list( enumerate_patterns_in_boolean_expression(rule.expression)) for expr in flat_expressions: if not should_send_to_semgrep_core(expr): continue span = (rule.pattern_spans.get(expr.pattern_id) if expr.pattern_id is not None else None) for lang in rule.languages: yield Pattern(rule_index, expr, rule.severity, lang, span)