1 回答
TA贡献1840条经验 获得超5个赞
这实际上是相当困难的。首先,您的if "onPause" in sourcecode方法目前不区分定义 onPause()和调用它。其次,找到正确的结束语}并非易事。天真地,您可能只计算打开和关闭{卷曲(增加块级别,}减少它),并假设}使块级别为零的 是方法的关闭卷曲。然而,这可能是错误的!因为该方法可能包含一些包含(可能不平衡)卷曲的字符串 文字。或带有卷曲的评论。这会弄乱块级计数。
要正确执行此操作,您必须构建一个实际的 Java 解析器。即使使用诸如tatsu 之类的库,这也需要大量工作。
如果你没事具有相当挥发性杂牌组装电脑,你可以尝试使用方块层级计数上述与缩进一起为线索(假设你的源代码缩进体面)。这是我作为起点的一些东西:
def augment_function(sourcecode, function, line_to_insert):
in_function = False
blocklevel = 0
insert_before = None
source = sourcecode.split("\n")
for line_no, line in enumerate(source):
if in_function:
if "{" in line:
blocklevel += 1
if "}" in line:
blocklevel -= 1
if blocklevel == 0:
insert_before = line_no
indent = len(line) - len(line.lstrip(" ")) + 4 #4=your indent level
break
elif function in line and "public " in line:
in_function = True
if "{" in line:
blocklevel += 1
if insert_before:
source.insert(insert_before, " "*indent + line_to_insert)
return "\n".join(source)
# test code:
java_code = """class Foo {
private int foo;
public void main(String[] args) {
foo = 1;
}
public void setFoo(int f)
{
foo = f;
}
public int getFoo(int f) {
return foo;
}
}
"""
print(augment_function(java_code, "setFoo", "log.debug(\"setFoo\")"))
请注意,这很容易受到各种边缘情况的影响(例如{在字符串或注释中,或制表符缩进而不是空格,或者可能有一千种其他情况)。这对您来说只是一个起点。
添加回答
举报