fcl-passrc: resolver adapted for pas2js

git-svn-id: trunk@39985 -
This commit is contained in:
Mattias Gaertner 2018-10-18 19:40:37 +00:00
parent edd72ca6d2
commit d3bdbfe5f2
3 changed files with 340 additions and 112 deletions

File diff suppressed because it is too large Load Diff

View File

@ -3185,18 +3185,22 @@ end;
procedure TTestResolver.TestString_Element; procedure TTestResolver.TestString_Element;
begin begin
StartProgram(false); StartProgram(false);
Add('var'); Add([
Add(' s: string;'); 'var',
Add(' c: char;'); ' s: string;',
Add('begin'); ' c: char;',
Add(' if s[1]=s then ;'); 'begin',
Add(' if s=s[2] then ;'); ' if s[1]=s then ;',
Add(' if s[3+4]=c then ;'); ' if s=s[2] then ;',
Add(' if c=s[5] then ;'); ' if s[3+4]=c then ;',
Add(' c:=s[6];'); ' if c=s[5] then ;',
Add(' s[7]:=c;'); ' c:=s[6];',
Add(' s[8]:=''a'';'); ' s[7]:=c;',
Add(' s[9+1]:=''b'';'); ' s[8]:=''a'';',
' s[9+1]:=''b'';',
' s[10]:='''''''';',
' s[11]:=^g;',
' s[12]:=^H;']);
ParseProgram; ParseProgram;
end; end;

View File

@ -7345,6 +7345,20 @@ var
end; end;
end; end;
procedure ConvCharToInt(var Arg: TJSElement; Param: TPasElement);
begin
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstString) then
begin
// convert char literal to int
ConvertCharLiteralToInt(TJSLiteral(Arg),Param,ArgContext);
end
else
begin
// convert char to int -> Arg.charCodeAt(0)
Arg:=CreateCallCharCodeAt(Arg,0,Param);
end;
end;
procedure ConvertArray(ArrayEl: TPasArrayType); procedure ConvertArray(ArrayEl: TPasArrayType);
var var
BracketEx, Sub: TJSBracketMemberExpression; BracketEx, Sub: TJSBracketMemberExpression;
@ -7455,22 +7469,16 @@ var
end end
else else
Int:=ord(TResEvalString(LowRg).S[1]); Int:=ord(TResEvalString(LowRg).S[1]);
if (Arg is TJSLiteral) and (TJSLiteral(Arg).Value.ValueType=jstString) then ConvCharToInt(Arg,Param);
begin
// convert char literal to int
ConvertCharLiteralToInt(TJSLiteral(Arg),Param,ArgContext);
end
else
begin
// convert char to int -> Arg.charCodeAt(0)
Arg:=CreateCallCharCodeAt(Arg,0,Param);
end;
end; end;
revkUnicodeString: revkUnicodeString:
begin
if length(TResEvalUTF16(LowRg).S)<>1 then if length(TResEvalUTF16(LowRg).S)<>1 then
ArgContext.Resolver.RaiseXExpectedButYFound(20170910213247,'char','string',Param) ArgContext.Resolver.RaiseXExpectedButYFound(20170910213247,'char','string',Param)
else else
Int:=ord(TResEvalUTF16(LowRg).S[1]); Int:=ord(TResEvalUTF16(LowRg).S[1]);
ConvCharToInt(Arg,Param);
end
else else
RaiseNotSupported(Param,ArgContext,20170910170446); RaiseNotSupported(Param,ArgContext,20170910170446);
end; end;