use nova_diagnostics::{Span, Spanned};
use crate::{expr::Expr, ty::Type, Block, Path};
pub use crate::expr::AssignOp;
#[derive(Debug, Clone)]
pub struct Attribute {
pub name: Spanned<String>,
pub args: Vec<Spanned<String>>,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Visibility {
Pub,
Private,
}
#[derive(Debug, Clone)]
pub struct Param {
pub is_mut: bool,
pub name: Spanned<String>,
pub ty: Spanned<Type>,
}
#[derive(Debug, Clone)]
pub struct WhereBound {
pub ty: Spanned<Type>,
pub bounds: Vec<Spanned<Path>>,
}
#[derive(Debug, Clone)]
pub struct Function {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub is_async: bool,
pub name: Spanned<String>,
pub generics: Vec<crate::ty::TypeParam>,
pub params: Vec<Param>,
pub return_ty: Option<Spanned<Type>>,
pub where_clause: Vec<WhereBound>,
pub body: Spanned<Block>,
}
#[derive(Debug, Clone)]
pub struct Record {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub name: Spanned<String>,
pub generics: Vec<crate::ty::TypeParam>,
pub fields: Vec<RecordField>,
}
#[derive(Debug, Clone)]
pub struct RecordField {
pub docs: Vec<Spanned<String>>,
pub vis: Visibility,
pub name: Spanned<String>,
pub ty: Spanned<Type>,
}
#[derive(Debug, Clone)]
pub struct TypeDecl {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub name: Spanned<String>,
pub generics: Vec<crate::ty::TypeParam>,
pub def: TypeDef,
}
#[derive(Debug, Clone)]
pub enum TypeDef {
Alias(Spanned<Type>),
Sum(Vec<Variant>),
}
#[derive(Debug, Clone)]
pub struct Variant {
pub docs: Vec<Spanned<String>>,
pub name: Spanned<String>,
pub fields: Vec<Spanned<Type>>,
}
#[derive(Debug, Clone)]
pub struct TraitDecl {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub name: Spanned<String>,
pub generics: Vec<crate::ty::TypeParam>,
pub supertraits: Vec<Spanned<Path>>,
pub where_clause: Vec<WhereBound>,
pub items: Vec<TraitItem>,
}
#[derive(Debug, Clone)]
pub enum TraitItem {
Required(FunctionSig),
Provided(Function),
AssocType {
docs: Vec<Spanned<String>>,
name: Spanned<String>,
bounds: Vec<Spanned<Path>>,
},
}
#[derive(Debug, Clone)]
pub struct FunctionSig {
pub docs: Vec<Spanned<String>>,
pub is_async: bool,
pub name: Spanned<String>,
pub generics: Vec<crate::ty::TypeParam>,
pub params: Vec<Param>,
pub return_ty: Option<Spanned<Type>>,
pub where_clause: Vec<WhereBound>,
}
#[derive(Debug, Clone)]
pub struct ImplBlock {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub generics: Vec<crate::ty::TypeParam>,
pub trait_: Option<Spanned<Path>>,
pub ty: Spanned<Type>,
pub where_clause: Vec<WhereBound>,
pub functions: Vec<Function>,
pub consts: Vec<ConstDecl>,
pub assoc_types: Vec<AssocTypeBinding>,
}
#[derive(Debug, Clone)]
pub struct AssocTypeBinding {
pub docs: Vec<Spanned<String>>,
pub name: Spanned<String>,
pub ty: Spanned<Type>,
}
#[derive(Debug, Clone)]
pub struct ConstDecl {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub name: Spanned<String>,
pub ty: Spanned<Type>,
pub value: Spanned<Expr>,
}
#[derive(Debug, Clone)]
pub struct Import {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub path: Spanned<Path>,
pub kind: ImportKind,
}
#[derive(Debug, Clone)]
pub enum ImportKind {
Simple,
Alias(Spanned<String>),
List(Vec<Spanned<String>>),
}
#[derive(Debug, Clone)]
pub struct Module {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub path: Spanned<Path>,
}
#[derive(Debug, Clone)]
pub struct ExternBlock {
pub docs: Vec<Spanned<String>>,
pub attrs: Vec<Attribute>,
pub abi: Option<String>,
pub items: Vec<ExternItem>,
}
#[derive(Debug, Clone)]
pub enum ExternItem {
Fn(FunctionSig),
}