right now I am working on a project for a university course. I got some random functions and most of them have a if-raise-statement in the code somewhere.
I try to find those, but only those 1 or 2 lines. I transform the functions into an AST and then visit it using libcst. I extend the visitor class, search for if-nodes and then match for raise-nodes. However this also matches and saves statements that are like if-if-raise or if-else-raise.
I hope someone can help me on how to modify the matcher to only match if-nodes directly followed by 1 raise node. (Sequence wildcard matchers would be awesome, but as far as I understand it they cannot be matched to find sequences of nodes.)
import libcst as cst
import libcst.matchers as m
class FindIfRaise(cst.CSTVisitor):
if_raise = []
# INIT
def __init__(self):
self.if_raise = []
def visit_If(self, node: cst.If):
try:
if m.findall(node, m.Raise()):
self.if_raise.append(node)
Thanks in advance for any help.
Instead of a node visitor pattern, you can recursively traverse the
cst, navigating via thebodyattribute of eachcstobject. This way you can track your depth, check for siblingifstatements, and only produceraisestatements when the desired conditions are met: