use crate::types::Type;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReceiverCoercion {
AutoAddress,
AutoDeref,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DotAccessKind {
StructField { is_exported: bool },
TupleStructField { is_newtype: bool },
TupleElement,
ModuleMember,
ValueEnumVariant,
EnumVariant,
InstanceMethod { is_exported: bool },
InstanceMethodValue {
is_exported: bool,
is_pointer_receiver: bool,
},
StaticMethod { is_exported: bool },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NativeTypeKind {
Slice,
EnumeratedSlice,
Map,
Channel,
Sender,
Receiver,
String,
}
impl NativeTypeKind {
pub fn from_type(ty: &Type) -> Option<Self> {
let resolved = ty.strip_refs();
if resolved.as_import_namespace().is_some() {
return None;
}
if let Type::Nominal { ref id, .. } = resolved
&& id.as_str().starts_with("go:")
{
return None;
}
let name = resolved.get_name()?;
Self::from_name(name)
}
pub fn from_name(name: &str) -> Option<Self> {
match name {
"Slice" => Some(Self::Slice),
"EnumeratedSlice" => Some(Self::EnumeratedSlice),
"Map" => Some(Self::Map),
"Channel" => Some(Self::Channel),
"Sender" => Some(Self::Sender),
"Receiver" => Some(Self::Receiver),
"string" => Some(Self::String),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CallKind {
Regular,
TupleStructConstructor,
AssertType,
UfcsMethod,
NativeConstructor(NativeTypeKind),
NativeMethod(NativeTypeKind),
NativeMethodIdentifier(NativeTypeKind),
ReceiverMethodUfcs { is_public: bool },
}