From 8c38953440b52e427e92b51c796a3a8d08f770b9 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 1 Mar 2021 22:01:31 +0000 Subject: [PATCH] fcl-passrc: useanalyzer: fixed marking nested type git-svn-id: trunk@48861 - --- packages/fcl-passrc/src/pasuseanalyzer.pas | 15 +++++++--- packages/fcl-passrc/tests/tcresolver.pas | 7 +++-- packages/fcl-passrc/tests/tcuseanalyzer.pas | 31 +++++++++++++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/packages/fcl-passrc/src/pasuseanalyzer.pas b/packages/fcl-passrc/src/pasuseanalyzer.pas index 55e332f61f..fa6a042b2d 100644 --- a/packages/fcl-passrc/src/pasuseanalyzer.pas +++ b/packages/fcl-passrc/src/pasuseanalyzer.pas @@ -2357,11 +2357,18 @@ begin else if IsModuleInternal(Member) then // private or strict private continue - else if (Mode=paumAllPasUsable) and FirstTime - and ((Member.ClassType=TPasProperty) or (Member is TPasType)) then + else if (Mode=paumAllPasUsable) and FirstTime then begin - // non private property can be used by typeinfo by descendants in other units - UseTypeInfo(Member); + if Member.ClassType=TPasProperty then + begin + // non private property can be used by typeinfo by descendants in other units + UseTypeInfo(Member); + end + else if Member is TPasType then + begin + // non private type can be used by descendants in other units + UseType(TPasType(Member),Mode); + end end else ; // else: class/record is in unit interface, mark all non private members diff --git a/packages/fcl-passrc/tests/tcresolver.pas b/packages/fcl-passrc/tests/tcresolver.pas index d7ac1df835..f1e48cc195 100644 --- a/packages/fcl-passrc/tests/tcresolver.pas +++ b/packages/fcl-passrc/tests/tcresolver.pas @@ -175,7 +175,7 @@ type procedure AddSystemUnit(Parts: TSystemUnitParts = []); procedure StartProgram(NeedSystemUnit: boolean; SystemUnitParts: TSystemUnitParts = []); procedure StartLibrary(NeedSystemUnit: boolean; SystemUnitParts: TSystemUnitParts = []); - procedure StartUnit(NeedSystemUnit: boolean); + procedure StartUnit(NeedSystemUnit: boolean; SystemUnitParts: TSystemUnitParts = []); property Modules[Index: integer]: TTestEnginePasResolver read GetModules; property ModuleCount: integer read GetModuleCount; property Hub: TPasResolverHub read FHub; @@ -2345,10 +2345,11 @@ begin Add('library '+ExtractFileUnitName(MainFilename)+';'); end; -procedure TCustomTestResolver.StartUnit(NeedSystemUnit: boolean); +procedure TCustomTestResolver.StartUnit(NeedSystemUnit: boolean; + SystemUnitParts: TSystemUnitParts); begin if NeedSystemUnit then - AddSystemUnit + AddSystemUnit(SystemUnitParts) else Parser.ImplicitUses.Clear; Add('unit '+ExtractFileUnitName(MainFilename)+';'); diff --git a/packages/fcl-passrc/tests/tcuseanalyzer.pas b/packages/fcl-passrc/tests/tcuseanalyzer.pas index bd7d429648..43530762cc 100644 --- a/packages/fcl-passrc/tests/tcuseanalyzer.pas +++ b/packages/fcl-passrc/tests/tcuseanalyzer.pas @@ -85,6 +85,7 @@ type procedure TestM_Class_PropertyInherited; procedure TestM_Class_MethodOverride; procedure TestM_Class_MethodOverride2; + procedure TestM_Class_NestedClass; procedure TestM_ClassInterface_Corba; procedure TestM_ClassInterface_NoHintsForMethod; procedure TestM_ClassInterface_NoHintsForImpl; @@ -1321,6 +1322,36 @@ begin AnalyzeProgram; end; +procedure TTestUseAnalyzer.TestM_Class_NestedClass; +begin + StartUnit(true,[supTObject]); + Add([ + 'interface', + 'type', + ' TBird = class', + ' public type', + ' TWing = class', + ' private', + ' function GetCurrent: TBird;', + ' public', + ' function MoveNext: Boolean; reintroduce;', + ' property Current: TBird read GetCurrent;', + ' end;', + ' end;', + 'implementation', + 'function TBird.TWing.GetCurrent: TBird;', + 'begin', + ' Result:=nil;', + 'end;', + 'function TBird.TWing.MoveNext: Boolean; reintroduce;', + 'begin', + ' Result:=false;', + 'end;', + '']); + AnalyzeUnit; + CheckUseAnalyzerUnexpectedHints; +end; + procedure TTestUseAnalyzer.TestM_ClassInterface_Corba; begin StartProgram(false);