Browse Source

rtl: typinfo GetPropList

mattias 7 years ago
parent
commit
949b1daf26
1 changed files with 70 additions and 13 deletions
  1. 70 13
      packages/rtl/typinfo.pas

+ 70 - 13
packages/rtl/typinfo.pas

@@ -348,6 +348,11 @@ function GetInterfaceMember(aTIInterface: TTypeInfoInterface; const aName: Strin
 function GetInterfaceMethods(aTIInterface: TTypeInfoInterface): TTypeMemberMethodDynArray;
 function GetInterfaceMethods(aTIInterface: TTypeInfoInterface): TTypeMemberMethodDynArray;
 
 
 function GetPropInfos(aTIClass: TTypeInfoClass): TTypeMemberPropertyDynArray;
 function GetPropInfos(aTIClass: TTypeInfoClass): TTypeMemberPropertyDynArray;
+function GetPropList(aTIClass: TTypeInfoClass; TypeKinds: TTypeKinds; Sorted: boolean = true): TTypeMemberPropertyDynArray;
+function GetPropList(aTIClass: TTypeInfoClass): TTypeMemberPropertyDynArray;
+function GetPropList(AClass: TClass): TTypeMemberPropertyDynArray;
+function GetPropList(Instance: TObject): TTypeMemberPropertyDynArray;
+
 function GetPropInfo(TI: TTypeInfoClass; const PropName: String): TTypeMemberProperty;
 function GetPropInfo(TI: TTypeInfoClass; const PropName: String): TTypeMemberProperty;
 function GetPropInfo(TI: TTypeInfoClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;
 function GetPropInfo(TI: TTypeInfoClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;
 function GetPropInfo(Instance: TObject; const PropName: String): TTypeMemberProperty;
 function GetPropInfo(Instance: TObject; const PropName: String): TTypeMemberProperty;
@@ -429,24 +434,21 @@ implementation
 function GetClassMembers(aTIClass: TTypeInfoClass): TTypeMemberDynArray;
 function GetClassMembers(aTIClass: TTypeInfoClass): TTypeMemberDynArray;
 var
 var
   C: TTypeInfoClass;
   C: TTypeInfoClass;
-  i, Cnt, j: Integer;
+  i: Integer;
+  PropName: String;
+  Names: TJSObject;
 begin
 begin
-  Cnt:=0;
+  Result:=nil;
+  Names:=TJSObject.new;
   C:=aTIClass;
   C:=aTIClass;
   while C<>nil do
   while C<>nil do
   begin
   begin
-    inc(Cnt,length(C.Names));
-    C:=C.Ancestor;
-  end;
-  SetLength(Result,Cnt);
-  C:=aTIClass;
-  i:=0;
-  while C<>nil do
-  begin
-    for j:=0 to length(C.Names)-1 do
+    for i:=0 to length(C.Names)-1 do
     begin
     begin
-      Result[i]:=C.Members[C.Names[j]];
-      inc(i);
+      PropName:=C.Names[i];
+      if Names.hasOwnProperty(PropName) then continue;
+      TJSArray(Result).push(C.Members[PropName]);
+      Names[PropName]:=true;
     end;
     end;
     C:=C.Ancestor;
     C:=C.Ancestor;
   end;
   end;
@@ -616,6 +618,61 @@ begin
   end;
   end;
 end;
 end;
 
 
+function GetPropList(aTIClass: TTypeInfoClass; TypeKinds: TTypeKinds;
+  Sorted: boolean): TTypeMemberPropertyDynArray;
+
+  function NameSort(a,b: JSValue): NativeInt;
+  begin
+    if TTypeMemberProperty(a).Name<TTypeMemberProperty(b).Name then
+      Result:=-1
+    else if TTypeMemberProperty(a).Name>TTypeMemberProperty(b).Name then
+      Result:=1
+    else
+      Result:=0;
+  end;
+
+var
+  C: TTypeInfoClass;
+  i: Integer;
+  Names: TJSObject;
+  PropName: String;
+  Prop: TTypeMemberProperty;
+begin
+  Result:=nil;
+  C:=aTIClass;
+  Names:=TJSObject.new;
+  while C<>nil do
+  begin
+    for i:=0 to C.PropCount-1 do
+    begin
+      PropName:=C.Properties[i];
+      if Names.hasOwnProperty(PropName) then continue;
+      Prop:=TTypeMemberProperty(C.Members[PropName]);
+      if not (Prop.TypeInfo.Kind in TypeKinds) then continue;
+      TJSArray(Result).push(Prop);
+      Names[PropName]:=true;
+    end;
+    C:=C.Ancestor;
+  end;
+  if Sorted then
+    TJSArray(Result).sort(@NameSort);
+end;
+
+function GetPropList(aTIClass: TTypeInfoClass): TTypeMemberPropertyDynArray;
+begin
+  Result:=GetPropInfos(aTIClass);
+end;
+
+function GetPropList(AClass: TClass): TTypeMemberPropertyDynArray;
+begin
+  Result:=GetPropInfos(TypeInfo(AClass));
+end;
+
+function GetPropList(Instance: TObject): TTypeMemberPropertyDynArray;
+begin
+  Result:=GetPropList(Instance.ClassType);
+end;
+
 function GetPropInfo(TI: TTypeInfoClass; const PropName: String
 function GetPropInfo(TI: TTypeInfoClass; const PropName: String
   ): TTypeMemberProperty;
   ): TTypeMemberProperty;
 var
 var