in experimental/piranha_playground/rule_inference/static_inference.py [0:0]
def create_rule(self, nodes_before: List[Node], nodes_after: List[Node]) -> RawRule:
"""
Create a rule based on the nodes before and after.
:param nodes_before: The list of nodes before the change.
:param nodes_after: The list of nodes after the change.
:return: A raw rule representing the transformation from nodes_before to nodes_after.
"""
if len(nodes_before) == 1:
if len(nodes_after) == 1:
nodes_before[0], nodes_after[0] = self.find_nodes_to_change(
nodes_before[0], nodes_after[0]
)
node = nodes_before[0]
qw = QueryWriter([node], self.template_holes)
query = qw.write()
lines_affected = " ".join(
[NodeUtils.convert_to_source(node) for node in nodes_after]
)
replacement_str = qw.replace_with_tags(lines_affected)
return RawRule(
name=self.name,
query=query,
replace_node=qw.outer_most_node[1:],
replace=replacement_str,
)
# If there are multiple nodes
else:
ancestor = NodeUtils.find_lowest_common_ancestor(nodes_before)
replacement_str = NodeUtils.convert_to_source(
ancestor, exclude=nodes_before
)
replacement_str = replacement_str.replace(
"{placeholder}", "", len(nodes_before) - 1
)
lines_affected = " ".join(
[NodeUtils.convert_to_source(node) for node in nodes_after]
)
replacement_str = replacement_str.replace(
"{placeholder}", lines_affected, 1
)
qw = QueryWriter([ancestor], self.template_holes)
qw.write()
replacement_str = qw.replace_with_tags(replacement_str)
return RawRule(
name=self.name,
query=qw.query_str,
replace_node=qw.outer_most_node[1:],
replace=replacement_str,
)