@Override public PType defaultPStateDesignator(PStateDesignator node, TypeCheckInfo question) throws AnalysisException { return node.apply(tcOthers, question); }
@Override public String caseAMapSeqStateDesignator(AMapSeqStateDesignator node) throws AnalysisException { return node.getMapseq().apply(this) + node.getExp().toString(); }
@Override public PExp caseAMapSeqStateDesignator(AMapSeqStateDesignator node) throws AnalysisException { AApplyExp applyExp = new AApplyExp(); applyExp.setRoot(node.getMapseq().apply(this).clone()); List<PExp> args = new LinkedList<PExp>(); args.add(node.getExp().clone()); applyExp.setArgs(args); return applyExp; }
@Override public SStmIR caseAAssignmentStm(AAssignmentStm node, IRInfo question) throws AnalysisException { PStateDesignator target = node.getTarget(); PExp exp = node.getExp(); SStateDesignatorIR targetCg = target.apply(question.getStateDesignatorVisitor(), question); SExpIR expCg = exp.apply(question.getExpVisitor(), question); AAssignmentStmIR assignment = new AAssignmentStmIR(); assignment.setTarget(targetCg); assignment.setExp(expCg); return assignment; }
public StateInvariantObligation(AAtomicStm atom, IPOContextStack ctxt, IPogAssistantFactory af) throws AnalysisException { super(atom, POType.STATE_INV, ctxt, atom.getLocation(), af); assistantFactory = af; PExp invApplyExp = makeInvApplyExp(atom); PExp invApplyExpForSub = invApplyExp.clone(); List<Substitution> subs = new LinkedList<Substitution>(); for (AAssignmentStm asgn : atom.getAssignments()) { String hash = asgn.getTarget().apply(af.getStateDesignatorNameGetter()); subs.add(new Substitution(hash, asgn.getExp().clone())); } IVariableSubVisitor varSubVisitor = af.getVarSubVisitor(); for (Substitution sub : subs) { invApplyExpForSub = invApplyExpForSub.apply(varSubVisitor, sub); } stitch = AstExpressionFactory.newAImpliesBooleanBinaryExp(invApplyExp, invApplyExpForSub); valuetree.setPredicate(stitch); }
public AssignmentContext(AAssignmentStm node, IPogAssistantFactory af, IPOContextStack ctxt) throws AnalysisException { super(ctxt); String hash = node.getTarget().apply(af.getStateDesignatorNameGetter()); t = null; for (ILexNameToken n : last_vars.keySet()) { if (n.getName().equals(hash)) { t = last_vars.get(n).getName().clone(); break; } } if (t == null) { t = new LexNameToken("", hash, null); } subLast = new Substitution(new LexNameToken("", hash, null), node.getExp().clone()); sub = new Substitution(t, node.getExp().clone()); this.visitor = af.getVarSubVisitor(); }
/** * Called by the {@link AMapSeqStateDesignator} node from {@link AMapSeqStateDesignator#apply(IPOFAnalysis)}. * @param node the calling {@link AMapSeqStateDesignator} node */ public void caseAMapSeqStateDesignator(AMapSeqStateDesignator node) throws AnalysisException { _visitedNodes.add(node); inAMapSeqStateDesignator(node); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { node.getType().apply(this); } if(node.getMapseq() != null && !_visitedNodes.contains(node.getMapseq())) { node.getMapseq().apply(this); } if(node.getExp() != null && !_visitedNodes.contains(node.getExp())) { node.getExp().apply(this); } if(node.getMapType() != null && !_visitedNodes.contains(node.getMapType())) { node.getMapType().apply(this); } if(node.getSeqType() != null && !_visitedNodes.contains(node.getSeqType())) { node.getSeqType().apply(this); } outAMapSeqStateDesignator(node); }
/** * Called by the {@link AFieldStateDesignator} node from {@link AFieldStateDesignator#apply(IAnalysis)}. * @param node the calling {@link AFieldStateDesignator} node */ public void caseAFieldStateDesignator(AFieldStateDesignator node) throws AnalysisException { _visitedNodes.add(node); inAFieldStateDesignator(node); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { node.getType().apply(this); } if(node.getObject() != null && !_visitedNodes.contains(node.getObject())) { node.getObject().apply(this); } if(node.getField() != null ) { node.getField().apply(this); } if(node.getObjectfield() != null ) { node.getObjectfield().apply(this); } outAFieldStateDesignator(node); }
/** * Called by the {@link AMapSeqStateDesignator} node from {@link AMapSeqStateDesignator#apply(IAnalysis)}. * @param node the calling {@link AMapSeqStateDesignator} node */ public void caseAMapSeqStateDesignator(AMapSeqStateDesignator node) throws AnalysisException { _visitedNodes.add(node); inAMapSeqStateDesignator(node); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { node.getType().apply(this); } if(node.getMapseq() != null && !_visitedNodes.contains(node.getMapseq())) { node.getMapseq().apply(this); } if(node.getExp() != null && !_visitedNodes.contains(node.getExp())) { node.getExp().apply(this); } if(node.getMapType() != null && !_visitedNodes.contains(node.getMapType())) { node.getMapType().apply(this); } if(node.getSeqType() != null && !_visitedNodes.contains(node.getSeqType())) { node.getSeqType().apply(this); } outAMapSeqStateDesignator(node); }
/** * Called by the {@link AFieldStateDesignator} node from {@link AFieldStateDesignator#apply(IAnalysis)}. * @param node the calling {@link AFieldStateDesignator} node */ public void caseAFieldStateDesignator(AFieldStateDesignator node, Q question) throws AnalysisException { _visitedNodes.add(node); inAFieldStateDesignator(node, question); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { node.getType().apply(this, question); } if(node.getObject() != null && !_visitedNodes.contains(node.getObject())) { node.getObject().apply(this, question); } if(node.getField() != null ) { node.getField().apply(this, question); } if(node.getObjectfield() != null ) { node.getObjectfield().apply(this, question); } outAFieldStateDesignator(node, question); }
/** * Called by the {@link AFieldStateDesignator} node from {@link AFieldStateDesignator#apply(IPOFAnalysis)}. * @param node the calling {@link AFieldStateDesignator} node */ public void caseAFieldStateDesignator(AFieldStateDesignator node) throws AnalysisException { _visitedNodes.add(node); inAFieldStateDesignator(node); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { node.getType().apply(this); } if(node.getObject() != null && !_visitedNodes.contains(node.getObject())) { node.getObject().apply(this); } if(node.getField() != null ) { node.getField().apply(this); } if(node.getObjectfield() != null ) { node.getObjectfield().apply(this); } outAFieldStateDesignator(node); }
public MapApplyObligation(PStateDesignator root, PExp arg, IPOContextStack ctxt, IPogAssistantFactory af) throws AnalysisException { super(root, POType.MAP_APPLY, ctxt, root.getLocation(), af); AMapDomainUnaryExp dom_exp = new AMapDomainUnaryExp(); dom_exp.setExp(root.clone().apply(new StateDesignatorToExpVisitor())); // We don't care about type of the exp. This is just for the CGP to not crash. dom_exp.setType(new AUnknownType()); AInSetBinaryExp inSetExp = AstExpressionFactory.newAInSetBinaryExp(arg.clone(), dom_exp); stitch = inSetExp; valuetree.setPredicate(ctxt.getPredWithContext(inSetExp)); } }
@Override public SStateDesignatorIR caseAFieldStateDesignator( AFieldStateDesignator node, IRInfo question) throws AnalysisException { PType type = node.getType(); PStateDesignator stateDesignator = node.getObject(); String fieldName = node.getField().getName(); STypeIR typeCg = type.apply(question.getTypeVisitor(), question); SStateDesignatorIR stateDesignatorCg = stateDesignator.apply(question.getStateDesignatorVisitor(), question); AFieldStateDesignatorIR field = new AFieldStateDesignatorIR(); field.setType(typeCg); field.setObject(stateDesignatorCg); field.setField(fieldName); return field; }
/** * Called by the {@link AFieldStateDesignator} node from {@link AFieldStateDesignator#apply(IAnalysis)}. * @param node the calling {@link AFieldStateDesignator} node */ public A caseAFieldStateDesignator(AFieldStateDesignator node, Q question) throws AnalysisException { _visitedNodes.add(node); A retVal = createNewReturnValue(node, question); mergeReturns(retVal,inAFieldStateDesignator(node, question)); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { mergeReturns(retVal,node.getType().apply(this, question)); } if(node.getObject() != null && !_visitedNodes.contains(node.getObject())) { mergeReturns(retVal,node.getObject().apply(this, question)); } if(node.getField() != null ) { mergeReturns(retVal,node.getField().apply(this, question)); } if(node.getObjectfield() != null ) { mergeReturns(retVal,node.getObjectfield().apply(this, question)); } mergeReturns(retVal,outAFieldStateDesignator(node, question)); return retVal; }
/** * Called by the {@link AFieldStateDesignator} node from {@link AFieldStateDesignator#apply(IAnalysis)}. * @param node the calling {@link AFieldStateDesignator} node */ public A caseAFieldStateDesignator(AFieldStateDesignator node) throws AnalysisException { _visitedNodes.add(node); A retVal = createNewReturnValue(node); mergeReturns(retVal,inAFieldStateDesignator(node)); if(node.getType() != null && !_visitedNodes.contains(node.getType())) { mergeReturns(retVal,node.getType().apply(this)); } if(node.getObject() != null && !_visitedNodes.contains(node.getObject())) { mergeReturns(retVal,node.getObject().apply(this)); } if(node.getField() != null ) { mergeReturns(retVal,node.getField().apply(this)); } if(node.getObjectfield() != null ) { mergeReturns(retVal,node.getObjectfield().apply(this)); } mergeReturns(retVal,outAFieldStateDesignator(node)); return retVal; }
@Override public PExp caseAFieldStateDesignator(AFieldStateDesignator node) throws AnalysisException { // pack this with the output of the visitor recursive calls. PExp value = node.getObject().apply(this); AFieldExp fieldExp = new AFieldExp(); fieldExp.setObject(value.clone()); fieldExp.setField(node.getField().clone()); // Not 100% sure these 2 match fieldExp.setMemberName(node.getObjectfield().clone()); fieldExp.setType(node.getType().clone()); return fieldExp; }
@Override public SStateDesignatorIR caseAMapSeqStateDesignator( AMapSeqStateDesignator node, IRInfo question) throws AnalysisException { PType type = node.getType(); PStateDesignator mapSeq = node.getMapseq(); PExp exp = node.getExp(); STypeIR typeCg = type.apply(question.getTypeVisitor(), question); SStateDesignatorIR mapSeqCg = mapSeq.apply(question.getStateDesignatorVisitor(), question); SExpIR expCg = exp.apply(question.getExpVisitor(), question); AMapSeqStateDesignatorIR mapSeqStateDesignator = new AMapSeqStateDesignatorIR(); mapSeqStateDesignator.setType(typeCg); mapSeqStateDesignator.setMapseq(mapSeqCg); mapSeqStateDesignator.setExp(expCg); return mapSeqStateDesignator; } }
public SeqApplyObligation(PStateDesignator root, PExp arg, IPOContextStack ctxt, IPogAssistantFactory af) throws AnalysisException { super(root, POType.SEQ_APPLY, ctxt, root.getLocation(), af); // arg >0 AIntLiteralExp zeroExp = new AIntLiteralExp(); zeroExp.setValue(new LexIntegerToken(0, null)); AGreaterNumericBinaryExp grExp = AstExpressionFactory.newAGreaterNumericBinaryExp(arg.clone(), zeroExp); // len(root) ALenUnaryExp lenExp = new ALenUnaryExp(); PExp stateExp = root.apply(new StateDesignatorToExpVisitor()); lenExp.setExp(stateExp.clone()); // len(root)+1 AIntLiteralExp oneExp = new AIntLiteralExp(); oneExp.setValue(new LexIntegerToken(1, null)); APlusNumericBinaryExp plusExp = AstExpressionFactory.newAPlusNumericBinaryExp(lenExp, oneExp); // arg <= len(root) +1 ALessEqualNumericBinaryExp lteExp = AstExpressionFactory.newALessEqualNumericBinaryExp(arg.clone(), plusExp); // arg > 0 and arg <= len(root)+1 AAndBooleanBinaryExp andExp = AstExpressionFactory.newAAndBooleanBinaryExp(grExp, lteExp); stitch = andExp; valuetree.setPredicate(ctxt.getPredWithContext(stitch)); } }
obligations.addAll(node.getTarget().apply(rootVisitor, question)); obligations.addAll(node.getExp().apply(rootVisitor, question));
@Override public PType caseAAssignmentStm(AAssignmentStm node, TypeCheckInfo question) throws AnalysisException { node.setTargetType(node.getTarget().apply(THIS, new TypeCheckInfo(question.assistantFactory, question.env))); node.setExpType(node.getExp().apply(THIS, new TypeCheckInfo(question.assistantFactory, question.env, question.scope, null, node.getTargetType(), null))); if (!question.assistantFactory.getTypeComparator().compatible(node.getTargetType(), node.getExpType())) { TypeCheckerErrors.report(3239, "Incompatible types in assignment", node.getLocation(), node); TypeCheckerErrors.detail2("Target", node.getTarget().getType(), "Expression", node.getExp().getType()); } node.setClassDefinition(question.env.findClassDefinition()); node.setStateDefinition(question.env.findStateDefinition()); AClassTypeAssistantTC assist = question.assistantFactory.createAClassTypeAssistant(); node.setInConstructor(assist.inConstructor(question.env)); if (node.getInConstructor()) { // Mark assignment target as initialized (so no warnings) PDefinition state; state = targetDefinition(node.getTarget(), question); if (state instanceof AInstanceVariableDefinition) { AInstanceVariableDefinition iv = (AInstanceVariableDefinition) state; iv.setInitialized(true); } } node.setType(AstFactory.newAVoidType(node.getLocation())); return node.getType(); }