if "onPause" in sourcecode
该方法目前不区分
onPause()
和
}
这不是小事。天真地说,你可能只会数开始和结束的卷发(
{
}
递减),并假设
}
使blocklevel为零的是该方法的结束卷曲。然而,这可能是错误的!因为该方法可能包含一些
一串
字面意义的
包含(可能不平衡的)卷发。或
有卷发。这将打乱区块级别计数。
要正确地做到这一点,您必须构建一个实际的Java解析器。即使在使用诸如
tatsu
.
如果你对一个相当不稳定的
kludge
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\")"))
请注意,这容易受到各种边缘情况(例如
{
在字符串或注释中,或在制表符缩进而不是空格中,或可能在一千种其他内容中)。这只是你的一个起点。