package sharpen.xobotos.api.templates;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.EnumDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import sharpen.core.framework.ByRef;
import sharpen.xobotos.StandardConfiguration.ConfigFlags;
import sharpen.xobotos.api.TemplateSection;
import sharpen.xobotos.api.TemplateVisitor;
import sharpen.xobotos.api.TemplateVisitor.VisitMode;
import sharpen.xobotos.api.bindings.CompilationUnitBinding;
import sharpen.xobotos.config.annotations.AttributeReference;
import sharpen.xobotos.config.xstream.IConfigurationFile;
import sharpen.xobotos.output.IOutputProvider;
import sharpen.xobotos.output.OutputType;
import java.util.List;
@XStreamAlias(value="compilation-unit")
public class CompilationUnitTemplate extends AbstractLocationTemplate
implements ITypeContainer, IOutputProvider, IConfigurationFile {
@XStreamOmitField
public final static CompilationUnitTemplate DEFAULT = new CompilationUnitTemplate();
@XStreamAsAttribute
@XStreamAlias("partial")
private boolean _partial;
@XStreamOmitField
@AttributeReference("output")
private OutputType _outputType;
@XStreamImplicit(itemFieldName="type")
private List<TypeTemplate> _types;
@XStreamImplicit(itemFieldName = "enum")
private List<EnumTemplate> _enums;
@XStreamAlias("main-type")
private MainTypeTemplate _mainType;
@SuppressWarnings("unused")
@XStreamImplicit(itemFieldName = "templates")
private List<TemplateSection> _templates;
@XStreamAlias("override-config")
private ConfigFlags _overrideConfig;
@XStreamAlias("binding")
private CompilationUnitBinding _binding;
@Override
public OutputType getOutputType() {
return _outputType;
}
public boolean isPartial() {
return _partial;
}
public CompilationUnitBinding getBinding() {
return _binding;
}
public List<TypeTemplate> getTypes() {
return join(_types, _mainType);
}
public List<EnumTemplate> getEnums() {
return unmodifiable(_enums);
}
public ConfigFlags getConfigFlags() {
return _overrideConfig;
}
public boolean visit(TemplateVisitor visitor, CompilationUnit unit, AbstractTypeDeclaration type) {
if (type instanceof TypeDeclaration)
return visit(visitor, getTypes(), (TypeDeclaration) type);
else if (type instanceof EnumDeclaration)
return visit(visitor, getEnums(), (EnumDeclaration) type);
return false;
}
@Override
public TypeTemplate findTypeTemplate(final TypeDeclaration node) {
if (!(node.getParent() instanceof CompilationUnit))
return null;
final CompilationUnit parent = (CompilationUnit) node.getParent();
final ByRef<TypeTemplate> result = new ByRef<TypeTemplate>();
TemplateVisitor visitor = new TemplateVisitor() {
@Override
public void accept(TypeTemplate type) {
result.value = type;
}
};
if (!visit(visitor, parent, node))
return null;
return result.value != null ? result.value : TypeTemplate.DEFAULT;
}
@Override
public EnumTemplate findEnumTemplate(final EnumDeclaration node) {
if (!(node.getParent() instanceof CompilationUnit))
return null;
final CompilationUnit parent = (CompilationUnit) node.getParent();
final ByRef<EnumTemplate> result = new ByRef<EnumTemplate>();
TemplateVisitor visitor = new TemplateVisitor() {
@Override
public void accept(EnumTemplate type) {
result.value = type;
}
};
if (!visit(visitor, parent, node))
return null;
return result.value != null ? result.value : EnumTemplate.DEFAULT;
}
public void visit(TemplateVisitor visitor, VisitMode mode) {
visitor.accept(this);
if (mode == VisitMode.AllUnits)
return;
visitList(visitor, mode, getTypes());
visitList(visitor, mode, getEnums());
}
@Override
protected void print(StringBuilder sb) {
if (_outputType != null) {
sb.append(':');
sb.append(_outputType);
}
if (_partial)
sb.append(":partial");
super.print(sb);
}
}