use crate::{Binder, Decl, Span};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NotationKind {
Prefix,
Infix,
Postfix,
Notation,
}
#[derive(Debug, Clone, PartialEq)]
pub enum OpenItem {
All,
Only(Vec<String>),
Hiding(Vec<String>),
Renaming(String, String),
}
#[derive(Debug, Clone)]
pub enum Command {
Decl(Decl),
Import {
module: String,
span: Span,
},
Export {
names: Vec<String>,
span: Span,
},
Namespace {
name: String,
span: Span,
},
End {
span: Span,
},
SetOption {
name: String,
value: String,
span: Span,
},
Open {
path: Vec<String>,
items: Vec<OpenItem>,
span: Span,
},
Section {
name: String,
span: Span,
},
Variable {
binders: Vec<Binder>,
span: Span,
},
Attribute {
attrs: Vec<String>,
name: String,
span: Span,
},
Check {
expr_str: String,
span: Span,
},
Eval {
expr_str: String,
span: Span,
},
Print {
name: String,
span: Span,
},
Reduce {
expr_str: String,
span: Span,
},
Universe {
names: Vec<String>,
span: Span,
},
Notation {
kind: NotationKind,
name: String,
prec: Option<u32>,
body: String,
span: Span,
},
Derive {
strategies: Vec<String>,
type_name: String,
span: Span,
},
Structure {
name: String,
extends: Vec<String>,
fields: Vec<StructureField>,
derives: Vec<String>,
span: Span,
},
Class {
name: String,
params: Vec<Binder>,
extends: Vec<String>,
fields: Vec<StructureField>,
span: Span,
},
Instance {
name: String,
ty: String,
priority: Option<u32>,
body: String,
span: Span,
},
AttributeDecl {
name: String,
kind: AttributeDeclKind,
span: Span,
},
ApplyAttribute {
attr_name: String,
target: String,
params: Vec<String>,
span: Span,
},
Syntax {
name: String,
prec: Option<u32>,
pattern: String,
span: Span,
},
Precedence {
name: String,
level: u32,
span: Span,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AttributeDeclKind {
Simple,
Macro,
Builtin,
}
#[derive(Debug, Clone, PartialEq)]
pub struct StructureField {
pub name: String,
pub ty: String,
pub is_explicit: bool,
pub default: Option<String>,
}