diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 4bf8ff4291..e54a4f2619 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/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 diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index 77aa42a461..2fa817f5f9 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/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;