use crate::ast::node::call_expression::*; use crate::ast::node::class::*; use crate::ast::node::closure::*; use crate::ast::node::compilation_unit::*; use crate::ast::node::d_string::*; use crate::ast::node::expression::*; use crate::ast::node::function::*; use crate::ast::node::generics::*; use crate::ast::node::implements_list::*; use crate::ast::node::interface::*; use crate::ast::node::level::*; use crate::ast::node::literal::*; use crate::ast::node::module::*; use crate::ast::node::names::*; use crate::ast::node::object_access::*; use crate::ast::node::statement::*; use crate::ast::node::tuple_arguments::*; use crate::ast::node::type_use::*; use crate::ast::node::use_statement::*; pub enum NodeRef<'a> { Identifier(&'a Identifier), FullyQualifiedName(&'a FullyQualifiedName), TypeUse(&'a TypeUse), PrimitiveTypeUse(&'a PrimitiveTypeUse), InterfaceOrClassTypeUse(&'a InterfaceOrClassTypeUse), TupleTypeUse(&'a TupleTypeUse), FunctionTypeUse(&'a FunctionTypeUse), GenericArguments(&'a GenericArguments), GenericParameters(&'a GenericParameters), TupleArguments(&'a TupleArguments), ImplementsList(&'a ImplementsList), Parameters(&'a Parameters), Parameter(&'a Parameter), ReturnType(&'a ReturnType), References(&'a References), CompilationUnit(&'a CompilationUnit), UseStatement(&'a UseStatement), ModuleLevelDeclaration(&'a ModuleLevelDeclaration), InterfaceLevelDeclaration(&'a InterfaceLevelDeclaration), ClassLevelDeclaration(&'a ClassLevelDeclaration), ModuleDeclaration(&'a ModuleDeclaration), InterfaceDeclaration(&'a InterfaceDeclaration), ClassDeclaration(&'a ClassDeclaration), FunctionDefinition(&'a FunctionDefinition), OperatorFunctionDefinition(&'a OperatorFunctionDefinition), PlatformFunctionDeclaration(&'a PlatformFunctionDeclaration), InterfaceFunctionDeclaration(&'a InterfaceFunctionDeclaration), InterfaceOperatorFunctionDeclaration(&'a InterfaceOperatorFunctionDeclaration), FunctionBody(&'a FunctionBody), ClassConstructor(&'a ClassConstructor), ClassConstructorParameter(&'a ClassConstructorParameter), PropertyDeclaration(&'a PropertyDeclaration), FieldDeclaration(&'a FieldDeclaration), BlockStatement(&'a BlockStatement), Statement(&'a Statement), VariableDeclarationStatement(&'a VariableDeclarationStatement), AssignStatement(&'a AssignStatement), CallStatement(&'a CallStatement), ReturnStatement(&'a ReturnStatement), IfStatement(&'a IfStatement), IfElseStatement(&'a IfElseStatement), ElseIfs(&'a ElseIfs), ElseBlock(&'a ElseBlock), WhileStatement(&'a WhileStatement), ForStatement(&'a ForStatement), Expression(&'a Expression), TernaryExpression(&'a TernaryExpression), BinaryExpression(&'a BinaryExpression), PrefixExpression(&'a PrefixExpression), SuffixExpression(&'a SuffixExpression), CallExpression(&'a CallExpression), TurboFish(&'a TurboFish), CallArguments(&'a CallArguments), CallArgument(&'a CallArgument), Closure(&'a Closure), ClosureCaptures(&'a ClosureCaptures), ClosureCapture(&'a ClosureCapture), ClosureParameters(&'a ClosureParameters), ClosureParameter(&'a ClosureParameter), ObjectAccess(&'a ObjectAccess), ObjectNavigations(&'a ObjectNavigations), ObjectNavigation(&'a ObjectNavigation), Literal(&'a Literal), DString(&'a DString), DStringPart(&'a DStringPart), } pub trait NodeInner { fn children(&self) -> Vec; fn as_node_ref(&self) -> NodeRef; } impl NodeInner for Identifier { fn children(&self) -> Vec { vec![] } fn as_node_ref(&self) -> NodeRef { NodeRef::Identifier(self) } } impl NodeInner for FullyQualifiedName { fn children(&self) -> Vec { self.identifiers() .iter() .map(|id| NodeRef::Identifier(*id)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::FullyQualifiedName(self) } } impl NodeInner for TypeUse { fn children(&self) -> Vec { match self { TypeUse::Primitive(primitive_type_use) => primitive_type_use.children(), TypeUse::InterfaceOrClass(interface_or_class_type_use) => { interface_or_class_type_use.children() } TypeUse::Tuple(tuple_type_use) => tuple_type_use.children(), TypeUse::Function(function_type_use) => function_type_use.children(), } } fn as_node_ref(&self) -> NodeRef { NodeRef::TypeUse(self) } } impl NodeInner for PrimitiveTypeUse { fn children(&self) -> Vec { match self { PrimitiveTypeUse::Array(generics) => { if let Some(generics) = generics { vec![NodeRef::GenericArguments(&generics)] } else { vec![] } } _ => vec![], } } fn as_node_ref(&self) -> NodeRef { NodeRef::PrimitiveTypeUse(self) } } impl NodeInner for InterfaceOrClassTypeUse { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::FullyQualifiedName(self.fqn())); children.push(NodeRef::GenericArguments(self.generics())); children } fn as_node_ref(&self) -> NodeRef { NodeRef::InterfaceOrClassTypeUse(self) } } impl NodeInner for TupleTypeUse { fn children(&self) -> Vec { vec![NodeRef::TupleArguments(self.arguments())] } fn as_node_ref(&self) -> NodeRef { NodeRef::TupleTypeUse(self) } } impl NodeInner for FunctionTypeUse { fn children(&self) -> Vec { vec![ NodeRef::GenericParameters(self.generics()), NodeRef::Parameters(self.parameters()), NodeRef::ReturnType(self.return_type()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::FunctionTypeUse(self) } } impl NodeInner for GenericArguments { fn children(&self) -> Vec { self.arguments() .iter() .map(|type_use| NodeRef::TypeUse(*type_use)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::GenericArguments(self) } } impl NodeInner for GenericParameters { fn children(&self) -> Vec { self.identifiers() .iter() .map(|id| NodeRef::Identifier(*id)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::GenericParameters(self) } } impl NodeInner for TupleArguments { fn children(&self) -> Vec { self.type_uses() .iter() .map(|type_use| NodeRef::TypeUse(*type_use)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::TupleArguments(self) } } impl NodeInner for ImplementsList { fn children(&self) -> Vec { self.type_uses() .iter() .map(|type_use| NodeRef::TypeUse(*type_use)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::ImplementsList(self) } } impl NodeInner for Parameters { fn children(&self) -> Vec { self.parameters() .iter() .map(|parameter| NodeRef::Parameter(*parameter)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::Parameters(self) } } impl NodeInner for Parameter { fn children(&self) -> Vec { vec![ NodeRef::Identifier(self.identifier()), NodeRef::TypeUse(self.type_use()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::Parameter(self) } } impl NodeInner for ReturnType { fn children(&self) -> Vec { vec![ NodeRef::TypeUse(self.declared_type()), NodeRef::References(self.references()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::ReturnType(self) } } impl NodeInner for References { fn children(&self) -> Vec { self.identifiers() .iter() .map(|identifier| NodeRef::Identifier(*identifier)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::References(self) } } impl NodeInner for CompilationUnit { fn children(&self) -> Vec { let mut children = vec![]; if let Some(namespace) = self.namespace() { children.push(NodeRef::FullyQualifiedName(namespace)); } children.extend( self.use_statements() .iter() .map(|use_statement| NodeRef::UseStatement(*use_statement)), ); children.extend( self.declarations() .iter() .map(|declaration| NodeRef::ModuleLevelDeclaration(*declaration)), ); children } fn as_node_ref(&self) -> NodeRef { NodeRef::CompilationUnit(self) } } impl NodeInner for UseStatement { fn children(&self) -> Vec { let mut children = vec![]; match self { UseStatement::Concrete(concrete_use_statement) => children.extend( concrete_use_statement .identifiers() .iter() .map(|identifier| NodeRef::Identifier(*identifier)) ), UseStatement::Star(_) => {} } children } fn as_node_ref(&self) -> NodeRef { NodeRef::UseStatement(self) } } impl NodeInner for ModuleLevelDeclaration { fn children(&self) -> Vec { use crate::ast::node::level::ModuleLevelDeclaration::*; match self { Module(module_declaration) => module_declaration.children(), Interface(interface_declaration) => interface_declaration.children(), Class(class_declaration) => class_declaration.children(), Function(function_definition) => function_definition.children(), PlatformFunction(platform_function_declaration) => { platform_function_declaration.children() } } } fn as_node_ref(&self) -> NodeRef { NodeRef::ModuleLevelDeclaration(self) } } impl NodeInner for InterfaceLevelDeclaration { fn children(&self) -> Vec { use crate::ast::node::level::InterfaceLevelDeclaration::*; match self { Module(module_declaration) => module_declaration.children(), Interface(interface_declaration) => interface_declaration.children(), Class(class_declaration) => class_declaration.children(), Function(function_declaration) => function_declaration.children(), OperatorFunction(operator_function_declaration) => { operator_function_declaration.children() } } } fn as_node_ref(&self) -> NodeRef { NodeRef::InterfaceLevelDeclaration(self) } } impl NodeInner for ClassLevelDeclaration { fn children(&self) -> Vec { use crate::ast::node::level::ClassLevelDeclaration::*; match self { Module(module_declaration) => module_declaration.children(), Interface(interface_declaration) => interface_declaration.children(), Class(class_declaration) => class_declaration.children(), Function(function_definition) => function_definition.children(), OperatorFunction(operator_function_definition) => { operator_function_definition.children() } PlatformFunction(platform_function_declaration) => { platform_function_declaration.children() } Property(property_declaration) => property_declaration.children(), Field(field_declaration) => field_declaration.children(), } } fn as_node_ref(&self) -> NodeRef { NodeRef::ClassLevelDeclaration(self) } } impl NodeInner for ModuleDeclaration { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::Identifier(self.identifier())); children.extend( self.declarations() .iter() .map(|declaration| NodeRef::ModuleLevelDeclaration(*declaration)), ); children } fn as_node_ref(&self) -> NodeRef { NodeRef::ModuleDeclaration(self) } } impl NodeInner for InterfaceDeclaration { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::Identifier(self.identifier())); children.push(NodeRef::GenericParameters(self.generics())); children.push(NodeRef::ImplementsList(self.implements())); children.extend( self.declarations() .iter() .map(|declaration| NodeRef::InterfaceLevelDeclaration(*declaration)), ); children } fn as_node_ref(&self) -> NodeRef { NodeRef::InterfaceDeclaration(self) } } impl NodeInner for ClassDeclaration { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::Identifier(self.identifier())); children.push(NodeRef::GenericParameters(self.generics())); if let Some(class_constructor) = self.class_constructor() { children.push(NodeRef::ClassConstructor(class_constructor)); } children.push(NodeRef::ImplementsList(self.implements())); children.extend( self.declarations() .iter() .map(|declaration| NodeRef::ClassLevelDeclaration(*declaration)), ); children } fn as_node_ref(&self) -> NodeRef { NodeRef::ClassDeclaration(self) } } impl NodeInner for FunctionDefinition { fn children(&self) -> Vec { vec![ NodeRef::GenericParameters(self.generics()), NodeRef::Identifier(self.identifier()), NodeRef::Parameters(self.parameters()), NodeRef::ReturnType(self.return_type()), NodeRef::FunctionBody(self.body()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::FunctionDefinition(self) } } impl NodeInner for OperatorFunctionDefinition { fn children(&self) -> Vec { vec![ NodeRef::GenericParameters(self.generics()), NodeRef::Parameters(self.parameters()), NodeRef::ReturnType(self.return_type()), NodeRef::FunctionBody(self.body()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::OperatorFunctionDefinition(self) } } impl NodeInner for PlatformFunctionDeclaration { fn children(&self) -> Vec { vec![ NodeRef::GenericParameters(self.generics()), NodeRef::Identifier(self.identifier()), NodeRef::Parameters(self.parameters()), NodeRef::ReturnType(self.return_type()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::PlatformFunctionDeclaration(self) } } impl NodeInner for InterfaceFunctionDeclaration { fn children(&self) -> Vec { let mut children = vec![ NodeRef::GenericParameters(self.generics()), NodeRef::Identifier(self.identifier()), NodeRef::Parameters(self.parameters()), NodeRef::ReturnType(self.return_type()), ]; if let Some(body) = self.body() { children.push(NodeRef::FunctionBody(body)) } children } fn as_node_ref(&self) -> NodeRef { NodeRef::InterfaceFunctionDeclaration(self) } } impl NodeInner for InterfaceOperatorFunctionDeclaration { fn children(&self) -> Vec { let mut children = vec![ NodeRef::GenericParameters(self.generics()), NodeRef::Parameters(self.parameters()), NodeRef::ReturnType(self.return_type()), ]; if let Some(body) = self.body() { children.push(NodeRef::FunctionBody(body)) } children } fn as_node_ref(&self) -> NodeRef { NodeRef::InterfaceOperatorFunctionDeclaration(self) } } impl NodeInner for FunctionBody { fn children(&self) -> Vec { match self { Self::Equals(expression) => expression.children(), Self::Block(block_statement) => block_statement.children(), Self::Alias(identifier) => vec![NodeRef::Identifier(identifier.as_ref())], } } fn as_node_ref(&self) -> NodeRef { NodeRef::FunctionBody(self) } } impl NodeInner for ClassConstructor { fn children(&self) -> Vec { self.parameters() .iter() .map(|parameter| NodeRef::ClassConstructorParameter(*parameter)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::ClassConstructor(self) } } impl NodeInner for ClassConstructorParameter { fn children(&self) -> Vec { match self { Self::Property(property_declaration) => property_declaration.children(), Self::Field(field_declaration) => field_declaration.children(), } } fn as_node_ref(&self) -> NodeRef { NodeRef::ClassConstructorParameter(self) } } impl NodeInner for PropertyDeclaration { fn children(&self) -> Vec { vec![ NodeRef::Identifier(self.identifier()), NodeRef::TypeUse(self.declared_type()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::PropertyDeclaration(self) } } impl NodeInner for FieldDeclaration { fn children(&self) -> Vec { vec![ NodeRef::Identifier(self.identifier()), NodeRef::TypeUse(self.declared_type()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::FieldDeclaration(self) } } impl NodeInner for BlockStatement { fn children(&self) -> Vec { let mut children = vec![]; children.extend( self.statements() .iter() .map(|statement| NodeRef::Statement(statement)), ); if let Some(expression) = self.expression() { children.push(NodeRef::Expression(expression)); } children } fn as_node_ref(&self) -> NodeRef { NodeRef::BlockStatement(self) } } impl NodeInner for Statement { fn children(&self) -> Vec { use crate::ast::node::statement::Statement::*; match self { BlockStatement(block_statement) => block_statement.children(), VariableDeclarationStatement(variable_declaration_statement) => { variable_declaration_statement.children() } AssignStatement(assign_statement) => assign_statement.children(), CallStatement(call_statement) => call_statement.children(), ReturnStatement(return_statement) => return_statement.children(), IfStatement(if_statement) => if_statement.children(), IfElseStatement(if_else_statement) => if_else_statement.children(), WhileStatement(while_statement) => while_statement.children(), ForStatement(for_statement) => for_statement.children(), } } fn as_node_ref(&self) -> NodeRef { NodeRef::Statement(self) } } impl NodeInner for VariableDeclarationStatement { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::Identifier(self.identifier())); if let Some(declared_type) = self.declared_type() { children.push(NodeRef::TypeUse(declared_type)); } if let Some(initializer) = self.initializer() { children.push(NodeRef::Expression(initializer)); } children } fn as_node_ref(&self) -> NodeRef { NodeRef::VariableDeclarationStatement(self) } } impl NodeInner for AssignStatement { fn children(&self) -> Vec { vec![ NodeRef::Expression(self.lhs()), NodeRef::Expression(self.rhs()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::AssignStatement(self) } } impl NodeInner for CallStatement { fn children(&self) -> Vec { vec![NodeRef::Expression(self.expression())] } fn as_node_ref(&self) -> NodeRef { NodeRef::CallStatement(self) } } impl NodeInner for ReturnStatement { fn children(&self) -> Vec { if let Some(expression) = self.expression() { vec![NodeRef::Expression(expression)] } else { vec![] } } fn as_node_ref(&self) -> NodeRef { NodeRef::ReturnStatement(self) } } impl NodeInner for IfStatement { fn children(&self) -> Vec { vec![ NodeRef::Expression(self.condition()), NodeRef::BlockStatement(self.then_block()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::IfStatement(self) } } impl NodeInner for IfElseStatement { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::IfStatement(self.if_statement())); children.push(NodeRef::ElseIfs(self.else_ifs())); if let Some(else_block) = self.else_block() { children.push(NodeRef::ElseBlock(else_block)); } children } fn as_node_ref(&self) -> NodeRef { NodeRef::IfElseStatement(self) } } impl NodeInner for ElseIfs { fn children(&self) -> Vec { self.if_statements() .iter() .map(|statement| NodeRef::IfStatement(statement)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::ElseIfs(self) } } impl NodeInner for ElseBlock { fn children(&self) -> Vec { vec![NodeRef::BlockStatement(self.block_statement())] } fn as_node_ref(&self) -> NodeRef { NodeRef::ElseBlock(self) } } impl NodeInner for WhileStatement { fn children(&self) -> Vec { vec![ NodeRef::Expression(self.condition()), NodeRef::BlockStatement(self.body()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::WhileStatement(self) } } impl NodeInner for ForStatement { fn children(&self) -> Vec { vec![ NodeRef::Identifier(self.variable()), NodeRef::Expression(self.iterator()), NodeRef::BlockStatement(self.body()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::ForStatement(self) } } impl NodeInner for Expression { fn children(&self) -> Vec { use crate::ast::node::expression::Expression::*; match self { Ternary(ternary) => ternary.children(), Binary(binary) => binary.children(), UnaryPrefix(prefix) => prefix.children(), UnarySuffix(suffix) => suffix.children(), Call(call) => call.children(), ObjectAccess(object_access) => object_access.children(), Literal(literal) => literal.children(), FullyQualifiedName(fully_qualified_name) => fully_qualified_name.children(), Closure(closure) => closure.children(), } } fn as_node_ref(&self) -> NodeRef { NodeRef::Expression(self) } } impl NodeInner for TernaryExpression { fn children(&self) -> Vec { vec![ NodeRef::Expression(self.condition()), NodeRef::Expression(self.true_expression()), NodeRef::Expression(self.false_expression()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::TernaryExpression(self) } } impl NodeInner for BinaryExpression { fn children(&self) -> Vec { vec![ NodeRef::Expression(self.left()), NodeRef::Expression(self.right()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::BinaryExpression(self) } } impl NodeInner for PrefixExpression { fn children(&self) -> Vec { vec![NodeRef::Expression(self.expression())] } fn as_node_ref(&self) -> NodeRef { NodeRef::PrefixExpression(self) } } impl NodeInner for SuffixExpression { fn children(&self) -> Vec { vec![NodeRef::Expression(self.expression())] } fn as_node_ref(&self) -> NodeRef { NodeRef::SuffixExpression(self) } } impl NodeInner for CallExpression { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::Expression(self.callee())); if let Some(turbo_fish) = self.turbo_fish() { children.push(NodeRef::TurboFish(turbo_fish)); } children.push(NodeRef::CallArguments(self.arguments())); children } fn as_node_ref(&self) -> NodeRef { NodeRef::CallExpression(self) } } impl NodeInner for TurboFish { fn children(&self) -> Vec { vec![NodeRef::GenericArguments(self.generics())] } fn as_node_ref(&self) -> NodeRef { NodeRef::TurboFish(self) } } impl NodeInner for CallArguments { fn children(&self) -> Vec { self.arguments() .iter() .map(|argument| NodeRef::CallArgument(*argument)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::CallArguments(self) } } impl NodeInner for CallArgument { fn children(&self) -> Vec { vec![NodeRef::Expression(self.expression())] } fn as_node_ref(&self) -> NodeRef { NodeRef::CallArgument(self) } } impl NodeInner for Closure { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::ClosureCaptures(self.captures())); children.push(NodeRef::ClosureParameters(self.parameters())); children.extend( self.statements() .iter() .map(|statement| NodeRef::Statement(statement)), ); if let Some(expression) = self.expression() { children.push(NodeRef::Expression(expression)); } children } fn as_node_ref(&self) -> NodeRef { NodeRef::Closure(self) } } impl NodeInner for ClosureCaptures { fn children(&self) -> Vec { self.captures() .iter() .map(|capture| NodeRef::ClosureCapture(*capture)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::ClosureCaptures(self) } } impl NodeInner for ClosureCapture { fn children(&self) -> Vec { vec![NodeRef::Identifier(self.identifier())] } fn as_node_ref(&self) -> NodeRef { NodeRef::ClosureCapture(self) } } impl NodeInner for ClosureParameters { fn children(&self) -> Vec { self.parameters() .iter() .map(|parameter| NodeRef::ClosureParameter(*parameter)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::ClosureParameters(self) } } impl NodeInner for ClosureParameter { fn children(&self) -> Vec { let mut children = vec![]; children.push(NodeRef::Identifier(self.identifier())); if let Some(type_use) = self.type_use() { children.push(NodeRef::TypeUse(type_use)); } children } fn as_node_ref(&self) -> NodeRef { NodeRef::ClosureParameter(self) } } impl NodeInner for ObjectAccess { fn children(&self) -> Vec { vec![ NodeRef::Expression(self.receiver()), NodeRef::ObjectNavigations(self.navigations()), ] } fn as_node_ref(&self) -> NodeRef { NodeRef::ObjectAccess(self) } } impl NodeInner for ObjectNavigations { fn children(&self) -> Vec { self.navigations() .iter() .map(|navigation| NodeRef::ObjectNavigation(*navigation)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::ObjectNavigations(self) } } impl NodeInner for ObjectNavigation { fn children(&self) -> Vec { vec![match self { ObjectNavigation::Identifier(identifier) => NodeRef::Identifier(identifier), ObjectNavigation::Index(index_expression) => NodeRef::Expression(index_expression), }] } fn as_node_ref(&self) -> NodeRef { NodeRef::ObjectNavigation(self) } } impl NodeInner for Literal { fn children(&self) -> Vec { match self { Literal::DString(d_string) => vec![NodeRef::DString(d_string)], Literal::BacktickString(d_string) => vec![NodeRef::DString(d_string)], _ => vec![], } } fn as_node_ref(&self) -> NodeRef { NodeRef::Literal(self) } } impl NodeInner for DString { fn children(&self) -> Vec { self.parts() .iter() .map(|part| NodeRef::DStringPart(*part)) .collect() } fn as_node_ref(&self) -> NodeRef { NodeRef::DString(self) } } impl NodeInner for DStringPart { fn children(&self) -> Vec { match self { DStringPart::Expression(expression) => vec![NodeRef::Expression(expression)], _ => vec![], } } fn as_node_ref(&self) -> NodeRef { NodeRef::DStringPart(self) } }