2009-02-10 15 views
5

¿Hay alguna herramienta (preferiblemente freeware) que pueda analizar la sintaxis Pascal/Delphi y eliminar automáticamente los vars no utilizados?Delphi: cómo eliminar automáticamente vars no utilizados ("Variable 'x' se declara pero nunca se usa" sugerencia)

En mi caso, estoy trabajando con una base de código Delphi muy grande, y las indicaciones del compilador informan que más de mil casos de "Variable 'x' están declarados pero nunca utilizados".

Me tomaría horas eliminarlas a mano, y podría cometer errores, pero la herramienta adecuada debería poder hacerlo de forma segura y automática.

Busqué en línea pero no encontré ninguno ... ¿alguien aquí conoce esta herramienta?

Gracias ...

Marcos Brarford

Respuesta

4

Veo su punto y totalmente de acuerdo en que una herramienta de este tipo sería útil cuando se trabaja con código anterior. Desafortunadamente, no conozco ninguna herramienta existente (debería agregar una herramienta gratuita aquí, las herramientas de análisis estático deberían poder hacerlo fácilmente, pero no conozco ninguna herramienta gratuita de análisis de código estático) que sea capaz de hacerlo .

Pero supongo que podría escribir fácilmente una herramienta de este tipo en unos minutos. Una pequeña GUI con un memo y un botón debería ser suficiente. Luego solo copie las sugerencias del compilador en la nota y presione el botón. La herramienta luego analiza cada línea. Puede verificar fácilmente si la línea contiene la pista que está buscando y cada línea tiene la misma estructura, por lo que el análisis debe ser relativamente fácil. A continuación, puede extraer el nombre del archivo y el número de línea, abrir el archivo y eliminar la declaración de la variable. Esto puede ser un poco complicado en el caso de múltiples declaraciones de variables en una línea, pero creo que es factible.

No sé si eso es demasiado esfuerzo para usted en comparación con la tarea de eliminar todas las declaraciones de variables usted mismo. Pero me gustaría ver una herramienta así, así que siéntete libre de escribirlo :)

Espero que haya ayudado al menos un poco.

Bien, realmente no puedo ver ningún problema aquí. Para la parte de análisis:

function ParseHint (const HintText : String; out HintInfo : THintInfo) : Boolean; 
var 
    I, J  : Integer; 
    HintName : String; 
begin 
    Result := False; 
    for I := 1 to Length (HintText) do 
    begin 
    if (HintText [I] = '(') then 
    begin 
     J := I + 1; 
     while (HintText [J] <> ')') do Inc (J); 
     HintInfo.LineNumber := StrToInt (MidStr (HintText, I+1, J-(I+1))); 
     HintInfo.SourceFile := MidStr (HintText, 12, I-12); 
     HintName := MidStr (HintText, J+3, 5); 
     if (HintName <> 'H2164') then Exit (False); 
    end; 
    if (HintText [I] = '''') then 
    begin 
     J := I + 1; 
     while (HintText [J] <> '''') do Inc (J); 
     HintInfo.VarName := MidStr (HintText, I+1, J-(I+1)); 
     Exit (True); 
    end; 
    end; 
end; 

Bueno, leyendo el archivo de origen debe ser fácil, por lo que la única parte remaing es la eliminación de la variable de su línea de la declaración. Simplemente podemos buscar las ocurrencias de HintInfo.VarName en la línea y verificar si el carácter antes y después de la ocurrencia no son letras, sino solo '', ',' o ':'. Si este es el caso, podemos simplemente eliminarlo. Esto cubre todos estos casos:

var UnusedVar : Integer; 
var 
    UnusedVar, 
    AnotherVar : Integer; 
var 
    UnusedVar, AnotherVar : Integer; 

Dime si estoy equivocado o si olvido algún caso, pero creo que esto iba a funcionar y woulde resolver el problema de la eliminación de las variables no utilizadas de los archivos fuente de Delphi usando el compilador generado consejos.

+0

Unos minutos serán un error muy grande, porque este no es un problema trivial. –

+0

Bueno, ¿quizás podrías señalar cuáles crees que serían los problemas? Para ser claros: no estoy hablando de encontrar variables no utilizadas, sino de interpretar las sugerencias del compilador de Delphi. – jpfollenius

+0

Ok, la interpretación de consejos no debería ser tan difícil. Pero esa no es la parte principal del problema. Por favor, eche un vistazo a mi respuesta a continuación: –

2

Si no hay tal herramienta y usted tiene algo de paciencia, estoy construyendo una herramienta de análisis y reparación Delphi. Y la eliminación de símbolos no utilizados está en la lista. Es un proyecto de baja intensidad, por lo que no puedo dar una estimación de cuándo está listo.

Sólo para explicar por qué esto no es una tarea trivial:

  1. leer la fuente
  2. crear un modelo que contiene suficiente información para cada uso del símbolo.
  3. marque todos los símbolos no utilizados.
  4. reescribe la fuente sin los símbolos innecesarios.

Tarea 1 y 2 son difíciles (por suerte para mí ya están hechos). El lenguaje Delphi es bastante complejo. Y necesita todos los elementos del lenguaje para poder recrear la fuente.

La tarea 3 es simple. Simplemente marque todos los símbolos que no se usen. Pero ten cuidado con los símbolos en la sección de interfaz de una unidad. Posiblemente no se usan, pero se necesitan más tarde (o por algún otro proyecto).

Tarea 4 depende.

Aproach A utiliza un formato intermedio (por ejemplo, una lista de cadenas), luego puede usar el modelo para encontrar la declaración de cada símbolo no utilizado (de abajo hacia arriba, posiblemente cambie los números de línea). Borras todo lo que no necesitas ¡Y no olvides eliminar la palabra clave var si es la última var en la lista!

Aproach B reescribe completamente el archivo de origen. En este caso, debe conservar todos los comentarios que no es realmente divertido de hacer (pero mi modelo también lo necesita). Simplemente quita los símbolos no utilizados del modelo y lo reescribe. Siempre asegúrese de crear una copia de seguridad, porque esto puede terminar en un desastre.

+0

Y existe la posibilidad de que varios vars se declaren en una línea, lo que de nuevo complica la eliminación. O la declaración var podría dividirse en dos líneas ('a' en primer lugar, ': entero' en segundo). Estoy de acuerdo - es difícil escribir una solución estable al problema. – gabr

+0

Ah, y si necesita un beta tester ... – gabr

+0

Y algunas partes del código podrían depender de una directiva de compilación ({$ ifdef ...}) pero las variables correspondientes pueden no serlo, de modo que el compilador podría detectar algunas variables como no utilizadas a pesar de que se usan con otras directivas de compilación – Name

2

¿Estás seguro de que las variables no deberían usarse? Sé que el compilador se da cuenta de que no se usan en este momento, pero ¿es correcto, quizás se deberían usar muchos de ellos, pero un desarrollador usó x2 en lugar de x1, por ejemplo, copiar y pegar?

Si bien es posible que desee eliminar todas esas variables no escrutadas, no sería tan apresurado, podrían ser indicios de errores en el código que desea corregir.

Ejemplo:

procedure PlotPixelAtCenter(rect: Rectangle) 
var 
    x, y: Integer; 
begin 
    x := (rect.Left + rect.Right) div 2; 
    x := (rect.Top + rect.Bottom) div 2; // <-- bug here, should be y := 
    PlotPixel(x, y); 
end; 

En este ejemplo, usted obtendrá un error acerca de una variable sin utilizar, pero esto es un error al acecho. Por supuesto, en este ejemplo, el error debería ser fácil de encontrar ya que el trazado probablemente estará desactivado, pero otros errores similares podrían ser más difíciles de detectar.

+0

> Sé que el compilador se da cuenta de que no se usan en este momento, pero ¿es correcto, ¿Algún ejemplo? – inzKulozik

+0

Buen punto. No me gustaría una herramienta para eliminar ciegamente todos los vars, sino para recorrer cada uno de ellos, como una búsqueda global y reemplazar con una confirmación antes de cada acción, para poder echar un vistazo y ver si hay un {$ ifdef} involucrado , o algo como usted mostró arriba. –

2

La solución es simple, pero requiere esas horas para asegurarse de no cometer un error. En primer lugar, puede usar Alt-F8 para recorrer cada informe uno tras otro (y Alt-F7 para retroceder). Eso hace que encontrarlos sea muy fácil. El cursor se pone en la línea por ti. Luego solo presione la tecla '/' dos veces para comentarlo. No lo elimine, coméntelo. De esta forma, si comete un error, no ha perdido ninguna información. La presencia de la variable y su tipo de datos todavía se registra. Puede arreglarlo más tarde en algún momento.

Una advertencia a todo esto: la compilación condicional puede dejar sin usar algunas variables cuando se construyen de diferentes maneras. Si esto sucede, simplemente elimine el comentario de la variable nuevamente y ponga la condición alrededor de la declaración también.

+0

gracias por el punto sobre la comprobación de las definiciones condicional, es algo que definitivamente sucederá de vez en cuando. –

+0

Gracias por los atajos Alt-F8 Alt-F7. Eso me ahorrará algo de tiempo. +1 – lkessler

+0

En general, elimino las variables no utilizadas, el control de código fuente o el historial de códigos para recuperarme de los errores. Al comentarlas solo significa que debe volver atrás y eliminar los comentarios en otro momento. – Alister

Cuestiones relacionadas