1use gcmodule::Trace;2use jrsonnet_interner::IStr;3#[cfg(feature = "deserialize")]4use serde::Deserialize;5#[cfg(feature = "serialize")]6use serde::Serialize;7use std::{8 fmt::{Debug, Display},9 ops::Deref,10 path::{Path, PathBuf},11 rc::Rc,12};1314#[cfg_attr(feature = "serialize", derive(Serialize))]15#[cfg_attr(feature = "deserialize", derive(Deserialize))]16#[derive(Debug, PartialEq, Trace)]17pub enum FieldName {18 19 Fixed(IStr),20 21 Dyn(LocExpr),22}2324#[cfg_attr(feature = "serialize", derive(Serialize))]25#[cfg_attr(feature = "deserialize", derive(Deserialize))]26#[derive(Debug, Clone, Copy, PartialEq, Trace)]27pub enum Visibility {28 29 Normal,30 31 Hidden,32 33 Unhide,34}3536impl Visibility {37 pub fn is_visible(&self) -> bool {38 matches!(self, Self::Normal | Self::Unhide)39 }40}4142#[cfg_attr(feature = "serialize", derive(Serialize))]43#[cfg_attr(feature = "deserialize", derive(Deserialize))]44#[derive(Clone, Debug, PartialEq, Trace)]45pub struct AssertStmt(pub LocExpr, pub Option<LocExpr>);4647#[cfg_attr(feature = "serialize", derive(Serialize))]48#[cfg_attr(feature = "deserialize", derive(Deserialize))]49#[derive(Debug, PartialEq, Trace)]50pub struct FieldMember {51 pub name: FieldName,52 pub plus: bool,53 pub params: Option<ParamsDesc>,54 pub visibility: Visibility,55 pub value: LocExpr,56}5758#[cfg_attr(feature = "serialize", derive(Serialize))]59#[cfg_attr(feature = "deserialize", derive(Deserialize))]60#[derive(Debug, PartialEq, Trace)]61pub enum Member {62 Field(FieldMember),63 BindStmt(BindSpec),64 AssertStmt(AssertStmt),65}6667#[cfg_attr(feature = "serialize", derive(Serialize))]68#[cfg_attr(feature = "deserialize", derive(Deserialize))]69#[derive(Debug, Clone, Copy, PartialEq, Trace)]70pub enum UnaryOpType {71 Plus,72 Minus,73 BitNot,74 Not,75}7677impl Display for UnaryOpType {78 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {79 use UnaryOpType::*;80 write!(81 f,82 "{}",83 match self {84 Plus => "+",85 Minus => "-",86 BitNot => "~",87 Not => "!",88 }89 )90 }91}9293#[cfg_attr(feature = "serialize", derive(Serialize))]94#[cfg_attr(feature = "deserialize", derive(Deserialize))]95#[derive(Debug, Clone, Copy, PartialEq, Trace)]96pub enum BinaryOpType {97 Mul,98 Div,99100 101 Mod,102103 Add,104 Sub,105106 Lhs,107 Rhs,108109 Lt,110 Gt,111 Lte,112 Gte,113114 BitAnd,115 BitOr,116 BitXor,117118 Eq,119 Neq,120121 And,122 Or,123124 125 In,126}127128impl Display for BinaryOpType {129 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {130 use BinaryOpType::*;131 write!(132 f,133 "{}",134 match self {135 Mul => "*",136 Div => "/",137 Mod => "%",138 Add => "+",139 Sub => "-",140 Lhs => "<<",141 Rhs => ">>",142 Lt => "<",143 Gt => ">",144 Lte => "<=",145 Gte => ">=",146 BitAnd => "&",147 BitOr => "|",148 BitXor => "^",149 Eq => "==",150 Neq => "!=",151 And => "&&",152 Or => "||",153 In => "in",154 }155 )156 }157}158159160#[cfg_attr(feature = "serialize", derive(Serialize))]161#[cfg_attr(feature = "deserialize", derive(Deserialize))]162#[derive(Debug, PartialEq, Trace)]163pub struct Param(pub IStr, pub Option<LocExpr>);164165166#[cfg_attr(feature = "serialize", derive(Serialize))]167#[cfg_attr(feature = "deserialize", derive(Deserialize))]168#[derive(Debug, Clone, PartialEq, Trace)]169pub struct ParamsDesc(pub Rc<Vec<Param>>);170171impl Deref for ParamsDesc {172 type Target = Vec<Param>;173 fn deref(&self) -> &Self::Target {174 &self.0175 }176}177178#[cfg_attr(feature = "serialize", derive(Serialize))]179#[cfg_attr(feature = "deserialize", derive(Deserialize))]180#[derive(Debug, PartialEq, Trace)]181pub struct ArgsDesc {182 pub unnamed: Vec<LocExpr>,183 pub named: Vec<(IStr, LocExpr)>,184}185impl ArgsDesc {186 pub fn new(unnamed: Vec<LocExpr>, named: Vec<(IStr, LocExpr)>) -> Self {187 Self { unnamed, named }188 }189}190191#[cfg_attr(feature = "serialize", derive(Serialize))]192#[cfg_attr(feature = "deserialize", derive(Deserialize))]193#[derive(Debug, Clone, PartialEq, Trace)]194pub struct BindSpec {195 pub name: IStr,196 pub params: Option<ParamsDesc>,197 pub value: LocExpr,198}199200#[cfg_attr(feature = "serialize", derive(Serialize))]201#[cfg_attr(feature = "deserialize", derive(Deserialize))]202#[derive(Debug, PartialEq, Trace)]203pub struct IfSpecData(pub LocExpr);204205#[cfg_attr(feature = "serialize", derive(Serialize))]206#[cfg_attr(feature = "deserialize", derive(Deserialize))]207#[derive(Debug, PartialEq, Trace)]208pub struct ForSpecData(pub IStr, pub LocExpr);209210#[cfg_attr(feature = "serialize", derive(Serialize))]211#[cfg_attr(feature = "deserialize", derive(Deserialize))]212#[derive(Debug, PartialEq, Trace)]213pub enum CompSpec {214 IfSpec(IfSpecData),215 ForSpec(ForSpecData),216}217218#[cfg_attr(feature = "serialize", derive(Serialize))]219#[cfg_attr(feature = "deserialize", derive(Deserialize))]220#[derive(Debug, PartialEq, Trace)]221pub struct ObjComp {222 pub pre_locals: Vec<BindSpec>,223 pub key: LocExpr,224 pub plus: bool,225 pub value: LocExpr,226 pub post_locals: Vec<BindSpec>,227 pub compspecs: Vec<CompSpec>,228}229230#[cfg_attr(feature = "serialize", derive(Serialize))]231#[cfg_attr(feature = "deserialize", derive(Deserialize))]232#[derive(Debug, PartialEq, Trace)]233pub enum ObjBody {234 MemberList(Vec<Member>),235 ObjComp(ObjComp),236}237238#[cfg_attr(feature = "serialize", derive(Serialize))]239#[cfg_attr(feature = "deserialize", derive(Deserialize))]240#[derive(Debug, PartialEq, Clone, Copy, Trace)]241pub enum LiteralType {242 This,243 Super,244 Dollar,245 Null,246 True,247 False,248}249250#[cfg_attr(feature = "serialize", derive(Serialize))]251#[cfg_attr(feature = "deserialize", derive(Deserialize))]252#[derive(Debug, PartialEq, Trace)]253pub struct SliceDesc {254 pub start: Option<LocExpr>,255 pub end: Option<LocExpr>,256 pub step: Option<LocExpr>,257}258259260#[cfg_attr(feature = "serialize", derive(Serialize))]261#[cfg_attr(feature = "deserialize", derive(Deserialize))]262#[derive(Debug, PartialEq, Trace)]263pub enum Expr {264 Literal(LiteralType),265266 267 Str(IStr),268 269 Num(f64),270 271 Var(IStr),272273 274 Arr(Vec<LocExpr>),275 276 277 278 279 280 281 282 283 284 285 286 ArrComp(LocExpr, Vec<CompSpec>),287288 289 Obj(ObjBody),290 291 ObjExtend(LocExpr, ObjBody),292293 294 Parened(LocExpr),295296 297 UnaryOp(UnaryOpType, LocExpr),298 299 BinaryOp(LocExpr, BinaryOpType, LocExpr),300 301 AssertExpr(AssertStmt, LocExpr),302 303 LocalExpr(Vec<BindSpec>, LocExpr),304305 306 Import(PathBuf),307 308 ImportStr(PathBuf),309 310 ImportBin(PathBuf),311 312 ErrorStmt(LocExpr),313 314 Apply(LocExpr, ArgsDesc, bool),315 316 Index(LocExpr, LocExpr),317 318 Function(ParamsDesc, LocExpr),319 320 Intrinsic(IStr),321 322 IfElse {323 cond: IfSpecData,324 cond_then: LocExpr,325 cond_else: Option<LocExpr>,326 },327 Slice(LocExpr, SliceDesc),328}329330331#[cfg_attr(feature = "serialize", derive(Serialize))]332#[cfg_attr(feature = "deserialize", derive(Deserialize))]333#[derive(Clone, PartialEq, Trace)]334#[skip_trace]335pub struct ExprLocation(pub Rc<Path>, pub usize, pub usize);336impl ExprLocation {337 pub fn belongs_to(&self, other: &ExprLocation) -> bool {338 other.0 == self.0 && other.1 <= self.1 && other.2 >= self.2339 }340}341342impl Debug for ExprLocation {343 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {344 write!(f, "{:?}:{:?}-{:?}", self.0, self.1, self.2)345 }346}347348349#[cfg_attr(feature = "serialize", derive(Serialize))]350#[cfg_attr(feature = "deserialize", derive(Deserialize))]351#[derive(Clone, PartialEq, Trace)]352pub struct LocExpr(pub Rc<Expr>, pub ExprLocation);353354impl Debug for LocExpr {355 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {356 if f.alternate() {357 write!(f, "{:#?}", self.0)?;358 } else {359 write!(f, "{:?}", self.0)?;360 }361 write!(f, " from {:?}", self.1)?;362 Ok(())363 }364}