/** * Called by the {@link AFieldExpIR} node from {@link AFieldExpIR#apply(IAnalysis)}. * @param node the calling {@link AFieldExpIR} node */ public void caseAFieldExpIR(AFieldExpIR node) throws AnalysisException { _visitedNodes.add(node); inAFieldExpIR(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); } outAFieldExpIR(node); }
private AFieldExpIR consRecFieldExp(AIdentifierVarExpIR patternVar, STypeIR currentType, String fieldName) { AFieldExpIR fieldExp = new AFieldExpIR(); fieldExp.setType(currentType.clone()); fieldExp.setObject(patternVar.clone()); fieldExp.setMemberName(fieldName); return fieldExp; }
/** * Creates a new complete constructor {@code AFieldExpIR} node with the given nodes as children. * @deprecated This method should not be used, use AstFactory instead. * The basic child nodes are removed from their previous parents. * @param object_ the {@link SExpIR} node for the {@code object} child of this {@link AFieldExpIR} node * @param memberName_ the {@link String} node for the {@code memberName} child of this {@link AFieldExpIR} node */ public AFieldExpIR(SourceNode sourceNode_, Object tag_, List<? extends ClonableString> metaData_, STypeIR type_, SExpIR object_, String memberName_) { super(sourceNode_,tag_,metaData_,type_); this.setObject(object_); this.setMemberName(memberName_); }
/** * Returns a deep clone of this {@link AFieldExpIR} node. * @return a deep clone of this {@link AFieldExpIR} node */ public AFieldExpIR clone() { return new AFieldExpIR( _sourceNode, _tag, _metaData, cloneNode(_type), cloneNode(_object), _memberName ); }
@Override public void caseAFieldExpIR(AFieldExpIR node) throws AnalysisException { node.getObject().apply(this); if (node.getObject().getType() instanceof ARecordTypeIR && !(node.parent() instanceof AApplyExpIR)) { AMethodTypeIR getterType = new AMethodTypeIR(); getterType.setResult(node.getType().clone()); AFieldExpIR getterField = node.clone(); getterField.setType(getterType); AApplyExpIR getCall = new AApplyExpIR(); getCall.setRoot(getterField); getCall.setType(node.getType().clone()); getCall.setSourceNode(node.getSourceNode()); getterField.setMemberName(consGetCallName(node.getMemberName())); /** * The getters added to the record classes do not copy object references representing values. Therefore we * need to take it into account when we do the field read call */ if (cloneFieldRead(node)) { getCall = makeCopy(getCall); } jmlGen.getJavaGen().getTransAssistant().replaceNodeWith(node, getCall); } }
@Override public void caseAFieldExpIR(AFieldExpIR node) throws AnalysisException { // Examples new IO().ferror() or myIoObj.ferror() STypeIR objType = node.getObject().getType(); if(objType instanceof AClassTypeIR) { AClassTypeIR classType = (AClassTypeIR) objType; String className = classType.getName(); String member = node.getMemberName(); if(isUnsupportedIO(className, member) || isUnsupportedVDMUtil(className, member)){ warn(node); } } }
@Override public void caseAFieldExpIR(AFieldExpIR node) throws AnalysisException { SExpIR object = node.getObject(); STypeIR objectType = object.getType(); if (!(objectType instanceof AUnionTypeIR)) { object.apply(this); return; } STypeIR resultType = getResultType(node, node.parent(), objectType, transAssistant.getInfo().getTypeAssistant()); handleFieldExp(node, node.getMemberName(), object, objectType, resultType); }
entering.setType(new AVoidTypeIR()); AFieldExpIR field = new AFieldExpIR(); field.setMemberName(methodIR.getName()); field.setObject(cast); leaving.setClassType(sentinel.clone()); leaving.setType(new AVoidTypeIR()); leaving.getArgs().add(field.clone());
SExpIR newObj = splitTarget(field.getObject().clone(), varDecls, vars); tr.replaceNodeWith(field.getObject(), newObj); AVarDeclIR varDecl = dAssist.consLocalVarDecl(field.getType().clone(), id, field.clone()); varDecls.add(varDecl); AIdentifierVarExpIR var = eAssist.consIdVar(id.getName(), field.getType().clone()); vars.add(var); return var;
AFieldExpIR fieldExp = new AFieldExpIR(); fieldExp.setSourceNode(node.getSourceNode()); fieldExp.setTag(node.getTag()); fieldExp.setType(node.getType().clone()); setFieldNames(fieldExp, stateDecl, node.getName());
@Override public SExpIR caseAFieldExpIR(AFieldExpIR node) throws AnalysisException { return node.getObject().apply(this); }
private SExpIR consRecFieldExp(AIdentifierVarExpIR patternVar, int i, STypeIR currentType, boolean cast) { ARecordTypeIR recordType = (ARecordTypeIR) patternVar.getType(); AFieldDeclIR recordField = transAssistant.getInfo().getAssistantManager().getDeclAssistant().getFieldDecl(transAssistant.getInfo().getClasses(), recordType, i); String fieldName = recordField.getName(); AFieldExpIR fieldExp = consRecFieldExp(patternVar, currentType, fieldName); if (cast) { ACastUnaryExpIR casted = new ACastUnaryExpIR(); casted.setType(recordType.clone()); casted.setExp(fieldExp.getObject()); fieldExp.setObject(casted); } return fieldExp; }
public AAssignToExpStmIR castFieldObj(AAssignToExpStmIR assign, AFieldExpIR target, STypeIR possibleType) { ACastUnaryExpIR cast = new ACastUnaryExpIR(); cast.setType(possibleType.clone()); cast.setExp(target.getObject().clone()); AAssignToExpStmIR assignCopy = assign.clone(); AFieldExpIR fieldCopy = target.clone(); transAssistant.replaceNodeWith(fieldCopy.getObject(), cast); transAssistant.replaceNodeWith(assignCopy.getTarget(), fieldCopy); return assignCopy; }
AIdentifierVarExpIR replField = javaGen.getInfo().getExpAssistant().consIdVar(consUniqueName(field.getMemberName()), field.getType().clone()); assistant.replaceNodeWith(field, replField); } else
private boolean cloneFieldRead(AFieldExpIR node) { if (jmlGen.getJavaSettings().getDisableCloning()) { return false; } AVarDeclIR decl = node.getAncestor(AVarDeclIR.class); /* * Normalized state designators do not need cloning */ if (decl != null && jmlGen.getStateDesInfo().isStateDesDecl(decl)) { return false; } if (jmlGen.getJavaGen().getJavaFormat().getValueSemantics().isCloneFree(node)) { return false; } JavaValueSemantics valSem = jmlGen.getJavaGen().getJavaFormat().getValueSemantics(); return !inTarget && !isObjOfFieldExp(node) && !isColOfMapSeq(node) && valSem.mayBeValueType(node.getType()); }
private void setSubject(SExpIR fieldExp, ACastUnaryExpIR castedFieldExp) { if (fieldExp instanceof AFieldExpIR) { ((AFieldExpIR) fieldExp).setObject(castedFieldExp); } else if (fieldExp instanceof AFieldNumberExpIR) { ((AFieldNumberExpIR) fieldExp).setTuple(castedFieldExp); } }
String memberName = node.getMemberName(); STypeIR fieldType = null;
if (field.getObject().getType() instanceof AUnionTypeIR) LinkedList<STypeIR> types = ((AUnionTypeIR) field.getObject().getType()).getTypes(); AIsOfClassExpIR cond = consInstanceCheck(field.getObject(), currentType); AAssignToExpStmIR castFieldObj = castFieldObj(node, field, currentType); ifChecks.setElseStm(consRaiseStm(MISSING_MEMBER, field.getMemberName()));