lib.enum: allow empty enums.
This commit is contained in:
		
							parent
							
								
									e6d8d5a354
								
							
						
					
					
						commit
						7e438180e0
					
				|  | @ -112,16 +112,11 @@ class EnumMeta(ShapeCastable, py_enum.EnumMeta): | |||
|         if hasattr(cls, "_amaranth_shape_"): | ||||
|             # Shape was provided explicitly; return it. | ||||
|             return cls._amaranth_shape_ | ||||
|         elif cls.__members__: | ||||
|             # Shape was not provided explicitly, but enumeration has members; treat it | ||||
|             # the same way `Shape.cast` treats standard library enumerations, so that | ||||
|             # `amaranth.lib.enum.Enum` can be a drop-in replacement for `enum.Enum`. | ||||
|             return Shape._cast_plain_enum(cls) | ||||
|         else: | ||||
|             # Shape was not provided explicitly, and enumeration has no members. | ||||
|             # This is a base or mixin class that cannot be instantiated directly. | ||||
|             raise TypeError("Enumeration '{}.{}' does not have a defined shape" | ||||
|                             .format(cls.__module__, cls.__qualname__)) | ||||
|             # Shape was not provided explicitly; treat it the same way `Shape.cast` treats | ||||
|             # standard library enumerations, so that `amaranth.lib.enum.Enum` can be a drop-in | ||||
|             # replacement for `enum.Enum`. | ||||
|             return Shape._cast_plain_enum(cls) | ||||
| 
 | ||||
|     def __call__(cls, value): | ||||
|         # :class:`py_enum.Enum` uses ``__call__()`` for type casting: ``E(x)`` returns | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| import enum as py_enum | ||||
| 
 | ||||
| from amaranth import * | ||||
| from amaranth.lib.enum import Enum | ||||
| 
 | ||||
|  | @ -21,9 +23,10 @@ class EnumTestCase(FHDLTestCase): | |||
|     def test_shape_no_members(self): | ||||
|         class EnumA(Enum): | ||||
|             pass | ||||
|         with self.assertRaisesRegex(TypeError, | ||||
|                 r"^Enumeration '.+?\.EnumA' does not have a defined shape$"): | ||||
|             Shape.cast(EnumA) | ||||
|         class PyEnumA(py_enum.Enum): | ||||
|             pass | ||||
|         self.assertEqual(Shape.cast(EnumA), unsigned(0)) | ||||
|         self.assertEqual(Shape.cast(PyEnumA), unsigned(0)) | ||||
| 
 | ||||
|     def test_shape_explicit(self): | ||||
|         class EnumA(Enum, shape=signed(2)): | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Charlotte
						Charlotte