Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].

### Added

- use enum name in repr

### Changed

### Fixed
Expand Down
76 changes: 76 additions & 0 deletions src/runtime/Types/ClassObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,82 @@ internal NewReference GetDocString()
}


/// <summary>
/// given an enum, write a __repr__ string formatted in the same
/// way as a python repr string. Something like:
/// '&lt;Color.GREEN: 2&gt;';
/// with a binary value for [Flags] enums
/// </summary>
/// <param name="inst">Instace of the enum object</param>
/// <returns></returns>
private static string getEnumReprString(object inst)
Comment thread
koubaa marked this conversation as resolved.
Outdated
{
var obType = inst.GetType();

var integralType = obType.GetEnumUnderlyingType();
var isFlags = obType.IsFlagsEnum();

string strValue = "";
switch (Type.GetTypeCode(integralType))
{
case TypeCode.SByte:
var valueSB = Convert.ToSByte(inst);
strValue = isFlags ? "0x" + valueSB.ToString("X2") : valueSB.ToString();
break;
case TypeCode.Byte:
var valueB = Convert.ToByte(inst);
strValue = isFlags ? "0x" + valueB.ToString("X2") : valueB.ToString();
break;
case TypeCode.Int16:
var valueI16 = Convert.ToInt16(inst);
strValue = isFlags ? "0x" + valueI16.ToString("X4") : valueI16.ToString();
break;
case TypeCode.UInt16:
var valueUI16 = Convert.ToUInt16(inst);
strValue = isFlags ? "0x" + valueUI16.ToString("X4") : valueUI16.ToString();
break;
case TypeCode.Int32:
var valueI32 = Convert.ToInt32(inst);
strValue = isFlags ? "0x" + valueI32.ToString("X8") : valueI32.ToString();
break;
case TypeCode.UInt32:
var valueUI32 = Convert.ToUInt32(inst);
strValue = isFlags ? "0x" + valueUI32.ToString("X8") : valueUI32.ToString();
break;
case TypeCode.Int64:
var valueI64 = Convert.ToInt64(inst);
strValue = isFlags ? "0x" + valueI64.ToString("X16") : valueI64.ToString();
break;
case TypeCode.UInt64:
var valueUI64 = Convert.ToUInt64(inst);
strValue = isFlags ? "0x" + valueUI64.ToString("X16") : valueUI64.ToString();
break;
default:
break;
}


var repr = $"<{obType.Name}.{inst}: {strValue}>";
return repr;
}

/// <summary>
/// ClassObject __repr__ implementation.
/// </summary>
public new static NewReference tp_repr(BorrowedReference ob)
{
if (GetManagedObject(ob) is not CLRObject co)
{
return Exceptions.RaiseTypeError("invalid object");
}
if (co.inst.GetType().IsEnum)
{
return Runtime.PyString_FromString(getEnumReprString(co.inst));
}

return ClassBase.tp_repr(ob);
}

/// <summary>
/// Implements __new__ for reflected classes and value types.
/// </summary>
Expand Down
10 changes: 10 additions & 0 deletions tests/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,16 @@ def test_enum_undefined_value():
Test.FieldTest().EnumField = Test.ShortEnum(20, True)


def test_enum_repr():
"""Test enumeration repr."""
from System import DayOfWeek

assert repr(DayOfWeek.Monday) == "<DayOfWeek.Monday: 1>"

assert repr(Test.FlagsEnum(7)) == "<FlagsEnum.Two, Five: 0x00000007>"
assert repr(Test.FlagsEnum(8)) == "<FlagsEnum.8: 0x00000008>"


def test_enum_conversion():
"""Test enumeration conversion."""
ob = Test.FieldTest()
Expand Down