代码之家  ›  专栏  ›  技术社区  ›  User3

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

  •  3
  • User3  · 技术社区  · 6 年前

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

    例子:

    public void onPause(){
       super.onPause();
       // Add my line here
    }
    
    public void onPause(){
       super.onPause();
       Config.pauseCollectingLifecycleData(); // Line exists do nothing 
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   digitalarbeiter    6 年前

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

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