aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-03-24 14:29:54 +0000
committergingerBill <bill@gingerbill.org>2020-03-24 14:29:54 +0000
commit5cbb266ef5666c1df5d25d3afe23e4a777abd22b (patch)
tree930b1a1ed3a3cc123183218af43635ef3053a030 /src/types.cpp
parentdfc63dcb606146dcb7a4c1076e593c7991a84c9a (diff)
Change behaviour of `switch v in &value` to make `v` have by-reference semantics
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp57
1 files changed, 49 insertions, 8 deletions
diff --git a/src/types.cpp b/src/types.cpp
index d2a040b0b..86be0d38f 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -302,6 +302,34 @@ struct Type {
bool failure;
};
+// IMPORTANT NOTE(bill): This must match the same as the in core.odin
+enum Typeid_Kind : u8 {
+ Typeid_Invalid,
+ Typeid_Integer,
+ Typeid_Rune,
+ Typeid_Float,
+ Typeid_Complex,
+ Typeid_Quaternion,
+ Typeid_String,
+ Typeid_Boolean,
+ Typeid_Any,
+ Typeid_Type_Id,
+ Typeid_Pointer,
+ Typeid_Procedure,
+ Typeid_Array,
+ Typeid_Enumerated_Array,
+ Typeid_Dynamic_Array,
+ Typeid_Slice,
+ Typeid_Tuple,
+ Typeid_Struct,
+ Typeid_Union,
+ Typeid_Enum,
+ Typeid_Map,
+ Typeid_Bit_Field,
+ Typeid_Bit_Set,
+};
+
+
// TODO(bill): Should I add extra information here specifying the kind of selection?
@@ -1113,13 +1141,13 @@ bool is_type_simd_vector(Type *t) {
}
Type *base_array_type(Type *t) {
- if (is_type_array(t)) {
- t = base_type(t);
- return t->Array.elem;
- }
- if (is_type_simd_vector(t)) {
- t = base_type(t);
- return t->SimdVector.elem;
+ Type *bt = base_type(t);
+ if (is_type_array(bt)) {
+ return bt->Array.elem;
+ } else if (is_type_enumerated_array(bt)) {
+ return bt->EnumeratedArray.elem;
+ } else if (is_type_simd_vector(bt)) {
+ return bt->SimdVector.elem;
}
return t;
}
@@ -3160,6 +3188,14 @@ i64 type_offset_of_from_selection(Type *type, Selection sel) {
return offset;
}
+
+Type *get_struct_field_type(Type *t, isize index) {
+ t = base_type(type_deref(t));
+ GB_ASSERT(t->kind == Type_Struct);
+ return t->Struct.fields[index]->type;
+}
+
+
gbString write_type_to_string(gbString str, Type *type) {
if (type == nullptr) {
return gb_string_appendc(str, "<no type>");
@@ -3391,7 +3427,13 @@ gbString write_type_to_string(gbString str, Type *type) {
str = gb_string_appendc(str, ")");
if (type->Proc.results) {
str = gb_string_appendc(str, " -> ");
+ if (type->Proc.results->Tuple.variables.count > 1) {
+ str = gb_string_appendc(str, "(");
+ }
str = write_type_to_string(str, type->Proc.results);
+ if (type->Proc.results->Tuple.variables.count > 1) {
+ str = gb_string_appendc(str, ")");
+ }
}
break;
@@ -3448,4 +3490,3 @@ gbString type_to_string(Type *type) {
return write_type_to_string(gb_string_make(heap_allocator(), ""), type);
}
-