package parsing.C.Functions.builder;
import java.util.Stack;
import org.antlr.v4.runtime.ParserRuleContext;
import parsing.ParseTreeUtils;
import antlr.C.ModuleParser.Parameter_declContext;
import antlr.C.ModuleParser.Parameter_idContext;
import ast.ASTNodeBuilder;
import ast.functionDef.Parameter;
import ast.functionDef.ParameterList;
public class ParameterListBuilder extends ASTNodeBuilder
{
ParameterList thisItem;
@Override
public void createNew(ParserRuleContext ctx)
{
item = new ParameterList();
thisItem = (ParameterList) item;
thisItem.initializeFromContext(ctx);
}
public void addParameter(Parameter_declContext aCtx,
Stack<ASTNodeBuilder> itemStack)
{
Parameter_declContext ctx = (Parameter_declContext) aCtx;
Parameter_idContext parameter_id = ctx.parameter_id();
Parameter param = new Parameter();
param.initializeFromContext(ctx);
String baseType = ParseTreeUtils.childTokenString(ctx
.param_decl_specifiers());
String completeType = determineCompleteType(parameter_id, baseType);
param.type.setBaseType(baseType);
param.type.setCompleteType(completeType);
thisItem.addParameter(param);
}
public String determineCompleteType(Parameter_idContext parameter_id,
String baseType)
{
String retType = baseType;
// TODO: use a string-builder here and clean this up.
// iterate until nesting level is reached
// where type is given.
while (parameter_id.parameter_name() == null)
{
String newCompleteType = "";
newCompleteType += "(";
if (parameter_id.ptrs() != null)
newCompleteType += ParseTreeUtils.childTokenString(parameter_id
.ptrs()) + " ";
if (parameter_id.type_suffix() != null)
newCompleteType += ParseTreeUtils.childTokenString(parameter_id
.type_suffix()) + " ";
newCompleteType += retType;
newCompleteType += ")";
retType = newCompleteType;
parameter_id = parameter_id.parameter_id();
}
if (parameter_id.ptrs() != null)
retType += " "
+ ParseTreeUtils.childTokenString(parameter_id.ptrs());
if (parameter_id.type_suffix() != null)
retType += " "
+ ParseTreeUtils.childTokenString(parameter_id
.type_suffix());
return retType;
}
}