2
0
Эх сурвалжийг харах

pastojs: TJSArray([...])

(cherry picked from commit a01dc282067e70f9e693e3272ba5aeb526336a3c)
mattias 3 жил өмнө
parent
commit
68c109035c

+ 64 - 10
packages/pastojs/src/fppas2js.pp

@@ -6575,6 +6575,12 @@ begin
               // TJSString(aString)
               // TJSString(aString)
               exit(cExact);
               exit(cExact);
             end
             end
+          else if (FromResolved.BaseType=btArrayLit) then
+            begin
+            if IsExternalClass_Name(ToClass,'Array') then
+              // TJSArray([...])
+              exit(cExact);
+            end
           else if (FromResolved.BaseType=btContext) then
           else if (FromResolved.BaseType=btContext) then
             begin
             begin
             FromTypeEl:=FromResolved.LoTypeEl;
             FromTypeEl:=FromResolved.LoTypeEl;
@@ -11912,6 +11918,45 @@ var
     Elements.AddElement.Expr:=LeftJS;
     Elements.AddElement.Expr:=LeftJS;
   end;
   end;
 
 
+  function ConvertJSArrayLit(Param: TPasExpr; const ParamResolved: TPasResolverResult): TJSElement;
+  var
+    ParamExpr: TParamsExpr;
+    ArrayType: TPasArrayType;
+    i: Integer;
+    JS: TJSElement;
+    SubParam: TPasExpr;
+    ArrLit: TJSArrayLiteral;
+  begin
+    Result:=nil;
+    if not (Param is TParamsExpr) then exit;
+    ParamExpr:=TParamsExpr(Param);
+    if ParamExpr.Kind<>pekSet then exit;
+    ArrayType:=aResolver.IsArrayExpr(ParamExpr);
+    if ArrayType<>nil then
+      begin
+      Result:=CreateArrayInit(ArrayType,Param,Param,AContext);
+      exit;
+      end
+    else if ParamResolved.BaseType=btArrayLit then
+      begin
+        ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,Param));
+        try
+          for i:=0 to length(ParamExpr.Params)-1 do
+            begin
+            SubParam:=ParamExpr.Params[i];
+            JS:=ConvertExpression(SubParam,AContext);
+            ArrLit.AddElement(JS);
+            end;
+          Result:=ArrLit;
+        finally
+          if Result=nil then
+            ArrLit.Free;
+        end;
+      end
+    else
+      RaiseNotSupported(El,AContext,20220331114026);
+  end;
+
 var
 var
   Decl: TPasElement;
   Decl: TPasElement;
   Ref: TResolvedReference;
   Ref: TResolvedReference;
@@ -12092,20 +12137,28 @@ begin
         Result:=CreatePrimitiveDotExpr(ArgName,El);
         Result:=CreatePrimitiveDotExpr(ArgName,El);
         exit;
         exit;
         end
         end
-      else if (C=TPasClassType)
-          and aResolver.IsExternalClass_Name(TPasClassType(Decl),'Function') then
+      else if (C=TPasClassType) then
         begin
         begin
-        // TJSFunction(param)
-        if (Param is TPasExpr) and (TPasExpr(Param).OpCode=eopAddress) then
+        if aResolver.IsExternalClass_Name(TPasClassType(Decl),'Function') then
           begin
           begin
-          aResolver.ComputeElement(TUnaryExpr(Param).Operand,ValueResolved,[rcNoImplicitProc]);
-          if (ValueResolved.BaseType=btProc)
-              and (ValueResolved.IdentEl is TPasProcedure) then
+          // TJSFunction(param)
+          if (Param is TPasExpr) and (TPasExpr(Param).OpCode=eopAddress) then
             begin
             begin
-            // TJSFunction(@procname)  -> procname
-            Result:=CreateReferencePathExpr(TPasProcedure(ValueResolved.IdentEl),AContext);
-            exit;
+            aResolver.ComputeElement(TUnaryExpr(Param).Operand,ValueResolved,[rcNoImplicitProc]);
+            if (ValueResolved.BaseType=btProc)
+                and (ValueResolved.IdentEl is TPasProcedure) then
+              begin
+              // TJSFunction(@procname)  -> procname
+              Result:=CreateReferencePathExpr(TPasProcedure(ValueResolved.IdentEl),AContext);
+              exit;
+              end;
             end;
             end;
+          end
+        else if aResolver.IsExternalClass_Name(TPasClassType(Decl),'Array') then
+          begin
+          // TJSArray(param)
+          Result:=ConvertJSArrayLit(Param,ParamResolved);
+          if Result<>nil then exit;
           end;
           end;
         end;
         end;
 
 
@@ -12942,6 +12995,7 @@ begin
       end;
       end;
     end;
     end;
 
 
+  // create set literal
   if length(El.Params)=0 then
   if length(El.Params)=0 then
     Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El))
     Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El))
   else
   else

+ 4 - 1
packages/pastojs/tests/tcmodules.pas

@@ -11807,7 +11807,9 @@ begin
   'begin',
   'begin',
   '  if TJSArray.isArray(65) then ;',
   '  if TJSArray.isArray(65) then ;',
   '  aObj:=TJSArray(a).concat(a);',
   '  aObj:=TJSArray(a).concat(a);',
-  '  o:=TJSObject(a);']);
+  '  o:=TJSObject(a);',
+  '  aObj:=TJSArray([''bird'',''ant'']);',
+  '']);
   ConvertProgram;
   ConvertProgram;
   CheckSource('TestExternalClass_TypeCastArrayToExternalClass',
   CheckSource('TestExternalClass_TypeCastArrayToExternalClass',
     LinesToStr([ // statements
     LinesToStr([ // statements
@@ -11819,6 +11821,7 @@ begin
     'if (Array.isArray(65)) ;',
     'if (Array.isArray(65)) ;',
     '$mod.aObj = $mod.a.concat($mod.a);',
     '$mod.aObj = $mod.a.concat($mod.a);',
     '$mod.o = $mod.a;',
     '$mod.o = $mod.a;',
+    '$mod.aObj = ["bird", "ant"];',
     '']));
     '']));
 end;
 end;