0

我正在尝试在分配节点之前引入一个新节点(作为新的代码行)。

使用FlattenSentinel引入新节点时会出现问题,因为我希望节点是分开的,但 libcs​​t 使用分号 ( ;) 将它们连接起来,例如:

a = 6

变成:

print('returning'); a = 6

重现示例的代码:

import libcst as cst
class MyTransformer(cst.CSTTransformer):

    def leave_Assign(self, old_node, updated_node):
        log_stmt = cst.Expr(cst.parse_expression("print('returning')"))
        return cst.FlattenSentinel([log_stmt, updated_node])

source_tree = cst.parse_module("a = 6")
modified_tree = source_tree.visit(MyTransformer())
print(modified_tree.code)

我也尝试引入一个新行,但看起来更糟,代码示例:

def leave_Assign(self, old_node, updated_node):
    log_stmt = cst.Expr(cst.parse_expression("print('returning')"))
    return cst.FlattenSentinel([log_stmt, cst.Expr(cst.Newline()), updated_node])

我想要的结果是将新节点插入现有节点上方(在同一级别),不带分号,如下所示:

print('returning')
a = 6

这在 libcs​​t 中可能吗?

4

1 回答 1

0

你的 AST 是这样的:

Module
  FunctionDef
    SimpleStatementLine
      Assign
        Target
        Integer

当您尝试用多个节点替换 Assign 时,您仍然需要尊重当前行,这会强制使用分号。

Module
  FunctionDef
    SimpleStatementLine
      Call // Your print call
      Assign // a = 6
        Target
        Integer

相反,您想用新节点替换SimpleStatementLineFlattenSentinel节点SimpleStatementLine。因此,您实际上必须修改代码才能在leave_SimpleStatementLine.

于 2022-01-10T18:35:35.170 回答