package it.xsemantics.example.fj.typesystem.fj.rules;
import it.xtypes.runtime.*;
public class TNewTypeRule extends FJTypeSystemRule {
protected Variable<java.util.List<it.xsemantics.example.fj.fj.Field>> var_fields = new Variable<java.util.List<it.xsemantics.example.fj.fj.Field>>(
createCollectionType(createEClassifierType(basicPackage.getField())));
protected Variable<Integer> var_i = new Variable<Integer>(
createBasicType("Integer"));
protected Variable<it.xsemantics.example.fj.fj.Type> var_argType = new Variable<it.xsemantics.example.fj.fj.Type>(
createEClassifierType(basicPackage.getType()));
protected Variable<it.xsemantics.example.fj.fj.Type> var_fieldType = new Variable<it.xsemantics.example.fj.fj.Type>(
createEClassifierType(basicPackage.getType()));
protected Variable<it.xsemantics.example.fj.fj.New> var_e = new Variable<it.xsemantics.example.fj.fj.New>(
createEClassifierType(basicPackage.getNew()));
protected Variable<it.xsemantics.example.fj.fj.Type> var_t = new Variable<it.xsemantics.example.fj.fj.Type>(
createEClassifierType(basicPackage.getType()));
protected TypingJudgmentEnvironment env_G = new TypingJudgmentEnvironment();
public TNewTypeRule() {
this("TNew", "|-", ":");
}
public TNewTypeRule(String ruleName, String typeJudgmentSymbol,
String typeStatementRelation) {
super(ruleName, typeJudgmentSymbol, typeStatementRelation);
}
@Override
public Variable<it.xsemantics.example.fj.fj.New> getLeft() {
return var_e;
}
@Override
public Variable<it.xsemantics.example.fj.fj.Type> getRight() {
return var_t;
}
@Override
public TypingJudgmentEnvironment getEnvironment() {
return env_G;
}
@Override
public void setEnvironment(TypingJudgmentEnvironment environment) {
if (environment != null)
env_G = environment;
}
@Override
public RuntimeRule newInstance() {
return new TNewTypeRule("TNew", "|-", ":");
}
@Override
public void applyImpl() throws RuleFailedException {
var_fields = new Variable<java.util.List<it.xsemantics.example.fj.fj.Field>>(
createCollectionType(createEClassifierType(basicPackage
.getField())),
getAll(var_e.getValue().getType().getClassref(), "members",
"superclass", it.xsemantics.example.fj.fj.Field.class));
try {
equals(length(var_e.getValue().getArgs()), length(var_fields));
} catch (RuleFailedException e) {
e.setMessage("argument number "
+ stringRep(length(var_e.getValue().getArgs()))
+ " is not equal to field number "
+ stringRep(length(var_fields)));
throw e;
}
register("forall " + stringRep(length(var_e.getValue().getArgs())));
try {
for (var_i.setValue(0); var_i.getValue() < length(var_e.getValue()
.getArgs()); var_i.setValue(var_i.getValue() + 1)) {
var_argType = new Variable<it.xsemantics.example.fj.fj.Type>(
createEClassifierType(basicPackage.getType()), null);
var_fieldType = new Variable<it.xsemantics.example.fj.fj.Type>(
createEClassifierType(basicPackage.getType()), null);
applyTypeRule(env_G,
var_e.getValue().getArgs().get(var_i.getValue()),
var_argType);
applyTypeRule(env_G, var_fields.getValue()
.get(var_i.getValue()), var_fieldType);
try {
applySubtypeRule(env_G, var_argType, var_fieldType);
} catch (RuleFailedException e) {
e.setMessage("argument type ("
+ stringRep(var_argType.getValue())
+ ") is not a subtype of field type ("
+ stringRep(var_fieldType.getValue()) + ")");
throw e;
}
}
} catch (Throwable e) {
registerFailure(e);
throw new RuleFailedException("failure in checking arguments "
+ stringRep(var_e.getValue().getArgs()));
}
register("end " + "forall "
+ stringRep(length(var_e.getValue().getArgs())));
assignment(var_t, var_e.getValue().getType());
// final check for variable initialization
}
@Override
protected String failMessage() {
return "cannot type";
}
}