Introduce TemplateFunction as wrapper of Vec<Step>
				
					
				
			This commit is contained in:
		
							parent
							
								
									16f3488d20
								
							
						
					
					
						commit
						659f3a88e4
					
				@ -6,7 +6,7 @@ use bevy_reflect::{FromReflect, Reflect, ReflectRef, VariantType};
 | 
			
		||||
use fluent_templates::lazy_static::lazy_static;
 | 
			
		||||
use hornbeam_grammar::ast::{Binding, MatchBinding};
 | 
			
		||||
use hornbeam_grammar::Locator;
 | 
			
		||||
use hornbeam_ir::ir::{Expression, Step, StepDef, StringPiece};
 | 
			
		||||
use hornbeam_ir::ir::{Expression, Step, StepDef, StringPiece, TemplateFunction};
 | 
			
		||||
use itertools::Itertools;
 | 
			
		||||
use std::any::TypeId;
 | 
			
		||||
use std::borrow::Cow;
 | 
			
		||||
@ -28,7 +28,7 @@ pub(crate) struct Scope<'a> {
 | 
			
		||||
 | 
			
		||||
pub(crate) struct Interpreter<'a, O, LS> {
 | 
			
		||||
    pub(crate) entrypoint: String,
 | 
			
		||||
    pub(crate) program: &'a BTreeMap<String, Arc<Vec<Step>>>,
 | 
			
		||||
    pub(crate) program: &'a BTreeMap<String, Arc<TemplateFunction>>,
 | 
			
		||||
    pub(crate) output: O,
 | 
			
		||||
    pub(crate) localisation: Arc<LS>,
 | 
			
		||||
    pub(crate) locale: String,
 | 
			
		||||
@ -445,6 +445,14 @@ impl<'a, O: OutputSystem + Send, LS: LocalisationSystem + Sync + Send> Interpret
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            StepDef::Call { name, args, slots } => {
 | 
			
		||||
                let Some(module) = self.program.get(name as &str) else {
 | 
			
		||||
                    return Err(InterpreterError::TypeError {
 | 
			
		||||
                        context: "Call".to_string(),
 | 
			
		||||
                        conflict: format!("no entrypoint for {name:?}."),
 | 
			
		||||
                        location: step.locator.clone(),
 | 
			
		||||
                    });
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                let mut evaled_args = BTreeMap::new();
 | 
			
		||||
                for (key, expr) in args {
 | 
			
		||||
                    evaled_args.insert(
 | 
			
		||||
@ -464,23 +472,18 @@ impl<'a, O: OutputSystem + Send, LS: LocalisationSystem + Sync + Send> Interpret
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // TODO check slots
 | 
			
		||||
                // ...
 | 
			
		||||
 | 
			
		||||
                // check params
 | 
			
		||||
 | 
			
		||||
                self.scopes.push(Scope {
 | 
			
		||||
                    variables: evaled_args,
 | 
			
		||||
                    slots: filled_in_slots,
 | 
			
		||||
                });
 | 
			
		||||
                let next_scope_idx = self.scopes.len() - 1;
 | 
			
		||||
 | 
			
		||||
                let steps = if let Some(steps) = self.program.get(name as &str) {
 | 
			
		||||
                    steps
 | 
			
		||||
                } else {
 | 
			
		||||
                    return Err(InterpreterError::TypeError {
 | 
			
		||||
                        context: "Call".to_string(),
 | 
			
		||||
                        conflict: format!("no entrypoint for {name:?}."),
 | 
			
		||||
                        location: step.locator.clone(),
 | 
			
		||||
                    });
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                self.run_steps(next_scope_idx, steps).await?;
 | 
			
		||||
                self.run_steps(next_scope_idx, &module.steps).await?;
 | 
			
		||||
 | 
			
		||||
                self.scopes.pop();
 | 
			
		||||
                assert_eq!(self.scopes.len(), next_scope_idx);
 | 
			
		||||
@ -892,16 +895,15 @@ impl<'a, O: OutputSystem + Send, LS: LocalisationSystem + Sync + Send> Interpret
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn run(mut self) -> Result<(), InterpreterError<LS::Error, O::Error>> {
 | 
			
		||||
        let main = if let Some(main) = self.program.get(&self.entrypoint) {
 | 
			
		||||
            main
 | 
			
		||||
        } else {
 | 
			
		||||
        let Some(main) = self.program.get(&self.entrypoint) else {
 | 
			
		||||
            return Err(InterpreterError::TypeError {
 | 
			
		||||
                context: format!("No entrypoint called {:?}", self.entrypoint),
 | 
			
		||||
                conflict: "".to_string(),
 | 
			
		||||
                location: Locator::empty(),
 | 
			
		||||
            });
 | 
			
		||||
        };
 | 
			
		||||
        self.run_steps(0, main).await?;
 | 
			
		||||
        // TODO slot + params check
 | 
			
		||||
        self.run_steps(0, &main.steps).await?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ use async_trait::async_trait;
 | 
			
		||||
use bevy_reflect::Reflect;
 | 
			
		||||
use hornbeam_grammar::parse_template;
 | 
			
		||||
use hornbeam_ir::ast_to_optimised_ir;
 | 
			
		||||
use hornbeam_ir::ir::Step;
 | 
			
		||||
use hornbeam_ir::ir::TemplateFunction;
 | 
			
		||||
use std::borrow::Cow;
 | 
			
		||||
use std::collections::BTreeMap;
 | 
			
		||||
use std::convert::Infallible;
 | 
			
		||||
@ -46,7 +46,7 @@ use crate::{default_template_accessible_methods, InterpreterError};
 | 
			
		||||
pub struct LoadedTemplates<LS> {
 | 
			
		||||
    // todo might be tempted to use e.g. ouroboros here, to keep the file source adjacent?
 | 
			
		||||
    // or do we just staticify?
 | 
			
		||||
    template_functions: BTreeMap<String, Arc<Vec<Step>>>,
 | 
			
		||||
    template_functions: BTreeMap<String, Arc<TemplateFunction>>,
 | 
			
		||||
 | 
			
		||||
    methods: Arc<BTreeMap<String, TemplateAccessibleMethod>>,
 | 
			
		||||
 | 
			
		||||
@ -170,6 +170,8 @@ impl<'a, LS> LoadedTemplates<LS> {
 | 
			
		||||
        params: Params,
 | 
			
		||||
        locale: String,
 | 
			
		||||
    ) -> PreparedTemplate<LS> {
 | 
			
		||||
        // TODO add support for running an `init` or `pre` fragment before running any fragment
 | 
			
		||||
        // This would allow boilerplate `set` statements to be done ahead of time for example...
 | 
			
		||||
        PreparedTemplate {
 | 
			
		||||
            all_instructions: Arc::new(self.template_functions.clone()),
 | 
			
		||||
            entrypoint: if let Some(frag) = fragment_name {
 | 
			
		||||
@ -186,7 +188,8 @@ impl<'a, LS> LoadedTemplates<LS> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct PreparedTemplate<LS> {
 | 
			
		||||
    pub(crate) all_instructions: Arc<BTreeMap<String, Arc<Vec<Step>>>>,
 | 
			
		||||
    // TODO rename to `template_functions`
 | 
			
		||||
    pub(crate) all_instructions: Arc<BTreeMap<String, Arc<TemplateFunction>>>,
 | 
			
		||||
    pub(crate) methods: Arc<BTreeMap<String, TemplateAccessibleMethod>>,
 | 
			
		||||
    pub(crate) entrypoint: String,
 | 
			
		||||
    pub(crate) variables: Params,
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
use crate::ir::{Step, StepDef};
 | 
			
		||||
use crate::ir::{Step, StepDef, TemplateFunction};
 | 
			
		||||
use hornbeam_grammar::ast::{
 | 
			
		||||
    Binding, Block, Expression, HtmlElement, MatchBinding, StringExpr, StringPiece, Template,
 | 
			
		||||
};
 | 
			
		||||
@ -144,14 +144,21 @@ fn pull_out_entrypoints_from_block(
 | 
			
		||||
/// Step 2. Compile the AST to IR steps.
 | 
			
		||||
pub(crate) fn compile_functions(
 | 
			
		||||
    functions: &BTreeMap<String, Vec<Block>>,
 | 
			
		||||
) -> Result<BTreeMap<String, Vec<Step>>, AstToIrError> {
 | 
			
		||||
) -> Result<BTreeMap<String, TemplateFunction>, AstToIrError> {
 | 
			
		||||
    let mut result = BTreeMap::new();
 | 
			
		||||
    for (func_name, func_blocks) in functions {
 | 
			
		||||
        let mut steps = Vec::new();
 | 
			
		||||
        for block in func_blocks {
 | 
			
		||||
            compile_ast_block_to_steps(block, &mut steps)?;
 | 
			
		||||
        }
 | 
			
		||||
        result.insert(func_name.clone(), steps);
 | 
			
		||||
        // TODO save more information
 | 
			
		||||
        result.insert(
 | 
			
		||||
            func_name.clone(),
 | 
			
		||||
            TemplateFunction {
 | 
			
		||||
                param_defs: None,
 | 
			
		||||
                steps,
 | 
			
		||||
            },
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    Ok(result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,20 @@ pub struct Function {
 | 
			
		||||
    pub steps: Vec<Step>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
 | 
			
		||||
pub struct TemplateFunction {
 | 
			
		||||
    /// `None` if we don't have static parameter information.
 | 
			
		||||
    pub param_defs: Option<Vec<ParamDef>>,
 | 
			
		||||
    pub steps: Vec<Step>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
 | 
			
		||||
pub struct ParamDef {
 | 
			
		||||
    pub name: IStr,
 | 
			
		||||
    // TODO type information
 | 
			
		||||
    pub default: Option<Expression>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
 | 
			
		||||
pub struct Step {
 | 
			
		||||
    #[serde(flatten)]
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,6 @@
 | 
			
		||||
//! For using the IR, see `hornbeam_interpreter` (dynamic) or `hornbeam_macros` (code gen).
 | 
			
		||||
 | 
			
		||||
use crate::ast_to_ir::pull_out_entrypoints;
 | 
			
		||||
use crate::ir::Step;
 | 
			
		||||
use crate::peephole::apply_all_peephole_passes;
 | 
			
		||||
use hornbeam_grammar::ast::Template;
 | 
			
		||||
use std::collections::BTreeMap;
 | 
			
		||||
@ -19,14 +18,16 @@ mod peephole;
 | 
			
		||||
 | 
			
		||||
pub use ast_to_ir::AstToIrError;
 | 
			
		||||
 | 
			
		||||
use self::ir::TemplateFunction;
 | 
			
		||||
 | 
			
		||||
pub fn ast_to_optimised_ir(
 | 
			
		||||
    template_name: &str,
 | 
			
		||||
    template: Template,
 | 
			
		||||
) -> Result<BTreeMap<String, Vec<Step>>, AstToIrError> {
 | 
			
		||||
) -> Result<BTreeMap<String, TemplateFunction>, AstToIrError> {
 | 
			
		||||
    let entrypoints = pull_out_entrypoints(template, template_name)?;
 | 
			
		||||
    let mut compiled_funcs = ast_to_ir::compile_functions(&entrypoints)?;
 | 
			
		||||
    for steps in compiled_funcs.values_mut() {
 | 
			
		||||
        apply_all_peephole_passes(steps);
 | 
			
		||||
    for func in compiled_funcs.values_mut() {
 | 
			
		||||
        apply_all_peephole_passes(&mut func.steps);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(compiled_funcs)
 | 
			
		||||
 | 
			
		||||
@ -167,16 +167,21 @@ pub fn apply_all_peephole_passes(steps: &mut Vec<Step>) {
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
    use crate::ast_to_ir::{compile_functions, pull_out_entrypoints};
 | 
			
		||||
    use crate::{
 | 
			
		||||
        ast_to_ir::{compile_functions, pull_out_entrypoints},
 | 
			
		||||
        ir::TemplateFunction,
 | 
			
		||||
    };
 | 
			
		||||
    use hornbeam_grammar::parse_template;
 | 
			
		||||
    use insta::assert_yaml_snapshot;
 | 
			
		||||
    use std::collections::BTreeMap;
 | 
			
		||||
 | 
			
		||||
    fn parse_ir_and_peephole(text: &str) -> BTreeMap<String, Vec<Step>> {
 | 
			
		||||
    fn parse_ir_and_peephole(text: &str) -> BTreeMap<String, TemplateFunction> {
 | 
			
		||||
        let template = parse_template(text, "inp").unwrap();
 | 
			
		||||
        let entrypoints = pull_out_entrypoints(template, "TemplateName").unwrap();
 | 
			
		||||
        let mut compiled = compile_functions(&entrypoints).unwrap();
 | 
			
		||||
        compiled.values_mut().for_each(apply_all_peephole_passes);
 | 
			
		||||
        compiled
 | 
			
		||||
            .values_mut()
 | 
			
		||||
            .for_each(|func| apply_all_peephole_passes(&mut func.steps));
 | 
			
		||||
        compiled
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,115 +3,122 @@ source: hornbeam_ir/src/ast_to_ir.rs
 | 
			
		||||
expression: "compile_functions(&pull_out_entrypoints(template,\n                    \"TemplateName\").unwrap()).unwrap()"
 | 
			
		||||
---
 | 
			
		||||
TemplateName:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<div"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: ">"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: TemplateName__Frag1
 | 
			
		||||
      args: {}
 | 
			
		||||
      slots: {}
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 3
 | 
			
		||||
      column: 5
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: TemplateName__Footer
 | 
			
		||||
      args: {}
 | 
			
		||||
      slots: {}
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 9
 | 
			
		||||
      column: 5
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "</div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<div"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: ">"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: TemplateName__Frag1
 | 
			
		||||
        args: {}
 | 
			
		||||
        slots: {}
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 3
 | 
			
		||||
        column: 5
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: TemplateName__Footer
 | 
			
		||||
        args: {}
 | 
			
		||||
        slots: {}
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 9
 | 
			
		||||
        column: 5
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "</div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
TemplateName__Footer:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: true
 | 
			
		||||
      text: Or even adjacent ones
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: ""
 | 
			
		||||
      line: 0
 | 
			
		||||
      column: 0
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: true
 | 
			
		||||
        text: Or even adjacent ones
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: ""
 | 
			
		||||
        line: 0
 | 
			
		||||
        column: 0
 | 
			
		||||
TemplateName__Frag1:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<span"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 4
 | 
			
		||||
      column: 9
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: ">"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 4
 | 
			
		||||
      column: 9
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: true
 | 
			
		||||
      text: This is a fragment!!
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: ""
 | 
			
		||||
      line: 0
 | 
			
		||||
      column: 0
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "</span>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 4
 | 
			
		||||
      column: 9
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: TemplateName__Frag2
 | 
			
		||||
      args: {}
 | 
			
		||||
      slots: {}
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 6
 | 
			
		||||
      column: 9
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<span"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 4
 | 
			
		||||
        column: 9
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: ">"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 4
 | 
			
		||||
        column: 9
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: true
 | 
			
		||||
        text: This is a fragment!!
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: ""
 | 
			
		||||
        line: 0
 | 
			
		||||
        column: 0
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "</span>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 4
 | 
			
		||||
        column: 9
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: TemplateName__Frag2
 | 
			
		||||
        args: {}
 | 
			
		||||
        slots: {}
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 6
 | 
			
		||||
        column: 9
 | 
			
		||||
TemplateName__Frag2:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<div"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 7
 | 
			
		||||
      column: 13
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: ">"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 7
 | 
			
		||||
      column: 13
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: true
 | 
			
		||||
      text: "There's no problem having nested fragments!"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: ""
 | 
			
		||||
      line: 0
 | 
			
		||||
      column: 0
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "</div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 7
 | 
			
		||||
      column: 13
 | 
			
		||||
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<div"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 7
 | 
			
		||||
        column: 13
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: ">"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 7
 | 
			
		||||
        column: 13
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: true
 | 
			
		||||
        text: "There's no problem having nested fragments!"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: ""
 | 
			
		||||
        line: 0
 | 
			
		||||
        column: 0
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "</div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 7
 | 
			
		||||
        column: 13
 | 
			
		||||
 | 
			
		||||
@ -3,171 +3,172 @@ source: hornbeam_ir/src/ast_to_ir.rs
 | 
			
		||||
expression: "compile_functions(&pull_out_entrypoints(template,\n                    \"TemplateName\").unwrap()).unwrap()"
 | 
			
		||||
---
 | 
			
		||||
TemplateName:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<div"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: " id=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: true
 | 
			
		||||
      text: myid
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: " class=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: true
 | 
			
		||||
      text: stylish
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: " arb=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteEval:
 | 
			
		||||
      escape: true
 | 
			
		||||
      expr:
 | 
			
		||||
        Variable:
 | 
			
		||||
          name: ritrary
 | 
			
		||||
          loc:
 | 
			
		||||
            filename: inp
 | 
			
		||||
            line: 2
 | 
			
		||||
            column: 47
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: " size=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteEval:
 | 
			
		||||
      escape: true
 | 
			
		||||
      expr:
 | 
			
		||||
        IntLiteral:
 | 
			
		||||
          val: 42
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: " stringy=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteEval:
 | 
			
		||||
      escape: true
 | 
			
		||||
      expr:
 | 
			
		||||
        StringExpr:
 | 
			
		||||
          pieces:
 | 
			
		||||
            - Literal: yup
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: ">"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: true
 | 
			
		||||
      text: This is a div with a few extras
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: ""
 | 
			
		||||
      line: 0
 | 
			
		||||
      column: 0
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: OtherComponent
 | 
			
		||||
      args:
 | 
			
		||||
        param1:
 | 
			
		||||
          IntLiteral:
 | 
			
		||||
            val: 1
 | 
			
		||||
        param2:
 | 
			
		||||
          StringExpr:
 | 
			
		||||
            pieces:
 | 
			
		||||
              - Literal: two
 | 
			
		||||
        param3:
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<div"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: " id=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: true
 | 
			
		||||
        text: myid
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: " class=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: true
 | 
			
		||||
        text: stylish
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: " arb=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteEval:
 | 
			
		||||
        escape: true
 | 
			
		||||
        expr:
 | 
			
		||||
          Variable:
 | 
			
		||||
            name: three
 | 
			
		||||
            name: ritrary
 | 
			
		||||
            loc:
 | 
			
		||||
              filename: inp
 | 
			
		||||
              line: 4
 | 
			
		||||
              column: 52
 | 
			
		||||
      slots:
 | 
			
		||||
        main: []
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 4
 | 
			
		||||
      column: 5
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "</div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
 | 
			
		||||
              line: 2
 | 
			
		||||
              column: 47
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: " size=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteEval:
 | 
			
		||||
        escape: true
 | 
			
		||||
        expr:
 | 
			
		||||
          IntLiteral:
 | 
			
		||||
            val: 42
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: " stringy=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteEval:
 | 
			
		||||
        escape: true
 | 
			
		||||
        expr:
 | 
			
		||||
          StringExpr:
 | 
			
		||||
            pieces:
 | 
			
		||||
              - Literal: yup
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: ">"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: true
 | 
			
		||||
        text: This is a div with a few extras
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: ""
 | 
			
		||||
        line: 0
 | 
			
		||||
        column: 0
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: OtherComponent
 | 
			
		||||
        args:
 | 
			
		||||
          param1:
 | 
			
		||||
            IntLiteral:
 | 
			
		||||
              val: 1
 | 
			
		||||
          param2:
 | 
			
		||||
            StringExpr:
 | 
			
		||||
              pieces:
 | 
			
		||||
                - Literal: two
 | 
			
		||||
          param3:
 | 
			
		||||
            Variable:
 | 
			
		||||
              name: three
 | 
			
		||||
              loc:
 | 
			
		||||
                filename: inp
 | 
			
		||||
                line: 4
 | 
			
		||||
                column: 52
 | 
			
		||||
        slots:
 | 
			
		||||
          main: []
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 4
 | 
			
		||||
        column: 5
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "</div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
 | 
			
		||||
@ -3,66 +3,73 @@ source: hornbeam_ir/src/peephole.rs
 | 
			
		||||
expression: "parse_ir_and_peephole(r#\"\ndiv\n    fragment Frag1\n        span\n            \"This is a fragment!!\"\n        fragment Frag2\n            div\n                \"There's no problem having <<nested>> fragments!\"\n    fragment Footer\n        \"Or even adjacent ones\"\n        \"#)"
 | 
			
		||||
---
 | 
			
		||||
TemplateName:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: TemplateName__Frag1
 | 
			
		||||
      args: {}
 | 
			
		||||
      slots: {}
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 3
 | 
			
		||||
      column: 5
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: TemplateName__Footer
 | 
			
		||||
      args: {}
 | 
			
		||||
      slots: {}
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 9
 | 
			
		||||
      column: 5
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "</div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: TemplateName__Frag1
 | 
			
		||||
        args: {}
 | 
			
		||||
        slots: {}
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 3
 | 
			
		||||
        column: 5
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: TemplateName__Footer
 | 
			
		||||
        args: {}
 | 
			
		||||
        slots: {}
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 9
 | 
			
		||||
        column: 5
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "</div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
TemplateName__Footer:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: Or even adjacent ones
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: ""
 | 
			
		||||
      line: 0
 | 
			
		||||
      column: 0
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: Or even adjacent ones
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: ""
 | 
			
		||||
        line: 0
 | 
			
		||||
        column: 0
 | 
			
		||||
TemplateName__Frag1:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<span>This is a fragment!!</span>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 4
 | 
			
		||||
      column: 9
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: TemplateName__Frag2
 | 
			
		||||
      args: {}
 | 
			
		||||
      slots: {}
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 6
 | 
			
		||||
      column: 9
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<span>This is a fragment!!</span>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 4
 | 
			
		||||
        column: 9
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: TemplateName__Frag2
 | 
			
		||||
        args: {}
 | 
			
		||||
        slots: {}
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 6
 | 
			
		||||
        column: 9
 | 
			
		||||
TemplateName__Frag2:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<div>There's no problem having <<nested>> fragments!</div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 7
 | 
			
		||||
      column: 13
 | 
			
		||||
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<div>There's no problem having <<nested>> fragments!</div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 7
 | 
			
		||||
        column: 13
 | 
			
		||||
 | 
			
		||||
@ -3,77 +3,78 @@ source: hornbeam_ir/src/peephole.rs
 | 
			
		||||
expression: "parse_ir_and_peephole(r#\"\ndiv.stylish#myid {size=42, stringy=\"yup\", arb=$ritrary}\n    \"This is a div with a few extras\"\n    OtherComponent {param1=1, param2=\"two\", param3=$three}\n        \"#)"
 | 
			
		||||
---
 | 
			
		||||
TemplateName:
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "<div id=\"myid\" class=\"stylish\" arb=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteEval:
 | 
			
		||||
      escape: true
 | 
			
		||||
      expr:
 | 
			
		||||
        Variable:
 | 
			
		||||
          name: ritrary
 | 
			
		||||
          loc:
 | 
			
		||||
            filename: inp
 | 
			
		||||
            line: 2
 | 
			
		||||
            column: 47
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\" size=\""
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteEval:
 | 
			
		||||
      escape: true
 | 
			
		||||
      expr:
 | 
			
		||||
        IntLiteral:
 | 
			
		||||
          val: 42
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "\" stringy=\"yup\">This is a div with a few extras"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
  - Call:
 | 
			
		||||
      name: OtherComponent
 | 
			
		||||
      args:
 | 
			
		||||
        param1:
 | 
			
		||||
          IntLiteral:
 | 
			
		||||
            val: 1
 | 
			
		||||
        param2:
 | 
			
		||||
          StringExpr:
 | 
			
		||||
            pieces:
 | 
			
		||||
              - Literal: two
 | 
			
		||||
        param3:
 | 
			
		||||
  param_defs: ~
 | 
			
		||||
  steps:
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "<div id=\"myid\" class=\"stylish\" arb=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteEval:
 | 
			
		||||
        escape: true
 | 
			
		||||
        expr:
 | 
			
		||||
          Variable:
 | 
			
		||||
            name: three
 | 
			
		||||
            name: ritrary
 | 
			
		||||
            loc:
 | 
			
		||||
              filename: inp
 | 
			
		||||
              line: 4
 | 
			
		||||
              column: 52
 | 
			
		||||
      slots:
 | 
			
		||||
        main: []
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 4
 | 
			
		||||
      column: 5
 | 
			
		||||
  - WriteLiteral:
 | 
			
		||||
      escape: false
 | 
			
		||||
      text: "</div>"
 | 
			
		||||
    locator:
 | 
			
		||||
      filename: inp
 | 
			
		||||
      line: 2
 | 
			
		||||
      column: 1
 | 
			
		||||
 | 
			
		||||
              line: 2
 | 
			
		||||
              column: 47
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\" size=\""
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteEval:
 | 
			
		||||
        escape: true
 | 
			
		||||
        expr:
 | 
			
		||||
          IntLiteral:
 | 
			
		||||
            val: 42
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "\" stringy=\"yup\">This is a div with a few extras"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
    - Call:
 | 
			
		||||
        name: OtherComponent
 | 
			
		||||
        args:
 | 
			
		||||
          param1:
 | 
			
		||||
            IntLiteral:
 | 
			
		||||
              val: 1
 | 
			
		||||
          param2:
 | 
			
		||||
            StringExpr:
 | 
			
		||||
              pieces:
 | 
			
		||||
                - Literal: two
 | 
			
		||||
          param3:
 | 
			
		||||
            Variable:
 | 
			
		||||
              name: three
 | 
			
		||||
              loc:
 | 
			
		||||
                filename: inp
 | 
			
		||||
                line: 4
 | 
			
		||||
                column: 52
 | 
			
		||||
        slots:
 | 
			
		||||
          main: []
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 4
 | 
			
		||||
        column: 5
 | 
			
		||||
    - WriteLiteral:
 | 
			
		||||
        escape: false
 | 
			
		||||
        text: "</div>"
 | 
			
		||||
      locator:
 | 
			
		||||
        filename: inp
 | 
			
		||||
        line: 2
 | 
			
		||||
        column: 1
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user