是否有任何工具(最好是免费软件)可以分析Pascal/Delphi语法并自动删除未使用的变量?
就我而言,我正在使用一个非常大的Delphi代码库,并且编译器提示报告超过一千个"变量'x'被声明但从未使用过".
我需要花费数小时手动删除它们,我可能会犯错误,但正确的工具应该能够安全自动地完成.
我在网上搜索但没找到一个......这里有人知道这样的工具吗?
谢谢...
马克布拉德福德
我明白你的观点,并且完全同意这样的工具在处理遗留代码时会很有用。不幸的是,我不知道任何现有的工具(我应该在这里添加免费软件工具,静态分析工具当然应该能够轻松完成,但我不知道有任何免费的静态代码分析工具)能够做到这一点.
但是我想您可以在几分钟内轻松编写这样的工具。一个带有备忘录和按钮的小图形用户界面就足够了。然后只需将编译器提示复制到备忘录中并按下按钮。然后该工具解析每一行。它可以轻松检查该行是否包含您要查找的提示,并且每个这样的行都具有相同的结构,因此解析应该相对容易。然后它可以提取文件名和行号,打开文件并删除变量声明。如果一行中有多个变量声明,这可能有点棘手,但我认为这是可行的。
我不知道与您自己删除所有变量声明的任务相比,这对您来说是否太过分了。但是我很想看到这样的工具,所以随意编写它:)
希望至少有所帮助。
好吧,我真的看不出这里有什么问题。对于解析部分:
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;
Run Code Online (Sandbox Code Playgroud)
好吧,阅读源文件应该很容易,所以唯一剩下的部分是从声明行中删除变量。我们可以简单地在行中搜索 HintInfo.VarName 的出现,并检查出现前后的字符是否没有字母而只有 ' '、',' 或 ':'。如果是这种情况,我们可以将其删除。这涵盖了所有这些情况:
var UnusedVar : Integer;
var
UnusedVar,
AnotherVar : Integer;
var
UnusedVar, AnotherVar : Integer;
Run Code Online (Sandbox Code Playgroud)
如果我错了或者我忘记了任何情况,请告诉我,但我认为这会起作用,并且可以解决使用编译器生成的提示从 delphi 源文件中删除未使用的变量的问题。