test(metatype): lock type_info round-trip example (currently bails)
type_info($T) is still unimplemented, so the round-trip
define(declare("ShapeCopy"), type_info(Shape)) bails with
"type_info is not yet implemented" plus the downstream
enum-inference cascade. Snapshot pins that current behavior;
the next commit implements type_info and turns this green.
This commit is contained in:
34
examples/0619-comptime-metatype-type-info.sx
Normal file
34
examples/0619-comptime-metatype-type-info.sx
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// Comptime reflection — `type_info($T)`: reflect a SOURCE enum INTO a `TypeInfo`
|
||||||
|
// value, then feed that value straight back to `define` to mint a byte-identical
|
||||||
|
// copy. This is the inverse of `define`'s decode: `type_info` reads a type's
|
||||||
|
// variants (name + payload type) out of the type table and constructs the same
|
||||||
|
// `.enum(EnumInfo{ variants })` value the `define` examples write by hand.
|
||||||
|
//
|
||||||
|
// Round-trip: `ShapeCopy` is reconstructed purely from `type_info(Shape)` — no
|
||||||
|
// literal variant list — and constructs/matches like the original.
|
||||||
|
#import "modules/std.sx";
|
||||||
|
#import "modules/std/meta.sx";
|
||||||
|
|
||||||
|
Shape :: enum {
|
||||||
|
circle: f64;
|
||||||
|
rect: i64;
|
||||||
|
empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reflect Shape → TypeInfo, then reconstruct an identical nominal enum.
|
||||||
|
ShapeCopy :: define(declare("ShapeCopy"), type_info(Shape));
|
||||||
|
|
||||||
|
describe :: (s: ShapeCopy) {
|
||||||
|
if s == {
|
||||||
|
case .circle: (r) { print("circle r={}\n", r); }
|
||||||
|
case .rect: (n) { print("rect n={}\n", n); }
|
||||||
|
case .empty: { print("empty\n"); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main :: () -> i32 {
|
||||||
|
describe(.circle(2.5));
|
||||||
|
describe(.rect(7));
|
||||||
|
describe(.empty);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
1
examples/expected/0619-comptime-metatype-type-info.exit
Normal file
1
examples/expected/0619-comptime-metatype-type-info.exit
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1
|
||||||
17
examples/expected/0619-comptime-metatype-type-info.stderr
Normal file
17
examples/expected/0619-comptime-metatype-type-info.stderr
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
error: type_info is not yet implemented
|
||||||
|
--> examples/0619-comptime-metatype-type-info.sx:19:43
|
||||||
|
|
|
||||||
|
19 | ShapeCopy :: define(declare("ShapeCopy"), type_info(Shape));
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: cannot infer enum type for '.circle' — use an explicit type or assign to a typed variable
|
||||||
|
--> examples/0619-comptime-metatype-type-info.sx:30:14
|
||||||
|
|
|
||||||
|
30 | describe(.circle(2.5));
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
|
error: cannot infer enum type for '.rect' — use an explicit type or assign to a typed variable
|
||||||
|
--> examples/0619-comptime-metatype-type-info.sx:31:14
|
||||||
|
|
|
||||||
|
31 | describe(.rect(7));
|
||||||
|
| ^^^^^
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
Reference in New Issue
Block a user