public AExplicitFunctionDefinition getInvDefinition(AStateDefinition d) { ILexLocation loc = d.getInvPattern().getLocation(); List<PPattern> params = new Vector<PPattern>(); params.add(d.getInvPattern().clone()); List<List<PPattern>> parameters = new Vector<List<PPattern>>(); parameters.add(params); PTypeList ptypes = new PTypeList(); ptypes.add(AstFactory.newAUnresolvedType(d.getName())); AFunctionType ftype = AstFactory.newAFunctionType(loc, false, ptypes, AstFactory.newABooleanBasicType(loc)); return AstFactory.newAExplicitFunctionDefinition(d.getName().getInvName(loc), NameScope.GLOBAL, null, ftype, parameters, d.getInvExpression(), null, null, true, null); }
@Override public void caseAStateDefinition(AStateDefinition node, Environment question) throws AnalysisException { if (node.getInvPattern() != null) { node.setInvdef(getInvDefinition(node)); } if (node.getInitPattern() != null) { node.setInitdef(getInitDefinition(node)); } }
if(node.getInvPattern() != null && !_visitedNodes.contains(node.getInvPattern())) node.getInvPattern().apply(this);
if(node.getInvPattern() != null && !_visitedNodes.contains(node.getInvPattern())) node.getInvPattern().apply(this);
if(node.getInvPattern() != null && !_visitedNodes.contains(node.getInvPattern())) node.getInvPattern().apply(this, question);
if(node.getInvPattern() != null && !_visitedNodes.contains(node.getInvPattern())) mergeReturns(retVal,node.getInvPattern().apply(this));
if(node.getInvPattern() != null && !_visitedNodes.contains(node.getInvPattern())) mergeReturns(retVal,node.getInvPattern().apply(this, question));
@Override public void caseAStateDefinition(AStateDefinition node, NewQuestion question) throws AnalysisException { for (AFieldField f : node.getFields()) { try { f.apply(THIS, new NewQuestion(question.rootVisitor, question.question)); } catch (TypeCheckException e) { question.question.assistantFactory.createPTypeAssistant().unResolve(f.getType()); throw e; } } node.setRecordType(af.createPTypeAssistant().typeResolve(node.getRecordType(), null, question.rootVisitor, question.question)); if (node.getInvPattern() != null) { node.getInvdef().apply(this, question); ARecordInvariantType rtype = (ARecordInvariantType) node.getRecordType(); rtype.setInvDef(node.getInvdef()); } if (node.getInitPattern() != null) { node.getInitdef().apply(this, question); } }
@Override public PType caseAStateDefinition(AStateDefinition node, TypeCheckInfo question) throws AnalysisException { Environment base = question.env; if (base.findStateDefinition() != node) { TypeCheckerErrors.report(3047, "Only one state definition allowed per module", node.getLocation(), node); return null; } for (PDefinition def : node.getStateDefs()) { if (!def.getName().getOld()) // Don't check old names { question.assistantFactory.getTypeComparator().checkComposeTypes(def.getType(), question.env, false); } } question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getStateDefs(), THIS, question); if (node.getInvdef() != null) { node.getInvdef().apply(THIS, question); question.assistantFactory.createPPatternAssistant().typeResolve(node.getInvPattern(), THIS, question); } if (node.getInitdef() != null) { node.getInitdef().apply(THIS, question); question.assistantFactory.createPPatternAssistant().typeResolve(node.getInitPattern(), THIS, question); } return null; }
AEqualsDefinition local = new AEqualsDefinition(); local.setExpType(def.getRecordType().clone()); local.setPattern(def.getInvPattern().clone()); local.setName(def.getName().clone()); AVariableExp varExp = getVarExp(def.getName(), def.clone());
AExplicitFunctionDefinition invdef = node.getInvdef(); PExp invExp = node.getInvExpression(); PPattern invPattern = node.getInvPattern();