use crate::ast::{Ident, ParamConvention, PrimitiveType};
use crate::location::Span;
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GenericParam {
pub name: Ident,
pub constraints: Vec<GenericConstraint>,
pub span: Span,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum GenericConstraint {
Trait { name: Ident, args: Vec<Type> },
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum FunctionAttribute {
Inline,
NoInline,
Cold,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct AttributeAnnotation {
pub kind: FunctionAttribute,
pub span: Span,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ExternAbi {
C,
System,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Type {
Primitive(PrimitiveType),
Ident(Ident),
Generic {
name: Ident,
args: Vec<Self>,
span: Span,
},
Array(Box<Self>),
Optional(Box<Self>),
Tuple(Vec<TupleField>),
Dictionary {
key: Box<Self>,
value: Box<Self>,
},
Closure {
params: Vec<(ParamConvention, Self)>,
ret: Box<Self>,
},
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TupleField {
pub name: Ident,
pub ty: Type,
pub span: Span,
}