pas2js: ArrayOfChar:=String, pass string to ArrayOfChar

git-svn-id: trunk@45321 -
This commit is contained in:
Mattias Gaertner 2020-05-09 20:14:21 +00:00
parent a316229ef6
commit 042ad497d3
2 changed files with 57 additions and 12 deletions

View File

@ -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

View File

@ -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;