Browse Source

fcl-passrc: useanalyzer: fixed typeinfo of inherited property

git-svn-id: trunk@38991 -
Mattias Gaertner 7 years ago
parent
commit
af1e46ac6c

+ 7 - 5
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

+ 1 - 1
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;
 

+ 28 - 0
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);