Skip to content

Commit 679caef

Browse files
committed
fix(detector): uMethodName skippt DFM-Event-Handler (SCA106 ~8 FPs)
Selftest-Round-6: VCL-Form-Event-Handler heissen per IDE-Designer- Konvention 'actSaveExecute', 'btnSaveClick', 'qDataAfterScroll' - Komponenten-Name als kleingeschriebenes Praefix. PascalCase-Style-Regel matched dort dauernd ohne dass der Entwickler die Methoden umbenennen koennte (IDE-Designer regeneriert sie sonst). Heuristik identisch zu uCanBeClassMethod (Round-3): 1. Parameter 'Sender: TObject' = Event-Handler-Signatur = skip. Test uTestMethodName nutzt keine TObject-Parameter -> kein Test-Break.
1 parent cec4d41 commit 679caef

1 file changed

Lines changed: 23 additions & 0 deletions

File tree

StaticCodeAnalyserForm/sources/Detectors/uMethodName.pas

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,26 @@ function LocalName(const FullName: string): string;
4242
Result := FullName;
4343
end;
4444

45+
function IsEventHandlerSignature(MethodNode: TAstNode): Boolean;
46+
// True wenn die Methode eine DFM-Event-Handler-Signatur hat - mind. 1
47+
// Parameter 'Sender: TObject'. Solche Methoden werden vom Form-Designer
48+
// per DFM gebunden und tragen per IDE-Konvention den Component-Namen als
49+
// kleingeschriebenes Praefix (actSaveExecute, btnSaveClick, qDataAfterScroll).
50+
// Spiegelt die Heuristik aus uCanBeClassMethod (Round-3-Fix); ohne diese
51+
// produzierte Self-Test auf realem VCL-Form-Code ~8 FPs.
52+
var
53+
Child : TAstNode;
54+
begin
55+
Result := False;
56+
for Child in MethodNode.Children do
57+
begin
58+
if Child.Kind <> nkParam then Continue;
59+
if SameText(Child.Name, 'Sender') then Exit(True);
60+
if Pos('tobject', LowerCase(Child.TypeRef)) > 0 then Exit(True);
61+
Exit; // nur ersten Parameter pruefen
62+
end;
63+
end;
64+
4565
class procedure TMethodNameDetector.AnalyzeUnit(UnitNode: TAstNode;
4666
const FileName: string; Results: TObjectList<TLeakFinding>);
4767
var
@@ -64,6 +84,9 @@ class procedure TMethodNameDetector.AnalyzeUnit(UnitNode: TAstNode;
6484
if not CharInSet(Ch, ['A'..'Z','a'..'z']) then Continue;
6585
// PascalCase = Upper als erstes Zeichen
6686
if CharInSet(Ch, ['A'..'Z']) then Continue;
87+
// Event-Handler (Sender: TObject als 1. Param) -> per IDE-Designer
88+
// benannt (actSaveExecute, btnSaveClick, ...). Style-Regel passt nicht.
89+
if IsEventHandlerSignature(M) then Continue;
6790
F := TLeakFinding.Create;
6891
F.FileName := FileName;
6992
F.MethodName := M.Name;

0 commit comments

Comments
 (0)