#![doc = include_str!("readme.md")]
use core::range::Range;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FSharpRoot {
pub items: Vec<Item>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Item {
Namespace(NamespaceDeclaration),
Module(ModuleDeclaration),
Open(OpenDirective),
Binding(Binding),
Type(TypeDefinition),
Class(ClassDefinition),
Interface(InterfaceDefinition),
Exception(ExceptionDefinition),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamespaceDeclaration {
pub name: String,
pub items: Vec<Item>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ModuleDeclaration {
pub name: String,
pub is_top_level: bool,
pub is_nested: bool,
pub items: Vec<Item>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OpenDirective {
pub path: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Binding {
pub name: String,
pub is_rec: bool,
pub is_mutable: bool,
pub parameters: Vec<Parameter>,
pub type_annotation: Option<String>,
pub expression: Expression,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Parameter {
pub name: String,
pub type_annotation: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TypeDefinition {
pub name: String,
pub type_parameters: Vec<String>,
pub body: TypeBody,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TypeBody {
Record(Vec<RecordField>),
Union(Vec<UnionCase>),
Alias(String),
Struct(Vec<RecordField>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RecordField {
pub name: String,
pub field_type: String,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UnionCase {
pub name: String,
pub fields: Vec<RecordField>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ClassDefinition {
pub name: String,
pub type_parameters: Vec<String>,
pub base_class: Option<String>,
pub interfaces: Vec<String>,
pub members: Vec<ClassMember>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ClassMember {
Constructor(Constructor),
Method(Method),
Property(Property),
Field(Field),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Constructor {
pub parameters: Vec<Parameter>,
pub body: Expression,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Method {
pub name: String,
pub parameters: Vec<Parameter>,
pub return_type: Option<String>,
pub body: Expression,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Property {
pub name: String,
pub property_type: String,
pub getter: Option<Expression>,
pub setter: Option<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Field {
pub name: String,
pub field_type: String,
pub initial_value: Option<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InterfaceDefinition {
pub name: String,
pub type_parameters: Vec<String>,
pub base_interfaces: Vec<String>,
pub members: Vec<InterfaceMember>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum InterfaceMember {
MethodSignature(Method),
PropertySignature(Property),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExceptionDefinition {
pub name: String,
pub fields: Vec<RecordField>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expression {
Literal(Literal),
Identifier(String),
If {
condition: Box<Expression>,
then_branch: Box<Expression>,
else_branch: Option<Box<Expression>>,
},
Match {
expression: Box<Expression>,
cases: Vec<MatchCase>,
},
Lambda {
parameters: Vec<Parameter>,
body: Box<Expression>,
},
Application {
function: Box<Expression>,
argument: Box<Expression>,
},
Binary {
left: Box<Expression>,
op: String,
right: Box<Expression>,
},
Unary {
op: String,
operand: Box<Expression>,
},
Let {
bindings: Vec<Binding>,
body: Box<Expression>,
},
PipeForward {
expression: Box<Expression>,
function: Box<Expression>,
},
PipeBackward {
function: Box<Expression>,
expression: Box<Expression>,
},
Tuple(Vec<Expression>),
List(Vec<Expression>),
Array(Vec<Expression>),
Record {
type_name: Option<String>,
fields: Vec<(String, Expression)>,
},
UnionCase {
case_name: String,
arguments: Vec<Expression>,
},
Sequential(Vec<Expression>),
Parenthesized(Box<Expression>),
Async(Box<Expression>),
Computation {
builder: String,
body: Vec<ComputationItem>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Literal {
Integer(i64),
Float(f64),
String(String),
Char(char),
Boolean(bool),
Unit,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MatchCase {
pub pattern: Pattern,
pub guard: Option<Expression>,
pub body: Expression,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Pattern {
Wildcard,
Identifier(String),
Literal(Literal),
Tuple(Vec<Pattern>),
List(Vec<Pattern>),
UnionCase {
case_name: String,
patterns: Vec<Pattern>,
},
Record(Vec<String>),
As {
pattern: Box<Pattern>,
identifier: String,
},
Or(Box<Pattern>, Box<Pattern>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ComputationItem {
Let(Binding),
Yield(Expression),
Return(Expression),
Expression(Expression),
CustomOperation {
name: String,
arguments: Vec<Expression>,
},
}