use crate::SourceSpan;
use crate::lex::Token;
use super::expr::Expr;
use super::punct::Punctuated;
use super::stmt::Block;
use super::ty::Type;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Ident<'de> {
pub sym: &'de str,
pub span: SourceSpan<'de>,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum Visibility {
Public,
Protected,
Private,
#[default]
Inherited,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Attribute<'de> {
pub span: SourceSpan<'de>,
pub path: Path<'de>,
pub args: Vec<Token<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Path<'de> {
pub leading_colon: bool,
pub segments: Vec<PathSegment<'de>>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct PathSegment<'de> {
pub ident: Ident<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BaseSpecifier<'de> {
pub access: Visibility,
pub virtual_token: bool,
pub path: Path<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Field<'de> {
pub attrs: Vec<Attribute<'de>>,
pub vis: Visibility,
pub ty: Type<'de>,
pub ident: Option<Ident<'de>>,
pub default_value: Option<Expr<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Fields<'de> {
Named(FieldsNamed<'de>),
Unit,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FieldsNamed<'de> {
pub members: Vec<Member<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Member<'de> {
AccessSpecifier(Visibility),
Field(Field<'de>),
Method(ItemFn<'de>),
Constructor(ItemConstructor<'de>),
Destructor(ItemDestructor<'de>),
Item(Box<Item<'de>>),
Friend(ItemFriend<'de>),
Using(ItemUse<'de>),
StaticAssert(ItemStaticAssert<'de>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct FnArg<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ty: Type<'de>,
pub ident: Option<Ident<'de>>,
pub default_value: Option<Expr<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Signature<'de> {
pub constexpr_token: bool,
pub consteval_token: bool,
pub inline_token: bool,
pub virtual_token: bool,
pub static_token: bool,
pub explicit_token: bool,
pub return_type: Type<'de>,
pub ident: Ident<'de>,
pub inputs: Punctuated<'de, FnArg<'de>>,
pub variadic: bool,
pub const_token: bool,
pub noexcept_token: bool,
pub override_token: bool,
pub final_token: bool,
pub pure_virtual: bool,
pub defaulted: bool,
pub deleted: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Variant<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ident: Ident<'de>,
pub discriminant: Option<Expr<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum TemplateParam<'de> {
Type {
ident: Option<Ident<'de>>,
default: Option<Type<'de>>,
},
NonType {
ty: Type<'de>,
ident: Option<Ident<'de>>,
default: Option<Expr<'de>>,
},
Template {
params: Vec<TemplateParam<'de>>,
ident: Option<Ident<'de>>,
},
Pack { ident: Ident<'de> },
}
#[derive(Debug, Clone, PartialEq)]
pub enum ForeignItem<'de> {
Fn(ItemFn<'de>),
Static(ItemStatic<'de>),
Verbatim(ItemVerbatim<'de>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct MemberInit<'de> {
pub member: Ident<'de>,
pub args: Punctuated<'de, Expr<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Item<'de> {
Fn(ItemFn<'de>),
Struct(ItemStruct<'de>),
Class(ItemClass<'de>),
Enum(ItemEnum<'de>),
Union(ItemUnion<'de>),
Namespace(ItemNamespace<'de>),
Use(ItemUse<'de>),
Type(ItemType<'de>),
Typedef(ItemTypedef<'de>),
Const(ItemConst<'de>),
Static(ItemStatic<'de>),
ForeignMod(ItemForeignMod<'de>),
Template(ItemTemplate<'de>),
StaticAssert(ItemStaticAssert<'de>),
Include(ItemInclude<'de>),
Macro(ItemMacro<'de>),
Verbatim(ItemVerbatim<'de>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemFn<'de> {
pub attrs: Vec<Attribute<'de>>,
pub vis: Visibility,
pub sig: Signature<'de>,
pub block: Option<Block<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemStruct<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ident: Option<Ident<'de>>,
pub generics: Option<Generics<'de>>,
pub bases: Vec<BaseSpecifier<'de>>,
pub fields: Fields<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemClass<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ident: Option<Ident<'de>>,
pub generics: Option<Generics<'de>>,
pub bases: Vec<BaseSpecifier<'de>>,
pub fields: Fields<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemEnum<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ident: Option<Ident<'de>>,
pub scoped: bool,
pub underlying_type: Option<Type<'de>>,
pub variants: Punctuated<'de, Variant<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemUnion<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ident: Option<Ident<'de>>,
pub fields: FieldsNamed<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemNamespace<'de> {
pub attrs: Vec<Attribute<'de>>,
pub inline_token: bool,
pub ident: Option<Ident<'de>>,
pub content: Vec<Item<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ItemUse<'de> {
Declaration {
attrs: Vec<Attribute<'de>>,
name: Path<'de>,
},
Directive {
attrs: Vec<Attribute<'de>>,
namespace: Path<'de>,
},
Alias {
attrs: Vec<Attribute<'de>>,
ident: Ident<'de>,
ty: Type<'de>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemType<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ident: Ident<'de>,
pub generics: Option<Generics<'de>>,
pub ty: Type<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemTypedef<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ty: Type<'de>,
pub ident: Ident<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemConst<'de> {
pub attrs: Vec<Attribute<'de>>,
pub constexpr_token: bool,
pub ty: Type<'de>,
pub ident: Ident<'de>,
pub expr: Expr<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemStatic<'de> {
pub attrs: Vec<Attribute<'de>>,
pub ty: Type<'de>,
pub ident: Ident<'de>,
pub expr: Option<Expr<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemForeignMod<'de> {
pub attrs: Vec<Attribute<'de>>,
pub abi: &'de str,
pub items: Vec<ForeignItem<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemTemplate<'de> {
pub attrs: Vec<Attribute<'de>>,
pub params: Punctuated<'de, TemplateParam<'de>>,
pub item: Box<Item<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemStaticAssert<'de> {
pub expr: Expr<'de>,
pub message: Option<Expr<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum IncludePath<'de> {
System(SourceSpan<'de>),
Local(SourceSpan<'de>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemInclude<'de> {
pub span: SourceSpan<'de>,
pub path: IncludePath<'de>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemMacro<'de> {
pub span: SourceSpan<'de>,
pub tokens: Vec<Token<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemVerbatim<'de> {
pub tokens: Vec<Token<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemConstructor<'de> {
pub attrs: Vec<Attribute<'de>>,
pub explicit_token: bool,
pub constexpr_token: bool,
pub ident: Ident<'de>,
pub inputs: Punctuated<'de, FnArg<'de>>,
pub noexcept_token: bool,
pub member_init_list: Vec<MemberInit<'de>>,
pub block: Option<Block<'de>>,
pub defaulted: bool,
pub deleted: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemDestructor<'de> {
pub attrs: Vec<Attribute<'de>>,
pub virtual_token: bool,
pub ident: Ident<'de>,
pub noexcept_token: bool,
pub block: Option<Block<'de>>,
pub defaulted: bool,
pub deleted: bool,
pub pure_virtual: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ItemFriend<'de> {
pub attrs: Vec<Attribute<'de>>,
pub item: Box<Item<'de>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Generics<'de> {
pub params: Punctuated<'de, TemplateParam<'de>>,
}