gpt4 book ai didi

java - 使用python在java代码的方法 block 中添加一行

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:08 25 4
gpt4 key购买 nike

我有很多 java 文件,我必须在其中搜索一个方法,如果存在,我必须在此方法中添加一行“如果此行尚不存在”。此行必须添加到方法的右大括号之前。

到目前为止,我有以下代码:

import os
import ntpath
extensions = set(['.java','.kt'])
for subdir, dirs, files in os.walk("/src/main"):
for file in files:
filepath = subdir + os.sep + file
extension = os.path.splitext(filepath)[1]
if extension in extensions:
if 'onCreate(' in open(filepath).read():
print (ntpath.basename(filepath))
if 'onPause' in open (filepath).read():
print ("is Activity and contains onPause\n")
#Check if Config.pauseCollectingLifecycleData(); is in this code bloack, if exists do nothing, if does not exist add to the end of code block before }
if 'onResume' in open (filepath).read():
print ("is Activity and contains onResume\n")
#Check if Config.resumeCollectingLifecycleData(); is in this code bloack, if exists do nothing, if does not exist add to the end of code block before }

但我不确定从这里该何去何从,Python 不是我的第一语言。我可以要求在正确的方向上得到指导吗?

例子:我正在寻找具有以下签名的方法:

public void onPause(){
super.onPause();
// Add my line here
}

public void onPause(){
super.onPause();
Config.pauseCollectingLifecycleData(); // Line exists do nothing
}

最佳答案

这其实挺难的。首先,您的 if "onPause"in sourcecode 方法目前不区分定义 onPause()调用 它。其次,找到正确的结束 } 并非易事。天真地,您可能只计算打开和关闭曲线({ 增加 block 级别,} 减少它),并假设 } 使 block 级别零是该方法的结束 curl 。然而,这可能是错误的!因为该方法可能包含一些 string literal 包含(可能不平衡) curl 。或者用 curl 来评论。这会弄乱 block 级计数。

要正确执行此操作,您必须构建一个实际的 Java 解析器。这是很多工作,即使使用诸如 tatsu 之类的库也是如此。 .

如果您对相当不稳定的 kludge 没问题,您可以尝试使用上面提到的 block 级别计数和缩进作为线索(假设您的源代码缩进得当)。这是我破解的起点:

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\")"))

请注意,这很容易受到各种边缘情况的影响(例如字符串或注释中的 {,或者制表符缩进而不是空格,或者可能有上千种其他情况)。这只是您的起点。

关于java - 使用python在java代码的方法 block 中添加一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com