All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jamon.codegen.AbstractUnit Maven / Gradle / Ivy

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.jamon.codegen;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;

import org.jamon.api.Location;
import org.jamon.compiler.ParserErrorImpl;
import org.jamon.compiler.ParserErrorsImpl;
import org.jamon.node.ArgNode;
import org.jamon.node.FragmentArgsNode;
import org.jamon.node.OptionalArgNode;

public abstract class AbstractUnit extends AbstractStatementBlock implements Unit, Comparable {
  public AbstractUnit(
    String name, StatementBlock parent, ParserErrorsImpl errors, Location location) {
    super(parent, location);
    if (name == null) {
      throw new NullPointerException();
    }
    this.name = name;
    this.errors = errors;
  }

  @Override
  public final String getName() {
    return name;
  }

  @Override
  public final Unit getParentUnit() {
    return (Unit) getParent();
  }

  protected final ParserErrorsImpl getErrors() {
    return errors;
  }

  @Override
  public int compareTo(AbstractUnit o) {
    return getName().compareTo(o.getName());
  }

  protected abstract void addFragmentArg(FragmentArgument arg);

  @Override
  public abstract List getFragmentArgs();

  @Override
  public FragmentUnit getFragmentUnitIntf(String path) {
    for (FragmentArgument arg : getFragmentArgs()) {
      if (path.equals(arg.getName())) {
        return arg.getFragmentUnit();
      }
    }
    return null;
  }

  @Override
  public void generateRenderBody(CodeWriter writer, TemplateDescriber describer)
  throws ParserErrorImpl {
    writer.openBlock();
    printStatements(writer, describer);
    writer.closeBlock();
  }

  public abstract void addRequiredArg(RequiredArgument arg);

  public abstract void addOptionalArg(OptionalArgument arg);

  @Override
  public abstract List getSignatureRequiredArgs();

  @Override
  public abstract Collection getSignatureOptionalArgs();

  public abstract Collection getVisibleArgs();

  private final String name;

  private final ParserErrorsImpl errors;

  private final Set argNames = new HashSet();

  @Override
  public FragmentUnit addFragment(FragmentArgsNode node, GenericParams genericParams) {
    checkArgName(node.getFragmentName(), node.getLocation());
    FragmentUnit frag = new FragmentUnit(node.getFragmentName(), this, genericParams, errors,
        node.getLocation());
    addFragmentArg(new FragmentArgument(frag, node.getLocation()));
    return frag;
  }

  @Override
  public void addRequiredArg(ArgNode node) {
    checkArgName(node.getName().getName(), node.getName().getLocation());
    addRequiredArg(new RequiredArgument(node));
  }

  @Override
  public void addOptionalArg(OptionalArgNode node) {
    checkArgName(node.getName().getName(), node.getName().getLocation());
    addOptionalArg(new OptionalArgument(node));
  }

  protected void addArgName(AbstractArgument arg) {
    argNames.add(arg.getName());
  }

  private void checkArgName(String name, org.jamon.api.Location location) {
    if (!argNames.add(name)) {
      getErrors().addError("multiple arguments named " + name, location);
    }
  }

  public List getRenderArgs() {
    return new SequentialList(getSignatureRequiredArgs(), getFragmentArgs());
  }

  @Override
  public void printRenderArgsDecl(CodeWriter writer) {
    printArgsDecl(writer, getRenderArgs());
  }

  public void printRenderArgs(CodeWriter writer) {
    printArgs(writer, getRenderArgs());
  }

  protected static void printArgsDecl(
    CodeWriter writer, Iterable i) {
    for (AbstractArgument arg : i) {
      writer.printListElement("final " + arg.getFullyQualifiedType() + " " + arg.getName());
    }
  }

  protected static void printArgs(CodeWriter writer, Iterable args) {
    for (AbstractArgument arg : args) {
      writer.printListElement(arg.getName());
    }
  }

  protected void generateInterfaceSummary(StringBuilder buf) {
    buf.append("Required\n");
    for (AbstractArgument arg : getSignatureRequiredArgs()) {
      buf.append(arg.getName());
      buf.append(":");
      buf.append(arg.getType());
      buf.append("\n");
    }
    buf.append("Optional\n");
    TreeMap optArgs = new TreeMap();
    for (OptionalArgument arg : getSignatureOptionalArgs()) {
      optArgs.put(arg.getName(), arg);
    }
    for (OptionalArgument arg : optArgs.values()) {
      buf.append(arg.getName());
      buf.append(":");
      buf.append(arg.getType());
      buf.append("\n");
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy