Browse Source

* Patch from Mattias gaertner to write less empty lines

git-svn-id: trunk@35577 -
michael 8 years ago
parent
commit
7b38e90513
2 changed files with 169 additions and 48 deletions
  1. 27 11
      packages/fcl-js/src/jswriter.pp
  2. 142 37
      packages/fcl-js/tests/tcwriter.pp

+ 27 - 11
packages/fcl-js/src/jswriter.pp

@@ -880,6 +880,12 @@ begin
       end;
     if (not C) and not (LastEl is TJSStatementList) then
       writeln(';');
+    end
+  else if Assigned(El.B) then
+    begin
+    WriteJS(El.B);
+    if (not C) and not (El.B is TJSStatementList) then
+      writeln(';');
     end;
   if B then
     begin
@@ -997,8 +1003,6 @@ begin
     begin
     if (El.BTrue=nil) or (El.BTrue is TJSEmptyStatement) then
       Writeln('{}')
-    else if not (El.BTrue is TJSStatementList) then
-      Writeln('')
     else
       Write(' ');
     Write('else ');
@@ -1117,28 +1121,37 @@ begin
       WriteJS(EC.Expr);
       FSkipRoundBrackets:=false;
       end;
-    If C then
-      Write(': ')
-    else
-      Writeln(':');
     if Assigned(EC.Body) then
       begin
       FSkipCurlyBrackets:=true;
+      If C then
+        Write(': ')
+      else
+        Writeln(':');
       Indent;
       WriteJS(EC.Body);
       Undent;
-      if Not ((EC.Body is TJSStatementList) or (EC.Body is TJSEmptyBlockStatement)) then
+      if ((EC.Body is TJSStatementList) or (EC.Body is TJSEmptyBlockStatement)) then
+        begin
         if C then
-          Write('; ')
+          begin
+          if I<El.Cases.Count-1 then
+            Write(' ');
+          end
         else
-          Writeln(';');
+          Writeln('');
+        end
+      else if C then
+        Write('; ')
+      else
+        Writeln(';');
       end
     else
       begin
       if C then
-        Write('; ')
+        Write(': ')
       else
-        Writeln(';');
+        Writeln(':');
       end;
     end;
   Write('}');
@@ -1217,6 +1230,7 @@ begin
   FSkipCurlyBrackets:=True;
   Indent;
   WriteJS(El.Block);
+  if Not C then writeln('');
   Undent;
   Write('}');
   If (El is TJSTryCatchFinallyStatement) or (El is TJSTryCatchStatement) then
@@ -1231,6 +1245,7 @@ begin
     Indent;
     WriteJS(El.BCatch);
     Undent;
+    if Not C then writeln('');
     Write('}');
     end;
   If (El is TJSTryCatchFinallyStatement) or (El is TJSTryFinallyStatement) then
@@ -1243,6 +1258,7 @@ begin
     FSkipCurlyBrackets:=True;
     WriteJS(El.BFinally);
     Undent;
+    if Not C then writeln('');
     Write('}');
     end;
 end;

+ 142 - 37
packages/fcl-js/tests/tcwriter.pp

@@ -84,6 +84,8 @@ type
   Public
     Procedure TestAssignment(Const Msg : String; AClass : TJSAssignStatementClass; Result : String;ACompact : Boolean);
     Function CreateAssignment(AClass : TJSAssignStatementClass) : TJSAssignStatement;
+    Function CreateStatementListOneElement : TJSStatementList;
+    Function CreateStatementListTwoElement2 : TJSStatementList;
   published
     Procedure TestEmptyStatement;
     Procedure TestEmptyStatementComment;
@@ -130,6 +132,7 @@ type
     Procedure TestAssignmentStatementBinaryAndCompact;
     Procedure TestForStatementEmpty;
     Procedure TestForStatementFull;
+    Procedure TestForStatementFull1;
     Procedure TestForStatementCompact;
     Procedure TestForInStatement;
     Procedure TestWhileStatement;
@@ -152,6 +155,7 @@ type
     Procedure TestStatementListOneStatementCompact;
     Procedure TestStatementListTwoStatements;
     Procedure TestStatementListTwoStatementsCompact;
+    Procedure TestStatementListFor;
     Procedure TestEmptyFunctionDef;
     Procedure TestEmptyFunctionDefCompact;
     Procedure TestFunctionDefParams;
@@ -628,7 +632,7 @@ begin
   U.Args:=TJSArguments.Create(0,0);
   U.Args.Elements.AddElement;
   U.Args.Elements[0].Expr:=CreateLiteral(123);
-  AssertWrite('member b of object a (a[b])','new a('+slinebreak+'123'+sLineBreak+')',U);
+  AssertWrite('member b of object a (a[b])','new a(123)',U);
 end;
 
 Procedure TTestExpressionWriter.TestNewMemberCompact;
@@ -666,7 +670,8 @@ begin
   U.Args:=TJSArguments.Create(0,0);
   U.Args.Elements.AddElement;
   U.Args.Elements[0].Expr:=CreateLiteral(123);
-  AssertWrite('call a(123)','a('+slinebreak+'123'+sLineBreak+')',U);
+  AssertWrite('call a(123)',
+     'a(123)',U);
 end;
 
 Procedure TTestExpressionWriter.TestCallCompact;
@@ -696,7 +701,7 @@ begin
   U.Args.Elements[0].Expr:=CreateLiteral(123);
   U.Args.Elements.AddElement;
   U.Args.Elements[1].Expr:=CreateLiteral(456);
-  AssertWrite('call a(123,456)','a(123, 456)',U);
+  AssertWrite('call a(123,456)','a(123,456)',U);
 
 end;
 
@@ -767,6 +772,19 @@ begin
   Result.Expr:=CreateIdent('b');
 end;
 
+function TTestStatementWriter.CreateStatementListOneElement: TJSStatementList;
+begin
+  Result:=TJSStatementList.Create(0,0);
+  Result.A:=CreateAssignment(nil);
+end;
+
+function TTestStatementWriter.CreateStatementListTwoElement2: TJSStatementList;
+begin
+  Result:=TJSStatementList.Create(0,0);
+  Result.A:=CreateAssignment(nil);
+  Result.B:=CreateAssignment(nil);
+end;
+
 Procedure TTestStatementWriter.TestEmptyStatement;
 
 begin
@@ -1120,7 +1138,6 @@ end;
 
 Procedure TTestStatementWriter.TestForStatementFull;
 
-
 Var
   S : TJSForStatement;
   UPP : TJSUnaryPostPlusPlusExpression;
@@ -1141,7 +1158,35 @@ begin
   S.Incr:=UPP;
   S.Cond:=CL;
   S.Body:=TJSEmptyBlockStatement.Create(0,0);
-  AssertWrite('for i:=0 to 9','for (i = 0; (i < 10); i++) {'+sLineBreak+'}',S);
+  AssertWrite('for i:=0 to 9','for (i = 0; i < 10; i++) {'+sLineBreak+'}',S);
+end;
+
+procedure TTestStatementWriter.TestForStatementFull1;
+
+Var
+  S : TJSForStatement;
+  UPP : TJSUnaryPostPlusPlusExpression;
+  CL : TJSRelationalExpressionLT;
+  sa : TJSSimpleAssignStatement;
+
+begin
+  SA:=TJSSimpleAssignStatement.Create(0,0);
+  SA.LHS:=CreateIdent('i');
+  SA.Expr:=CreateLiteral(0);
+  UPP:=TJSUnaryPostPlusPlusExpression.Create(0,0);
+  UPP.A:=CreateIdent('i');
+  CL:=TJSRelationalExpressionLT.Create(0,0);
+  CL.A:=CreateIdent('i');
+  CL.B:=CreateLiteral(10);
+  S:=TJSForStatement.Create(0,0);
+  S.Init:=SA;
+  S.Incr:=UPP;
+  S.Cond:=CL;
+  S.Body:=CreateStatementListOneElement;
+  AssertWrite('for i:=0 to 9',
+     'for (i = 0; i < 10; i++) {'+sLineBreak
+    +'a = b;'+sLineBreak
+    +'}',S);
 end;
 
 Procedure TTestStatementWriter.TestForStatementCompact;
@@ -1166,7 +1211,7 @@ begin
   S.Cond:=CL;
   S.Body:=TJSEmptyBlockStatement.Create(0,0);
   Writer.Options:=[woCompact,woUseUTF8];
-  AssertWrite('for i:=0 to 9','for (i=0; (i<10); i++) {}',S);
+  AssertWrite('for i:=0 to 9','for (i=0; i<10; i++) {}',S);
 end;
 
 Procedure TTestStatementWriter.TestForInStatement;
@@ -1288,7 +1333,7 @@ begin
   C:=S.Cases.AddCase;
   C.Body:=TJSEmptyBlockStatement.Create(0,0);;
   C.Expr:=CreateIdent('d');
-  AssertWrite('switch ','switch (a) {case c: {}case d: {}}',S);
+  AssertWrite('switch ','switch (a) {case c: {} case d: {}}',S);
 end;
 
 Procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefault;
@@ -1327,7 +1372,7 @@ begin
   C:=S.Cases.AddCase;
   C.Body:=TJSEmptyBlockStatement.Create(0,0);;
   S.TheDefault:=C;
-  AssertWrite('switch ','switch (a) {case c: {}case d: {}default: {}}',S);
+  AssertWrite('switch ','switch (a) {case c: {} case d: {} default: {}}',S);
 end;
 
 Procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmpty;
@@ -1345,7 +1390,16 @@ begin
   C:=S.Cases.AddCase;
   C.Body:=TJSEmptyBlockStatement.Create(0,0);;
   S.TheDefault:=C;
-  AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'case d:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'default:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
+  AssertWrite('switch ',
+     'switch (a) {'+sLineBreak
+    +'case c:'+sLineBreak
+    +'case d:'+sLineBreak
+    +'{'+sLineBreak
+    +'}'+sLineBreak
+    +'default:'+sLineBreak
+    +'{'+sLineBreak
+    +'}'+sLineBreak
+    +'}',S);
 end;
 
 Procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmptyCompact;
@@ -1364,7 +1418,7 @@ begin
   C:=S.Cases.AddCase;
   C.Body:=TJSEmptyBlockStatement.Create(0,0);;
   S.TheDefault:=C;
-  AssertWrite('switch ','switch (a) {case c: case d: {}default: {}}',S);
+  AssertWrite('switch ','switch (a) {case c: case d: {} default: {}}',S);
 end;
 
 Procedure TTestStatementWriter.TestIfThen;
@@ -1389,7 +1443,10 @@ begin
   S.Cond:=CreateIdent('a');
   S.btrue:=TJSEmptyBlockStatement.Create(0,0);
   S.bfalse:=TJSEmptyBlockStatement.Create(0,0);
-  AssertWrite('if then','if (a) {'+sLineBreak+'} else {'+sLineBreak+'}',S);
+  AssertWrite('if then',
+     'if (a) {'+sLineBreak
+    +'} else {'+sLineBreak
+    +'}',S);
 end;
 
 Procedure TTestStatementWriter.TestStatementListEmpty;
@@ -1415,12 +1472,14 @@ end;
 Procedure TTestStatementWriter.TestStatementListOneStatement;
 Var
   S : TJSStatementList;
-
 begin
 //  Writer.Options:=[woCompact,woUseUTF8];
   S:=TJSStatementList.Create(0,0);
   S.A:=CreateAssignment(nil);
-  AssertWrite('Statement list','{'+sLineBreak+'a = b;'+sLineBreak+'}',S);
+  AssertWrite('Statement list',
+     '{'+sLineBreak
+    +'a = b;'+sLineBreak
+    +'}',S);
 end;
 
 Procedure TTestStatementWriter.TestStatementListOneStatementCompact;
@@ -1444,7 +1503,11 @@ begin
   S:=TJSStatementList.Create(0,0);
   S.A:=CreateAssignment(nil);
   S.B:=CreateAssignment(nil);
-  AssertWrite('Statement list','{'+sLineBreak+'a = b;'+sLineBreak+'a = b;'+sLineBreak+'}',S);
+  AssertWrite('Statement list',
+     '{'+sLineBreak
+    +'a = b;'+sLineBreak
+    +'a = b;'+sLineBreak
+    +'}',S);
 end;
 
 Procedure TTestStatementWriter.TestStatementListTwoStatementsCompact;
@@ -1459,6 +1522,21 @@ begin
   AssertWrite('Statement list','{a=b; a=b}',S);
 end;
 
+procedure TTestStatementWriter.TestStatementListFor;
+Var
+  S : TJSStatementList;
+begin
+  // Writer.Options:=[woCompact,woUseUTF8];
+  S:=TJSStatementList.Create(0,0);
+  S.A:=TJSForStatement.Create(0,0);
+  TJSForStatement(S.A).Body:=TJSEmptyBlockStatement.Create(0,0);
+  AssertWrite('Statement list',
+     '{'+sLineBreak
+    +'for (; ; ) {'+sLineBreak
+    +'};'+sLineBreak
+    +'}',S);
+end;
+
 Procedure TTestStatementWriter.TestEmptyFunctionDef;
 
 Var
@@ -1468,7 +1546,9 @@ begin
   FD:=TJSFunctionDeclarationStatement.Create(0,0);
   FD.AFunction:=TJSFuncDef.Create;
   FD.AFunction.Name:='a';
-  AssertWrite('Empty function','function a() {'+sLineBreak+'}',FD);
+  AssertWrite('Empty function',
+     'function a() {'+sLineBreak
+    +'}',FD);
 end;
 
 Procedure TTestStatementWriter.TestEmptyFunctionDefCompact;
@@ -1497,7 +1577,9 @@ begin
   FD.AFunction.Params.Add('c');
   FD.AFunction.Params.Add('d');
 
-  AssertWrite('Empty function, 3 params','function a(b, c, d) {'+sLineBreak+'}',FD);
+  AssertWrite('Empty function, 3 params',
+     'function a(b, c, d) {'+sLineBreak
+    +'}',FD);
 end;
 
 Procedure TTestStatementWriter.TestFunctionDefParamsCompact;
@@ -1532,7 +1614,10 @@ begin
   R:=TJSReturnStatement.Create(0,0);
   R.Expr:=CreateLiteral(0);
   FD.AFunction.Body.A:=R;
-  AssertWrite('1 statement, ','function a() {'+sLineBreak+'  return 0;'+sLineBreak+'}',FD);
+  AssertWrite('1 statement, ',
+     'function a() {'+sLineBreak
+    +'  return 0;'+sLineBreak
+    +'}',FD);
 end;
 
 Procedure TTestStatementWriter.TestFunctionDefBody1Compact;
@@ -1581,7 +1666,11 @@ begin
   L.A:=A;
   L.B:=R;
   FD.AFunction.Body.A:=L;
-  AssertWrite('Function, 2 statements','function a(b) {'+sLineBreak+'  b = (b * 10);'+sLineBreak+'  return b;'+sLineBreak+'}',FD);
+  AssertWrite('Function, 2 statements',
+     'function a(b) {'+sLineBreak
+    +'  b = b * 10;'+sLineBreak
+    +'  return b;'+sLineBreak
+    +'}',FD);
 end;
 
 Procedure TTestStatementWriter.TestFunctionDefBody2Compact;
@@ -1612,7 +1701,7 @@ begin
   L.A:=A;
   L.B:=R;
   FD.AFunction.Body.A:=L;
-  AssertWrite('Function, 2 statements, compact','function a(b) {b=(b*10); return b}',FD);
+  AssertWrite('Function, 2 statements, compact','function a(b) {b=b*10; return b}',FD);
 end;
 
 Procedure TTestStatementWriter.TestTryCatch;
@@ -1637,7 +1726,12 @@ begin
   A.LHS:=CreateIdent('b');
   A.Expr:=CreateLiteral(1);
   T.BCatch:=A;
-  AssertWrite('Try catch','try {'+sLineBreak+'  b = (b * 10)'+sLineBreak+'}'+sLineBreak+'catch (e) {'+sLineBreak+'  b = 1'+sLineBreak+'}'+sLineBreak,T);
+  AssertWrite('Try catch',
+     'try {'+sLineBreak
+    +'  b = b * 10'+sLineBreak
+    +'} catch (e) {'+sLineBreak
+    +'  b = 1'+sLineBreak
+    +'}',T);
 end;
 
 Procedure TTestStatementWriter.TestTryCatchCompact;
@@ -1662,7 +1756,7 @@ begin
   A.LHS:=CreateIdent('b');
   A.Expr:=CreateLiteral(1);
   T.BCatch:=A;
-  AssertWrite('Try catch compact','try {b=(b*10)} catch (e) {b=1}',T);
+  AssertWrite('Try catch compact','try {b=b*10} catch (e) {b=1}',T);
 end;
 
 Procedure TTestStatementWriter.TestTryFinally;
@@ -1687,7 +1781,12 @@ begin
   A.LHS:=CreateIdent('b');
   A.Expr:=CreateLiteral(1);
   T.BFinally:=A;
-  AssertWrite('Try finally ','try {'+sLineBreak+'  b = (b * 10)'+sLineBreak+'}'+sLineBreak+'finally {'+sLineBreak+'  b = 1'+sLineBreak+'}'+sLineBreak,T);
+  AssertWrite('Try finally ',
+    'try {'+sLineBreak
+   +'  b = b * 10'+sLineBreak
+   +'} finally {'+sLineBreak
+   +'  b = 1'+sLineBreak
+   +'}',T);
 end;
 
 Procedure TTestStatementWriter.TestTryFinallyCompact;
@@ -1713,7 +1812,7 @@ begin
   A.LHS:=CreateIdent('b');
   A.Expr:=CreateLiteral(1);
   T.BFinally:=A;
-  AssertWrite('Try finally compact','try {b=(b*10)} finally {b=1}',T);
+  AssertWrite('Try finally compact','try {b=b*10} finally {b=1}',T);
 end;
 
 Procedure TTestStatementWriter.TestTryCatchFinally;
@@ -1741,7 +1840,13 @@ begin
   A.LHS:=CreateIdent('b');
   A.Expr:=CreateLiteral(1);
   T.BFinally:=A;
-  AssertWrite('Try finally ','try {'+sLineBreak+'  b = (b * 10)'+sLineBreak+'}'+sLineBreak+'catch (e) {'+sLineBreak+'  b = 10'+sLineBreak+'}'+sLineBreak+'finally {'+sLineBreak+'  b = 1'+sLineBreak+'}'+sLineBreak,T);
+  AssertWrite('Try finally ',
+     'try {'+sLineBreak
+    +'  b = b * 10'+sLineBreak
+    +'} catch (e) {'+sLineBreak
+    +'  b = 10'+sLineBreak
+    +'} finally {'+sLineBreak
+    +'  b = 1'+sLineBreak+'}',T);
 end;
 
 Procedure TTestStatementWriter.TestTryCatchFinallyCompact;
@@ -1770,7 +1875,7 @@ begin
   A.LHS:=CreateIdent('b');
   A.Expr:=CreateLiteral(1);
   T.BFinally:=A;
-  AssertWrite('Try finally ','try {b=(b*10)} catch (e) {b=10} finally {b=1}',T);
+  AssertWrite('Try finally ','try {b=b*10} catch (e) {b=10} finally {b=1}',T);
 end;
 
 Procedure TTestStatementWriter.TestWith;
@@ -1791,7 +1896,7 @@ begin
   M.B:=CreateLiteral(10);
   A.Expr:=M;
   T.B:=A;
-  AssertWrite('With statement ','with (e)'+slineBreak+'  b = (b * 10)',T);
+  AssertWrite('With statement ','with (e)'+slineBreak+'  b = b * 10',T);
 end;
 
 Procedure TTestStatementWriter.TestWithCompact;
@@ -1812,7 +1917,7 @@ begin
   M.B:=CreateLiteral(10);
   A.Expr:=M;
   T.B:=A;
-  AssertWrite('With statement ','with (e) b=(b*10)',T);
+  AssertWrite('With statement ','with (e) b=b*10',T);
 end;
 
 Procedure TTestStatementWriter.TestSourceElements;
@@ -1839,7 +1944,7 @@ begin
   M.B:=CreateLiteral(2);
   A.Expr:=M;
   T.Statements.AddNode.Node:=A;
-  AssertWrite('Statement lists ','b = (b * 10);'+sLineBreak+'c = (c * 2);'+sLineBreak,T);
+  AssertWrite('Statement lists ','b = b * 10;'+sLineBreak+'c = c * 2;'+sLineBreak,T);
 end;
 
 Procedure TTestStatementWriter.TestSourceElementsCompact;
@@ -1866,7 +1971,7 @@ begin
   M.B:=CreateLiteral(2);
   A.Expr:=M;
   T.Statements.AddNode.Node:=A;
-  AssertWrite('Statement lists compact','b=(b*10); c=(c*2);',T);
+  AssertWrite('Statement lists compact','b=b*10; c=c*2;',T);
 end;
 
 { ---------------------------------------------------------------------
@@ -1931,7 +2036,7 @@ Var
 begin
   L:=TJSLiteral.Create(0,0,'');
   L.Value.AsString:='ab"cd';
-  AssertWrite('ab"cd','"ab\"cd"',L);
+  AssertWrite('ab"cd','''ab"cd''',L);
 end;
 
 Procedure TTestLiteralWriter.TestStringBackslash;
@@ -2027,7 +2132,7 @@ begin
   I:=TJSLiteral.Create(0,0);
   I.Value.AsNumber:=1;
   L.Elements.AddElement.Expr:=I;
-  AssertWrite('Empty array ','['+sLineBreak+'1'+sLineBreak+']',L);
+  AssertWrite('Empty array ','[1]',L);
 end;
 
 Procedure TTestLiteralWriter.TestArrayOneElementCompact;
@@ -2056,7 +2161,7 @@ begin
   I:=TJSLiteral.Create(0,0);
   I.Value.AsNumber:=1;
   L.Elements.AddElement.Expr:=I;
-  AssertWrite('Empty array ','['+sLineBreak+'  1'+sLineBreak+']',L);
+  AssertWrite('Empty array ','[1]',L);
 end;
 
 Procedure TTestLiteralWriter.TestArrayTwoElements;
@@ -2073,7 +2178,7 @@ begin
   I:=TJSLiteral.Create(0,0);
   I.Value.AsNumber:=2;
   L.Elements.AddElement.Expr:=I;
-  AssertWrite('Empty array ','['+sLineBreak+'1,'+sLineBreak+'2'+sLineBreak+']',L);
+  AssertWrite('Empty array ','[1, 2]',L);
 end;
 
 Procedure TTestLiteralWriter.TestArrayTwoElementsCompact;
@@ -2090,7 +2195,7 @@ begin
   I:=TJSLiteral.Create(0,0);
   I.Value.AsNumber:=2;
   L.Elements.AddElement.Expr:=I;
-  AssertWrite('Empty array ','[1, 2]',L);
+  AssertWrite('Empty array ','[1,2]',L);
 end;
 
 Procedure TTestLiteralWriter.TestArrayTwoElementsCompact2;
@@ -2107,7 +2212,7 @@ begin
   I:=TJSLiteral.Create(0,0);
   I.Value.AsNumber:=2;
   L.Elements.AddElement.Expr:=I;
-  AssertWrite('Empty array ','[1, 2]',L);
+  AssertWrite('Empty array ','[1,2]',L);
 end;
 
 Procedure TTestLiteralWriter.TestArrayThreeElementsCompact;
@@ -2127,7 +2232,7 @@ begin
   I:=TJSLiteral.Create(0,0);
   I.Value.AsNumber:=3;
   L.Elements.AddElement.Expr:=I;
-  AssertWrite('Empty array ','[1, 2, 3]',L);
+  AssertWrite('Empty array ','[1,2,3]',L);
 end;
 
 Procedure TTestLiteralWriter.TestObjectEmpty;
@@ -2372,7 +2477,7 @@ Var
   S : UnicodeString;
 begin
   S:=FTextWriter.AsUnicodeString;
-  AssertEquals(Msg,Result,S);
+  AssertEquals(Msg,String(Result),String(S));
 end;
 
 Procedure TTestJSWriter.AssertWrite(Const Msg, Result: String;