package org.scribble.codegen.java.util;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
public class MethodBuilder extends JavaBuilder
{
private final List<String> annots = new LinkedList<>();
private final List<String> mods = new LinkedList<>();
private String ret; // null for constructor -- void must be set explicitly
private final List<String> pars = new LinkedList<>();
private final List<String> exceptions = new LinkedList<>();
private final List<String> body = new LinkedList<>();
protected MethodBuilder()
{
}
protected MethodBuilder(String name)
{
super(name);
}
public void addAnnotations(String... mods)
{
this.annots.addAll(Arrays.asList(mods));
}
public void addModifiers(String... mods)
{
this.mods.addAll(Arrays.asList(mods));
}
public void setReturn(String ret)
{
setterCheck(this.ret);
this.ret = ret;
}
public String getReturn()
{
return this.ret;
}
// Each par is the String: type + " " + name
public void addParameters(String... par)
{
this.pars.addAll(Arrays.asList(par));
}
public List<String> getParameters()
{
return this.pars;
}
public void addExceptions(String... exceptions)
{
this.exceptions.addAll(Arrays.asList(exceptions));
}
public void addBodyLine(String ln)
{
this.body.add(ln);
}
public final void addBodyLine(int i, String ln)
{
for (int j = 0; j < i; j++)
{
ln = "\t" + ln;
}
addBodyLine(ln);
}
@Override
public String build()
{
String meth = "";
meth = buildSignature(meth);
meth = buildBody(meth);
return meth;
}
protected String buildSignature(String meth)
{
if (!this.annots.isEmpty())
{
meth += "\t";
meth += this.annots.stream().collect(Collectors.joining("\n\t")) + "\n";
}
meth += "\t";
if (!this.mods.isEmpty())
{
meth += this.mods.stream().collect(Collectors.joining(" "));
meth += " ";
}
if (this.ret != null)
{
meth += this.ret + " ";
}
meth += name + "(";
meth += this.pars.stream().collect(Collectors.joining(", "));
meth += ")";
if (!this.exceptions.isEmpty())
{
meth += " throws " + this.exceptions.stream().collect(Collectors.joining(", "));
}
return meth;
}
protected String buildBody(String meth)
{
meth += " {\n";
if (!this.body.isEmpty())
{
meth += "\t\t";
meth += this.body.stream().collect(Collectors.joining("\n\t\t"));
}
meth += "\n\t}";
return meth;
}
}