use of com.squarespace.template.Instructions.RepeatedInst in project template-compiler by Squarespace.
the class InstructionReprTest method testRepeatedRepr.
@Test
public void testRepeatedRepr() {
CodeMaker mk = maker();
RepeatedInst r1 = mk.repeated("a.b");
assertEquals(r1.repr(), "{.repeated section a.b}");
r1.getConsequent().add(mk.text("A"));
assertEquals(r1.repr(), "{.repeated section a.b}A");
AlternatesWithInst a1 = mk.alternates();
r1.setAlternatesWith(a1);
assertEquals(r1.repr(), "{.repeated section a.b}A{.alternates with}");
a1.getConsequent().add(mk.text("-"));
assertEquals(r1.repr(), "{.repeated section a.b}A{.alternates with}-");
r1.setAlternative(mk.end());
assertEquals(r1.repr(), "{.repeated section a.b}A{.alternates with}-{.end}");
assertEquals(ReprEmitter.get(r1, false), "{.repeated section a.b}");
}
use of com.squarespace.template.Instructions.RepeatedInst in project template-compiler by Squarespace.
the class InstructionEqualityTest method testRepeatEquals.
@Test
public void testRepeatEquals() throws CodeSyntaxException {
CodeMaker mk = maker();
RepeatedInst r1 = mk.repeated("foo.bar");
RepeatedInst r2 = mk.repeated("foo.bar");
assertEquals(r1, r2);
assertFalse(r1.equals(null));
assertNotEquals(r1, mk.repeated("bar.foo"));
assertNotEquals(r1, mk.repeated("@"));
AlternatesWithInst a1 = mk.alternates();
AlternatesWithInst a2 = mk.alternates();
r1.setAlternatesWith(a1);
assertNotEquals(r1, r2);
r2.setAlternatesWith(a2);
assertEquals(r1, r2);
testBlockEquals(r1, r2);
}
use of com.squarespace.template.Instructions.RepeatedInst in project template-compiler by Squarespace.
the class ReferenceScanner method extract.
/**
* Extracts reference metrics from a single instruction.
*/
public void extract(Instruction inst) {
String name = null;
if (inst == null) {
return;
}
if (!(inst instanceof RootInst)) {
refs.increment(inst);
}
switch(inst.getType()) {
case TEXT:
refs.textBytes += ((TextInst) inst).getView().length();
break;
case ALTERNATES_WITH:
AlternatesWithInst alternatesWith = (AlternatesWithInst) inst;
extractBlock(alternatesWith.getConsequent());
extract(alternatesWith.getAlternative());
break;
case IF:
{
BlockInstruction blockInst = (BlockInstruction) inst;
refs.addIfInstruction(blockInst);
if (inst instanceof IfInst) {
IfInst ifInst = (IfInst) inst;
for (Object[] var : ifInst.getVariables()) {
name = ReprEmitter.get(var);
refs.addVariable(name);
}
} else {
IfPredicateInst ifInst = (IfPredicateInst) inst;
refs.increment(ifInst.getPredicate());
}
extractBlock(blockInst.getConsequent());
extract(blockInst.getAlternative());
break;
}
case OR_PREDICATE:
case PREDICATE:
PredicateInst predicateInst = (PredicateInst) inst;
Predicate predicate = predicateInst.getPredicate();
if (predicate != null) {
refs.increment(predicate);
predicate.addReferences(predicateInst.getArguments(), refs);
}
extractBlock(predicateInst.getConsequent());
extract(predicateInst.getAlternative());
break;
case REPEATED:
RepeatedInst repeated = (RepeatedInst) inst;
name = ReprEmitter.get(repeated.getVariable());
refs.pushSection(name);
extractBlock(repeated.getConsequent());
extract(repeated.getAlternative());
extract(repeated.getAlternatesWith());
refs.popSection();
break;
case ROOT:
extractBlock(((RootInst) inst).getConsequent());
break;
case SECTION:
SectionInst section = (SectionInst) inst;
name = ReprEmitter.get(section.getVariable());
refs.pushSection(name);
extractBlock(section.getConsequent());
extract(section.getAlternative());
refs.popSection();
break;
case VARIABLE:
VariableInst varInst = (VariableInst) inst;
name = ReprEmitter.get(varInst.getVariables());
refs.addVariable(name);
for (FormatterCall call : varInst.getFormatters()) {
refs.increment(call.getFormatter());
}
break;
default:
break;
}
}
use of com.squarespace.template.Instructions.RepeatedInst in project template-compiler by Squarespace.
the class TreeEmitter method emitHeader.
private static void emitHeader(InstructionType type, Instruction inst, int depth, StringBuilder buf) {
if (type.equals(InstructionType.ROOT)) {
return;
}
indent(depth, buf);
buf.append(type.toString());
buf.append(" {").append(inst.getLineNumber()).append(',').append(inst.getCharOffset()).append("}");
switch(type) {
case BINDVAR:
BindVarInst bindvar = (BindVarInst) inst;
buf.append(' ').append(bindvar.getName()).append(" = ");
emitVariables(bindvar.getVariables(), buf);
break;
case COMMENT:
CommentInst comment = (CommentInst) inst;
buf.append(' ');
emitEscapedString(comment.getView(), buf);
break;
case EVAL:
EvalInst eval = (EvalInst) inst;
buf.append(' ');
emitEscapedString(eval.body(), buf);
break;
case INCLUDE:
{
IncludeInst include = (IncludeInst) inst;
buf.append(' ');
emitArgs(include.getArguments(), buf);
break;
}
case IF:
{
if (inst instanceof IfInst) {
buf.append(' ');
ReprEmitter.emitIfExpression((IfInst) inst, buf);
} else {
IfPredicateInst predicateInst = (IfPredicateInst) inst;
Predicate predicate = predicateInst.getPredicate();
if (predicate != null) {
buf.append(' ').append(predicate);
Arguments args = predicateInst.getArguments();
if (!args.isEmpty()) {
buf.append(' ');
emitArgs(args, buf);
}
}
}
break;
}
case INJECT:
{
InjectInst inject = (InjectInst) inst;
buf.append(' ');
emitEscapedString(inject.variable(), buf);
buf.append(' ');
emitEscapedString(inject.filename(), buf);
buf.append(' ');
emitArgs(inject.arguments(), buf);
break;
}
case OR_PREDICATE:
case PREDICATE:
PredicateInst predicateInst = (PredicateInst) inst;
Predicate predicate = predicateInst.getPredicate();
if (predicate != null) {
buf.append(' ').append(predicate);
Arguments args = predicateInst.getArguments();
if (!args.isEmpty()) {
buf.append(' ');
emitArgs(args, buf);
}
}
break;
case REPEATED:
RepeatedInst repeated = (RepeatedInst) inst;
buf.append(' ');
emitNames(repeated.getVariable(), buf);
break;
case SECTION:
SectionInst section = (SectionInst) inst;
buf.append(' ');
emitNames(section.getVariable(), buf);
break;
case TEXT:
TextInst text = (TextInst) inst;
buf.append(' ');
emitEscapedString(text.getView(), buf);
break;
case VARIABLE:
{
VariableInst varInst = (VariableInst) inst;
Variables variables = varInst.getVariables();
buf.append(' ');
ReprEmitter.emitVariables(variables, buf);
for (FormatterCall formatterCall : varInst.getFormatters()) {
buf.append('\n');
indent(depth + INCR, buf);
buf.append("| ");
buf.append(formatterCall.getFormatter().identifier());
Arguments args = formatterCall.getArguments();
if (!args.isEmpty()) {
buf.append(' ');
emitArgs(args, buf);
}
}
break;
}
default:
break;
}
buf.append('\n');
}
Aggregations