+/*
+ * type_declaration is for typedef and typealias. They are registered
+ * into type scopes.
+ */
+int register_type_declaration(GQuark type_name, struct declaration *declaration,
+ struct type_scope *scope);
+struct declaration *lookup_type_declaration(GQuark type_name,
+ struct type_scope *scope);
+
+/*
+ * Type scopes also contain a separate registry for struct, variant and
+ * enum types. Those register types rather than type declarations, so
+ * that a named variant can be declared without specifying its target
+ * "choice" tag field immediately.
+ */
+int register_struct_type(GQuark struct_name, struct type_struct *struct_type,
+ struct type_scope *scope);
+struct type_struct *lookup_struct_type(GQuark struct_name,
+ struct type_scope *scope);
+int register_variant_type(GQuark variant_name,
+ struct type_variant *variant_type,
+ struct type_scope *scope);
+struct type_variant *lookup_variant_type(GQuark variant_name,
+ struct type_scope *scope);
+int register_enum_type(GQuark enum_name, struct type_enum *enum_type,
+ struct type_scope *scope);
+struct type_enum *lookup_enum_type(GQuark enum_name,
+ struct type_scope *scope);