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

我有很多 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 

}


偶然的你
浏览 177回答 1
1回答

慕斯709654

这实际上是相当困难的。首先,您的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\")"))请注意,这很容易受到各种边缘情况的影响(例如{在字符串或注释中,或制表符缩进而不是空格,或者可能有一千种其他情况)。这对您来说只是一个起点。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python