1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use super::{ array::ArrayRef, const_pointer::ConstPointerRef, pointer::PointerRef, TokenStreamPair, }; use proc_macro2::TokenStream; use witx::{Id, NamedType, Type, TypeRef}; pub(crate) trait TypeDefinitionExtensions { fn get_type_definitions(&self, ident: &Id, docs: TokenStream) -> TokenStreamPair; fn has_rust_value(&self) -> bool; } impl TypeDefinitionExtensions for TypeRef { fn get_type_definitions(&self, ident: &Id, docs: TokenStream) -> TokenStreamPair { match self { TypeRef::Name(ref name) => name.get_type_definitions(ident, docs), TypeRef::Value(ref value) => value.get_type_definitions(ident, docs), } } fn has_rust_value(&self) -> bool { match self { TypeRef::Name(ref name) => name.has_rust_value(), TypeRef::Value(ref value) => value.has_rust_value(), } } } impl TypeDefinitionExtensions for NamedType { fn get_type_definitions(&self, _ident: &Id, _docs: TokenStream) -> TokenStreamPair { unimplemented!("TypeRef::NamedType") } fn has_rust_value(&self) -> bool { self.tref.has_rust_value() } } impl TypeDefinitionExtensions for Type { fn get_type_definitions(&self, ident: &Id, docs: TokenStream) -> TokenStreamPair { match self { Type::Enum(ref enum_datatype) => enum_datatype.get_type_definitions(ident, docs), Type::Int(ref int_datatype) => int_datatype.get_type_definitions(ident, docs), Type::Flags(ref flags_datatype) => flags_datatype.get_type_definitions(ident, docs), Type::Struct(ref struct_datatype) => struct_datatype.get_type_definitions(ident, docs), Type::Union(ref union_datatype) => union_datatype.get_type_definitions(ident, docs), Type::Handle(ref handle_datatype) => handle_datatype.get_type_definitions(ident, docs), Type::Array(ref type_ref) => ArrayRef(type_ref).get_type_definitions(ident, docs), Type::Pointer(ref type_ref) => PointerRef(type_ref).get_type_definitions(ident, docs), Type::ConstPointer(ref type_ref) => { ConstPointerRef(type_ref).get_type_definitions(ident, docs) } Type::Builtin(builtin_type) => builtin_type.get_type_definitions(ident, docs), } } fn has_rust_value(&self) -> bool { match self { Type::Enum(ref enum_datatype) => enum_datatype.has_rust_value(), Type::Int(ref int_datatype) => int_datatype.has_rust_value(), Type::Flags(ref flags_datatype) => flags_datatype.has_rust_value(), Type::Struct(ref struct_datatype) => struct_datatype.has_rust_value(), Type::Union(ref union_datatype) => union_datatype.has_rust_value(), Type::Handle(ref handle_datatype) => handle_datatype.has_rust_value(), Type::Array(ref type_ref) => ArrayRef(type_ref).has_rust_value(), Type::Pointer(ref type_ref) => PointerRef(type_ref).has_rust_value(), Type::ConstPointer(ref type_ref) => ConstPointerRef(type_ref).has_rust_value(), Type::Builtin(builtin_type) => builtin_type.has_rust_value(), } } }