Delphi:如何自动删除未使用的变量("变量'x'已声明但从未使用过"提示)

Mar*_*ord 5 delphi syntax

是否有任何工具(最好是免费软件)可以分析Pascal/Delphi语法并自动删除未使用的变量?

就我而言,我正在使用一个非常大的Delphi代码库,并且编译器提示报告超过一千个"变量'x'被声明但从未使用过".

我需要花费数小时手动删除它们,我可能会犯错误,但正确的工具应该能够安全自动地完成.

我在网上搜索但没找到一个......这里有人知道这样的工具吗?

谢谢...

马克布拉德福德

jpf*_*ius 5

我明白你的观点,并且完全同意这样的工具在处理遗留代码时会很有用。不幸的是,我不知道任何现有的工具(我应该在这里添加免费软件工具,静态分析工具当然应该能够轻松完成,但我不知道有任何免费的静态代码分析工具)能够做到这一点.

但是我想您可以在几分钟内轻松编写这样的工具。一个带有备忘录和按钮的小图形用户界面就足够了。然后只需将编译器提示复制到备忘录中并按下按钮。然后该工具解析每一行。它可以轻松检查该行是否包含您要查找的提示,并且每个这样的行都具有相同的结构,因此解析应该相对容易。然后它可以提取文件名和行号,打开文件并删除变量声明。如果一行中有多个变量声明,这可能有点棘手,但我认为这是可行的。

我不知道与您自己删除所有变量声明的任务相比,这对您来说是否太过分了。但是我很想看到这样的工具,所以随意编写它:)

希望至少有所帮助。

好吧,我真的看不出这里有什么问题。对于解析部分:

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 源文件中删除未使用的变量的问题。