#![doc = include_str!("readme.md")]
use crate::lexer::RustTokenType;
use core::range::Range;
use std::sync::Arc;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RustRoot {
pub items: Vec<Item>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Generics {
pub params: Vec<GenericParam>,
pub where_clause: Option<WhereClause>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum GenericParam {
Lifetime(Lifetime),
Type {
name: Identifier,
bounds: Vec<TypeParamBound>,
default: Option<Type>,
},
Const {
name: Identifier,
ty: Type,
default: Option<Expr>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Lifetime {
pub name: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TypeParamBound {
Trait(Type),
Lifetime(Lifetime),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct WhereClause {
pub predicates: Vec<WherePredicate>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum WherePredicate {
Type {
bounded_ty: Type,
bounds: Vec<TypeParamBound>,
},
Lifetime {
lifetime: Lifetime,
bounds: Vec<Lifetime>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Identifier {
pub name: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Item {
Function(Arc<Function>),
Struct(Arc<Struct>),
Enum(Arc<Enum>),
Module(Arc<Module>),
Use(Arc<UseItem>),
Trait(Arc<Trait>),
Impl(Arc<Impl>),
TypeAlias(Arc<TypeAlias>),
Const(Arc<Const>),
Static(Arc<Static>),
ExternBlock(Arc<ExternBlock>),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Function {
pub name: Identifier,
pub params: Vec<Param>,
pub return_type: Option<Type>,
pub body: Block,
pub generics: Option<Generics>,
pub is_async: bool,
pub is_unsafe: bool,
pub is_extern: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Struct {
pub name: Identifier,
pub generics: Option<Generics>,
pub fields: Vec<Field>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Field {
pub name: Identifier,
pub ty: Type,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Enum {
pub name: Identifier,
pub generics: Option<Generics>,
pub variants: Vec<Variant>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Variant {
pub name: Identifier,
pub fields: Option<Vec<Field>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Module {
pub name: Identifier,
pub items: Vec<Item>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UseItem {
pub path: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Trait {
pub name: Identifier,
pub generics: Option<Generics>,
pub items: Vec<TraitItem>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TraitItem {
Method(Function),
Type(TypeAlias),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Impl {
pub generics: Option<Generics>,
pub ty: Type,
pub trait_: Option<Type>,
pub items: Vec<ImplItem>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ImplItem {
Method(Function),
Type(TypeAlias),
Const(Const),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TypeAlias {
pub name: Identifier,
pub generics: Option<Generics>,
pub ty: Type,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Const {
pub name: Identifier,
pub ty: Type,
pub expr: Expr,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Static {
pub name: Identifier,
pub ty: Type,
pub expr: Expr,
pub mutable: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Type {
Path(String),
Reference {
mutable: bool,
ty: Box<Type>,
},
Tuple(Vec<Type>),
Array {
ty: Box<Type>,
size: Expr,
},
Slice(Box<Type>),
Fn {
params: Vec<Type>,
ret: Option<Box<Type>>,
},
Infer,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Param {
pub name: Identifier,
pub ty: Type,
pub is_mut: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Block {
pub statements: Vec<Statement>,
pub block_start: usize,
pub block_end: usize,
pub nested: usize,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Statement {
Let {
name: Identifier,
ty: Option<Type>,
expr: Option<Expr>,
mutable: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
ExprStmt {
expr: Expr,
semi: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Return {
expr: Option<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Break {
expr: Option<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Continue {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Item(Item),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expr {
Ident(Identifier),
Literal {
value: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Bool {
value: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Unary {
op: RustTokenType,
expr: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Binary {
left: Box<Expr>,
op: RustTokenType,
right: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Call {
callee: Box<Expr>,
args: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Field {
receiver: Box<Expr>,
field: Identifier,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Index {
receiver: Box<Expr>,
index: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Paren {
expr: Box<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Block(Block),
If {
condition: Box<Expr>,
then_block: Block,
else_block: Option<Block>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
While {
condition: Box<Expr>,
body: Block,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
For {
var: Identifier,
iter: Box<Expr>,
body: Block,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Loop {
body: Block,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Match {
expr: Box<Expr>,
arms: Vec<MatchArm>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Tuple {
elements: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Array {
elements: Vec<Expr>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Struct {
path: String,
fields: Vec<FieldInit>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MatchArm {
pub pattern: Pattern,
pub guard: Option<Expr>,
pub body: Expr,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Pattern {
Wildcard,
Ident(Identifier),
Literal(String),
Tuple(Vec<Pattern>),
Struct {
path: String,
fields: Vec<FieldPattern>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FieldPattern {
pub name: Identifier,
pub pattern: Pattern,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FieldInit {
pub name: Identifier,
pub expr: Expr,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExternBlock {
pub abi: Option<String>,
pub items: Vec<Item>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}