TextBuffer (int indent, BytecodeMappingTracer tracer) { VarType leftType = left.getExprType(); VarType rightType = right.getExprType(); boolean fieldInClassInit = false, hiddenField = false; if (left.type == Exprent.EXPRENT_FIELD) { // first assignment to a final field. Field name without "this" in front of it FieldExprent field = (FieldExprent)left; ClassNode node = ((ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_NODE)); if (node != null) { StructField fd = node.classStruct.getField(field.getName(), field.getDescriptor().descriptorString); if (fd != null) { if (field.isStatic() && fd.hasModifier(CodeConstants.ACC_FINAL)) { fieldInClassInit = true; } if (node.getWrapper() != null && node.getWrapper().getHiddenMembers().contains(InterpreterUtil.makeUniqueKey(fd.getName(), fd.getDescriptor()))) { hiddenField = true; } } } } if (hiddenField) { return new TextBuffer(); } TextBuffer buffer = new TextBuffer(); if (fieldInClassInit) { buffer.append(((FieldExprent)left).getName()); } else { buffer.append(left.toJava(indent, tracer)); } if (right.type == EXPRENT_CONST) { ((ConstExprent) right).adjustConstType(leftType); } TextBuffer res = right.toJava(indent, tracer); if (condType == CONDITION_NONE && !leftType.isSuperset(rightType) && (rightType.equals(VarType.VARTYPE_OBJECT) || leftType.getType() != CodeConstants.TYPE_OBJECT)) { if (right.getPrecedence() >= FunctionExprent.getPrecedence(FunctionExprent.FUNCTION_CAST)) { res.enclose("(", ")"); } res.prepend("(" + ExprProcessor.getCastTypeName(leftType, Collections.emptyList()) + ")"); } buffer.append(condType == CONDITION_NONE ? " = " : OPERATORS[condType]).append(res); tracer.addMapping(bytecode); return buffer; }