mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-17 00:53:13 +02:00
fcl-passrc: parser: generic record
git-svn-id: trunk@36219 -
This commit is contained in:
parent
76331eef75
commit
d7614a19cc
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user