ast: move implementations of Expr below Op
This commit is contained in:
80
src/ast.rs
80
src/ast.rs
@@ -193,51 +193,12 @@ pub enum Expr<A: Annotation = Span> {
|
|||||||
Op(Op, Vec<Anno<Self, A>>),
|
Op(Op, Vec<Anno<Self, A>>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A: Annotation> Default for Expr<A> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self::Op(Op::Tuple, vec![])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<A: Annotation> Expr<A> {
|
|
||||||
pub fn anno(self, annotation: A) -> Anno<Expr<A>, A> {
|
|
||||||
Anno(self, annotation)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn and_do(self, annotation: A, other: Anno<Expr<A>, A>) -> Self {
|
|
||||||
let Self::Op(Op::Do, mut exprs) = self else {
|
|
||||||
return Self::Op(Op::Do, vec![self.anno(annotation), other]);
|
|
||||||
};
|
|
||||||
let Anno(Self::Op(Op::Do, mut other), _) = other else {
|
|
||||||
exprs.push(other);
|
|
||||||
return Self::Op(Op::Do, exprs);
|
|
||||||
};
|
|
||||||
exprs.append(&mut other);
|
|
||||||
Self::Op(Op::Do, exprs)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_place(&self) -> bool {
|
|
||||||
matches!(
|
|
||||||
self,
|
|
||||||
Self::Id(_) | Self::Op(Op::Index, _) | Self::Op(Op::Dot, _) | Self::Op(Op::Deref, _)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(clippy::type_complexity)]
|
|
||||||
pub fn as_slice(&self) -> Option<(Op, &[Anno<Expr<A>, A>])> {
|
|
||||||
match self {
|
|
||||||
Expr::Op(op, args) => Some((*op, args.as_slice())),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
pub enum Op {
|
pub enum Op {
|
||||||
// -- true operators
|
// -- true operators
|
||||||
Do, // Expr ; Expr
|
Do, // Expr ; Expr
|
||||||
As, // Expr as Expr
|
As, // Expr as Expr
|
||||||
Macro, // macro Expr => Expr
|
Macro, // macro { (Pat => Expr)* }
|
||||||
Block, // { Expr }
|
Block, // { Expr }
|
||||||
Array, // [ Expr,* ]
|
Array, // [ Expr,* ]
|
||||||
ArRep, // [ Expr ; Expr ]
|
ArRep, // [ Expr ; Expr ]
|
||||||
@@ -305,6 +266,45 @@ pub enum Op {
|
|||||||
OrSet, // Expr |= Expr
|
OrSet, // Expr |= Expr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<A: Annotation> Default for Expr<A> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Op(Op::Tuple, vec![])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<A: Annotation> Expr<A> {
|
||||||
|
pub fn anno(self, annotation: A) -> Anno<Expr<A>, A> {
|
||||||
|
Anno(self, annotation)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn and_do(self, annotation: A, other: Anno<Expr<A>, A>) -> Self {
|
||||||
|
let Self::Op(Op::Do, mut exprs) = self else {
|
||||||
|
return Self::Op(Op::Do, vec![self.anno(annotation), other]);
|
||||||
|
};
|
||||||
|
let Anno(Self::Op(Op::Do, mut other), _) = other else {
|
||||||
|
exprs.push(other);
|
||||||
|
return Self::Op(Op::Do, exprs);
|
||||||
|
};
|
||||||
|
exprs.append(&mut other);
|
||||||
|
Self::Op(Op::Do, exprs)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_place(&self) -> bool {
|
||||||
|
matches!(
|
||||||
|
self,
|
||||||
|
Self::Id(_) | Self::Op(Op::Index, _) | Self::Op(Op::Dot, _) | Self::Op(Op::Deref, _)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::type_complexity)]
|
||||||
|
pub fn as_slice(&self) -> Option<(Op, &[Anno<Expr<A>, A>])> {
|
||||||
|
match self {
|
||||||
|
Expr::Op(op, args) => Some((*op, args.as_slice())),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
use crate::{fmt::FmtAdapter, span::Span};
|
use crate::{fmt::FmtAdapter, span::Span};
|
||||||
use std::{fmt::Display, format_args as fmt};
|
use std::{fmt::Display, format_args as fmt};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user