#![doc = include_str!("readme.md")]
use core::range::Range;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CSharpRoot {
pub items: Vec<Item>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Item {
Namespace(NamespaceDeclaration),
Using(UsingDirective),
Class(ClassDeclaration),
Interface(InterfaceDeclaration),
Struct(StructDeclaration),
Enum(EnumDeclaration),
Record(RecordDeclaration),
Delegate(DelegateDeclaration),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamespaceDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
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 UsingDirective {
pub path: String,
pub is_static: bool,
pub alias: Option<String>,
pub is_global: bool,
#[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 ClassDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub base_types: Vec<String>,
pub type_parameters: Vec<TypeParameter>,
pub constraints: Vec<TypeParameterConstraint>,
pub members: Vec<Member>,
#[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 StructDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub members: Vec<Member>,
pub type_parameters: Vec<TypeParameter>,
#[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 InterfaceDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub members: Vec<Member>,
pub type_parameters: Vec<TypeParameter>,
#[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 EnumDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub members: Vec<EnumMember>,
#[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 EnumMember {
pub name: String,
pub attributes: Vec<Attribute>,
pub value: Option<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RecordDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub members: Vec<Member>,
pub type_parameters: Vec<TypeParameter>,
#[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 DelegateDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub return_type: String,
pub type_parameters: Vec<TypeParameter>,
pub parameters: Vec<Parameter>,
#[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 Member {
Method(MethodDeclaration),
Field(FieldDeclaration),
Property(PropertyDeclaration),
Indexer(IndexerDeclaration),
Constructor(MethodDeclaration),
Event(EventDeclaration),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MethodDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub modifiers: Vec<String>,
pub return_type: String,
pub type_parameters: Vec<TypeParameter>,
pub parameters: Vec<Parameter>,
pub body: Option<Vec<Statement>>,
pub is_async: bool,
#[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 PropertyDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub r#type: String,
pub modifiers: Vec<String>,
pub get_accessor: Option<Accessor>,
pub set_accessor: Option<Accessor>,
#[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 Accessor {
pub attributes: Vec<Attribute>,
pub body: Option<Vec<Statement>>,
pub modifiers: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IndexerDeclaration {
pub attributes: Vec<Attribute>,
pub r#type: String,
pub parameters: Vec<Parameter>,
pub get_accessor: Option<Accessor>,
pub set_accessor: Option<Accessor>,
#[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 EventDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub r#type: String,
pub modifiers: Vec<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 Parameter {
pub attributes: Vec<Attribute>,
pub name: String,
pub r#type: String,
pub modifiers: Vec<String>,
pub default_value: Option<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FieldDeclaration {
pub name: String,
pub attributes: Vec<Attribute>,
pub r#type: String,
pub modifiers: Vec<String>,
pub initializer: Option<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 Attribute {
pub name: String,
pub arguments: Vec<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 TypeParameter {
pub name: String,
pub attributes: Vec<Attribute>,
pub variance: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TypeParameterConstraint {
pub parameter_name: String,
pub constraints: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Statement {
Expression(Expression),
Return(Option<Expression>),
Block(Vec<Statement>),
If {
condition: Expression,
then_branch: Box<Statement>,
else_branch: Option<Box<Statement>>,
},
While {
condition: Expression,
body: Box<Statement>,
},
For {
init: Option<Box<Statement>>,
condition: Option<Expression>,
update: Option<Expression>,
body: Box<Statement>,
},
Foreach {
item_type: String,
item_name: String,
iterable: Expression,
body: Box<Statement>,
},
LocalVariable {
r#type: String,
name: String,
initializer: Option<Expression>,
},
Break,
Continue,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expression {
Literal(Literal),
Identifier(String),
MethodCall(MethodCall),
MemberAccess(MemberAccess),
ElementAccess(ElementAccess),
New(NewExpression),
This,
Base,
Binary {
left: Box<Expression>,
op: String,
right: Box<Expression>,
},
Unary {
op: String,
expression: Box<Expression>,
},
Assignment {
left: Box<Expression>,
op: String,
right: Box<Expression>,
},
Await(Box<Expression>),
Query(Box<QueryExpression>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct QueryExpression {
pub from_clause: FromClause,
pub body: QueryBody,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FromClause {
pub identifier: String,
pub expression: Box<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct QueryBody {
pub clauses: Vec<QueryClause>,
pub select_or_group: SelectOrGroupClause,
pub continuation: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QueryClause {
From(FromClause),
Let(LetClause),
Where(Expression),
Join(JoinClause),
OrderBy(Vec<Ordering>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QueryClauseExt {
GroupBy(Expression),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LetClause {
pub identifier: String,
pub expression: Expression,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct JoinClause {
pub identifier: String,
pub in_expression: Expression,
pub on_expression: Expression,
pub equals_expression: Expression,
pub into_identifier: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Ordering {
pub expression: Expression,
pub ascending: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SelectOrGroupClause {
Select(Expression),
Group {
expression: Expression,
by_expression: Expression,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NewExpression {
pub r#type: String,
pub arguments: Vec<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Literal {
Integer(i64),
String(String),
Boolean(bool),
Null,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MemberAccess {
pub target: Box<Expression>,
pub name: String,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MethodCall {
pub target: Option<Box<Expression>>,
pub name: String,
pub arguments: Vec<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ElementAccess {
pub target: Box<Expression>,
pub arguments: Vec<Expression>,
}