소스 검색

fcl-js: test load srcmap

mattias 6 년 전
부모
커밋
1df109333e

+ 3 - 3
compiler/packages/fcl-js/src/jsbase.pp

@@ -23,11 +23,11 @@ uses
   {$ifdef pas2js}
   js,
   {$endif}
-  Classes, SysUtils;
+  Classes;
 
 const
-  MinSafeIntDouble = -$fffffffffffff-1; // -4503599627370496
-  MaxSafeIntDouble =  $fffffffffffff; //  4503599627370495
+  MinSafeIntDouble = -$1fffffffffffff; // -9007199254740991 53 bits (52 explicitly stored)
+  MaxSafeIntDouble =  $1fffffffffffff; //  9007199254740991
 Type
   TJSType = (jstUNDEFINED,jstNull,jstBoolean,jstNumber,jstString,jstObject,jstReference,jstCompletion);
 

+ 19 - 0
compiler/packages/fcl-js/src/jstree.pp

@@ -439,6 +439,13 @@ Type
     Class function PostFixOperatorToken : tjsToken; override;
   end;
 
+  { TJSUnaryBracketsExpression - e.g. '(A)' }
+
+  TJSUnaryBracketsExpression = Class(TJSUnaryExpression)
+  Public
+    Class function PrefixOperatorToken : tjsToken; override;
+    Class function PostFixOperatorToken : tjsToken; override;
+  end;
 
   { TJSBinary - base class }
 
@@ -1432,6 +1439,18 @@ begin
   Result:=tjsThrow;
 end;
 
+{ TJSUnaryBracketsExpression }
+
+class function TJSUnaryBracketsExpression.PrefixOperatorToken: tjsToken;
+begin
+  Result:=tjsBraceOpen;
+end;
+
+class function TJSUnaryBracketsExpression.PostFixOperatorToken: tjsToken;
+begin
+  Result:=tjsBraceClose;
+end;
+
 { TJSUnaryPostMinusMinusExpression }
 
 Class function TJSUnaryPostMinusMinusExpression.PostFixOperatorToken : tjsToken;

+ 35 - 17
compiler/packages/fcl-js/src/jswriter.pp

@@ -240,7 +240,9 @@ Type
     Property Options : TWriteOptions Read FOptions Write SetOptions;
     Property IndentSize : Byte Read FIndentSize Write FIndentSize;
     Property UseUTF8 : Boolean Read GetUseUTF8;
-    property LastChar: WideChar read FLastChar;
+    Property LastChar: WideChar read FLastChar;
+    Property SkipCurlyBrackets : Boolean read FSkipCurlyBrackets write FSkipCurlyBrackets;
+    Property SkipRoundBrackets : Boolean read FSkipRoundBrackets write FSkipRoundBrackets;
   end;
   EJSWriter = Class(Exception);
 
@@ -801,6 +803,15 @@ begin
             if (Code=0) and (D=AsNumber) then
               S:=S2;
             end;
+          else
+            if s[i-1]='0' then
+              begin
+              // 1.2340E...
+              S2:=LeftStr(S,i-2)+copy(S,i,length(S));
+              val(S2,D,Code);
+              if (Code=0) and (D=AsNumber) then
+                S:=S2;
+              end;
           end;
           end;
         // chomp default exponent E+000
@@ -944,10 +955,14 @@ begin
         and (not (A is TJSSourceElements))
         and (not (A is TJSEmptyBlockStatement))
     then
+      begin
+      if FLastChar<>';' then
+        Write(';');
       if C then
-        Write('; ')
+        Write(' ')
       else
-        Writeln(';');
+        Writeln('');
+      end;
     end;
   Writer.CurElement:=LastEl;
   if C then
@@ -1197,17 +1212,15 @@ begin
     Write(S);
     end;
   WriteJS(El.A);
-  if (S='') then
+  S:=El.PostFixOperator;
+  if (S<>'') then
     begin
-    S:=El.PostFixOperator;
-    if (S<>'') then
-      begin
-      Writer.CurElement:=El;
-      if ((S='-') and (FLastChar='-'))
-          or ((S='+') and (FLastChar='+')) then
-        Write(' ');
-      Write(S);
-      end;
+    Writer.CurElement:=El;
+    case S[1] of
+    '+': if FLastChar='+' then Write(' ');
+    '-': if FLastChar='-' then Write(' ');
+    end;
+    Write(S);
     end;
 end;
 
@@ -1240,10 +1253,12 @@ begin
       begin
       if not (LastEl is TJSStatementList) then
         begin
+        if FLastChar<>';' then
+          Write(';');
         if C then
-          Write('; ')
+          Write(' ')
         else
-          Writeln(';');
+          Writeln('');
         end;
       FSkipCurlyBrackets:=True;
       WriteJS(El.B);
@@ -1252,11 +1267,14 @@ begin
     if (not C) and not (LastEl is TJSStatementList) then
       writeln(';');
     end
-  else if Assigned(El.B) then
+  else if Assigned(El.B) and not IsEmptyStatement(El.B) then
     begin
     WriteJS(El.B);
     if (not C) and not (El.B is TJSStatementList) then
-      writeln(';');
+      if FLastChar=';' then
+        writeln('')
+      else
+        writeln(';');
     end;
   if B then
     begin

+ 61 - 5
compiler/packages/fcl-js/tests/tcsrcmap.pas

@@ -24,6 +24,7 @@ type
     procedure Test_Base64VLQ;
     procedure TestSrcMapIgnoreDuplicate;
     procedure TestSrcMapNames;
+    procedure TestSrcMapLoad;
   end;
 
 implementation
@@ -127,7 +128,9 @@ begin
   try
     sm.AddMapping(1,1,'a.js',2,2,'foo');
     sm.AddMapping(3,3,'a.js',4,4,'foo');
+    {$IFDEF VerboseSrcMap}
     writeln(sm.ToString);
+    {$ENDIF}
     {
       version: 3,
       file: 'generated.js',
@@ -139,33 +142,86 @@ begin
 
     // version
     El:=GetEl(Obj,'version',TJSONIntegerNumber);
-    AssertEquals('json "version" value',El.AsInt64,3);
+    AssertEquals('json "version" value',3,El.AsInt64);
 
     // file
     El:=GetEl(Obj,'file',TJSONString);
-    AssertEquals('json "file" value',El.AsString,'generated.js');
+    AssertEquals('json "file" value','generated.js',El.AsString);
 
     // sources
     Arr:=TJSONArray(GetEl(Obj,'sources',TJSONArray));
     AssertEquals('json "sources".count',Arr.Count,1);
     El:=Arr[0];
     CheckEl('sources[0]',El,TJSONString);
-    AssertEquals('json "sources[0]" value',El.AsString,'a.js');
+    AssertEquals('json "sources[0]" value','a.js',El.AsString);
 
     // names
     Arr:=TJSONArray(GetEl(Obj,'names',TJSONArray));
     AssertEquals('json "names".count',Arr.Count,1);
     El:=Arr[0];
     CheckEl('names[0]',El,TJSONString);
-    AssertEquals('json "names[0]" value',El.AsString,'foo');
+    AssertEquals('json "names[0]" value','foo',El.AsString);
 
     // mappings
     El:=GetEl(Obj,'mappings',TJSONString);
-    AssertEquals('json "mappings" value',El.AsString,'CACEA;;GAEEA');
+    AssertEquals('json "mappings" value','CACEA;;EAEEA',El.AsString);
+
+  finally
+    Obj.Free;
+    sm.Free;
+  end;
+end;
+
+procedure TTestSrcMap.TestSrcMapLoad;
+var
+  sm, sm2: TSourceMap;
+  Obj: TJSONObject;
+  i: Integer;
+begin
+  Obj:=nil;
+  sm2:=nil;
+  sm:=TSourceMap.Create('generated.js');
+  try
+    sm.AddMapping(1,1,'a.js',2,2,'foo');
+    sm.AddMapping(3,3,'a.js',4,4,'foo');
+    {$IFDEF VerboseSrcMap}
+    writeln(sm.ToString);
+    {$ENDIF}
+    {
+      version: 3,
+      file: 'generated.js',
+      sources: ['a.js'],
+      names: ['foo'],
+      mappings: 'CACEA;;GAEEA'
+    }
+    Obj:=sm.ToJSON;
+
+    sm2:=TSourceMap.Create('(not set)');
+    sm2.LoadFromJSON(Obj);
+
+    AssertEquals('same GeneratedFilename',sm.GeneratedFilename,sm2.GeneratedFilename);
+    AssertEquals('same SourceCount',sm.SourceCount,sm2.SourceCount);
+    for i:=0 to sm.SourceCount-1 do
+      AssertEquals('same SourceFiles['+IntToStr(i)+']',sm.SourceFiles[i],sm2.SourceFiles[i]);
+    AssertEquals('same NameCount',sm.NameCount,sm2.NameCount);
+    for i:=0 to sm.NameCount-1 do
+      AssertEquals('same Names['+IntToStr(i)+']',sm.Names[i],sm2.Names[i]);
+    AssertEquals('same Count',sm.Count,sm2.Count);
+    for i:=0 to sm.Count-1 do
+      begin
+      AssertEquals('same Items['+IntToStr(i)+'].Index',sm[i].Index,sm2[i].Index);
+      AssertEquals('same Items['+IntToStr(i)+'].GeneratedLine',sm[i].GeneratedLine,sm2[i].GeneratedLine);
+      AssertEquals('same Items['+IntToStr(i)+'].GeneratedColumn',sm[i].GeneratedColumn,sm2[i].GeneratedColumn);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcFileIndex',sm[i].SrcFileIndex,sm2[i].SrcFileIndex);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcLine',sm[i].SrcLine,sm2[i].SrcLine);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcColumn',sm[i].SrcColumn,sm2[i].SrcColumn);
+      AssertEquals('same Items['+IntToStr(i)+'].NameIndex',sm[i].NameIndex,sm2[i].NameIndex);
+      end;
 
   finally
     Obj.Free;
     sm.Free;
+    sm2:=nil;
   end;
 end;
 

+ 12 - 5
compiler/packages/fcl-js/tests/testjs.lpi

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
   <ProjectOptions>
-    <Version Value="10"/>
+    <Version Value="11"/>
     <General>
       <SessionStorage Value="InProjectDir"/>
       <MainUnit Value="0"/>
@@ -14,9 +14,10 @@
       <Version Value="2"/>
     </PublishOptions>
     <RunParams>
-      <local>
-        <FormatVersion Value="1"/>
-      </local>
+      <FormatVersion Value="2"/>
+      <Modes Count="1">
+        <Mode0 Name="default"/>
+      </Modes>
     </RunParams>
     <RequiredPackages Count="1">
       <Item1>
@@ -85,7 +86,7 @@
     <Version Value="11"/>
     <SearchPaths>
       <IncludeFiles Value="$(ProjOutDir)"/>
-      <OtherUnitFiles Value="../src"/>
+      <OtherUnitFiles Value="../../fcl-json/src;../src"/>
     </SearchPaths>
     <CodeGeneration>
       <Checks>
@@ -99,6 +100,12 @@
         <OptimizationLevel Value="0"/>
       </Optimizations>
     </CodeGeneration>
+    <Other>
+      <CustomOptions Value="-dVerboseSrcMap"/>
+      <OtherDefines Count="1">
+        <Define0 Value="VerboseSrcMap"/>
+      </OtherDefines>
+    </Other>
   </CompilerOptions>
   <Debugging>
     <Exceptions Count="3">

+ 0 - 4
compiler/packages/fcl-js/tests/testjs.lpr

@@ -12,10 +12,6 @@ uses
 var
   Application: TTestRunner;
 
-{$IFDEF WINDOWS}{$R testjs.rc}{$ENDIF}
-
-{$R *.res}
-
 begin
   DefaultFormat:=fplain;
   DefaultRunAllTests:=True;