package net.jangaroo.jooc.backend;
import net.jangaroo.jooc.JooSymbol;
import net.jangaroo.jooc.JsWriter;
import net.jangaroo.jooc.ast.AstNode;
import net.jangaroo.jooc.ast.AstVisitor;
import net.jangaroo.jooc.ast.BinaryOpExpr;
import net.jangaroo.jooc.ast.CommaSeparatedList;
import net.jangaroo.jooc.ast.ConditionalExpr;
import net.jangaroo.jooc.ast.Declaration;
import net.jangaroo.jooc.ast.DotExpr;
import net.jangaroo.jooc.ast.Ide;
import net.jangaroo.jooc.ast.IsExpr;
import net.jangaroo.jooc.ast.LiteralExpr;
import net.jangaroo.jooc.ast.Parameters;
import net.jangaroo.jooc.ast.PostfixOpExpr;
import net.jangaroo.jooc.ast.PredefinedTypeDeclaration;
import net.jangaroo.jooc.ast.PrefixOpExpr;
import java.io.IOException;
public abstract class CodeGeneratorBase implements AstVisitor {
protected final JsWriter out;
public CodeGeneratorBase(JsWriter out) {
this.out = out;
}
protected void writeModifiers(JsWriter out, Declaration declaration) throws IOException {
for (JooSymbol modifier : declaration.getSymModifiers()) {
out.writeSymbol(modifier);
}
}
@Override
public final void visitLiteralExpr(LiteralExpr literalExpr) throws IOException {
out.writeSymbol(literalExpr.getValue());
}
@Override
public final void visitPostfixOpExpr(PostfixOpExpr postfixOpExpr) throws IOException {
postfixOpExpr.getArg().visit(this);
out.writeSymbol(postfixOpExpr.getOp());
}
@Override
public void visitDotExpr(DotExpr dotExpr) throws IOException {
visitPostfixOpExpr(dotExpr);
dotExpr.getIde().visit(this);
}
@Override
public final void visitPrefixOpExpr(PrefixOpExpr prefixOpExpr) throws IOException {
out.writeSymbol(prefixOpExpr.getOp());
prefixOpExpr.getArg().visit(this);
}
@Override
public final void visitBinaryOpExpr(BinaryOpExpr binaryOpExpr) throws IOException {
binaryOpExpr.getArg1().visit(this);
out.writeSymbol(binaryOpExpr.getOp());
binaryOpExpr.getArg2().visit(this);
}
@Override
public final void visitIsExpr(IsExpr isExpr) throws IOException {
visitInfixOpExpr(isExpr);
}
@Override
public final void visitConditionalExpr(ConditionalExpr conditionalExpr) throws IOException {
conditionalExpr.getCond().visit(this);
out.writeSymbol(conditionalExpr.getSymQuestion());
conditionalExpr.getIfTrue().visit(this);
out.writeSymbol(conditionalExpr.getSymColon());
conditionalExpr.getIfFalse().visit(this);
}
@Override
public final <T extends AstNode> void visitCommaSeparatedList(CommaSeparatedList<T> commaSeparatedList) throws IOException {
visitIfNotNull(commaSeparatedList.getHead());
if (commaSeparatedList.getSymComma() != null) {
out.writeSymbol(commaSeparatedList.getSymComma());
visitIfNotNull(commaSeparatedList.getTail());
}
}
@Override
public void visitParameters(Parameters parameters) throws IOException {
visitCommaSeparatedList(parameters);
}
@Override
public final void visitPredefinedTypeDeclaration(PredefinedTypeDeclaration predefinedTypeDeclaration) throws IOException {
throw new IllegalStateException("there should be no code generation for predefined types");
}
protected void writeOptSymbol(JooSymbol symbol) throws IOException {
if (symbol != null) {
out.writeSymbol(symbol);
}
}
protected void writeOptSymbol(JooSymbol optSymbol, String defaultToken) throws IOException {
if (optSymbol != null) {
out.writeSymbol(optSymbol);
} else {
out.writeToken(defaultToken);
}
}
protected void writeSymbolReplacement(JooSymbol symbol, String replacementToken) throws IOException {
if (symbol != null) {
out.writeSymbolWhitespace(symbol);
}
out.writeToken(replacementToken);
}
protected void visitIfNotNull(AstNode args) throws IOException {
if (args != null) {
args.visit(this);
}
}
protected void visitIfNotNull(AstNode args, String replacementToken) throws IOException {
if (args != null) {
args.visit(this);
} else {
out.writeToken(replacementToken);
}
}
protected void visitAll(Iterable<? extends AstNode> nodes) throws IOException {
for (AstNode node : nodes) {
node.visit(this);
}
}
}