Browse Source

fcl-passrc: added TRecordValuesItems.NameExp

git-svn-id: trunk@38867 -
Mattias Gaertner 7 years ago
parent
commit
6bab0e1892
2 changed files with 50 additions and 38 deletions
  1. 19 10
      packages/fcl-passrc/src/pastree.pp
  2. 31 28
      packages/fcl-passrc/src/pparser.pp

+ 19 - 10
packages/fcl-passrc/src/pastree.pp

@@ -270,15 +270,18 @@ type
   { TRecordValues }
 
   TRecordValuesItem = record
-    Name      : AnsiString;
+    Name      : String;
+    NameExp   : TPrimitiveExpr;
     ValueExp  : TPasExpr;
   end;
+  PRecordValuesItem = ^TRecordValuesItem;
+  TRecordValuesItemArray = array of TRecordValuesItem;
 
   TRecordValues = class(TPasExpr)
-    Fields    : array of TRecordValuesItem;
+    Fields    : TRecordValuesItemArray;
     constructor Create(AParent : TPasElement); overload;
     destructor Destroy; override;
-    procedure AddField(const AName: AnsiString; Value: TPasExpr);
+    procedure AddField(AName: TPrimitiveExpr; Value: TPasExpr);
     function GetDeclaration(full : Boolean) : string; override;
     procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
       const Arg: Pointer); override;
@@ -657,9 +660,9 @@ type
       const Arg: Pointer); override;
   public
     PackMode: TPackMode;
-    Members: TFPList;     // array of TPasVariable elements
-    VariantEl: TPasElement; // TPasVariable or TPasType
-    Variants: TFPList;	// array of TPasVariant elements, may be nil!
+    Members: TFPList;     // list of TPasVariable elements
+    VariantEl: TPasElement; // nil or TPasVariable or TPasType
+    Variants: TFPList;	// list of TPasVariant elements, may be nil!
     GenericTemplateTypes: TFPList; // list of TPasGenericTemplateType
     Function IsPacked: Boolean;
     Function IsBitPacked : Boolean;
@@ -3673,14 +3676,14 @@ var
   i: Integer;
 begin
   inherited ForEachCall(aMethodCall, Arg);
+  for i:=0 to GenericTemplateTypes.Count-1 do
+    ForEachChildCall(aMethodCall,Arg,TPasElement(GenericTemplateTypes[i]),false);
   for i:=0 to Members.Count-1 do
     ForEachChildCall(aMethodCall,Arg,TPasElement(Members[i]),false);
   ForEachChildCall(aMethodCall,Arg,VariantEl,false);
   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;
@@ -4829,8 +4832,12 @@ begin
   inherited ForEachCall(aMethodCall, Arg);
   for i:=0 to length(Fields)-1 do
     with Fields[i] do
+      begin
+      if NameExp<>nil then
+        ForEachChildCall(aMethodCall,Arg,NameExp,false);
       if ValueExp<>nil then
         ForEachChildCall(aMethodCall,Arg,ValueExp,false);
+      end;
 end;
 
 constructor TRecordValues.Create(AParent : TPasElement);
@@ -4848,13 +4855,15 @@ begin
   inherited Destroy;
 end;
 
-procedure TRecordValues.AddField(const AName:AnsiString;Value:TPasExpr);
+procedure TRecordValues.AddField(AName: TPrimitiveExpr; Value: TPasExpr);
 var
   i : Integer;
 begin
   i:=length(Fields);
   SetLength(Fields, i+1);
-  Fields[i].Name:=AName;
+  Fields[i].Name:=AName.Value;
+  Fields[i].NameExp:=AName;
+  AName.Parent:=Self;
   Fields[i].ValueExp:=Value;
   Value.Parent:=Self;
 end;

+ 31 - 28
packages/fcl-passrc/src/pparser.pp

@@ -1523,6 +1523,7 @@ begin
   ok:=false;
   Try
     TPasPointerType(Result).DestType := ParseType(Result,CurSourcePos);
+    Engine.FinishScope(stTypeDef,Result);
     ok:=true;
   finally
     if not ok then
@@ -2540,7 +2541,7 @@ function TPasParser.DoParseConstValueExpression(AParent: TPasElement): TPasExpr;
         end;
       repeat
         NextToken;
-        a.AddValues(DoParseConstValueExpression(AParent));
+        a.AddValues(DoParseConstValueExpression(a));
       until CurToken<>tkComma;
       Result:=a;
     finally
@@ -2553,7 +2554,7 @@ function TPasParser.DoParseConstValueExpression(AParent: TPasElement): TPasExpr;
   end;
 
 var
-  x : TPasExpr;
+  x , v: TPasExpr;
   n : AnsiString;
   r : TRecordValues;
 begin
@@ -2573,32 +2574,34 @@ begin
 
         tkColon: // record field (a:xxx;b:yyy;c:zzz);
           begin
-            r:=nil;
-            try
-              n:=GetExprIdent(x);
-              ReleaseAndNil(TPasElement(x));
-              r:=CreateRecordValues(AParent);
-              NextToken;
-              x:=DoParseConstValueExpression(AParent);
-              r.AddField(n, x);
-              x:=nil;
-              if not lastfield then
-                repeat
-                  n:=ExpectIdentifier;
-                  ExpectToken(tkColon);
-                  NextToken;
-                  x:=DoParseConstValueExpression(AParent);
-                  r.AddField(n, x);
-                  x:=nil;
-                until lastfield; // CurToken<>tkSemicolon;
-              Result:=r;
-            finally
-              if Result=nil then
-                begin
-                r.Free;
-                x.Free;
-                end;
-            end;
+          if not (x is TPrimitiveExpr) then
+            CheckToken(tkBraceClose);
+          r:=nil;
+          try
+            n:=GetExprIdent(x);
+            r:=CreateRecordValues(AParent);
+            NextToken;
+            v:=DoParseConstValueExpression(r);
+            r.AddField(TPrimitiveExpr(x), v);
+            x:=nil;
+            if not lastfield then
+              repeat
+                n:=ExpectIdentifier;
+                x:=CreatePrimitiveExpr(r,pekIdent,n);
+                ExpectToken(tkColon);
+                NextToken;
+                v:=DoParseConstValueExpression(AParent);
+                r.AddField(TPrimitiveExpr(x), v);
+                x:=nil;
+              until lastfield; // CurToken<>tkSemicolon;
+            Result:=r;
+          finally
+            if Result=nil then
+              begin
+              r.Free;
+              x.Free;
+              end;
+          end;
           end;
       else
         // Binary expression!  ((128 div sizeof(longint)) - 3);