def METHOD_NAME(ir):  # pylint: disable=too-many-branches
    # operations
    if isinstance(ir, Assignment):
        return f"({METHOD_NAME(ir.lvalue)}):=({METHOD_NAME(ir.rvalue)})"
    if isinstance(ir, Index):
        return f"index({ntype(ir.index_type)})"
    if isinstance(ir, Member):
        return "member"  # .format(ntype(ir._type))
    if isinstance(ir, Length):
        return "length"
    if isinstance(ir, Binary):
        return f"binary({str(ir.type)})"
    if isinstance(ir, Unary):
        return f"unary({str(ir.type)})"
    if isinstance(ir, Condition):
        return f"condition({METHOD_NAME(ir.value)})"
    if isinstance(ir, NewStructure):
        return "new_structure"
    if isinstance(ir, NewContract):
        return "new_contract"
    if isinstance(ir, NewArray):
        return f"new_array({ntype(ir.array_type)})"
    if isinstance(ir, NewElementaryType):
        return f"new_elementary({ntype(ir.type)})"
    if isinstance(ir, Delete):
        return f"delete({METHOD_NAME(ir.lvalue)},{METHOD_NAME(ir.variable)})"
    if isinstance(ir, SolidityCall):
        return f"solidity_call({ir.function.full_name})"
    if isinstance(ir, InternalCall):
        return f"internal_call({ntype(ir.type_call)})"
    if isinstance(ir, EventCall):  # is this useful?
        return "event"
    if isinstance(ir, LibraryCall):
        return "library_call"
    if isinstance(ir, InternalDynamicCall):
        return "internal_dynamic_call"
    if isinstance(ir, HighLevelCall):  # TODO: improve
        return "high_level_call"
    if isinstance(ir, LowLevelCall):  # TODO: improve
        return "low_level_call"
    if isinstance(ir, TypeConversion):
        return f"type_conversion({ntype(ir.type)})"
    if isinstance(ir, Return):  # this can be improved using values
        return "return"  # .format(ntype(ir.type))
    if isinstance(ir, Transfer):
        return f"transfer({METHOD_NAME(ir.call_value)})"
    if isinstance(ir, Send):
        return f"send({METHOD_NAME(ir.call_value)})"
    if isinstance(ir, Unpack):  # TODO: improve
        return "unpack"
    if isinstance(ir, InitArray):  # TODO: improve
        return "init_array"
    if isinstance(ir, Function):  # TODO: investigate this
        return "function_solc"
    # variables
    if isinstance(ir, Constant):
        return f"constant({ntype(ir.type)})"
    if isinstance(ir, SolidityVariableComposed):
        return f"solidity_variable_composed({ir.name})"
    if isinstance(ir, SolidityVariable):
        return f"solidity_variable{ir.name}"
    if isinstance(ir, TemporaryVariable):
        return "temporary_variable"
    if isinstance(ir, ReferenceVariable):
        return f"reference({ntype(ir.type)})"
    if isinstance(ir, LocalVariable):
        return f"local_solc_variable({ir.location})"
    if isinstance(ir, StateVariable):
        return f"state_solc_variable({ntype(ir.type)})"
    if isinstance(ir, LocalVariableInitFromTuple):
        return "local_variable_init_tuple"
    if isinstance(ir, TupleVariable):
        return "tuple_variable"
    # default
    simil_logger.error(type(ir), "is missing encoding!")
    return ""