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