fcl-passrc: parser: generic record

git-svn-id: trunk@36219 -
This commit is contained in:
Mattias Gaertner 2017-05-15 15:08:21 +00:00
parent 76331eef75
commit d7614a19cc
2 changed files with 36 additions and 1 deletions

View File

@ -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

View File

@ -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);