Browse Source

pastojs: read old pcu files from 2.0.0

mattias 4 years ago
parent
commit
6ff084bbea
1 changed files with 53 additions and 1 deletions
  1. 53 1
      compiler/packages/pastojs/src/fppas2js.pp

+ 53 - 1
compiler/packages/pastojs/src/fppas2js.pp

@@ -2149,6 +2149,7 @@ type
       AContext: TConvertContext): TJSElement; virtual;
       AContext: TConvertContext): TJSElement; virtual;
     Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
     Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
       AContext: TConvertContext): TJSElement; virtual;
       AContext: TConvertContext): TJSElement; virtual;
+    Procedure CreateRTTIAnonymous(El: TPasType; AContext: TConvertContext); virtual; // needed by precompiled files from 2.0.0
     Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
     Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
       FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
       FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
       MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
       MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
@@ -19900,6 +19901,23 @@ var
     ObjLit.Expr:=JS;
     ObjLit.Expr:=JS;
   end;
   end;
 
 
+  function VarTypeInfoAlreadyCreated(VarType: TPasType): boolean;
+  var
+    i: Integer;
+    PrevMember: TPasElement;
+  begin
+    i:=Index-1;
+    while (i>=0) do
+      begin
+      PrevMember:=TPasElement(Members[i]);
+      if (PrevMember is TPasVariable) and (TPasVariable(PrevMember).VarType=VarType)
+          and IsElementUsed(PrevMember) then
+        exit(true);
+      dec(i);
+      end;
+    Result:=false;
+  end;
+
 var
 var
   JSTypeInfo: TJSElement;
   JSTypeInfo: TJSElement;
   aName: String;
   aName: String;
@@ -19912,7 +19930,10 @@ begin
   V:=TPasVariable(Members[Index]);
   V:=TPasVariable(Members[Index]);
   VarType:=V.VarType;
   VarType:=V.VarType;
   if (VarType<>nil) and (VarType.Name='') then
   if (VarType<>nil) and (VarType.Name='') then
-    RaiseNotSupported(VarType,AContext,20210223022919);
+    begin
+    if not VarTypeInfoAlreadyCreated(VarType) then
+      CreateRTTIAnonymous(VarType,AContext); // only needed by precompiled files from 2.0.0
+    end;
 
 
   JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
   JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
   OptionsEl:=nil;
   OptionsEl:=nil;
@@ -20230,6 +20251,37 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TPasToJSConverter.CreateRTTIAnonymous(El: TPasType;
+  AContext: TConvertContext);
+// if El has any anonymous types, create the RTTI
+var
+  C: TClass;
+  JS: TJSElement;
+  GlobalCtx: TFunctionContext;
+  Src: TJSSourceElements;
+begin
+  if El.Name<>'' then
+    RaiseNotSupported(El,AContext,20170905162324,'inconsistency');
+
+  GlobalCtx:=AContext.GetGlobalFunc;
+  if GlobalCtx=nil then
+    RaiseNotSupported(El,AContext,20181229130835);
+  if not (GlobalCtx.JSElement is TJSSourceElements) then
+    begin
+    {$IFDEF VerbosePas2JS}
+    writeln('TPasToJSConverter.CreateRTTIAnonymous GlobalCtx=',GetObjName(GlobalCtx),' JSElement=',GetObjName(GlobalCtx.JSElement));
+    {$ENDIF}
+    RaiseNotSupported(El,AContext,20181229130926);
+    end;
+  Src:=TJSSourceElements(GlobalCtx.JSElement);
+  C:=El.ClassType;
+  if C=TPasArrayType then
+    begin
+    JS:=ConvertArrayType(TPasArrayType(El),AContext);
+    AddToSourceElements(Src,JS);
+    end;
+end;
+
 function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
 function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
   Src: TJSSourceElements; FuncContext: TFunctionContext;
   Src: TJSSourceElements; FuncContext: TFunctionContext;
   MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;
   MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;