为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2021-08-17 15:49:19
我有很多 java 文件,我必须在其中搜索一个方法,如果存在,我必须在此方法中添加一行“如果此行尚不存在”。此行必须在方法的右大括号之前添加。到目前为止,我有以下代码:import osimport ntpathextensions = 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 }
查看完整描述

1 回答

?
慕斯709654

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

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


查看完整回答
反对 回复 2021-08-17
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信