Browse Source

fcl-passrc: parser: generic record

git-svn-id: trunk@36219 -
Mattias Gaertner 8 years ago
parent
commit
d7614a19cc
2 changed files with 36 additions and 1 deletions
  1. 20 0
      packages/fcl-passrc/src/pastree.pp
  2. 16 1
      packages/fcl-passrc/src/pparser.pp

+ 20 - 0
packages/fcl-passrc/src/pastree.pp

@@ -635,9 +635,11 @@ type
     Members: TFPList;     // array of TPasVariable elements
     Members: TFPList;     // array of TPasVariable elements
     VariantEl: TPasElement; // TPasVariable or TPasType
     VariantEl: TPasElement; // TPasVariable or TPasType
     Variants: TFPList;	// array of TPasVariant elements, may be nil!
     Variants: TFPList;	// array of TPasVariant elements, may be nil!
+    GenericTemplateTypes: TFPList; // list of TPasGenericTemplateType
     Function IsPacked: Boolean;
     Function IsPacked: Boolean;
     Function IsBitPacked : Boolean;
     Function IsBitPacked : Boolean;
     Function IsAdvancedRecord : Boolean;
     Function IsAdvancedRecord : Boolean;
+    Procedure SetGenericTemplates(AList : TFPList);
   end;
   end;
 
 
   TPasGenericTemplateType = Class(TPasType);
   TPasGenericTemplateType = Class(TPasType);
@@ -2416,12 +2418,17 @@ constructor TPasRecordType.Create(const AName: string; AParent: TPasElement);
 begin
 begin
   inherited Create(AName, AParent);
   inherited Create(AName, AParent);
   Members := TFPList.Create;
   Members := TFPList.Create;
+  GenericTemplateTypes:=TFPList.Create;
 end;
 end;
 
 
 destructor TPasRecordType.Destroy;
 destructor TPasRecordType.Destroy;
 var
 var
   i: Integer;
   i: Integer;
 begin
 begin
+  for i := 0 to GenericTemplateTypes.Count - 1 do
+    TPasElement(GenericTemplateTypes[i]).Release;
+  FreeAndNil(GenericTemplateTypes);
+
   for i := 0 to Members.Count - 1 do
   for i := 0 to Members.Count - 1 do
     TPasVariable(Members[i]).Release;
     TPasVariable(Members[i]).Release;
   FreeAndNil(Members);
   FreeAndNil(Members);
@@ -3547,6 +3554,8 @@ begin
   if Variants<>nil then
   if Variants<>nil then
     for i:=0 to Variants.Count-1 do
     for i:=0 to Variants.Count-1 do
       ForEachChildCall(aMethodCall,Arg,TPasElement(Variants[i]),false);
       ForEachChildCall(aMethodCall,Arg,TPasElement(Variants[i]),false);
+  for i:=0 to GenericTemplateTypes.Count-1 do
+    ForEachChildCall(aMethodCall,Arg,TPasElement(GenericTemplateTypes[i]),false);
 end;
 end;
 
 
 function TPasRecordType.IsPacked: Boolean;
 function TPasRecordType.IsPacked: Boolean;
@@ -3575,6 +3584,17 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure TPasRecordType.SetGenericTemplates(AList: TFPList);
+var
+  I: Integer;
+begin
+  For I:=0 to AList.Count-1 do
+    begin
+    TPasElement(AList[i]).Parent:=Self;
+    GenericTemplateTypes.Add(AList[i]);
+    end;
+end;
+
 procedure TPasProcedureType.GetArguments(List : TStrings);
 procedure TPasProcedureType.GetArguments(List : TStrings);
 
 
 Var
 Var

+ 16 - 1
packages/fcl-passrc/src/pparser.pp

@@ -2775,6 +2775,7 @@ var
   NamePos: TPasSourcePos;
   NamePos: TPasSourcePos;
   ok: Boolean;
   ok: Boolean;
   Proc: TPasProcedure;
   Proc: TPasProcedure;
+  RecordEl: TPasRecordType;
 
 
 begin
 begin
   CurBlock := declNone;
   CurBlock := declNone;
@@ -2982,7 +2983,20 @@ begin
                  Declarations.Declarations.Add(ClassEl);
                  Declarations.Declarations.Add(ClassEl);
                  Declarations.Classes.Add(ClassEl);
                  Declarations.Classes.Add(ClassEl);
                  CheckHint(classel,True);
                  CheckHint(classel,True);
+                 Engine.FinishScope(stTypeDef,ClassEl);
                  end;
                  end;
+              tkRecord:
+                begin
+                RecordEl := TPasRecordType(CreateElement(TPasRecordType,
+                  TypeName, Declarations, NamePos));
+                RecordEl.SetGenericTemplates(List);
+                NextToken;
+                ParseRecordFieldList(RecordEl,tkend,true);
+                Declarations.Declarations.Add(RecordEl);
+                Declarations.Classes.Add(RecordEl);
+                CheckHint(RecordEl,True);
+                Engine.FinishScope(stTypeDef,RecordEl);
+                end;
               tkArray:
               tkArray:
                  begin
                  begin
                  if List.Count<>1 then
                  if List.Count<>1 then
@@ -2990,9 +3004,10 @@ begin
                  ArrEl:=TPasArrayType(ParseArrayType(Declarations,NamePos,TypeName,pmNone));
                  ArrEl:=TPasArrayType(ParseArrayType(Declarations,NamePos,TypeName,pmNone));
                  CheckHint(ArrEl,True);
                  CheckHint(ArrEl,True);
                  ArrEl.ElType.Release;
                  ArrEl.ElType.Release;
-                 ArrEl.elType:=TPasGenericTemplateType(List[0]);
+                 ArrEl.ElType:=TPasGenericTemplateType(List[0]);
                  Declarations.Declarations.Add(ArrEl);
                  Declarations.Declarations.Add(ArrEl);
                  Declarations.Types.Add(ArrEl);
                  Declarations.Types.Add(ArrEl);
+                 Engine.FinishScope(stTypeDef,ArrEl);
                  end;
                  end;
             else
             else
               ParseExc(nParserGenericClassOrArray,SParserGenericClassOrArray);
               ParseExc(nParserGenericClassOrArray,SParserGenericClassOrArray);