slcom/slangc/model/TemplateArgumentModel.sauce

82 lines
2.4 KiB
Plaintext

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;
}
}