Adición de una línea en un bloque de método de código java usando Python

Usuario 3:

Tengo un montón de archivos de Java en el que tengo que buscar un método, si está presente tengo que añadir una línea dentro de este método "Si esta línea no existe". Esta línea tiene que ser añadido antes de la llave de cierre del método.

Hasta ahora tengo el siguiente código:

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 }

Pero no estoy seguro de dónde ir desde aquí, Python no es mi primera lengua. Yo podría solicitar ser guiada en la dirección correcta.

Ejemplo: Busco a un método con la siguiente firma:

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

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

Esto es realmente muy difícil. En primer lugar, el if "onPause" in sourcecodeenfoque que actualmente no distingue entre la definición onPause() y llamar a él. Y en segundo lugar, encontrar el correcto cierre }no es trivial. Ingenuamente, que sólo podría contar apertura y cierre (curlies {incrementos del blocklevel, }la decrementa), y se supone que el }que hace que el blocklevel cero es el cierre rizado del método. Sin embargo, esto podría ser mal! Debido a que el método podría contener algo de cadena literal que contiene curlies (posiblemente no balanceadas). O comentarios con curlies. Esto haría estropear el recuento blocklevel.

Para hacer esto correctamente, usted tendría que construir un programa de análisis real de Java. Eso es un montón de trabajo, incluso cuando se utilizan las bibliotecas como Tatsu .

Si estás bien con un comportamiento bastante volátil kludge , se puede tratar de utilizar el recuento blocklevel mencionado anteriormente con la escotadura como una pista (asumiendo que su código fuente está sangrado decentemente). Aquí hay algo que he hackeado como punto de partida:

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

Tenga en cuenta que este es vulnerable a todo tipo de casos extremos (como {en una cadena o en un comentario, o guión pestaña en lugar del espacio, o posiblemente miles de otras cosas). Esto es sólo un punto de partida para usted.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=212262&siteId=1
Recomendado
Clasificación