package slangc.model; import slangc.parser.Branch; import slangc.parser.ErrorType; import slangc.parser.Node; import slangc.parser.NodeType; import slangc.parser.Token; public class TemplateArgumentModel { private TemplateArgumentModel original = null; private TemplateModel template; private TypeModel expandedType = null; private TypeModel overrideType = null; private int index; private String name; public TemplateArgumentModel(TemplateModel template, int index, Node subnode) { this.template = template; this.index = index; if (subnode.getNodeType() == NodeType.SIMPLE_GENERIC_DECLARATION) { this.name = ((Token)((Branch)((Branch)subnode).getSubnode(1)).getSubnode(0)).getSnippet().getSource(); } else { subnode.annotate(ErrorType.INTERNAL_ERROR, "Unrecognised generic declaration"); } /*for (int i = 0; i < ((Branch)subnode).countSubnodes(); i++) { System.out.println("> GOT A " + ((Branch)subnode).getSubnode(i).getNodeType()); }*/ } private TemplateArgumentModel(TemplateModel template, TemplateArgumentModel original, TemplateArgument override) { this.template = template; this.original = original; this.index = original.index; this.name = original.name; overrideType = ((TypeTemplateArgument)override).getType(); } public TemplateModel getTemplate() { return template; } public int getIndex() { return index; } public String getName() { return name; } public TypeModel getDefaultType() { return template.getTypeDefinition().getPackage().getSystem().getDefaultBaseType(); } public int expand() { if (expandedType == null) { //System.out.println("Working with a " + template.getTemplatedNode().getNode().getNodeType()); UserTypeModel outer = (UserTypeModel)template.getTypeDefinition(); if (outer == null) { throw new Error("Internal error: Templated node is not a type?"); } TypeModel t; if (overrideType != null) { t = overrideType; } else { t = getDefaultType(); } expandedType = template.getTypeDefinition().getPackage().getSystem().addInnerAliasType(outer, name, t.getPackage().getName(), t.getOuterName()); return 1; } else { return 0; } } public TemplateArgumentModel specialised(TemplateModel newModel, TemplateArgument argument) { return new TemplateArgumentModel(newModel, this, argument); } public TemplateArgumentModel getOriginal() { return original; } }