From b1752fb4ce5e261f09d036fac62e0fd669d6e607 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Sun, 30 Dec 2018 09:39:46 +0000 Subject: [PATCH] fcl-js: omit brackets on associative operations (a||b)||(c||d), (a&&b)&&(c&&d), (a|b)|c, (a&b)&c, (a^b)^c, (a+b)+c, (a-b)-c, (a*b)*c git-svn-id: trunk@40707 - --- packages/fcl-js/src/jswriter.pp | 20 ++++++++++++ packages/fcl-js/tests/tcwriter.pp | 54 +++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/packages/fcl-js/src/jswriter.pp b/packages/fcl-js/src/jswriter.pp index 6cbae4c23d..bdcbb43c7d 100644 --- a/packages/fcl-js/src/jswriter.pp +++ b/packages/fcl-js/src/jswriter.pp @@ -1255,6 +1255,7 @@ procedure TJSWriter.WriteBinary(El: TJSBinary); Var S : String; AllowCompact, WithBrackets: Boolean; + ElC: TClass; begin {$IFDEF VerboseJSWriter} System.writeln('TJSWriter.WriteBinary SkipRoundBrackets=',FSkipRoundBrackets); @@ -1263,6 +1264,18 @@ begin if WithBrackets then Write('('); FSkipRoundBrackets:=false; + ElC:=El.ClassType; + if El.A is TJSBinaryExpression then + if (El.A.ClassType=ElC) + and ((ElC=TJSLogicalOrExpression) + or (ElC=TJSLogicalAndExpression) + or (ElC=TJSBitwiseAndExpression) + or (ElC=TJSBitwiseOrExpression) + or (ElC=TJSBitwiseXOrExpression) + or (ElC=TJSAdditiveExpressionPlus) + or (ElC=TJSAdditiveExpressionMinus) + or (ElC=TJSMultiplicativeExpressionMul)) then + FSkipRoundBrackets:=true; WriteJS(El.A); Writer.CurElement:=El; AllowCompact:=False; @@ -1279,6 +1292,13 @@ begin S:=' '+S+' '; end; FSkipRoundBrackets:=false; + ElC:=El.ClassType; + if El.B is TJSBinaryExpression then + if (El.B.ClassType=ElC) + and ((ElC=TJSLogicalOrExpression) + or (ElC=TJSLogicalAndExpression)) then + FSkipRoundBrackets:=true; + // Note: a+(b+c) <> a+b+c e.g. floats, 0+string Write(S); WriteJS(El.B); Writer.CurElement:=El; diff --git a/packages/fcl-js/tests/tcwriter.pp b/packages/fcl-js/tests/tcwriter.pp index c376d25a5e..9a65119946 100644 --- a/packages/fcl-js/tests/tcwriter.pp +++ b/packages/fcl-js/tests/tcwriter.pp @@ -180,10 +180,11 @@ type { TTestExpressionWriter } - TTestExpressionWriter= class(TTestJSWriter) + TTestExpressionWriter = class(TTestJSWriter) Protected Procedure TestUnary(Const Msg : String; AClass : TJSUnaryClass; Result : String); - Procedure TestBinary(Const Msg : String; AClass : TJSBinaryClass; Result : String;ACompact : Boolean); + Procedure TestBinary(Const Msg : String; AClass : TJSBinaryClass; Result : String; ACompact : Boolean); + Procedure TestBinaryNested(Const Msg : String; AClass : TJSBinaryClass; Result : String; ACompact : Boolean); Published Procedure TestIdent; Procedure TestThis; @@ -201,8 +202,10 @@ type Procedure TestPostMinusMinus; Procedure TestBinaryLogicalOr; Procedure TestBinaryLogicalOrCompact; + Procedure TestBinaryLogicalOrNested; Procedure TestBinaryLogicalAnd; Procedure TestBinaryLogicalAndCompact; + Procedure TestBinaryLogicalAndNested; Procedure TestBinaryBitwiseOr; Procedure TestBinaryBitwiseOrCompact; Procedure TestBinaryBitwiseAnd; @@ -237,10 +240,13 @@ type Procedure TestBinaryURShiftOfCompact; Procedure TestBinaryPlus; Procedure TestBinaryPlusCompact; + Procedure TestBinaryPlusNested; Procedure TestBinaryMinus; Procedure TestBinaryMinusCompact; + Procedure TestBinaryMinusNested; Procedure TestBinaryMultiply; Procedure TestBinaryMultiplyCompact; + Procedure TestBinaryMultiplyNested; Procedure TestBinaryDivide; Procedure TestBinaryDivideCompact; Procedure TestBinaryMod; @@ -291,6 +297,23 @@ begin AssertWrite(Msg,Result,U); end; +procedure TTestExpressionWriter.TestBinaryNested(const Msg: String; + AClass: TJSBinaryClass; Result: String; ACompact: Boolean); +var + U: TJSBinary; +begin + if ACompact then + Writer.Options:=Writer.Options+[woCompact]; + U:=AClass.Create(0,0); + U.A:=AClass.Create(0,0); + TJSBinary(U.A).A:=CreateIdent('a'); + TJSBinary(U.A).B:=CreateIdent('b'); + U.B:=AClass.Create(0,0); + TJSBinary(U.B).A:=CreateIdent('c'); + TJSBinary(U.B).B:=CreateIdent('d'); + AssertWrite(Msg,Result,U); +end; + procedure TTestExpressionWriter.TestIdent; begin @@ -373,6 +396,11 @@ begin TestBinary('logical or',TJSLogicalOrExpression,'(a||b)',True); end; +procedure TTestExpressionWriter.TestBinaryLogicalOrNested; +begin + TestBinaryNested('logical or',TJSLogicalOrExpression,'(a||b||c||d)',True); +end; + procedure TTestExpressionWriter.TestBinaryLogicalAnd; begin TestBinary('logical or',TJSLogicalAndExpression,'(a && b)',False); @@ -383,6 +411,11 @@ begin TestBinary('logical or',TJSLogicalAndExpression,'(a&&b)',True); end; +procedure TTestExpressionWriter.TestBinaryLogicalAndNested; +begin + TestBinaryNested('logical and',TJSLogicalAndExpression,'(a&&b&&c&&d)',True); +end; + procedure TTestExpressionWriter.TestBinaryBitwiseOr; begin TestBinary('Bitwise or',TJSBitwiseOrExpression,'(a | b)',False); @@ -553,6 +586,11 @@ begin TestBinary('A plus B',TJSAdditiveExpressionPlus,'(a+b)',True); end; +procedure TTestExpressionWriter.TestBinaryPlusNested; +begin + TestBinaryNested('(A+B)+(C+D)',TJSAdditiveExpressionPlus,'(a+b+(c+d))',True); +end; + procedure TTestExpressionWriter.TestBinaryMinus; begin TestBinary('A minus B',TJSAdditiveExpressionMinus,'(a - b)',False); @@ -563,6 +601,11 @@ begin TestBinary('A minus B',TJSAdditiveExpressionMinus,'(a-b)',True); end; +procedure TTestExpressionWriter.TestBinaryMinusNested; +begin + TestBinaryNested('(A-B)-(C-D)',TJSAdditiveExpressionMinus,'(a-b-(c-d))',True); +end; + procedure TTestExpressionWriter.TestBinaryMultiply; begin TestBinary('A multiply B',TJSMultiplicativeExpressionMul,'(a * b)',False); @@ -573,6 +616,11 @@ begin TestBinary('A multiply B',TJSMultiplicativeExpressionMul,'(a*b)',True); end; +procedure TTestExpressionWriter.TestBinaryMultiplyNested; +begin + TestBinaryNested('(A*B)*(C*D)',TJSMultiplicativeExpressionMul,'(a*b*(c*d))',True); +end; + procedure TTestExpressionWriter.TestBinaryDivide; begin TestBinary('A divide B',TJSMultiplicativeExpressionDiv,'(a / b)',False); @@ -2594,7 +2642,7 @@ Var S : AnsiString; p: Integer; begin - S:=FTextWriter.AsAnsistring; + S:=FTextWriter.AsString; if S=Result then exit; p:=1; while (p<=length(S)) and (p<=length(Result)) and (S[p]=Result[p]) do inc(p);