@@ -3189,6 +3189,7 @@ public boolean visit(Assignment node) {
31893189 IVariableBinding toBinding = getLeftVariableBinding (left , leftTypeBinding );
31903190 String op = node .getOperator ().toString ();
31913191 String opType = (op .length () == 1 ? null : op .substring (0 , op .length () - 1 ));
3192+
31923193 boolean needNewStaticParenthesis = false ;
31933194 boolean isParenthesized = (right instanceof ParenthesizedExpression );
31943195// boolean haveDocRight = (getJ2sJavadoc(right, DOC_CHECK_ONLY) != null);
@@ -3206,12 +3207,14 @@ public boolean visit(Assignment node) {
32063207 if ("boolean" .equals (leftName ) && "boolean" .equals (rightName )) {
32073208 if (("^=" .equals (op ))) {
32083209 opType = "!=" ;
3209- } else {
3210+ } else if ( opType == null ) {
32103211 // all boolean should be OK -- no automatic here
32113212 left .accept (this );
3212- buffer .append (( opType == null ? "=" : op ) );
3213+ buffer .append ("=" );
32133214 right .accept (this );
32143215 leftName = null ;
3216+ } else {
3217+ // a&=b -> !!(a&(b)) because both must execute
32153218 }
32163219 } else if (opType == null ) {
32173220 // = operator is no problem
@@ -3234,11 +3237,13 @@ public boolean visit(Assignment node) {
32343237 else
32353238 left .accept (this );
32363239 int ptArray2 = (temp_processingArrayIndex ? buffer .length () : -1 );
3240+ boolean leftIsString = leftName .equals ("String" );
3241+ boolean mustBoxAll = !(leftIsString || leftTypeBinding != null && leftTypeBinding .isPrimitive ());
32373242 if (!"char" .equals (leftName )) {
3238- if (isIntegerType (leftName ) || "boolean" .equals (leftName )) {
3243+ if (isIntegerType (leftName ) || "boolean" .equals (leftName ) || mustBoxAll ) {
32393244 // can't just use a |= b because that ends up as 1 or 0, not true or false.
32403245 // byte|short|int|long += ...
3241- if (!addPrimitiveTypedExpression (left , toBinding , leftName , opType , right , rightName , null , true ))
3246+ if (!addPrimitiveTypedExpression (left , toBinding , leftName , opType , right , rightName , null , true , mustBoxAll ? leftTypeBinding : null ))
32423247 ptArray = -1 ;
32433248 } else {
32443249 ptArray = -1 ;
@@ -3249,7 +3254,6 @@ public boolean visit(Assignment node) {
32493254 buffer .append (' ' );
32503255 buffer .append (op );
32513256 buffer .append (' ' );
3252- boolean leftIsString = leftName .equals ("String" );
32533257 if ("char" .equals (rightName )) {
32543258 if (right instanceof CharacterLiteral ) {
32553259 // ... = 'c'
@@ -3443,7 +3447,7 @@ public boolean visit(CastExpression node) {
34433447 String nameFROM = expBinding .getName ();
34443448 String nameTO = ((PrimitiveType ) typeTO ).getPrimitiveTypeCode ().toString ();
34453449 if (!nameTO .equals (nameFROM )) {
3446- addPrimitiveTypedExpression (null , null , nameTO , null , expression , nameFROM , null , false );
3450+ addPrimitiveTypedExpression (null , null , nameTO , null , expression , nameFROM , null , false , null );
34473451 return false ;
34483452 }
34493453 }
@@ -3600,7 +3604,7 @@ public boolean visit(InfixExpression node) {
36003604 if ("/" .equals (operator ) && leftIsInt && rightIsInt ) {
36013605 // left and right are one of byte, short, int, or long
36023606 // division must take care of this.
3603- addPrimitiveTypedExpression (left , null , leftName , operator , right , rightName , extendedOperands , false );
3607+ addPrimitiveTypedExpression (left , null , leftName , operator , right , rightName , extendedOperands , false , null );
36043608 return false ;
36053609 }
36063610
@@ -4329,7 +4333,7 @@ private void addExpressionAsTargetType(Expression exp, Object targetType, String
43294333 if ((isNumeric || paramName .equals ("char" )) && !isBoxTyped (exp )) {
43304334 // using operator "m" to limit int application of $i$
43314335
4332- addPrimitiveTypedExpression (null , null , paramName , op , exp , rightName , extendedOperands , false );
4336+ addPrimitiveTypedExpression (null , null , paramName , op , exp , rightName , extendedOperands , false , null );
43334337 } else {
43344338 // char f() { return Character }
43354339 // Character f() { return char }
@@ -4575,11 +4579,11 @@ private void addOperand(Expression exp, boolean isToString) {
45754579 * @param rightName
45764580 * @param extendedOperands
45774581 * @param isAssignment (+=, &=, etc)
4578- * @param return true if is an assignment and a = (a op b) was
4579- * used
4582+ * @param mustBoxAll Integer != b
4583+ * @return true if is an assignment and a = (a op b) was used
45804584 */
45814585 private boolean addPrimitiveTypedExpression (Expression left , IVariableBinding assignmentBinding , String leftName ,
4582- String op , Expression right , String rightName , List <?> extendedOperands , boolean isAssignment ) {
4586+ String op , Expression right , String rightName , List <?> extendedOperands , boolean isAssignment , ITypeBinding allBinding ) {
45834587 // byte|short|int|long /= ...
45844588 // convert to proper number of bits
45854589
@@ -4589,6 +4593,9 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
45894593
45904594 // a = ($b$[0] = a | right, $b$[0])
45914595
4596+
4597+
4598+ // also boolean |= boolean op will be !!|
45924599 String classIntArray = null ;
45934600 String more = null , less = null ;
45944601
@@ -4598,7 +4605,16 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
45984605 boolean addParens = (op != "r" || fromChar || right instanceof ParenthesizedExpression );
45994606 boolean isDiv = "/" .equals (op );
46004607 boolean toChar = false ;
4608+ boolean isBoolean = false ;
46014609 switch (leftName ) {
4610+ case "Boolean" :
4611+ isBoolean = true ;
4612+ break ;
4613+ case "boolean" :
4614+ less = "!!(" ;
4615+ more = ")" ;
4616+ addParens = true ;
4617+ break ;
46024618 case "char" :
46034619 if (!fromChar ) {
46044620 prefix += "String.fromCharCode(" ;
@@ -4608,7 +4624,7 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46084624 toChar = true ;
46094625 break ;
46104626 default :
4611- // double, float
4627+ // double, float, boxed
46124628 break ;
46134629 case "long" :
46144630 if (isDiv || !fromIntType ) {
@@ -4655,6 +4671,8 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46554671 }
46564672 boolean wasArray = temp_processingArrayIndex ;
46574673
4674+
4675+
46584676 if (isAssignment && left == null ) {
46594677 buffer .append (op );
46604678 }
@@ -4670,11 +4688,23 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46704688 buffer .append ("(" );
46714689 }
46724690 if (left != null ) {
4691+
46734692 // a += b
4693+
4694+
4695+ if (allBinding != null ) {
4696+ // Boolean.from(!!(a | (b))
4697+ buffer .append (leftName + ".valueOf$" + getJSTypeCode (leftName .toLowerCase ()))
4698+ .append (isBoolean ? "(!!(" : "(" );
4699+ }
4700+
46744701 addFieldName (left , assignmentBinding );
46754702 buffer .append (op );
4676- if (isAssignment )
4703+
4704+ if (isAssignment ) {
46774705 buffer .append ("(" );
4706+ }
4707+
46784708 }
46794709 if (!appendBoxingNode (right , fromChar ) && fromChar && !toChar ) {
46804710 buffer .append (CHARCODEAT0 );
@@ -4685,6 +4715,10 @@ private boolean addPrimitiveTypedExpression(Expression left, IVariableBinding as
46854715 if (left != null && isAssignment ) {
46864716 buffer .append (")" );
46874717 }
4718+
4719+ if (allBinding != null )
4720+ buffer .append (isBoolean ? "))" : ")" );
4721+
46884722 if (classIntArray != null ) {
46894723 // this is necessary because in JavaScript,
46904724 // a = new Int8Array(1)
@@ -5719,13 +5753,15 @@ private String getJSTypeCode(String className) {
57195753 return "Z" ;
57205754 case "byte" :
57215755 return "B" ;
5756+ case "character" :
57225757 case "char" :
57235758 return "C" ;
57245759 case "double" :
57255760 return "D" ;
57265761 case "float" :
57275762 return "F" ;
5728- case "int" :
5763+ case "integer" :
5764+ case "int" :
57295765 return "I" ;
57305766 case "long" :
57315767 return "J" ;
0 commit comments