Browse Source

+ add TRttiPointerType
* extend Rtti test

git-svn-id: trunk@37402 -

svenbarth 7 years ago
parent
commit
0c8f670ee0
2 changed files with 39 additions and 0 deletions
  1. 14 0
      packages/rtl-objpas/src/inc/rtti.pp
  2. 25 0
      packages/rtl-objpas/tests/tests.rtti.pas

+ 14 - 0
packages/rtl-objpas/src/inc/rtti.pp

@@ -230,6 +230,12 @@ type
     property StringKind: TRttiStringKind read GetStringKind;
     property StringKind: TRttiStringKind read GetStringKind;
   end;
   end;
 
 
+  TRttiPointerType = class(TRttiType)
+  private
+    function GetReferredType: TRttiType;
+  public
+    property ReferredType: TRttiType read GetReferredType;
+  end;
 
 
   { TRttiInstanceType }
   { TRttiInstanceType }
 
 
@@ -617,6 +623,13 @@ begin
     Result := false;
     Result := false;
 end;
 end;
 
 
+{ TRttiPointerType }
+
+function TRttiPointerType.GetReferredType: TRttiType;
+begin
+  Result := GRttiPool.GetType(FTypeData^.RefType);
+end;
+
 { TRttiPool }
 { TRttiPool }
 
 
 function TRttiPool.GetTypes: specialize TArray<TRttiType>;
 function TRttiPool.GetTypes: specialize TArray<TRttiType>;
@@ -668,6 +681,7 @@ begin
           tkUString,
           tkUString,
           tkWString : Result := TRttiStringType.Create(ATypeInfo);
           tkWString : Result := TRttiStringType.Create(ATypeInfo);
           tkFloat   : Result := TRttiFloatType.Create(ATypeInfo);
           tkFloat   : Result := TRttiFloatType.Create(ATypeInfo);
+          tkPointer : Result := TRttiPointerType.Create(ATypeInfo);
         else
         else
           Result := TRttiType.Create(ATypeInfo);
           Result := TRttiType.Create(ATypeInfo);
         end;
         end;

+ 25 - 0
packages/rtl-objpas/tests/tests.rtti.pas

@@ -24,6 +24,7 @@ type
   published
   published
     //procedure GetTypes;
     //procedure GetTypes;
     procedure GetTypeInteger;
     procedure GetTypeInteger;
+    procedure GetTypePointer;
     procedure GetClassProperties;
     procedure GetClassProperties;
 
 
     procedure GetClassPropertiesValue;
     procedure GetClassPropertiesValue;
@@ -835,6 +836,30 @@ begin
   LContext.Free;
   LContext.Free;
 end;
 end;
 
 
+procedure TTestCase1.GetTypePointer;
+var
+  context: TRttiContext;
+  t: TRttiType;
+  p: TRttiPointerType absolute t;
+begin
+  context := TRttiContext.Create;
+  try
+    t := context.GetType(TypeInfo(Pointer));
+    Assert(t is TRttiPointerType, 'Type of Pointer is not a TRttiPointerType');
+    Assert(not Assigned(p.ReferredType), 'ReferredType of Pointer is not Nil');
+    t := context.GetType(TypeInfo(PLongInt));
+    Assert(t is TRttiPointerType, 'Type of Pointer is not a TRttiPointerType');
+    Assert(Assigned(p.ReferredType), 'ReferredType of PLongInt is Nil');
+    Assert(p.ReferredType = context.GetType(TypeInfo(LongInt)), 'ReferredType of PLongInt is not a LongInt');
+    t := context.GetType(TypeInfo(PWideChar));
+    Assert(t is TRttiPointerType, 'Type of Pointer is not a TRttiPointerType');
+    Assert(Assigned(p.ReferredType), 'ReferredType of PWideChar is Nil');
+    Assert(p.ReferredType = context.GetType(TypeInfo(WideChar)), 'ReferredType of PWideChar is not a WideChar');
+  finally
+    context.Free;
+  end;
+end;
+
 procedure TTestCase1.GetClassProperties;
 procedure TTestCase1.GetClassProperties;
 var
 var
   LContext: TRttiContext;
   LContext: TRttiContext;