Browse Source

fcl-passrc: useanalyzer: no hints for locals of not used forward defined proc

git-svn-id: trunk@37163 -
Mattias Gaertner 8 years ago
parent
commit
c8a593e8c5

+ 15 - 7
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1713,20 +1713,28 @@ var
   Usage: TPAElement;
   ProcScope: TPasProcedureScope;
   PosEl: TPasElement;
+  DeclProc: TPasProcedure;
 begin
   {$IFDEF VerbosePasAnalyzer}
   writeln('TPasAnalyzer.EmitProcedureHints ',GetElModName(El));
   {$ENDIF}
   ProcScope:=El.CustomData as TPasProcedureScope;
-  if (ProcScope.DeclarationProc=nil) and (FindNode(El)=nil) then
+  if ProcScope.DeclarationProc=nil then
+    DeclProc:=El
+  else
+    DeclProc:=ProcScope.DeclarationProc;
+  if FindNode(DeclProc)=nil then
     begin
     // procedure never used
-    if El.Visibility in [visPrivate,visStrictPrivate] then
-      EmitMessage(20170312093348,mtHint,nPAPrivateMethodIsNeverUsed,
-        sPAPrivateMethodIsNeverUsed,[El.FullName],El)
-    else
-      EmitMessage(20170312093418,mtHint,nPALocalXYNotUsed,
-        sPALocalXYNotUsed,[El.ElementTypeName,El.Name],El);
+    if ProcScope.DeclarationProc=nil then
+      begin
+      if El.Visibility in [visPrivate,visStrictPrivate] then
+        EmitMessage(20170312093348,mtHint,nPAPrivateMethodIsNeverUsed,
+          sPAPrivateMethodIsNeverUsed,[El.FullName],El)
+      else
+        EmitMessage(20170312093418,mtHint,nPALocalXYNotUsed,
+          sPALocalXYNotUsed,[El.ElementTypeName,El.Name],El);
+      end;
     exit;
     end;
 

+ 37 - 0
packages/fcl-passrc/tests/tcuseanalyzer.pas

@@ -94,6 +94,8 @@ type
     procedure TestM_Hint_PrivatePropertyNeverUsed;
     procedure TestM_Hint_LocalClassInProgramNotUsed;
     procedure TestM_Hint_LocalMethodInProgramNotUsed;
+    procedure TestM_Hint_LocalVarOfNotUsedProc;
+    procedure TestM_Hint_LocalVarOfNotUsedMethod;
     procedure TestM_Hint_AssemblerParameterIgnored;
     procedure TestM_Hint_AssemblerDelphiParameterIgnored;
     procedure TestM_Hint_FunctionResultDoesNotSeemToBeSet;
@@ -1254,6 +1256,41 @@ begin
   CheckUseAnalyzerUnexpectedHints;
 end;
 
+procedure TTestUseAnalyzer.TestM_Hint_LocalVarOfNotUsedProc;
+begin
+  StartProgram(true,[]);
+  Add('type');
+  Add('procedure DoIt;');
+  Add('var i: longint;');
+  Add('begin');
+  Add('end;');
+  Add('begin');
+  AnalyzeProgram;
+  CheckUseAnalyzerHint(mtHint,nPALocalXYNotUsed,'Local procedure "DoIt" not used');
+  CheckUseAnalyzerUnexpectedHints;
+end;
+
+procedure TTestUseAnalyzer.TestM_Hint_LocalVarOfNotUsedMethod;
+begin
+  StartProgram(true,[supTObject]);
+  Add('type');
+  Add('  TMobile = class');
+  Add('  private');
+  Add('    procedure DoIt;');
+  Add('  end;');
+  Add('procedure TMobile.DoIt;');
+  Add('var i: longint;');
+  Add('begin');
+  Add('end;');
+  Add('var');
+  Add('  m: TMobile;');
+  Add('begin');
+  Add('  if m=nil then ;');
+  AnalyzeProgram;
+  CheckUseAnalyzerHint(mtHint,nPAPrivateMethodIsNeverUsed,'Private method "TMobile.DoIt" is never used');
+  CheckUseAnalyzerUnexpectedHints;
+end;
+
 procedure TTestUseAnalyzer.TestM_Hint_AssemblerParameterIgnored;
 begin
   StartProgram(true);