From 0a79974d0e87d9e12abc4bd43ec01ad5fef4df8d Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Fri, 14 Jul 2023 15:46:51 +0900 Subject: [PATCH] [rust] Extract HIR initialization passes to hir crate --- compiler/forget/Cargo.lock | 2 + .../crates/forget_build_hir/src/build.rs | 2 +- .../crates/forget_build_hir/src/builder.rs | 166 +- .../crates/forget_build_hir/src/error.rs | 5 - .../forget/crates/forget_build_hir/src/lib.rs | 5 - .../crates/forget_estree/src/generated.rs | 1988 +++++++++-------- compiler/forget/crates/forget_hir/Cargo.toml | 2 + .../crates/forget_hir/src/initialize.rs | 174 ++ compiler/forget/crates/forget_hir/src/lib.rs | 6 + .../src/constant_propagation.rs | 5 +- 10 files changed, 1287 insertions(+), 1068 deletions(-) create mode 100644 compiler/forget/crates/forget_hir/src/initialize.rs diff --git a/compiler/forget/Cargo.lock b/compiler/forget/Cargo.lock index 06bba26e76..c08519d179 100644 --- a/compiler/forget/Cargo.lock +++ b/compiler/forget/Cargo.lock @@ -521,10 +521,12 @@ name = "forget_hir" version = "0.1.0" dependencies = [ "bumpalo", + "forget_diagnostics", "forget_estree", "forget_utils", "indexmap 2.0.0", "serde", + "thiserror", ] [[package]] diff --git a/compiler/forget/crates/forget_build_hir/src/build.rs b/compiler/forget/crates/forget_build_hir/src/build.rs index 37ef55ee73..97f9523e8e 100644 --- a/compiler/forget/crates/forget_build_hir/src/build.rs +++ b/compiler/forget/crates/forget_build_hir/src/build.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use bumpalo::boxed::Box; use bumpalo::collections::String; -use forget_diagnostics::{Diagnostic, DiagnosticSeverity}; +use forget_diagnostics::Diagnostic; use forget_estree::{ AssignmentTarget, BinaryExpression, BlockStatement, Expression, ForInit, ForStatement, Function, FunctionExpression, IfStatement, JsValue, Literal, Pattern, Statement, diff --git a/compiler/forget/crates/forget_build_hir/src/builder.rs b/compiler/forget/crates/forget_build_hir/src/builder.rs index 7b13ac40f3..758a6e1155 100644 --- a/compiler/forget/crates/forget_build_hir/src/builder.rs +++ b/compiler/forget/crates/forget_build_hir/src/builder.rs @@ -1,13 +1,13 @@ use std::cell::RefCell; -use std::collections::HashSet; use std::rc::Rc; use bumpalo::boxed::Box; use bumpalo::collections::{String, Vec}; -use forget_diagnostics::{invariant, Diagnostic, DiagnosticSeverity}; +use forget_diagnostics::Diagnostic; use forget_hir::{ - BasicBlock, BlockId, BlockKind, Environment, GotoKind, Identifier, IdentifierData, InstrIx, - Instruction, InstructionIdGenerator, InstructionValue, Terminal, TerminalValue, Type, HIR, + initialize_hir, BasicBlock, BlockId, BlockKind, Environment, GotoKind, Identifier, + IdentifierData, InstrIx, Instruction, InstructionIdGenerator, InstructionValue, Terminal, + TerminalValue, Type, HIR, }; use indexmap::IndexMap; @@ -346,161 +346,3 @@ impl<'a> Builder<'a> { } } } - -pub fn initialize_hir<'a>(hir: &mut HIR<'a>) -> Result<(), Diagnostic> { - reverse_postorder_blocks(hir); - remove_unreachable_for_updates(hir); - remove_unreachable_fallthroughs(hir); - remove_unreachable_do_while_statements(hir); - mark_instruction_ids(hir)?; - mark_predecessors(hir); - Ok(()) -} - -/// Modifies the HIR to put the blocks in reverse postorder, with predecessors before -/// successors (except for the case of loops) -pub fn reverse_postorder_blocks<'a>(hir: &mut HIR<'a>) { - let mut visited = HashSet::::with_capacity(hir.blocks.len()); - let mut postorder = std::vec::Vec::::with_capacity(hir.blocks.len()); - fn visit<'a>( - block_id: BlockId, - hir: &HIR<'a>, - visited: &mut HashSet, - postorder: &mut std::vec::Vec, - ) { - if !visited.insert(block_id) { - // already visited - return; - } - let block = hir.block(block_id); - let terminal = &block.terminal; - match &terminal.value { - TerminalValue::Branch(terminal) => { - visit(terminal.alternate, hir, visited, postorder); - visit(terminal.consequent, hir, visited, postorder); - } - TerminalValue::If(terminal) => { - visit(terminal.alternate, hir, visited, postorder); - visit(terminal.consequent, hir, visited, postorder); - } - TerminalValue::For(terminal) => { - visit(terminal.init, hir, visited, postorder); - } - TerminalValue::DoWhile(terminal) => { - visit(terminal.body, hir, visited, postorder); - } - TerminalValue::Goto(terminal) => { - visit(terminal.block, hir, visited, postorder); - } - TerminalValue::Return(..) => { /* no-op */ } - TerminalValue::Unsupported(..) => { - panic!("Unexpected unsupported terminal") - } - } - postorder.push(block_id); - } - visit(hir.entry, &hir, &mut visited, &mut postorder); - - // NOTE: could consider sorting the blocks in-place by key - let mut blocks = IndexMap::with_capacity(hir.blocks.len()); - for id in postorder.iter().rev().cloned() { - blocks.insert(id, hir.blocks.remove(&id).unwrap()); - } - - hir.blocks = blocks; -} - -/// Prunes ForTerminal.update values (sets to None) if they are unreachable -pub fn remove_unreachable_for_updates<'a>(hir: &mut HIR<'a>) { - let block_ids: HashSet = hir.blocks.keys().cloned().collect(); - - for block in hir.blocks.values_mut() { - if let TerminalValue::For(terminal) = &mut block.terminal.value { - if let Some(update) = terminal.update { - if !block_ids.contains(&update) { - terminal.update = None; - } - } - } - } -} - -/// Prunes unreachable fallthrough values, setting them to None if the referenced -/// block was not otherwise reachable. -pub fn remove_unreachable_fallthroughs<'a>(hir: &mut HIR<'a>) { - let block_ids: HashSet = hir.blocks.keys().cloned().collect(); - - for block in hir.blocks.values_mut() { - block - .terminal - .value - .map_optional_fallthroughs(|fallthrough| { - if block_ids.contains(&fallthrough) { - Some(fallthrough) - } else { - None - } - }) - } -} - -/// Rewrites DoWhile statements into Gotos if the test block is not reachable -pub fn remove_unreachable_do_while_statements<'a>(hir: &mut HIR<'a>) { - let block_ids: HashSet = hir.blocks.keys().cloned().collect(); - - for block in hir.blocks.values_mut() { - if let TerminalValue::DoWhile(terminal) = &mut block.terminal.value { - if !block_ids.contains(&terminal.test) { - block.terminal.value = TerminalValue::Goto(forget_hir::GotoTerminal { - block: terminal.body, - kind: GotoKind::Break, - }); - } - } - } -} - -/// Updates the instruction ids for all instructions and blocks -/// Relies on the blocks being in reverse postorder to ensure that id ordering is correct -pub fn mark_instruction_ids<'a>(hir: &mut HIR<'a>) -> Result<(), Diagnostic> { - let mut id_gen = InstructionIdGenerator::new(); - let mut visited = HashSet::<(usize, usize)>::new(); - for (ii, block) in hir.blocks.values_mut().enumerate() { - let block_id = block.id; - for (jj, instr_ix) in block.instructions.iter_mut().enumerate() { - invariant(visited.insert((ii, jj)), || { - Diagnostic::invariant(BuildHIRError::BlockVisitedTwice { block: block_id }, None) - })?; - let instr = &mut hir.instructions[usize::from(*instr_ix)]; - instr.id = id_gen.next(); - } - block.terminal.id = id_gen.next(); - } - Ok(()) -} - -/// Updates the predecessors of each block -pub fn mark_predecessors<'a>(hir: &mut HIR<'a>) { - for block in hir.blocks.values_mut() { - block.predecessors.clear(); - } - let mut visited = HashSet::::with_capacity(hir.blocks.len()); - fn visit<'a>( - block_id: BlockId, - prev_id: Option, - hir: &mut HIR<'a>, - visited: &mut HashSet, - ) { - let block = hir.block_mut(block_id); - if let Some(prev_id) = prev_id { - block.predecessors.insert(prev_id); - } - if !visited.insert(block_id) { - return; - } - for successor in block.terminal.value.successors() { - visit(successor, Some(block_id), hir, visited) - } - } - visit(hir.entry, None, hir, &mut visited); -} diff --git a/compiler/forget/crates/forget_build_hir/src/error.rs b/compiler/forget/crates/forget_build_hir/src/error.rs index d8a00fd52d..954b0c30a9 100644 --- a/compiler/forget/crates/forget_build_hir/src/error.rs +++ b/compiler/forget/crates/forget_build_hir/src/error.rs @@ -1,4 +1,3 @@ -use forget_hir::BlockId; use thiserror::Error; /// Errors which can occur during HIR construction @@ -32,10 +31,6 @@ pub enum BuildHIRError { #[error("React functions may not reassign variables defined outside of the component or hook")] ReassignedGlobal, - /// ErrorSeverity::Invariant - #[error("Invariant: Expected block {block} not to have been visited yet")] - BlockVisitedTwice { block: BlockId }, - /// ErrorSeverity::InvalidSyntax #[error("Could not resolve a target for `break` statement")] UnresolvedBreakTarget, diff --git a/compiler/forget/crates/forget_build_hir/src/lib.rs b/compiler/forget/crates/forget_build_hir/src/lib.rs index 69632dcbd7..71210aa421 100644 --- a/compiler/forget/crates/forget_build_hir/src/lib.rs +++ b/compiler/forget/crates/forget_build_hir/src/lib.rs @@ -4,9 +4,4 @@ mod context; mod error; pub use build::build; -pub use builder::{ - initialize_hir, mark_instruction_ids, mark_predecessors, - remove_unreachable_do_while_statements, remove_unreachable_fallthroughs, - remove_unreachable_for_updates, reverse_postorder_blocks, -}; pub use error::*; diff --git a/compiler/forget/crates/forget_estree/src/generated.rs b/compiler/forget/crates/forget_estree/src/generated.rs index 1e8661b41c..474a658936 100644 --- a/compiler/forget/crates/forget_estree/src/generated.rs +++ b/compiler/forget/crates/forget_estree/src/generated.rs @@ -1,8 +1,6 @@ use std::num::NonZeroU32; - -use serde::{Deserialize, Serialize}; - -use crate::{Binding, JsValue, SourceRange}; +use serde::{Serialize, Deserialize}; +use crate::{JsValue, Binding, SourceRange}; #[derive(Serialize, Deserialize, Clone, Debug)] pub struct SourceLocation { pub source: Option, @@ -669,134 +667,167 @@ impl<'de> serde::Deserialize<'de> for Statement { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__StatementTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __StatementTag, + >::new("type", "Pattern"), )?; match tagged.0 { __StatementTag::BlockStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::BlockStatement(node)) } __StatementTag::BreakStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::BreakStatement(node)) } __StatementTag::ContinueStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::ContinueStatement(node)) } __StatementTag::DebuggerStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::DebuggerStatement(node)) } __StatementTag::DoWhileStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::DoWhileStatement(node)) } __StatementTag::EmptyStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::EmptyStatement(node)) } __StatementTag::ExpressionStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::ExpressionStatement(node)) } __StatementTag::ForInStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::ForInStatement(node)) } __StatementTag::ForOfStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::ForOfStatement(node)) } __StatementTag::ForStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::ForStatement(node)) } __StatementTag::FunctionDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::FunctionDeclaration(node)) } __StatementTag::IfStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::IfStatement(node)) } __StatementTag::LabeledStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::LabeledStatement(node)) } __StatementTag::ReturnStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::ReturnStatement(node)) } __StatementTag::SwitchStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::SwitchStatement(node)) } __StatementTag::ThrowStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::ThrowStatement(node)) } __StatementTag::TryStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::TryStatement(node)) } __StatementTag::VariableDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Statement::VariableDeclaration(node)) } __StatementTag::WhileStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::WhileStatement(node)) } __StatementTag::WithStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Statement::WithStatement(node)) @@ -856,132 +887,159 @@ impl<'de> serde::Deserialize<'de> for Expression { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ExpressionTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __ExpressionTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ExpressionTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::ArrayExpression(node)) } __ExpressionTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::ArrowFunctionExpression(node)) } __ExpressionTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::AssignmentExpression(node)) } __ExpressionTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::BinaryExpression(node)) } __ExpressionTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Expression::CallExpression(node)) } __ExpressionTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::ConditionalExpression(node)) } __ExpressionTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::FunctionExpression(node)) } __ExpressionTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Expression::Identifier(node)) } __ExpressionTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Expression::Literal(node)) } __ExpressionTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::LogicalExpression(node)) } __ExpressionTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::MemberExpression(node)) } __ExpressionTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Expression::NewExpression(node)) } __ExpressionTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::ObjectExpression(node)) } __ExpressionTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::SequenceExpression(node)) } __ExpressionTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Expression::ThisExpression(node)) } __ExpressionTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::UnaryExpression(node)) } __ExpressionTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::UpdateExpression(node)) } __ExpressionTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(Expression::YieldExpression(node)) } __ExpressionTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Expression::JSXElement(node)) @@ -1009,30 +1067,33 @@ impl<'de> serde::Deserialize<'de> for ImportDeclarationSpecifier { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ImportDeclarationSpecifierTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __ImportDeclarationSpecifierTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ImportDeclarationSpecifierTag::ImportSpecifier => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ImportDeclarationSpecifier::ImportSpecifier(node)) } __ImportDeclarationSpecifierTag::ImportDefaultSpecifier => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ImportDeclarationSpecifier::ImportDefaultSpecifier(node)) } __ImportDeclarationSpecifierTag::ImportNamespaceSpecifier => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ImportDeclarationSpecifier::ImportNamespaceSpecifier(node)) } } @@ -1075,143 +1136,179 @@ impl<'de> serde::Deserialize<'de> for ModuleItem { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ModuleItemTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __ModuleItemTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ModuleItemTag::ImportDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ModuleItem::ImportOrExportDeclaration( - ImportOrExportDeclaration::ImportDeclaration(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + ModuleItem::ImportOrExportDeclaration( + ImportOrExportDeclaration::ImportDeclaration(node), + ), + ) } __ModuleItemTag::BlockStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::BlockStatement(node))) } __ModuleItemTag::BreakStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::BreakStatement(node))) } __ModuleItemTag::ContinueStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::ContinueStatement(node))) } __ModuleItemTag::DebuggerStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::DebuggerStatement(node))) } __ModuleItemTag::DoWhileStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::DoWhileStatement(node))) } __ModuleItemTag::EmptyStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::EmptyStatement(node))) } __ModuleItemTag::ExpressionStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::ExpressionStatement(node))) } __ModuleItemTag::ForInStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::ForInStatement(node))) } __ModuleItemTag::ForOfStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::ForOfStatement(node))) } __ModuleItemTag::ForStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::ForStatement(node))) } __ModuleItemTag::FunctionDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::FunctionDeclaration(node))) } __ModuleItemTag::IfStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::IfStatement(node))) } __ModuleItemTag::LabeledStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::LabeledStatement(node))) } __ModuleItemTag::ReturnStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::ReturnStatement(node))) } __ModuleItemTag::SwitchStatement => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::SwitchStatement(node))) } __ModuleItemTag::ThrowStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::ThrowStatement(node))) } __ModuleItemTag::TryStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::TryStatement(node))) } __ModuleItemTag::VariableDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ModuleItem::Statement(Statement::VariableDeclaration(node))) } __ModuleItemTag::WhileStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::WhileStatement(node))) } __ModuleItemTag::WithStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ModuleItem::Statement(Statement::WithStatement(node))) @@ -1235,16 +1332,17 @@ impl<'de> serde::Deserialize<'de> for ImportOrExportDeclaration { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ImportOrExportDeclarationTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __ImportOrExportDeclarationTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ImportOrExportDeclarationTag::ImportDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ImportOrExportDeclaration::ImportDeclaration(node)) } } @@ -1286,172 +1384,175 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSuper { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ExpressionOrSuperTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __ExpressionOrSuperTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ExpressionOrSuperTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::ArrayExpression( - node, - ))) - } - __ExpressionOrSuperTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression( - Expression::ArrowFunctionExpression(node), - )) - } - __ExpressionOrSuperTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression( - Expression::AssignmentExpression(node), - )) - } - __ExpressionOrSuperTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::BinaryExpression( - node, - ))) - } - __ExpressionOrSuperTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(ExpressionOrSuper::Expression(Expression::CallExpression( - node, - ))) + Ok(ExpressionOrSuper::Expression(Expression::ArrayExpression(node))) + } + __ExpressionOrSuperTag::ArrowFunctionExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + ExpressionOrSuper::Expression( + Expression::ArrowFunctionExpression(node), + ), + ) + } + __ExpressionOrSuperTag::AssignmentExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::AssignmentExpression(node))) + } + __ExpressionOrSuperTag::BinaryExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::BinaryExpression(node))) + } + __ExpressionOrSuperTag::CallExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::CallExpression(node))) } __ExpressionOrSuperTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression( - Expression::ConditionalExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + ExpressionOrSuper::Expression( + Expression::ConditionalExpression(node), + ), + ) } __ExpressionOrSuperTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression( - Expression::FunctionExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::FunctionExpression(node))) } __ExpressionOrSuperTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSuper::Expression(Expression::Identifier(node))) } __ExpressionOrSuperTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSuper::Expression(Expression::Literal(node))) } __ExpressionOrSuperTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression( - Expression::LogicalExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::LogicalExpression(node))) } __ExpressionOrSuperTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::MemberExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::MemberExpression(node))) } __ExpressionOrSuperTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(ExpressionOrSuper::Expression(Expression::NewExpression( - node, - ))) + Ok(ExpressionOrSuper::Expression(Expression::NewExpression(node))) } __ExpressionOrSuperTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::ObjectExpression( - node, - ))) - } - __ExpressionOrSuperTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression( - Expression::SequenceExpression(node), - )) - } - __ExpressionOrSuperTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(ExpressionOrSuper::Expression(Expression::ThisExpression( - node, - ))) + Ok(ExpressionOrSuper::Expression(Expression::ObjectExpression(node))) + } + __ExpressionOrSuperTag::SequenceExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::SequenceExpression(node))) + } + __ExpressionOrSuperTag::ThisExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::ThisExpression(node))) } __ExpressionOrSuperTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::UnaryExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::UnaryExpression(node))) } __ExpressionOrSuperTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::UpdateExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::UpdateExpression(node))) } __ExpressionOrSuperTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSuper::Expression(Expression::YieldExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSuper::Expression(Expression::YieldExpression(node))) } __ExpressionOrSuperTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSuper::Expression(Expression::JSXElement(node))) } __ExpressionOrSuperTag::Super => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSuper::Super(node)) @@ -1495,172 +1596,179 @@ impl<'de> serde::Deserialize<'de> for ExpressionOrSpread { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ExpressionOrSpreadTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __ExpressionOrSpreadTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ExpressionOrSpreadTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression(Expression::ArrayExpression( - node, - ))) - } - __ExpressionOrSpreadTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::ArrowFunctionExpression(node), - )) - } - __ExpressionOrSpreadTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::AssignmentExpression(node), - )) - } - __ExpressionOrSpreadTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::BinaryExpression(node), - )) - } - __ExpressionOrSpreadTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(ExpressionOrSpread::Expression(Expression::CallExpression( - node, - ))) + Ok(ExpressionOrSpread::Expression(Expression::ArrayExpression(node))) + } + __ExpressionOrSpreadTag::ArrowFunctionExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + ExpressionOrSpread::Expression( + Expression::ArrowFunctionExpression(node), + ), + ) + } + __ExpressionOrSpreadTag::AssignmentExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + ExpressionOrSpread::Expression( + Expression::AssignmentExpression(node), + ), + ) + } + __ExpressionOrSpreadTag::BinaryExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::BinaryExpression(node))) + } + __ExpressionOrSpreadTag::CallExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::CallExpression(node))) } __ExpressionOrSpreadTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::ConditionalExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + ExpressionOrSpread::Expression( + Expression::ConditionalExpression(node), + ), + ) } __ExpressionOrSpreadTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::FunctionExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::FunctionExpression(node))) } __ExpressionOrSpreadTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSpread::Expression(Expression::Identifier(node))) } __ExpressionOrSpreadTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSpread::Expression(Expression::Literal(node))) } __ExpressionOrSpreadTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::LogicalExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::LogicalExpression(node))) } __ExpressionOrSpreadTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::MemberExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::MemberExpression(node))) } __ExpressionOrSpreadTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(ExpressionOrSpread::Expression(Expression::NewExpression( - node, - ))) + Ok(ExpressionOrSpread::Expression(Expression::NewExpression(node))) } __ExpressionOrSpreadTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::ObjectExpression(node), - )) - } - __ExpressionOrSpreadTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::SequenceExpression(node), - )) - } - __ExpressionOrSpreadTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(ExpressionOrSpread::Expression(Expression::ThisExpression( - node, - ))) + Ok(ExpressionOrSpread::Expression(Expression::ObjectExpression(node))) + } + __ExpressionOrSpreadTag::SequenceExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::SequenceExpression(node))) + } + __ExpressionOrSpreadTag::ThisExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::ThisExpression(node))) } __ExpressionOrSpreadTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression(Expression::UnaryExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::UnaryExpression(node))) } __ExpressionOrSpreadTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression( - Expression::UpdateExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::UpdateExpression(node))) } __ExpressionOrSpreadTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ExpressionOrSpread::Expression(Expression::YieldExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ExpressionOrSpread::Expression(Expression::YieldExpression(node))) } __ExpressionOrSpreadTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSpread::Expression(Expression::JSXElement(node))) } __ExpressionOrSpreadTag::SpreadElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ExpressionOrSpread::SpreadElement(node)) @@ -1704,150 +1812,167 @@ impl<'de> serde::Deserialize<'de> for FunctionBody { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__FunctionBodyTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __FunctionBodyTag, + >::new("type", "Pattern"), )?; match tagged.0 { __FunctionBodyTag::BlockStatement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::BlockStatement(node)) } __FunctionBodyTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::ArrayExpression(node))) } __FunctionBodyTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(FunctionBody::Expression( - Expression::ArrowFunctionExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(FunctionBody::Expression(Expression::ArrowFunctionExpression(node))) } __FunctionBodyTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(FunctionBody::Expression(Expression::AssignmentExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(FunctionBody::Expression(Expression::AssignmentExpression(node))) } __FunctionBodyTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::BinaryExpression(node))) } __FunctionBodyTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::Expression(Expression::CallExpression(node))) } __FunctionBodyTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(FunctionBody::Expression(Expression::ConditionalExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(FunctionBody::Expression(Expression::ConditionalExpression(node))) } __FunctionBodyTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(FunctionBody::Expression(Expression::FunctionExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(FunctionBody::Expression(Expression::FunctionExpression(node))) } __FunctionBodyTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::Expression(Expression::Identifier(node))) } __FunctionBodyTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::Expression(Expression::Literal(node))) } __FunctionBodyTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(FunctionBody::Expression(Expression::LogicalExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(FunctionBody::Expression(Expression::LogicalExpression(node))) } __FunctionBodyTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::MemberExpression(node))) } __FunctionBodyTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::Expression(Expression::NewExpression(node))) } __FunctionBodyTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::ObjectExpression(node))) } __FunctionBodyTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(FunctionBody::Expression(Expression::SequenceExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(FunctionBody::Expression(Expression::SequenceExpression(node))) } __FunctionBodyTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::Expression(Expression::ThisExpression(node))) } __FunctionBodyTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::UnaryExpression(node))) } __FunctionBodyTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::UpdateExpression(node))) } __FunctionBodyTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(FunctionBody::Expression(Expression::YieldExpression(node))) } __FunctionBodyTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(FunctionBody::Expression(Expression::JSXElement(node))) @@ -1871,11 +1996,15 @@ impl<'de> serde::Deserialize<'de> for Pattern { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__PatternTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __PatternTag, + >::new("type", "Pattern"), )?; match tagged.0 { __PatternTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(Pattern::Identifier(node)) @@ -1919,143 +2048,169 @@ impl<'de> serde::Deserialize<'de> for ForInit { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ForInitTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __ForInitTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ForInitTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::ArrayExpression(node))) } __ForInitTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(ForInit::Expression(Expression::ArrowFunctionExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(ForInit::Expression(Expression::ArrowFunctionExpression(node))) } __ForInitTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::AssignmentExpression(node))) } __ForInitTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::BinaryExpression(node))) } __ForInitTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInit::Expression(Expression::CallExpression(node))) } __ForInitTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::ConditionalExpression(node))) } __ForInitTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::FunctionExpression(node))) } __ForInitTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInit::Expression(Expression::Identifier(node))) } __ForInitTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInit::Expression(Expression::Literal(node))) } __ForInitTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::LogicalExpression(node))) } __ForInitTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::MemberExpression(node))) } __ForInitTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInit::Expression(Expression::NewExpression(node))) } __ForInitTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::ObjectExpression(node))) } __ForInitTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::SequenceExpression(node))) } __ForInitTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInit::Expression(Expression::ThisExpression(node))) } __ForInitTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::UnaryExpression(node))) } __ForInitTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::UpdateExpression(node))) } __ForInitTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::Expression(Expression::YieldExpression(node))) } __ForInitTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInit::Expression(Expression::JSXElement(node))) } __ForInitTag::VariableDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInit::VariableDeclaration(node)) } } @@ -2079,20 +2234,25 @@ impl<'de> serde::Deserialize<'de> for ForInInit { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__ForInInitTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __ForInInitTag, + >::new("type", "Pattern"), )?; match tagged.0 { __ForInInitTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(ForInInit::Pattern(Pattern::Identifier(node))) } __ForInInitTag::VariableDeclaration => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(ForInInit::VariableDeclaration(node)) } } @@ -2116,17 +2276,23 @@ impl<'de> serde::Deserialize<'de> for PropertyKey { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__PropertyKeyTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __PropertyKeyTag, + >::new("type", "Pattern"), )?; match tagged.0 { __PropertyKeyTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(PropertyKey::Identifier(node)) } __PropertyKeyTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(PropertyKey::Literal(node)) @@ -2169,166 +2335,163 @@ impl<'de> serde::Deserialize<'de> for AssignmentTarget { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__AssignmentTargetTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __AssignmentTargetTag, + >::new("type", "Pattern"), )?; match tagged.0 { __AssignmentTargetTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::ArrayExpression( - node, - ))) - } - __AssignmentTargetTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression( - Expression::ArrowFunctionExpression(node), - )) - } - __AssignmentTargetTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression( - Expression::AssignmentExpression(node), - )) - } - __AssignmentTargetTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::BinaryExpression( - node, - ))) - } - __AssignmentTargetTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(AssignmentTarget::Expression(Expression::CallExpression( - node, - ))) + Ok(AssignmentTarget::Expression(Expression::ArrayExpression(node))) + } + __AssignmentTargetTag::ArrowFunctionExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + AssignmentTarget::Expression( + Expression::ArrowFunctionExpression(node), + ), + ) + } + __AssignmentTargetTag::AssignmentExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::AssignmentExpression(node))) + } + __AssignmentTargetTag::BinaryExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::BinaryExpression(node))) + } + __AssignmentTargetTag::CallExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::CallExpression(node))) } __AssignmentTargetTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression( - Expression::ConditionalExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::ConditionalExpression(node))) } __AssignmentTargetTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression( - Expression::FunctionExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::FunctionExpression(node))) } __AssignmentTargetTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(AssignmentTarget::Expression(Expression::Identifier(node))) } __AssignmentTargetTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(AssignmentTarget::Expression(Expression::Literal(node))) } __AssignmentTargetTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::LogicalExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::LogicalExpression(node))) } __AssignmentTargetTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::MemberExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::MemberExpression(node))) } __AssignmentTargetTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(AssignmentTarget::Expression(Expression::NewExpression( - node, - ))) + Ok(AssignmentTarget::Expression(Expression::NewExpression(node))) } __AssignmentTargetTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::ObjectExpression( - node, - ))) - } - __AssignmentTargetTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression( - Expression::SequenceExpression(node), - )) - } - __AssignmentTargetTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(AssignmentTarget::Expression(Expression::ThisExpression( - node, - ))) + Ok(AssignmentTarget::Expression(Expression::ObjectExpression(node))) + } + __AssignmentTargetTag::SequenceExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::SequenceExpression(node))) + } + __AssignmentTargetTag::ThisExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::ThisExpression(node))) } __AssignmentTargetTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::UnaryExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::UnaryExpression(node))) } __AssignmentTargetTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::UpdateExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::UpdateExpression(node))) } __AssignmentTargetTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(AssignmentTarget::Expression(Expression::YieldExpression( - node, - ))) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(AssignmentTarget::Expression(Expression::YieldExpression(node))) } __AssignmentTargetTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(AssignmentTarget::Expression(Expression::JSXElement(node))) @@ -2354,20 +2517,23 @@ impl<'de> serde::Deserialize<'de> for JSXMemberExpressionOrIdentifier { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXMemberExpressionOrIdentifierTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __JSXMemberExpressionOrIdentifierTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXMemberExpressionOrIdentifierTag::JSXMemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXMemberExpressionOrIdentifier::JSXMemberExpression(node)) } __JSXMemberExpressionOrIdentifierTag::JSXIdentifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXMemberExpressionOrIdentifier::JSXIdentifier(node)) @@ -2411,179 +2577,189 @@ impl<'de> serde::Deserialize<'de> for JSXExpressionOrEmpty { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXExpressionOrEmptyTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __JSXExpressionOrEmptyTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXExpressionOrEmptyTag::ArrayExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::ArrayExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::ArrayExpression(node))) } __JSXExpressionOrEmptyTag::ArrowFunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::ArrowFunctionExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + JSXExpressionOrEmpty::Expression( + Expression::ArrowFunctionExpression(node), + ), + ) } __JSXExpressionOrEmptyTag::AssignmentExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::AssignmentExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + JSXExpressionOrEmpty::Expression( + Expression::AssignmentExpression(node), + ), + ) } __JSXExpressionOrEmptyTag::BinaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::BinaryExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::BinaryExpression(node))) } __JSXExpressionOrEmptyTag::CallExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::CallExpression(node), - )) + Ok(JSXExpressionOrEmpty::Expression(Expression::CallExpression(node))) } __JSXExpressionOrEmptyTag::ConditionalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::ConditionalExpression(node), - )) - } - __JSXExpressionOrEmptyTag::FunctionExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::FunctionExpression(node), - )) - } - __JSXExpressionOrEmptyTag::Identifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(JSXExpressionOrEmpty::Expression(Expression::Identifier( - node, - ))) + Ok( + JSXExpressionOrEmpty::Expression( + Expression::ConditionalExpression(node), + ), + ) + } + __JSXExpressionOrEmptyTag::FunctionExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + JSXExpressionOrEmpty::Expression( + Expression::FunctionExpression(node), + ), + ) + } + __JSXExpressionOrEmptyTag::Identifier => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::Identifier(node))) } __JSXExpressionOrEmptyTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXExpressionOrEmpty::Expression(Expression::Literal(node))) } __JSXExpressionOrEmptyTag::LogicalExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::LogicalExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::LogicalExpression(node))) } __JSXExpressionOrEmptyTag::MemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::MemberExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::MemberExpression(node))) } __JSXExpressionOrEmptyTag::NewExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(JSXExpressionOrEmpty::Expression(Expression::NewExpression( - node, - ))) + Ok(JSXExpressionOrEmpty::Expression(Expression::NewExpression(node))) } __JSXExpressionOrEmptyTag::ObjectExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::ObjectExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::ObjectExpression(node))) } __JSXExpressionOrEmptyTag::SequenceExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::SequenceExpression(node), - )) + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok( + JSXExpressionOrEmpty::Expression( + Expression::SequenceExpression(node), + ), + ) } __JSXExpressionOrEmptyTag::ThisExpression => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::ThisExpression(node), - )) + Ok(JSXExpressionOrEmpty::Expression(Expression::ThisExpression(node))) } __JSXExpressionOrEmptyTag::UnaryExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::UnaryExpression(node), - )) - } - __JSXExpressionOrEmptyTag::UpdateExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::UpdateExpression(node), - )) - } - __JSXExpressionOrEmptyTag::YieldExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; - Ok(JSXExpressionOrEmpty::Expression( - Expression::YieldExpression(node), - )) - } - __JSXExpressionOrEmptyTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; - Ok(JSXExpressionOrEmpty::Expression(Expression::JSXElement( - node, - ))) + Ok(JSXExpressionOrEmpty::Expression(Expression::UnaryExpression(node))) + } + __JSXExpressionOrEmptyTag::UpdateExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::UpdateExpression(node))) + } + __JSXExpressionOrEmptyTag::YieldExpression => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::YieldExpression(node))) + } + __JSXExpressionOrEmptyTag::JSXElement => { + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; + Ok(JSXExpressionOrEmpty::Expression(Expression::JSXElement(node))) } __JSXExpressionOrEmptyTag::JSXEmptyExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXExpressionOrEmpty::JSXEmptyExpression(node)) } } @@ -2607,22 +2783,25 @@ impl<'de> serde::Deserialize<'de> for JSXAttributeOrSpread { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXAttributeOrSpreadTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __JSXAttributeOrSpreadTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXAttributeOrSpreadTag::JSXAttribute => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXAttributeOrSpread::JSXAttribute(node)) } __JSXAttributeOrSpreadTag::JSXSpreadAttribute => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXAttributeOrSpread::JSXSpreadAttribute(node)) } } @@ -2650,32 +2829,39 @@ impl<'de> serde::Deserialize<'de> for JSXAttributeValue { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXAttributeValueTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __JSXAttributeValueTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXAttributeValueTag::Literal => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXAttributeValue::Literal(node)) } __JSXAttributeValueTag::JSXExpressionContainer => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXAttributeValue::JSXExpressionContainer(node)) } __JSXAttributeValueTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXAttributeValue::JSXElement(node)) } __JSXAttributeValueTag::JSXFragment => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXAttributeValue::JSXFragment(node)) @@ -2703,29 +2889,33 @@ impl<'de> serde::Deserialize<'de> for JSXElementName { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXElementNameTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __JSXElementNameTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXElementNameTag::JSXIdentifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXElementName::JSXIdentifier(node)) } __JSXElementNameTag::JSXMemberExpression => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXElementName::JSXMemberExpression(node)) } __JSXElementNameTag::JSXNamespacedName => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXElementName::JSXNamespacedName(node)) } } @@ -2749,22 +2939,25 @@ impl<'de> serde::Deserialize<'de> for JSXIdentifierOrNamespacedName { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXIdentifierOrNamespacedNameTag>::new( - "type", "Pattern", - ), + serde::__private::de::TaggedContentVisitor::< + __JSXIdentifierOrNamespacedNameTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXIdentifierOrNamespacedNameTag::JSXIdentifier => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXIdentifierOrNamespacedName::JSXIdentifier(node)) } __JSXIdentifierOrNamespacedNameTag::JSXNamespacedName => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXIdentifierOrNamespacedName::JSXNamespacedName(node)) } } @@ -2794,36 +2987,47 @@ impl<'de> serde::Deserialize<'de> for JSXChildItem { { let tagged = serde::Deserializer::deserialize_any( deserializer, - serde::__private::de::TaggedContentVisitor::<__JSXChildItemTag>::new("type", "Pattern"), + serde::__private::de::TaggedContentVisitor::< + __JSXChildItemTag, + >::new("type", "Pattern"), )?; match tagged.0 { __JSXChildItemTag::JSXText => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXChildItem::JSXText(node)) } __JSXChildItemTag::JSXExpressionContainer => { - let node: Box = - as Deserialize>::deserialize( - serde::__private::de::ContentDeserializer::::new(tagged.1), - )?; + let node: Box = as Deserialize>::deserialize( + serde::__private::de::ContentDeserializer::::new(tagged.1), + )?; Ok(JSXChildItem::JSXExpressionContainer(node)) } __JSXChildItemTag::JSXSpreadChild => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXChildItem::JSXSpreadChild(node)) } __JSXChildItemTag::JSXElement => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXChildItem::JSXElement(node)) } __JSXChildItemTag::JSXFragment => { - let node: Box = as Deserialize>::deserialize( + let node: Box = as Deserialize>::deserialize( serde::__private::de::ContentDeserializer::::new(tagged.1), )?; Ok(JSXChildItem::JSXFragment(node)) diff --git a/compiler/forget/crates/forget_hir/Cargo.toml b/compiler/forget/crates/forget_hir/Cargo.toml index fc30a10baa..6b994c18ce 100644 --- a/compiler/forget/crates/forget_hir/Cargo.toml +++ b/compiler/forget/crates/forget_hir/Cargo.toml @@ -18,3 +18,5 @@ forget_estree = { workspace = true } indexmap = { workspace = true } serde = { workspace = true } forget_utils = { workspace = true } +forget_diagnostics = { workspace = true } +thiserror = { workspace = true } diff --git a/compiler/forget/crates/forget_hir/src/initialize.rs b/compiler/forget/crates/forget_hir/src/initialize.rs new file mode 100644 index 0000000000..4de30fe62b --- /dev/null +++ b/compiler/forget/crates/forget_hir/src/initialize.rs @@ -0,0 +1,174 @@ +use std::collections::HashSet; + +use forget_diagnostics::{invariant, Diagnostic}; +use indexmap::IndexMap; +use thiserror::Error; + +use crate::{BlockId, GotoKind, GotoTerminal, InstructionIdGenerator, TerminalValue, HIR}; + +/// Runs a variety of passes to put the HIR in canonical form. This should be called +/// after initial HIR construction and after any transformations that change the +/// shape of the control-flow graph. +pub fn initialize_hir<'a>(hir: &mut HIR<'a>) -> Result<(), Diagnostic> { + reverse_postorder_blocks(hir); + remove_unreachable_for_updates(hir); + remove_unreachable_fallthroughs(hir); + remove_unreachable_do_while_statements(hir); + mark_instruction_ids(hir)?; + mark_predecessors(hir); + Ok(()) +} + +/// Modifies the HIR to put the blocks in reverse postorder, with predecessors before +/// successors (except for the case of loops) +pub fn reverse_postorder_blocks<'a>(hir: &mut HIR<'a>) { + let mut visited = HashSet::::with_capacity(hir.blocks.len()); + let mut postorder = std::vec::Vec::::with_capacity(hir.blocks.len()); + fn visit<'a>( + block_id: BlockId, + hir: &HIR<'a>, + visited: &mut HashSet, + postorder: &mut std::vec::Vec, + ) { + if !visited.insert(block_id) { + // already visited + return; + } + let block = hir.block(block_id); + let terminal = &block.terminal; + match &terminal.value { + TerminalValue::Branch(terminal) => { + visit(terminal.alternate, hir, visited, postorder); + visit(terminal.consequent, hir, visited, postorder); + } + TerminalValue::If(terminal) => { + visit(terminal.alternate, hir, visited, postorder); + visit(terminal.consequent, hir, visited, postorder); + } + TerminalValue::For(terminal) => { + visit(terminal.init, hir, visited, postorder); + } + TerminalValue::DoWhile(terminal) => { + visit(terminal.body, hir, visited, postorder); + } + TerminalValue::Goto(terminal) => { + visit(terminal.block, hir, visited, postorder); + } + TerminalValue::Return(..) => { /* no-op */ } + TerminalValue::Unsupported(..) => { + panic!("Unexpected unsupported terminal") + } + } + postorder.push(block_id); + } + visit(hir.entry, &hir, &mut visited, &mut postorder); + + // NOTE: could consider sorting the blocks in-place by key + let mut blocks = IndexMap::with_capacity(hir.blocks.len()); + for id in postorder.iter().rev().cloned() { + blocks.insert(id, hir.blocks.remove(&id).unwrap()); + } + + hir.blocks = blocks; +} + +/// Prunes ForTerminal.update values (sets to None) if they are unreachable +pub fn remove_unreachable_for_updates<'a>(hir: &mut HIR<'a>) { + let block_ids: HashSet = hir.blocks.keys().cloned().collect(); + + for block in hir.blocks.values_mut() { + if let TerminalValue::For(terminal) = &mut block.terminal.value { + if let Some(update) = terminal.update { + if !block_ids.contains(&update) { + terminal.update = None; + } + } + } + } +} + +/// Prunes unreachable fallthrough values, setting them to None if the referenced +/// block was not otherwise reachable. +pub fn remove_unreachable_fallthroughs<'a>(hir: &mut HIR<'a>) { + let block_ids: HashSet = hir.blocks.keys().cloned().collect(); + + for block in hir.blocks.values_mut() { + block + .terminal + .value + .map_optional_fallthroughs(|fallthrough| { + if block_ids.contains(&fallthrough) { + Some(fallthrough) + } else { + None + } + }) + } +} + +/// Rewrites DoWhile statements into Gotos if the test block is not reachable +pub fn remove_unreachable_do_while_statements<'a>(hir: &mut HIR<'a>) { + let block_ids: HashSet = hir.blocks.keys().cloned().collect(); + + for block in hir.blocks.values_mut() { + if let TerminalValue::DoWhile(terminal) = &mut block.terminal.value { + if !block_ids.contains(&terminal.test) { + block.terminal.value = TerminalValue::Goto(GotoTerminal { + block: terminal.body, + kind: GotoKind::Break, + }); + } + } + } +} + +/// Updates the instruction ids for all instructions and blocks +/// Relies on the blocks being in reverse postorder to ensure that id ordering is correct +pub fn mark_instruction_ids<'a>(hir: &mut HIR<'a>) -> Result<(), Diagnostic> { + let mut id_gen = InstructionIdGenerator::new(); + let mut visited = HashSet::<(usize, usize)>::new(); + for (ii, block) in hir.blocks.values_mut().enumerate() { + let block_id = block.id; + for (jj, instr_ix) in block.instructions.iter_mut().enumerate() { + invariant(visited.insert((ii, jj)), || { + Diagnostic::invariant(BlockVisitedTwice { block: block_id }, None) + })?; + let instr = &mut hir.instructions[usize::from(*instr_ix)]; + instr.id = id_gen.next(); + } + block.terminal.id = id_gen.next(); + } + Ok(()) +} + +#[derive(Error, Debug)] +#[error("Invariant: Expected block {block} not to have been visited yet")] +pub struct BlockVisitedTwice { + block: BlockId, +} + +/// Updates the predecessors of each block +pub fn mark_predecessors<'a>(hir: &mut HIR<'a>) { + for block in hir.blocks.values_mut() { + block.predecessors.clear(); + } + let mut visited = HashSet::::with_capacity(hir.blocks.len()); + fn visit<'a>( + block_id: BlockId, + prev_id: Option, + hir: &mut HIR<'a>, + visited: &mut HashSet, + ) { + let block = hir.block_mut(block_id); + if let Some(prev_id) = prev_id { + block.predecessors.insert(prev_id); + } + if !visited.insert(block_id) { + return; + } + for successor in block.terminal.value.successors() { + visit(successor, Some(block_id), hir, visited) + } + } + visit(hir.entry, None, hir, &mut visited); +} diff --git a/compiler/forget/crates/forget_hir/src/lib.rs b/compiler/forget/crates/forget_hir/src/lib.rs index 9c81353c99..5fc409fa4c 100644 --- a/compiler/forget/crates/forget_hir/src/lib.rs +++ b/compiler/forget/crates/forget_hir/src/lib.rs @@ -3,6 +3,7 @@ mod environment; mod features; mod function; mod id_types; +mod initialize; mod instruction; mod print; mod registry; @@ -14,6 +15,11 @@ pub use environment::*; pub use features::*; pub use function::*; pub use id_types::*; +pub use initialize::{ + initialize_hir, mark_instruction_ids, mark_predecessors, + remove_unreachable_do_while_statements, remove_unreachable_fallthroughs, + remove_unreachable_for_updates, reverse_postorder_blocks, +}; pub use instruction::*; pub use print::Print; pub use registry::Registry; diff --git a/compiler/forget/crates/forget_optimization/src/constant_propagation.rs b/compiler/forget/crates/forget_optimization/src/constant_propagation.rs index 4f3a0305ea..cb1faf1296 100644 --- a/compiler/forget/crates/forget_optimization/src/constant_propagation.rs +++ b/compiler/forget/crates/forget_optimization/src/constant_propagation.rs @@ -1,10 +1,9 @@ use std::collections::HashMap; -use forget_build_hir::initialize_hir; use forget_estree::BinaryOperator; use forget_hir::{ - BlockKind, Environment, Function, GotoKind, GotoTerminal, IdentifierId, Instruction, - InstructionValue, LoadGlobal, Operand, Primitive, PrimitiveValue, TerminalValue, + initialize_hir, BlockKind, Environment, Function, GotoKind, GotoTerminal, IdentifierId, + Instruction, InstructionValue, LoadGlobal, Operand, Primitive, PrimitiveValue, TerminalValue, }; use forget_ssa::eliminate_redundant_phis;