diff --git a/packages/fcl-passrc/src/pastree.pp b/packages/fcl-passrc/src/pastree.pp index 33e66b565a..d0edd1d097 100644 --- a/packages/fcl-passrc/src/pastree.pp +++ b/packages/fcl-passrc/src/pastree.pp @@ -635,9 +635,11 @@ type Members: TFPList; // array of TPasVariable elements VariantEl: TPasElement; // TPasVariable or TPasType Variants: TFPList; // array of TPasVariant elements, may be nil! + GenericTemplateTypes: TFPList; // list of TPasGenericTemplateType Function IsPacked: Boolean; Function IsBitPacked : Boolean; Function IsAdvancedRecord : Boolean; + Procedure SetGenericTemplates(AList : TFPList); end; TPasGenericTemplateType = Class(TPasType); @@ -2416,12 +2418,17 @@ constructor TPasRecordType.Create(const AName: string; AParent: TPasElement); begin inherited Create(AName, AParent); Members := TFPList.Create; + GenericTemplateTypes:=TFPList.Create; end; destructor TPasRecordType.Destroy; var i: Integer; begin + for i := 0 to GenericTemplateTypes.Count - 1 do + TPasElement(GenericTemplateTypes[i]).Release; + FreeAndNil(GenericTemplateTypes); + for i := 0 to Members.Count - 1 do TPasVariable(Members[i]).Release; FreeAndNil(Members); @@ -3547,6 +3554,8 @@ begin if Variants<>nil then for i:=0 to Variants.Count-1 do ForEachChildCall(aMethodCall,Arg,TPasElement(Variants[i]),false); + for i:=0 to GenericTemplateTypes.Count-1 do + ForEachChildCall(aMethodCall,Arg,TPasElement(GenericTemplateTypes[i]),false); end; function TPasRecordType.IsPacked: Boolean; @@ -3575,6 +3584,17 @@ begin 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); Var diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp index ead412cb5f..55d08672a5 100644 --- a/packages/fcl-passrc/src/pparser.pp +++ b/packages/fcl-passrc/src/pparser.pp @@ -2775,6 +2775,7 @@ var NamePos: TPasSourcePos; ok: Boolean; Proc: TPasProcedure; + RecordEl: TPasRecordType; begin CurBlock := declNone; @@ -2982,7 +2983,20 @@ begin Declarations.Declarations.Add(ClassEl); Declarations.Classes.Add(ClassEl); CheckHint(classel,True); + Engine.FinishScope(stTypeDef,ClassEl); 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: begin if List.Count<>1 then @@ -2990,9 +3004,10 @@ begin ArrEl:=TPasArrayType(ParseArrayType(Declarations,NamePos,TypeName,pmNone)); CheckHint(ArrEl,True); ArrEl.ElType.Release; - ArrEl.elType:=TPasGenericTemplateType(List[0]); + ArrEl.ElType:=TPasGenericTemplateType(List[0]); Declarations.Declarations.Add(ArrEl); Declarations.Types.Add(ArrEl); + Engine.FinishScope(stTypeDef,ArrEl); end; else ParseExc(nParserGenericClassOrArray,SParserGenericClassOrArray);