package it.xsemantics.example.fj.typesystem.fj.rules; import it.xsemantics.example.fj.lookup.FjAuxiliaryFunctions; import it.xtypes.runtime.*; public class TFieldOkTypeRule extends FJTypeSystemRule { protected Variable<it.xsemantics.example.fj.fj.Class> var_C = new Variable<it.xsemantics.example.fj.fj.Class>( createEClassifierType(basicPackage.getClass_())); protected Variable<it.xsemantics.example.fj.fj.Field> var_inheritedField = new Variable<it.xsemantics.example.fj.fj.Field>( createEClassifierType(basicPackage.getField())); protected Variable<it.xsemantics.example.fj.fj.Field> var_otherField = new Variable<it.xsemantics.example.fj.fj.Field>( createEClassifierType(basicPackage.getField())); protected Variable<it.xsemantics.example.fj.fj.Field> var_f = new Variable<it.xsemantics.example.fj.fj.Field>( createEClassifierType(basicPackage.getField())); protected Variable<String> right_var; protected TypingJudgmentEnvironment env_G = new TypingJudgmentEnvironment(); public TFieldOkTypeRule() { this("TFieldOk", "|-", ":"); } public TFieldOkTypeRule(String ruleName, String typeJudgmentSymbol, String typeStatementRelation) { super(ruleName, typeJudgmentSymbol, typeStatementRelation); } @Override public Variable<it.xsemantics.example.fj.fj.Field> getLeft() { return var_f; } @Override public Variable<String> getRight() { if (right_var == null) right_var = new Variable<String>(createBasicType("String"), "OK"); return right_var; } @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 TFieldOkTypeRule("TFieldOk", "|-", ":"); } @Override public void applyImpl() throws RuleFailedException { var_C = new Variable<it.xsemantics.example.fj.fj.Class>( createEClassifierType(basicPackage.getClass_()), castto( container(var_f.getValue()), it.xsemantics.example.fj.fj.Class.class)); register("!exists " + stringRep(getAll(var_C.getValue().getSuperclass(), "members", "superclass", it.xsemantics.example.fj.fj.Field.class))); try { boolean not_exist_temp_1 = true; try { for (java.util.Iterator<it.xsemantics.example.fj.fj.Field> iterator = getAll( var_C.getValue().getSuperclass(), "members", "superclass", it.xsemantics.example.fj.fj.Field.class).iterator(); iterator .hasNext();) { var_inheritedField.setValue(iterator.next()); try { equals(var_inheritedField.getValue().getName(), var_f .getValue().getName()); not_exist_temp_1 = false; break; } catch (Throwable e) { registerFailure(e); if (!iterator.hasNext()) throw new RuleFailedException("exists failed", e); } } // if we're here exists succeeded, thus !exist failed } catch (RuleFailedException e) { // OK not_exist_temp_1 = true; } if (!not_exist_temp_1) throw new RuleFailedException("not exists failed"); } catch (Throwable e) { registerFailure(e); throw new RuleFailedException("duplicate field in base class"); } register("end " + "!exists " + stringRep(getAll(var_C.getValue().getSuperclass(), "members", "superclass", it.xsemantics.example.fj.fj.Field.class))); register("!exists " + stringRep(FjAuxiliaryFunctions.selectFields(var_C.getValue()))); try { boolean not_exist_temp_2 = true; try { for (java.util.Iterator<it.xsemantics.example.fj.fj.Field> iterator = FjAuxiliaryFunctions.selectFields(var_C .getValue()).iterator(); iterator.hasNext();) { var_otherField.setValue(iterator.next()); try { equals(var_otherField.getValue().getName(), var_f .getValue().getName()); notEquals(var_otherField, var_f); not_exist_temp_2 = false; break; } catch (Throwable e) { registerFailure(e); if (!iterator.hasNext()) throw new RuleFailedException("exists failed", e); } } // if we're here exists succeeded, thus !exist failed } catch (RuleFailedException e) { // OK not_exist_temp_2 = true; } if (!not_exist_temp_2) throw new RuleFailedException("not exists failed"); } catch (Throwable e) { registerFailure(e); throw new RuleFailedException("duplicate field in the same class"); } register("end " + "!exists " + stringRep(FjAuxiliaryFunctions.selectFields(var_C.getValue()))); } @Override protected String failMessage() { return "cannot type"; } }