mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 09:26:15 +02:00
fcl-passrc: useanalyzer: fixed typeinfo of inherited property
git-svn-id: trunk@38991 -
This commit is contained in:
parent
67446aa414
commit
af1e46ac6c
@ -781,7 +781,7 @@ procedure TPasAnalyzer.UseTypeInfo(El: TPasElement);
|
|||||||
|
|
||||||
var
|
var
|
||||||
C: TClass;
|
C: TClass;
|
||||||
Members: TFPList;
|
Members, Args: TFPList;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
Member: TPasElement;
|
Member: TPasElement;
|
||||||
MemberResolved: TPasResolverResult;
|
MemberResolved: TPasResolverResult;
|
||||||
@ -804,15 +804,16 @@ begin
|
|||||||
begin
|
begin
|
||||||
// published property
|
// published property
|
||||||
Prop:=TPasProperty(El);
|
Prop:=TPasProperty(El);
|
||||||
for i:=0 to Prop.Args.Count-1 do
|
Args:=Resolver.GetPasPropertyArgs(Prop);
|
||||||
UseSubEl(TPasArgument(Prop.Args[i]).ArgType);
|
for i:=0 to Args.Count-1 do
|
||||||
UseSubEl(Prop.VarType);
|
UseSubEl(TPasArgument(Args[i]).ArgType);
|
||||||
|
UseSubEl(Resolver.GetPasPropertyType(Prop));
|
||||||
UseElement(Resolver.GetPasPropertyGetter(Prop),rraRead,false);
|
UseElement(Resolver.GetPasPropertyGetter(Prop),rraRead,false);
|
||||||
UseElement(Resolver.GetPasPropertySetter(Prop),rraRead,false);
|
UseElement(Resolver.GetPasPropertySetter(Prop),rraRead,false);
|
||||||
UseElement(Resolver.GetPasPropertyIndex(Prop),rraRead,false);
|
UseElement(Resolver.GetPasPropertyIndex(Prop),rraRead,false);
|
||||||
// stored and defaultvalue are only used when published -> mark as used
|
// stored and defaultvalue are only used when published -> mark as used
|
||||||
UseElement(Resolver.GetPasPropertyStoredExpr(Prop),rraRead,false);
|
UseElement(Resolver.GetPasPropertyStoredExpr(Prop),rraRead,false);
|
||||||
UseElement(Prop.DefaultExpr,rraRead,false);
|
UseElement(Resolver.GetPasPropertyDefaultExpr(Prop),rraRead,false);
|
||||||
end
|
end
|
||||||
else if (C=TPasAliasType) or (C=TPasTypeAliasType) then
|
else if (C=TPasAliasType) or (C=TPasTypeAliasType) then
|
||||||
UseSubEl(TPasAliasType(El).DestType)
|
UseSubEl(TPasAliasType(El).DestType)
|
||||||
@ -1707,6 +1708,7 @@ begin
|
|||||||
// when checking a single unit, mark all method+properties implementing the interfaces
|
// when checking a single unit, mark all method+properties implementing the interfaces
|
||||||
MarkAllInterfaceImplementations(ClassScope);
|
MarkAllInterfaceImplementations(ClassScope);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// members
|
// members
|
||||||
AllPublished:=(Mode<>paumAllExports);
|
AllPublished:=(Mode<>paumAllExports);
|
||||||
for i:=0 to El.Members.Count-1 do
|
for i:=0 to El.Members.Count-1 do
|
||||||
|
@ -7888,7 +7888,7 @@ begin
|
|||||||
'begin',
|
'begin',
|
||||||
' TObject.Create;']);
|
' TObject.Create;']);
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtNote,nConstructingClassXWithAbstractMethodY,'Constructing a class "TObject" with abstract method "DoIt"');
|
CheckResolverHint(mtWarning,nConstructingClassXWithAbstractMethodY,'Constructing a class "TObject" with abstract method "DoIt"');
|
||||||
CheckResolverUnexpectedHints;
|
CheckResolverUnexpectedHints;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -145,6 +145,7 @@ type
|
|||||||
procedure TestWP_PublishedProperty;
|
procedure TestWP_PublishedProperty;
|
||||||
procedure TestWP_BuiltInFunctions;
|
procedure TestWP_BuiltInFunctions;
|
||||||
procedure TestWP_TypeInfo;
|
procedure TestWP_TypeInfo;
|
||||||
|
procedure TestWP_TypeInfo_PropertyEnumType;
|
||||||
procedure TestWP_ForInClass;
|
procedure TestWP_ForInClass;
|
||||||
procedure TestWP_AssertSysUtils;
|
procedure TestWP_AssertSysUtils;
|
||||||
procedure TestWP_RangeErrorSysUtils;
|
procedure TestWP_RangeErrorSysUtils;
|
||||||
@ -2467,6 +2468,33 @@ begin
|
|||||||
AnalyzeWholeProgram;
|
AnalyzeWholeProgram;
|
||||||
end;
|
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;
|
procedure TTestUseAnalyzer.TestWP_ForInClass;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
|
Loading…
Reference in New Issue
Block a user