boolean (@NotNull Exprent exprent, @NotNull VarType newType, boolean checkMinExprentType) { if (exprent.type == Exprent.EXPRENT_CONST) { ConstExprent constExprent = (ConstExprent)exprent; VarType constType = constExprent.getConstType(); if (newType.getTypeFamily() > CodeConstants.TYPE_FAMILY_INTEGER || constType.getTypeFamily() > CodeConstants.TYPE_FAMILY_INTEGER) return true; if (newType.getTypeFamily() == CodeConstants.TYPE_FAMILY_INTEGER) { VarType integerType = new ConstExprent((Integer)constExprent.getValue(), false, null).getConstType(); if (integerType.isStrictSuperset(newType)) { newType = integerType; } } return changeConstExprentType(new VarVersionPair(exprent.id, -1), exprent, newType, checkMinExprentType); } if (exprent.type == Exprent.EXPRENT_VAR) { return changeConstExprentType(new VarVersionPair((VarExprent)exprent), exprent, newType, checkMinExprentType); } if (exprent.type == Exprent.EXPRENT_ASSIGNMENT) { return changeExprentType(((AssignmentExprent)exprent).getRight(), newType, checkMinExprentType); } if (exprent.type == Exprent.EXPRENT_FUNCTION) { FunctionExprent functionExprent = (FunctionExprent)exprent; switch (functionExprent.getFuncType()) { case FunctionExprent.FUNCTION_IIF -> { // FIXME: return changeExprentType(functionExprent.getLstOperands().get(1), newType, checkMinExprentType) & changeExprentType(functionExprent.getLstOperands().get(2), newType, checkMinExprentType); } case FunctionExprent.FUNCTION_AND, FunctionExprent.FUNCTION_OR, FunctionExprent.FUNCTION_XOR -> { return changeExprentType(functionExprent.getLstOperands().get(0), newType, checkMinExprentType) & changeExprentType(functionExprent.getLstOperands().get(1), newType, checkMinExprentType); } } } return true; }