Browse Source

fcl-passrc: resolver adapted for pas2js

git-svn-id: trunk@39985 -
Mattias Gaertner 6 years ago
parent
commit
d3bdbfe5f2

File diff suppressed because it is too large
+ 249 - 76
packages/fcl-passrc/src/pasresolver.pp


+ 16 - 12
packages/fcl-passrc/tests/tcresolver.pas

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

+ 18 - 10
packages/pastojs/src/fppas2js.pp

@@ -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
-                  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;
+                ConvCharToInt(Arg,Param);
                 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;

Some files were not shown because too many files changed in this diff