public void visitAssignop(JCAssignOp tree) { // Attribute arguments. Type owntype = attribTree(tree.lhs, env, VAR, Type.noType); Type operand = attribExpr(tree.rhs, env); // Find operator. Symbol operator = tree.operator = rs.resolveBinaryOperator( tree.pos(), tree.getTag() - JCTree.ASGOffset, env, owntype, operand); if (operator.kind == MTH) { chk.checkOperator(tree.pos(), (OperatorSymbol)operator, tree.getTag() - JCTree.ASGOffset, owntype, operand); if (types.isSameType(operator.type.getReturnType(), syms.stringType)) { // String assignment; make sure the lhs is a string chk.checkType(tree.lhs.pos(), owntype, syms.stringType); } else { chk.checkDivZero(tree.rhs.pos(), operator, operand); chk.checkCastable(tree.rhs.pos(), operator.type.getReturnType(), owntype); } } result = check(tree, owntype, VAL, pkind, pt); }
public void visitAssignop(JCAssignOp tree) { // Attribute arguments. Type owntype = attribTree(tree.lhs, env, VAR, Type.noType); Type operand = attribExpr(tree.rhs, env); // Find operator. Symbol operator = tree.operator = rs.resolveBinaryOperator( tree.pos(), tree.tag - JCTree.ASGOffset, env, owntype, operand); if (operator.kind == MTH) { chk.checkOperator(tree.pos(), (OperatorSymbol)operator, tree.tag - JCTree.ASGOffset, owntype, operand); if (types.isSameType(operator.type.getReturnType(), syms.stringType)) { // String assignment; make sure the lhs is a string chk.checkType(tree.lhs.pos(), owntype, syms.stringType); } else { chk.checkDivZero(tree.rhs.pos(), operator, operand); chk.checkCastable(tree.rhs.pos(), operator.type.getReturnType(), owntype); } } result = check(tree, owntype, VAL, pkind, pt); }
public void visitAssignop(JCAssignOp tree) { // Attribute arguments. Type owntype = attribTree(tree.lhs, env, varInfo); Type operand = attribExpr(tree.rhs, env); // Find operator. Symbol operator = tree.operator = rs.resolveBinaryOperator( tree.pos(), tree.getTag().noAssignOp(), env, owntype, operand); if (operator.kind == MTH && !owntype.isErroneous() && !operand.isErroneous()) { chk.checkOperator(tree.pos(), (OperatorSymbol)operator, tree.getTag().noAssignOp(), owntype, operand); chk.checkDivZero(tree.rhs.pos(), operator, operand); chk.checkCastable(tree.rhs.pos(), operator.type.getReturnType(), owntype); } result = check(tree, owntype, VAL, resultInfo); }
public void visitAssignop(JCAssignOp tree) { // Attribute arguments. Type owntype = attribTree(tree.lhs, env, varInfo); Type operand = attribExpr(tree.rhs, env); // Find operator. Symbol operator = tree.operator = rs.resolveBinaryOperator( tree.pos(), tree.getTag().noAssignOp(), env, owntype, operand); if (operator.kind == MTH && !owntype.isErroneous() && !operand.isErroneous()) { chk.checkOperator(tree.pos(), (OperatorSymbol)operator, tree.getTag().noAssignOp(), owntype, operand); chk.checkDivZero(tree.rhs.pos(), operator, operand); chk.checkCastable(tree.rhs.pos(), operator.type.getReturnType(), owntype); } result = check(tree, owntype, VAL, resultInfo); }
public JCTree build(final JCTree lhs) { int newTag = tree.getTag() - JCTree.ASGOffset; // Erasure (TransTypes) can change the type of // tree.lhs. However, we can still get the // unerased type of tree.lhs as it is stored // in tree.type in Attr. Symbol newOperator = rs.resolveBinaryOperator(tree.pos(), newTag, attrEnv, tree.type, tree.rhs.type); JCExpression expr = (JCExpression)lhs; if (expr.type != tree.type) expr = make.TypeCast(tree.type, expr); JCBinary opResult = make.Binary(newTag, expr, tree.rhs); opResult.operator = newOperator; opResult.type = newOperator.type.getReturnType(); JCTypeCast newRhs = make.TypeCast(types.unboxedType(tree.type), opResult); return make.Assign((JCExpression)lhs, newRhs).setType(tree.type); } });
public JCTree build(final JCTree lhs) { int newTag = tree.tag - JCTree.ASGOffset; // Erasure (TransTypes) can change the type of // tree.lhs. However, we can still get the // unerased type of tree.lhs as it is stored // in tree.type in Attr. Symbol newOperator = rs.resolveBinaryOperator(tree.pos(), newTag, attrEnv, tree.type, tree.rhs.type); JCExpression expr = (JCExpression)lhs; if (expr.type != tree.type) expr = make.TypeCast(tree.type, expr); JCBinary opResult = make.Binary(newTag, expr, tree.rhs); opResult.operator = newOperator; opResult.type = newOperator.type.getReturnType(); JCTypeCast newRhs = make.TypeCast(types.unboxedType(tree.type), opResult); return make.Assign((JCExpression)lhs, newRhs).setType(tree.type); } });
public JCTree build(final JCTree lhs) { JCTree.Tag newTag = tree.getTag().noAssignOp(); // Erasure (TransTypes) can change the type of // tree.lhs. However, we can still get the // unerased type of tree.lhs as it is stored // in tree.type in Attr. Symbol newOperator = rs.resolveBinaryOperator(tree.pos(), newTag, attrEnv, tree.type, tree.rhs.type); JCExpression expr = (JCExpression)lhs; if (expr.type != tree.type) expr = make.TypeCast(tree.type, expr); JCBinary opResult = make.Binary(newTag, expr, tree.rhs); opResult.operator = newOperator; opResult.type = newOperator.type.getReturnType(); JCExpression newRhs = boxingReq ? make.TypeCast(types.unboxedType(tree.type), opResult) : opResult; return make.Assign((JCExpression)lhs, newRhs).setType(tree.type); } });
public JCTree build(final JCTree lhs) { JCTree.Tag newTag = tree.getTag().noAssignOp(); // Erasure (TransTypes) can change the type of // tree.lhs. However, we can still get the // unerased type of tree.lhs as it is stored // in tree.type in Attr. Symbol newOperator = rs.resolveBinaryOperator(tree.pos(), newTag, attrEnv, tree.type, tree.rhs.type); JCExpression expr = (JCExpression)lhs; if (expr.type != tree.type) expr = make.TypeCast(tree.type, expr); JCBinary opResult = make.Binary(newTag, expr, tree.rhs); opResult.operator = newOperator; opResult.type = newOperator.type.getReturnType(); JCExpression newRhs = boxingReq ? make.TypeCast(types.unboxedType(tree.type), opResult) : opResult; return make.Assign((JCExpression)lhs, newRhs).setType(tree.type); } });