#load "./wasi/clock"
#load "./io/file"
- #load "./type_info_helper"
+ #load "./type_info/helper"
}
#if runtime.Runtime == runtime.Runtime_Js {
+++ /dev/null
-// A lot of these names have been copied from JAI's introspection system. This is just because
-// I don't want to mentally bike-shed about the names; I just want to get something working.
-
-package core.type_info
-
-type_table : [] ^Type_Info;
-
-Type_Info :: struct {
- // This must match the order of the elements in onyxtypes.h
- Kind :: enum {
- Invalid :: 0x00; // Unused
- Basic :: 0x01;
- Pointer :: 0x02;
- Function :: 0x03;
- Struct :: 0x04;
- Compound :: 0x05;
- Array :: 0x06;
- Slice :: 0x07;
- Dynamic_Array :: 0x08;
- Variadic_Argument :: 0x09;
- Enum :: 0x0a;
- }
-
- kind := Kind.Invalid;
- size: u32;
-
- // Does this need to know alignment? Probably?
- alignment: u32;
-}
-
-Type_Info_Basic :: struct {
- use base : Type_Info;
-
- // This must match the order of the elements in BasicKind in onyxtypes.h
- Kind :: enum {
- Void :: 0x00;
- Bool :: 0x01;
- I8 :: 0x03;
- U8 :: 0x04;
- I16 :: 0x05;
- U16 :: 0x06;
- I32 :: 0x07;
- U32 :: 0x08;
- I64 :: 0x09;
- U64 :: 0x0a;
-
- F32 :: 0x0c;
- F64 :: 0x0d;
-
- Rawptr :: 0x0e;
-
- I8X16 :: 0x0f;
- I16X8 :: 0x10;
- I32X4 :: 0x11;
- I64X2 :: 0x12;
- F32X4 :: 0x13;
- F64X2 :: 0x14;
- V128 :: 0x15;
-
- Type_Index :: 0x16;
- }
-
- basic_kind: Kind;
-}
-
-Type_Info_Pointer :: struct {
- use base : Type_Info;
-
- @Rename
- to: type_expr;
-}
-
-Type_Info_Function :: struct {
- use base : Type_Info;
-
- return_type: type_expr;
- parameter_types: [] type_expr;
-
- is_variadic: bool;
-}
-
-Type_Info_Array :: struct {
- use base : Type_Info;
-
- @Rename
- of: type_expr;
- count: u32;
-}
-
-Type_Info_Slice :: struct {
- use base : Type_Info;
-
- @Rename
- of: type_expr;
-}
-
-Type_Info_Dynamic_Array :: struct {
- use base : Type_Info;
-
- @Rename
- of: type_expr;
-}
-
-Type_Info_Variadic_Argument :: struct {
- use base : Type_Info;
-
- @Rename
- of: type_expr;
-}
-
-Type_Info_Enum :: struct {
- use base : Type_Info;
-
- Member :: struct {
- name: str;
- value: u64; // This assumes enums are always represented as ints.
- }
-
- // This is first for better alignment
- backing_type: type_expr;
- name: str;
- members: [] Member;
-
- is_flags: bool;
-}
-
-Type_Info_Struct :: struct {
- use base : Type_Info;
-
- Member :: struct {
- name: str;
- offset: u32;
- type_index: type_expr;
-
- used: bool;
- has_default: bool;
- }
-
- name: str;
- members: [] Member;
-}
-
-Type_Info_Compound :: struct {
- use base : Type_Info;
-
- components : [] type_expr;
-}
-
-get_type_info :: (t: type_expr) -> ^Type_Info {
- if t < ~~0 || t >= ~~type_table.count do return null;
-
- return type_table[cast(i32) t];
-}
--- /dev/null
+package builtin.type_info
+
+#private_file io :: package core.io
+
+write_type_name :: (writer: ^io.Writer, t: type_expr) {
+ info := get_type_info(t);
+ if info == null do return;
+
+ switch info.kind {
+ case .Basic {
+ basic := cast(^Type_Info_Basic) info;
+
+ switch basic.basic_kind {
+ case .Void do io.write_str(writer, "void");
+ case .Bool do io.write_str(writer, "bool");
+ case .U8 do io.write_str(writer, "u8");
+ case .I8 do io.write_str(writer, "i8");
+ case .U16 do io.write_str(writer, "u16");
+ case .I16 do io.write_str(writer, "i16");
+ case .U32 do io.write_str(writer, "u32");
+ case .I32 do io.write_str(writer, "i32");
+ case .U64 do io.write_str(writer, "u64");
+ case .I64 do io.write_str(writer, "i64");
+
+ case .F32 do io.write_str(writer, "f32");
+ case .F64 do io.write_str(writer, "f64");
+
+ case .Rawptr do return io.write_str(writer, "rawptr");
+
+ case .I8X16 do return io.write_str(writer, "i8x16");
+ case .I16X8 do return io.write_str(writer, "i16x8");
+ case .I32X4 do return io.write_str(writer, "i32x4");
+ case .I64X2 do return io.write_str(writer, "i64x2");
+ case .F32X4 do return io.write_str(writer, "f32x4");
+ case .F64X2 do return io.write_str(writer, "f64x2");
+ case .V128 do return io.write_str(writer, "v128");
+
+ case .Type_Index do return io.write_str(writer, "type_expr");
+ }
+ }
+
+ case .Pointer {
+ pointer := cast(^Type_Info_Pointer) info;
+ io.write_str(writer, "^");
+ write_type_name(writer, pointer.to);
+ }
+
+ case .Array {
+ arr := cast(^Type_Info_Array) info;
+ io.write_format(writer, "[%i] ", arr.count);
+ write_type_name(writer, arr.of);
+ }
+
+ case .Slice {
+ slice := cast(^Type_Info_Slice) info;
+ io.write_str(writer, "[] ");
+ write_type_name(writer, slice.of);
+ }
+
+ case .Dynamic_Array {
+ dyn := cast(^Type_Info_Dynamic_Array) info;
+ io.write_str(writer, "[..] ");
+ write_type_name(writer, dyn.of);
+ }
+
+ case .Variadic_Argument {
+ va := cast(^Type_Info_Variadic_Argument) info;
+ io.write_str(writer, "..");
+ write_type_name(writer, va.of);
+ }
+
+ case .Enum {
+ e := cast(^Type_Info_Enum) info;
+ io.write_str(writer, e.name);
+ }
+
+ case .Struct {
+ s := cast(^Type_Info_Struct) info;
+ io.write_str(writer, s.name);
+ }
+
+ case .Compound {
+ comp := cast(^Type_Info_Compound) info;
+ io.write_str(writer, "(");
+
+ i := 0;
+ for type: comp.components {
+ if i != 0 do io.write_str(writer, ", ");
+
+ write_type_name(writer, type);
+ i += 1;
+ }
+ io.write_str(writer, ")");
+ }
+
+ case .Function {
+ f := cast(^Type_Info_Function) info;
+ io.write_str(writer, "(");
+
+ i := 0;
+ for type: f.parameter_types {
+ if i != 0 do io.write_str(writer, ", ");
+
+ write_type_name(writer, type);
+ i += 1;
+ }
+ io.write_str(writer, ") -> ");
+
+ write_type_name(writer, f.return_type);
+ }
+ }
+}
--- /dev/null
+// A lot of these names have been copied from JAI's introspection system. This is just because
+// I don't want to mentally bike-shed about the names; I just want to get something working.
+
+package builtin.type_info
+
+type_table : [] ^Type_Info;
+
+Type_Info :: struct {
+ // This must match the order of the elements in onyxtypes.h
+ Kind :: enum {
+ Invalid :: 0x00; // Unused
+ Basic :: 0x01;
+ Pointer :: 0x02;
+ Function :: 0x03;
+ Struct :: 0x04;
+ Compound :: 0x05;
+ Array :: 0x06;
+ Slice :: 0x07;
+ Dynamic_Array :: 0x08;
+ Variadic_Argument :: 0x09;
+ Enum :: 0x0a;
+ }
+
+ kind := Kind.Invalid;
+ size: u32;
+
+ // Does this need to know alignment? Probably?
+ alignment: u32;
+}
+
+Type_Info_Basic :: struct {
+ use base : Type_Info;
+
+ // This must match the order of the elements in BasicKind in onyxtypes.h
+ Kind :: enum {
+ Void :: 0x00;
+ Bool :: 0x01;
+ I8 :: 0x03;
+ U8 :: 0x04;
+ I16 :: 0x05;
+ U16 :: 0x06;
+ I32 :: 0x07;
+ U32 :: 0x08;
+ I64 :: 0x09;
+ U64 :: 0x0a;
+
+ F32 :: 0x0c;
+ F64 :: 0x0d;
+
+ Rawptr :: 0x0e;
+
+ I8X16 :: 0x0f;
+ I16X8 :: 0x10;
+ I32X4 :: 0x11;
+ I64X2 :: 0x12;
+ F32X4 :: 0x13;
+ F64X2 :: 0x14;
+ V128 :: 0x15;
+
+ Type_Index :: 0x16;
+ }
+
+ basic_kind: Kind;
+}
+
+Type_Info_Pointer :: struct {
+ use base : Type_Info;
+
+ @Rename
+ to: type_expr;
+}
+
+Type_Info_Function :: struct {
+ use base : Type_Info;
+
+ return_type: type_expr;
+ parameter_types: [] type_expr;
+
+ is_variadic: bool;
+}
+
+Type_Info_Array :: struct {
+ use base : Type_Info;
+
+ @Rename
+ of: type_expr;
+ count: u32;
+}
+
+Type_Info_Slice :: struct {
+ use base : Type_Info;
+
+ @Rename
+ of: type_expr;
+}
+
+Type_Info_Dynamic_Array :: struct {
+ use base : Type_Info;
+
+ @Rename
+ of: type_expr;
+}
+
+Type_Info_Variadic_Argument :: struct {
+ use base : Type_Info;
+
+ @Rename
+ of: type_expr;
+}
+
+Type_Info_Enum :: struct {
+ use base : Type_Info;
+
+ Member :: struct {
+ name: str;
+ value: u64; // This assumes enums are always represented as ints.
+ }
+
+ // This is first for better alignment
+ backing_type: type_expr;
+ name: str;
+ members: [] Member;
+
+ is_flags: bool;
+}
+
+Type_Info_Struct :: struct {
+ use base : Type_Info;
+
+ Member :: struct {
+ name: str;
+ offset: u32;
+ type_index: type_expr;
+
+ used: bool;
+ has_default: bool;
+ }
+
+ name: str;
+ members: [] Member;
+}
+
+Type_Info_Compound :: struct {
+ use base : Type_Info;
+
+ components : [] type_expr;
+}
+
+get_type_info :: (t: type_expr) -> ^Type_Info {
+ if t < ~~0 || t >= ~~type_table.count do return null;
+
+ return type_table[cast(i32) t];
+}
+++ /dev/null
-package core.type_info
-
-#private_file io :: package core.io
-
-write_type_name :: (writer: ^io.Writer, t: type_expr) {
- info := get_type_info(t);
- if info == null do return;
-
- switch info.kind {
- case .Basic {
- basic := cast(^Type_Info_Basic) info;
-
- switch basic.basic_kind {
- case .Void do io.write_str(writer, "void");
- case .Bool do io.write_str(writer, "bool");
- case .U8 do io.write_str(writer, "u8");
- case .I8 do io.write_str(writer, "i8");
- case .U16 do io.write_str(writer, "u16");
- case .I16 do io.write_str(writer, "i16");
- case .U32 do io.write_str(writer, "u32");
- case .I32 do io.write_str(writer, "i32");
- case .U64 do io.write_str(writer, "u64");
- case .I64 do io.write_str(writer, "i64");
-
- case .F32 do io.write_str(writer, "f32");
- case .F64 do io.write_str(writer, "f64");
-
- case .Rawptr do return io.write_str(writer, "rawptr");
-
- case .I8X16 do return io.write_str(writer, "i8x16");
- case .I16X8 do return io.write_str(writer, "i16x8");
- case .I32X4 do return io.write_str(writer, "i32x4");
- case .I64X2 do return io.write_str(writer, "i64x2");
- case .F32X4 do return io.write_str(writer, "f32x4");
- case .F64X2 do return io.write_str(writer, "f64x2");
- case .V128 do return io.write_str(writer, "v128");
-
- case .Type_Index do return io.write_str(writer, "type_expr");
- }
- }
-
- case .Pointer {
- pointer := cast(^Type_Info_Pointer) info;
- io.write_str(writer, "^");
- write_type_name(writer, pointer.to);
- }
-
- case .Array {
- arr := cast(^Type_Info_Array) info;
- io.write_format(writer, "[%i] ", arr.count);
- write_type_name(writer, arr.of);
- }
-
- case .Slice {
- slice := cast(^Type_Info_Slice) info;
- io.write_str(writer, "[] ");
- write_type_name(writer, slice.of);
- }
-
- case .Dynamic_Array {
- dyn := cast(^Type_Info_Dynamic_Array) info;
- io.write_str(writer, "[..] ");
- write_type_name(writer, dyn.of);
- }
-
- case .Variadic_Argument {
- va := cast(^Type_Info_Variadic_Argument) info;
- io.write_str(writer, "..");
- write_type_name(writer, va.of);
- }
-
- case .Enum {
- e := cast(^Type_Info_Enum) info;
- io.write_str(writer, e.name);
- }
-
- case .Struct {
- s := cast(^Type_Info_Struct) info;
- io.write_str(writer, s.name);
- }
-
- case .Compound {
- comp := cast(^Type_Info_Compound) info;
- io.write_str(writer, "(");
-
- i := 0;
- for type: comp.components {
- if i != 0 do io.write_str(writer, ", ");
-
- write_type_name(writer, type);
- i += 1;
- }
- io.write_str(writer, ")");
- }
-
- case .Function {
- f := cast(^Type_Info_Function) info;
- io.write_str(writer, "(");
-
- i := 0;
- for type: f.parameter_types {
- if i != 0 do io.write_str(writer, ", ");
-
- write_type_name(writer, type);
- i += 1;
- }
- io.write_str(writer, ") -> ");
-
- write_type_name(writer, f.return_type);
- }
- }
-}
\ No newline at end of file
default_slider_theme := Slider_Theme.{};
-slider :: (use r: Rectangle, value: ^$T, min_value: T, max_value: T, text: str, theme := ^default_slider_theme, site := #callsite, increment := 0) -> bool {
+slider :: (use r: Rectangle, value: ^$T, min_value: T, max_value: T, theme := ^default_slider_theme, site := #callsite, increment := 0) -> bool {
result := false;
hash := get_site_hash(site, increment);
result = true;
// Animate this?
- // adjust_slider_value(value, mouse_state.x - x0, width, min_value, max_value);
-
x := mouse_state.x - x0;
if T == i32 || T == i64 || T == u32 || T == u64 {
.state = Entity_State_Parse_Builtin,
.type = Entity_Type_Load_File,
.package = NULL,
- .include = create_load(context.ast_alloc, "core/type_info"),
+ .include = create_load(context.ast_alloc, "core/type_info/type_info"),
}));
add_entities_for_node(NULL, (AstNode *) &builtin_stack_top, context.global_scope, NULL);
return;
}
- p = package_lookup("core.type_info");
+ p = package_lookup("builtin.type_info");
if (p != NULL) {
type_table_node = (AstTyped *) symbol_raw_resolve(p->scope, "type_table");
}