package org.overture.codegen.vdm2jml.data; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.overture.codegen.ir.INode; import org.overture.codegen.ir.SDeclIR; import org.overture.codegen.ir.declarations.ADefaultClassDeclIR; import org.overture.codegen.ir.declarations.AFieldDeclIR; import org.overture.codegen.ir.declarations.AMethodDeclIR; public class RecClassInfo { private List<ADefaultClassDeclIR> recClasses; private Set<SDeclIR> members; public RecClassInfo() { this.recClasses = new LinkedList<>(); this.members = new HashSet<SDeclIR>(); } public void register(SDeclIR acc) { if (!contains(acc)) { members.add(acc); } } private boolean contains(SDeclIR memberToCheck) { for (SDeclIR m : members) { if (m == memberToCheck) { return true; } } return false; } public void updateAccessor(AMethodDeclIR oldAcc, AMethodDeclIR newAcc) { SDeclIR toRemove = null; for (SDeclIR m : members) { if (m == oldAcc) { toRemove = m; break; } } if (toRemove != null) { members.remove(toRemove); members.add(newAcc); } } public boolean isRecField(AFieldDeclIR field) { return contains(field); } public boolean inAccessor(INode node) { AMethodDeclIR anc = node.getAncestor(AMethodDeclIR.class); if (anc == null) { return false; } return contains(anc); } public boolean inRecConstructor(INode node) { if (!inRec(node)) { return false; } AMethodDeclIR m = node.getAncestor(AMethodDeclIR.class); if (m != null) { return m.getIsConstructor(); } return false; } public boolean inRec(INode node) { ADefaultClassDeclIR clazz = node.getAncestor(ADefaultClassDeclIR.class); if (clazz == null) { return false; } for (ADefaultClassDeclIR r : recClasses) { if (clazz == r) { return true; } } return false; } public void registerRecClass(ADefaultClassDeclIR recClass) { recClasses.add(recClass); } }