pastojs: concat(string1,string2,...)

git-svn-id: trunk@40597 -
This commit is contained in:
Mattias Gaertner 2018-12-19 23:18:04 +00:00
parent ee61fc2102
commit e108d9c5eb
3 changed files with 44 additions and 3 deletions

View File

@ -1765,6 +1765,7 @@ type
Function ConvertBuiltIn_WriteStr(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
Function ConvertBuiltIn_Val(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
Function ConvertBuiltIn_ConcatArray(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
Function ConvertBuiltIn_ConcatString(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
Function ConvertBuiltIn_CopyArray(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
Function ConvertBuiltIn_InsertArray(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
Function ConvertBuiltIn_DeleteArray(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
@ -3989,7 +3990,7 @@ begin
if RHS.IdentEl.ClassType=TPasClassType then
Result:=cJSValueConversion; // RHS is a class type
end;
end
end;
end;
end
else if (LHS.BaseType=btContext) then
@ -8522,6 +8523,7 @@ begin
bfWriteStr: Result:=ConvertBuiltIn_WriteStr(El,AContext);
bfVal: Result:=ConvertBuiltIn_Val(El,AContext);
bfConcatArray: Result:=ConvertBuiltIn_ConcatArray(El,AContext);
bfConcatString: Result:=ConvertBuiltIn_ConcatString(El,AContext);
bfCopyArray: Result:=ConvertBuiltIn_CopyArray(El,AContext);
bfInsertArray: Result:=ConvertBuiltIn_InsertArray(El,AContext);
bfDeleteArray: Result:=ConvertBuiltIn_DeleteArray(El,AContext);
@ -10743,6 +10745,40 @@ begin
end;
end;
function TPasToJSConverter.ConvertBuiltIn_ConcatString(El: TParamsExpr;
AContext: TConvertContext): TJSElement;
var
Params: TPasExprArray;
A: TJSElement;
Call: TJSCallExpression;
i: Integer;
DotEx: TJSDotMemberExpression;
begin
Params:=El.Params;
if Length(Params)=1 then
// concat(a) -> a
Result:=ConvertElement(Params[0],AContext)
else
begin
// concat(a,b,c) -> a.concat(b,c)
Result:=nil;
A:=ConvertElement(Params[0],AContext); // beware: might fail
Call:=CreateCallExpression(El);
try
DotEx:=TJSDotMemberExpression(CreateElement(TJSDotMemberExpression,Params[0]));
DotEx.MExpr:=A;
DotEx.Name:='concat';
Call.Expr:=DotEx;
for i:=1 to length(Params)-1 do
Call.AddArg(ConvertElement(Params[i],AContext));
Result:=Call;
finally
if Result=nil then
Call.Free;
end;
end;
end;
function TPasToJSConverter.ConvertBuiltIn_CopyArray(El: TParamsExpr;
AContext: TConvertContext): TJSElement;
var

View File

@ -6379,6 +6379,8 @@ begin
' s:=#$20AC;', // euro
' s:=#$10437;', // outside BMP
' s:=default(string);',
' s:=concat(s);',
' s:=concat(s,''a'',s)',
'']);
ConvertProgram;
CheckSource('TestStringConst',
@ -6395,8 +6397,10 @@ begin
'$mod.s=''"\''"'';',
'$mod.s="€";',
'$mod.s="'#$F0#$90#$90#$B7'";',
'$mod.s="";'
]));
'$mod.s="";',
'$mod.s = $mod.s;',
'$mod.s = $mod.s.concat("a", $mod.s);',
'']));
end;
procedure TTestModule.TestStringConstSurrogate;

View File

@ -2940,6 +2940,7 @@ End.
<li>Intrinsic procedure WriteStr(out s: string; params...)</li>
<li><i>Debugger;</i> converts to <i>debugger;</i>. If a debugger is running
it will break on this line just like a break point.</li>
<li><i>concat(string1,string2,...)</i> since 1.3</li>
</ul>
</div>