135135
136136// TODO: superclass inheritance for JAXB XmlAccessorType
137137
138+ //BH 2020.12.14 -- 3.2.9-v1s fix for Boolean |= boolean and related boxing
138139//BH 2020.12.06 -- 3.2.9-v1r fix for (long) double using |0
139140//BH 2020.11.20 -- 3.2.9-v1q fix for new ImmutableCollections.ListN<>(E...) should use Object[]
140141//BH 2020.08.03 -- 3.2.9-v1p fix for boxing boolean should be Boolean.valueOf$, not new Boolean
@@ -3189,6 +3190,7 @@ public boolean visit(Assignment node) {
31893190 IVariableBinding toBinding = getLeftVariableBinding (left , leftTypeBinding );
31903191 String op = node .getOperator ().toString ();
31913192 String opType = (op .length () == 1 ? null : op .substring (0 , op .length () - 1 ));
3193+
31923194 boolean needNewStaticParenthesis = false ;
31933195 boolean isParenthesized = (right instanceof ParenthesizedExpression );
31943196// boolean haveDocRight = (getJ2sJavadoc(right, DOC_CHECK_ONLY) != null);
@@ -3206,12 +3208,14 @@ public boolean visit(Assignment node) {
32063208 if ("boolean" .equals (leftName ) && "boolean" .equals (rightName )) {
32073209 if (("^=" .equals (op ))) {
32083210 opType = "!=" ;
3209- } else {
3211+ } else if ( opType == null ) {
32103212 // all boolean should be OK -- no automatic here
32113213 left .accept (this );
3212- buffer .append (( opType == null ? "=" : op ) );
3214+ buffer .append ("=" );
32133215 right .accept (this );
32143216 leftName = null ;
3217+ } else {
3218+ // a&=b -> !!(a&(b)) because both must execute
32153219 }
32163220 } else if (opType == null ) {
32173221 // = operator is no problem
@@ -3234,11 +3238,13 @@ public boolean visit(Assignment node) {
32343238 else
32353239 left .accept (this );
32363240 int ptArray2 = (temp_processingArrayIndex ? buffer .length () : -1 );
3241+ boolean leftIsString = leftName .equals ("String" );
3242+ boolean mustBoxAll = !(leftIsString || leftTypeBinding != null && leftTypeBinding .isPrimitive ());
32373243 if (!"char" .equals (leftName )) {
3238- if (isIntegerType (leftName ) || "boolean" .equals (leftName )) {
3244+ if (isIntegerType (leftName ) || "boolean" .equals (leftName ) || mustBoxAll ) {
32393245 // can't just use a |= b because that ends up as 1 or 0, not true or false.
32403246 // byte|short|int|long += ...
3241- if (!addPrimitiveTypedExpression (left , toBinding , leftName , opType , right , rightName , null , true ))
3247+ if (!addPrimitiveTypedExpression (left , toBinding , leftName , opType , right , rightName , null , true , mustBoxAll ? leftTypeBinding : null ))
32423248 ptArray = -1 ;
32433249 } else {
32443250 ptArray = -1 ;
@@ -3249,7 +3255,6 @@ public boolean visit(Assignment node) {
32493255 buffer .append (' ' );
32503256 buffer .append (op );
32513257 buffer .append (' ' );
3252- boolean leftIsString = leftName .equals ("String" );
32533258 if ("char" .equals (rightName )) {
32543259 if (right instanceof CharacterLiteral ) {
32553260 // ... = 'c'
@@ -3443,7 +3448,7 @@ public boolean visit(CastExpression node) {
34433448 String nameFROM = expBinding .getName ();
34443449 String nameTO = ((PrimitiveType ) typeTO ).getPrimitiveTypeCode ().toString ();
34453450 if (!nameTO .equals (nameFROM )) {
3446- addPrimitiveTypedExpression (null , null , nameTO , null , expression , nameFROM , null , false );
3451+ addPrimitiveTypedExpression (null , null , nameTO , null , expression , nameFROM , null , false , null );
34473452 return false ;
34483453 }
34493454 }
@@ -3600,7 +3605,7 @@ public boolean visit(InfixExpression node) {
36003605 if ("/" .equals (operator ) && leftIsInt && rightIsInt ) {
36013606 // left and right are one of byte, short, int, or long
36023607 // division must take care of this.
3603- addPrimitiveTypedExpression (left , null , leftName , operator , right , rightName , extendedOperands , false );
3608+ addPrimitiveTypedExpression (left , null , leftName , operator , right , rightName , extendedOperands , false , null );
36043609 return false ;
36053610 }
36063611
@@ -4329,7 +4334,7 @@ private void addExpressionAsTargetType(Expression exp, Object targetType, String
43294334 if ((isNumeric || paramName .equals ("char" )) && !isBoxTyped (exp )) {
43304335 // using operator "m" to limit int application of $i$
43314336
4332- addPrimitiveTypedExpression (null , null , paramName , op , exp , rightName , extendedOperands , false );
4337+ addPrimitiveTypedExpression (null , null , paramName , op , exp , rightName , extendedOperands , false , null );
43334338 } else {
43344339 // char f() { return Character }
43354340 // Character f() { return char }
@@ -4575,11 +4580,11 @@ private void addOperand(Expression exp, boolean isToString) {
45754580 * @param rightName
45764581 * @param extendedOperands
45774582 * @param isAssignment (+=, &=, etc)
4578- * @param return true if is an assignment and a = (a op b) was
4579- * used
4583+ * @param mustBoxAll Integer != b
4584+ * @return true if is an assignment and a = (a op b) was used
45804585 */
45814586 private boolean addPrimitiveTypedExpression (Expression left , IVariableBinding assignmentBinding , String leftName ,
4582- String op , Expression right , String rightName , List <?> extendedOperands , boolean isAssignment ) {
4587+ String op , Expression right , String rightName , List <?> extendedOperands , boolean isAssignment , ITypeBinding allBinding ) {
45834588 // byte|short|int|long /= ...
45844589 // convert to proper number of bits
45854590
@@ -4589,6 +4594,9 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
45894594
45904595 // a = ($b$[0] = a | right, $b$[0])
45914596
4597+
4598+
4599+ // also boolean |= boolean op will be !!|
45924600 String classIntArray = null ;
45934601 String more = null , less = null ;
45944602
@@ -4598,7 +4606,16 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
45984606 boolean addParens = (op != "r" || fromChar || right instanceof ParenthesizedExpression );
45994607 boolean isDiv = "/" .equals (op );
46004608 boolean toChar = false ;
4609+ boolean isBoolean = false ;
46014610 switch (leftName ) {
4611+ case "Boolean" :
4612+ isBoolean = true ;
4613+ break ;
4614+ case "boolean" :
4615+ less = "!!(" ;
4616+ more = ")" ;
4617+ addParens = true ;
4618+ break ;
46024619 case "char" :
46034620 if (!fromChar ) {
46044621 prefix += "String.fromCharCode(" ;
@@ -4608,7 +4625,7 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46084625 toChar = true ;
46094626 break ;
46104627 default :
4611- // double, float
4628+ // double, float, boxed
46124629 break ;
46134630 case "long" :
46144631 if (isDiv || !fromIntType ) {
@@ -4655,6 +4672,8 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46554672 }
46564673 boolean wasArray = temp_processingArrayIndex ;
46574674
4675+
4676+
46584677 if (isAssignment && left == null ) {
46594678 buffer .append (op );
46604679 }
@@ -4670,11 +4689,23 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46704689 buffer .append ("(" );
46714690 }
46724691 if (left != null ) {
4692+
46734693 // a += b
4694+
4695+
4696+ if (allBinding != null ) {
4697+ // Boolean.from(!!(a | (b))
4698+ buffer .append (leftName + ".valueOf$" + getJSTypeCode (leftName .toLowerCase ()))
4699+ .append (isBoolean ? "(!!(" : "(" );
4700+ }
4701+
46744702 addFieldName (left , assignmentBinding );
46754703 buffer .append (op );
4676- if (isAssignment )
4704+
4705+ if (isAssignment ) {
46774706 buffer .append ("(" );
4707+ }
4708+
46784709 }
46794710 if (!appendBoxingNode (right , fromChar ) && fromChar && !toChar ) {
46804711 buffer .append (CHARCODEAT0 );
@@ -4685,6 +4716,10 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46854716 if (left != null && isAssignment ) {
46864717 buffer .append (")" );
46874718 }
4719+
4720+ if (allBinding != null )
4721+ buffer .append (isBoolean ? "))" : ")" );
4722+
46884723 if (classIntArray != null ) {
46894724 // this is necessary because in JavaScript,
46904725 // a = new Int8Array(1)
@@ -5719,13 +5754,15 @@ private String getJSTypeCode(String className) {
57195754 return "Z" ;
57205755 case "byte" :
57215756 return "B" ;
5757+ case "character" :
57225758 case "char" :
57235759 return "C" ;
57245760 case "double" :
57255761 return "D" ;
57265762 case "float" :
57275763 return "F" ;
5728- case "int" :
5764+ case "integer" :
5765+ case "int" :
57295766 return "I" ;
57305767 case "long" :
57315768 return "J" ;
0 commit comments