82 lines
2.4 KiB
Plaintext
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;
|
|
}
|
|
}
|