From 6766bfc4d87cad5de01af9f1b09fcd54f822429f Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Sat, 05 Jun 2021 18:52:38 +0000 Subject: [PATCH] feat(jrsonnet-parser): implement gc AST can't have cycles, so tracing is noop here --- --- a/crates/jrsonnet-parser/Cargo.toml +++ b/crates/jrsonnet-parser/Cargo.toml @@ -18,6 +18,7 @@ unescape = "0.1.0" serde = { version = "1.0", features = ["derive", "rc"], optional = true } +gc = { version = "0.4.1", features = ["derive"] } [dev-dependencies] jrsonnet-stdlib = { path = "../jrsonnet-stdlib", version = "0.3.7" } --- a/crates/jrsonnet-parser/src/expr.rs +++ b/crates/jrsonnet-parser/src/expr.rs @@ -1,3 +1,4 @@ +use gc::{unsafe_empty_trace, Finalize, Trace}; use jrsonnet_interner::IStr; #[cfg(feature = "deserialize")] use serde::Deserialize; @@ -19,6 +20,10 @@ /// {["dyn"+"amic"]: 3} Dyn(LocExpr), } +impl Finalize for FieldName {} +unsafe impl Trace for FieldName { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -31,6 +36,10 @@ /// ::: Unhide, } +impl Finalize for Visibility {} +unsafe impl Trace for Visibility { + unsafe_empty_trace!(); +} impl Visibility { pub fn is_visible(&self) -> bool { @@ -42,6 +51,10 @@ #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Clone, Debug, PartialEq)] pub struct AssertStmt(pub LocExpr, pub Option); +impl Finalize for AssertStmt {} +unsafe impl Trace for AssertStmt { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -53,6 +66,10 @@ pub visibility: Visibility, pub value: LocExpr, } +impl Finalize for FieldMember {} +unsafe impl Trace for FieldMember { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -62,6 +79,10 @@ BindStmt(BindSpec), AssertStmt(AssertStmt), } +impl Finalize for Member {} +unsafe impl Trace for Member { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -72,6 +93,11 @@ BitNot, Not, } +impl Finalize for UnaryOpType {} +unsafe impl Trace for UnaryOpType { + unsafe_empty_trace!(); +} + impl Display for UnaryOpType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use UnaryOpType::*; @@ -119,6 +145,11 @@ And, Or, } +impl Finalize for BinaryOpType {} +unsafe impl Trace for BinaryOpType { + unsafe_empty_trace!(); +} + impl Display for BinaryOpType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use BinaryOpType::*; @@ -154,12 +185,21 @@ #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Debug, PartialEq)] pub struct Param(pub IStr, pub Option); +impl Finalize for Param {} +unsafe impl Trace for Param { + unsafe_empty_trace!(); +} /// Defined function parameters #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Debug, Clone, PartialEq)] pub struct ParamsDesc(pub Rc>); +impl Finalize for ParamsDesc {} +unsafe impl Trace for ParamsDesc { + unsafe_empty_trace!(); +} + impl Deref for ParamsDesc { type Target = Vec; fn deref(&self) -> &Self::Target { @@ -171,11 +211,20 @@ #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Debug, PartialEq)] pub struct Arg(pub Option, pub LocExpr); +impl Finalize for Arg {} +unsafe impl Trace for Arg { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Debug, PartialEq)] pub struct ArgsDesc(pub Vec); +impl Finalize for ArgsDesc {} +unsafe impl Trace for ArgsDesc { + unsafe_empty_trace!(); +} + impl Deref for ArgsDesc { type Target = Vec; fn deref(&self) -> &Self::Target { @@ -191,16 +240,28 @@ pub params: Option, pub value: LocExpr, } +impl Finalize for BindSpec {} +unsafe impl Trace for BindSpec { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Debug, PartialEq)] pub struct IfSpecData(pub LocExpr); +impl Finalize for IfSpecData {} +unsafe impl Trace for IfSpecData { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Debug, PartialEq)] pub struct ForSpecData(pub IStr, pub LocExpr); +impl Finalize for ForSpecData {} +unsafe impl Trace for ForSpecData { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -209,6 +270,10 @@ IfSpec(IfSpecData), ForSpec(ForSpecData), } +impl Finalize for CompSpec {} +unsafe impl Trace for CompSpec { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -220,6 +285,10 @@ pub post_locals: Vec, pub compspecs: Vec, } +impl Finalize for ObjComp {} +unsafe impl Trace for ObjComp { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -228,6 +297,10 @@ MemberList(Vec), ObjComp(ObjComp), } +impl Finalize for ObjBody {} +unsafe impl Trace for ObjBody { + unsafe_empty_trace!(); +} #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] @@ -240,6 +313,10 @@ True, False, } +impl Finalize for LiteralType {} +unsafe impl Trace for LiteralType { + unsafe_empty_trace!(); +} #[derive(Debug, PartialEq)] pub struct SliceDesc { @@ -247,6 +324,10 @@ pub end: Option, pub step: Option, } +impl Finalize for SliceDesc {} +unsafe impl Trace for SliceDesc { + unsafe_empty_trace!(); +} /// Syntax base #[cfg_attr(feature = "serialize", derive(Serialize))] @@ -315,12 +396,21 @@ cond_else: Option, }, } +impl Finalize for Expr {} +unsafe impl Trace for Expr { + unsafe_empty_trace!(); +} /// file, begin offset, end offset #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Clone, PartialEq)] pub struct ExprLocation(pub Rc, pub usize, pub usize); +impl Finalize for ExprLocation {} +unsafe impl Trace for ExprLocation { + unsafe_empty_trace!(); +} + impl Debug for ExprLocation { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{:?}:{:?}-{:?}", self.0, self.1, self.2) @@ -332,6 +422,11 @@ #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[derive(Clone, PartialEq)] pub struct LocExpr(pub Rc, pub Option); +impl Finalize for LocExpr {} +unsafe impl Trace for LocExpr { + unsafe_empty_trace!(); +} + impl Debug for LocExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if f.alternate() { -- gitstuff