From af1e46ac6c97a52b55a07c73222749724bf4c928 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 14 May 2018 16:54:28 +0000 Subject: [PATCH] fcl-passrc: useanalyzer: fixed typeinfo of inherited property git-svn-id: trunk@38991 - --- packages/fcl-passrc/src/pasuseanalyzer.pas | 12 +++++---- packages/fcl-passrc/tests/tcresolver.pas | 2 +- packages/fcl-passrc/tests/tcuseanalyzer.pas | 28 +++++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/packages/fcl-passrc/src/pasuseanalyzer.pas b/packages/fcl-passrc/src/pasuseanalyzer.pas index 2a3c14e456..69a111fc0f 100644 --- a/packages/fcl-passrc/src/pasuseanalyzer.pas +++ b/packages/fcl-passrc/src/pasuseanalyzer.pas @@ -781,7 +781,7 @@ procedure TPasAnalyzer.UseTypeInfo(El: TPasElement); var C: TClass; - Members: TFPList; + Members, Args: TFPList; i: Integer; Member: TPasElement; MemberResolved: TPasResolverResult; @@ -804,15 +804,16 @@ begin begin // published property Prop:=TPasProperty(El); - for i:=0 to Prop.Args.Count-1 do - UseSubEl(TPasArgument(Prop.Args[i]).ArgType); - UseSubEl(Prop.VarType); + Args:=Resolver.GetPasPropertyArgs(Prop); + for i:=0 to Args.Count-1 do + UseSubEl(TPasArgument(Args[i]).ArgType); + UseSubEl(Resolver.GetPasPropertyType(Prop)); UseElement(Resolver.GetPasPropertyGetter(Prop),rraRead,false); UseElement(Resolver.GetPasPropertySetter(Prop),rraRead,false); UseElement(Resolver.GetPasPropertyIndex(Prop),rraRead,false); // stored and defaultvalue are only used when published -> mark as used UseElement(Resolver.GetPasPropertyStoredExpr(Prop),rraRead,false); - UseElement(Prop.DefaultExpr,rraRead,false); + UseElement(Resolver.GetPasPropertyDefaultExpr(Prop),rraRead,false); end else if (C=TPasAliasType) or (C=TPasTypeAliasType) then UseSubEl(TPasAliasType(El).DestType) @@ -1707,6 +1708,7 @@ begin // when checking a single unit, mark all method+properties implementing the interfaces MarkAllInterfaceImplementations(ClassScope); end; + // members AllPublished:=(Mode<>paumAllExports); for i:=0 to El.Members.Count-1 do diff --git a/packages/fcl-passrc/tests/tcresolver.pas b/packages/fcl-passrc/tests/tcresolver.pas index 481a1a2690..da95133da5 100644 --- a/packages/fcl-passrc/tests/tcresolver.pas +++ b/packages/fcl-passrc/tests/tcresolver.pas @@ -7888,7 +7888,7 @@ begin 'begin', ' TObject.Create;']); ParseProgram; - CheckResolverHint(mtNote,nConstructingClassXWithAbstractMethodY,'Constructing a class "TObject" with abstract method "DoIt"'); + CheckResolverHint(mtWarning,nConstructingClassXWithAbstractMethodY,'Constructing a class "TObject" with abstract method "DoIt"'); CheckResolverUnexpectedHints; end; diff --git a/packages/fcl-passrc/tests/tcuseanalyzer.pas b/packages/fcl-passrc/tests/tcuseanalyzer.pas index cec604123a..2e419a2c00 100644 --- a/packages/fcl-passrc/tests/tcuseanalyzer.pas +++ b/packages/fcl-passrc/tests/tcuseanalyzer.pas @@ -145,6 +145,7 @@ type procedure TestWP_PublishedProperty; procedure TestWP_BuiltInFunctions; procedure TestWP_TypeInfo; + procedure TestWP_TypeInfo_PropertyEnumType; procedure TestWP_ForInClass; procedure TestWP_AssertSysUtils; procedure TestWP_RangeErrorSysUtils; @@ -2467,6 +2468,33 @@ begin AnalyzeWholeProgram; end; +procedure TTestUseAnalyzer.TestWP_TypeInfo_PropertyEnumType; +begin + StartProgram(false); + Add([ + 'type', + ' TObject = class end;', + ' {#talign_typeinfo}TAlign = (alLeft,alRight);', + ' {$M+}', + ' TPersistent = class', + ' private', + ' FAlign: TAlign;', + ' public', + ' property {#tpersistent_align_notypeinfo}Align: TAlign read FAlign write FAlign;', + ' end;', + ' {$M-}', + ' {#tbutton_typeinfo}TButton = class(TPersistent)', + ' published', + ' property {#tbutton_align_typeinfo}Align;', + ' end;', + 'var', + ' {#p_notypeinfo}p: pointer;', + 'begin', + ' p:=typeinfo(TButton);', + '']); + AnalyzeWholeProgram; +end; + procedure TTestUseAnalyzer.TestWP_ForInClass; begin StartProgram(false);