Browse Source

pas2js: ArrayOfChar:=String, pass string to ArrayOfChar

git-svn-id: trunk@45321 -
Mattias Gaertner 5 years ago
parent
commit
042ad497d3
2 changed files with 57 additions and 12 deletions
  1. 37 3
      packages/pastojs/src/fppas2js.pp
  2. 20 9
      packages/pastojs/tests/tcmodules.pas

+ 37 - 3
packages/pastojs/src/fppas2js.pp

@@ -1890,6 +1890,7 @@ type
       AssignContext: TAssignContext; PosEl: TPasElement): TJSCallExpression; virtual;
     Function AppendPropertyReadArgs(Call: TJSCallExpression; Prop: TPasProperty;
       aContext: TConvertContext; PosEl: TPasElement): TJSCallExpression; virtual;
+    Function CreateDotSplit(El: TPasElement; Expr: TJSElement): TJSElement; virtual;
     Function CreatePrecompiledJS(El: TJSElement): string; virtual;
     Function CreateRaisePropReadOnly(PosEl: TPasElement): TJSElement; virtual;
     Procedure AddRTLVersionCheck(FuncContext: TFunctionContext; PosEl: TPasElement);
@@ -17427,6 +17428,21 @@ begin
   Result:=Call;
 end;
 
+function TPasToJSConverter.CreateDotSplit(El: TPasElement; Expr: TJSElement
+  ): TJSElement;
+var
+  DotExpr: TJSDotMemberExpression;
+  Call: TJSCallExpression;
+begin
+  Call:=CreateCallExpression(El);
+  DotExpr:=TJSDotMemberExpression(CreateElement(TJSDotMemberExpression,El));
+  Call.Expr:=DotExpr;
+  DotExpr.MExpr:=Expr;
+  DotExpr.Name:='split';
+  Call.AddArg(CreateLiteralJSString(El,''));
+  Result:=Call;
+end;
+
 function TPasToJSConverter.CreatePrecompiledJS(El: TJSElement): string;
 var
   aWriter: TBufferWriter;
@@ -19812,6 +19828,17 @@ begin
       // e.g. double := currency  ->  double := currency/10000
       AssignContext.RightSide:=CreateDivideNumber(El,AssignContext.RightSide,10000);
       end
+    else if AssignContext.RightResolved.BaseType in btAllStringAndChars then
+      begin
+      if AssignContext.LeftResolved.BaseType=btContext then
+        begin
+        if AssignContext.LeftResolved.LoTypeEl is TPasArrayType then
+          begin
+          // AnArray:=aString  -> AnArray:=aString.split("")
+          AssignContext.RightSide:=CreateDotSplit(El.right,AssignContext.RightSide);
+          end;
+        end;
+      end
     else if AssignContext.RightResolved.BaseType=btContext then
       begin
       RightTypeEl:=AssignContext.RightResolved.LoTypeEl;
@@ -22689,14 +22716,21 @@ begin
 
     if ArgTypeIsArray then
       begin
+      // array as argument
       if ExprResolved.BaseType=btNil then
         begin
         // nil to array ->  pass []
         Result:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,El));
         exit;
-        end;
-      // array as argument
-      Result:=CreateArrayInit(TPasArrayType(ArgTypeEl),El,El,AContext);
+        end
+      else if ExprResolved.BaseType in btAllStringAndChars then
+        begin
+        // pass string to an array
+        Result:=ConvertExpression(El,AContext);
+        Result:=CreateDotSplit(El,Result);
+        end
+      else
+        Result:=CreateArrayInit(TPasArrayType(ArgTypeEl),El,El,AContext);
       end;
 
     if Result=nil then

+ 20 - 9
packages/pastojs/tests/tcmodules.pas

@@ -9510,8 +9510,6 @@ end;
 
 procedure TTestModule.TestArray_ArrayOfCharAssignString;
 begin
-  exit; // todo
-
   StartProgram(false);
   Add([
   'type TArr = array of char;',
@@ -9522,21 +9520,34 @@ begin
   'procedure Run(const a: array of char);',
   'begin',
   '  Run(c);',
-  //'  Run(s);',
+  '  Run(s);',
   'end;',
   'begin',
-  //'  a:=c;',
-  //'  a:=s;',
-  //'  a:=#13;',
-  //'  a:=''Foo'';',
-  //'  Run(c);',
-  //'  Run(s);',
+  '  a:=c;',
+  '  a:=s;',
+  '  a:=#13;',
+  '  a:=''Foo'';',
+  '  Run(c);',
+  '  Run(s);',
   '']);
   ConvertProgram;
   CheckSource('TestArray_ArrayOfCharAssignString',
     LinesToStr([ // statements
+    'this.c = "";',
+    'this.s = "";',
+    'this.a = [];',
+    'this.Run = function (a) {',
+    '  $mod.Run($mod.c.split(""));',
+    '  $mod.Run($mod.s.split(""));',
+    '};',
     '']),
     LinesToStr([
+    '$mod.a = $mod.c.split("");',
+    '$mod.a = $mod.s.split("");',
+    '$mod.a = "\r".split("");',
+    '$mod.a = "Foo".split("");',
+    '$mod.Run($mod.c.split(""));',
+    '$mod.Run($mod.s.split(""));',
     '']));
 end;