@Override public void inAClassClassDefinition(AClassClassDefinition node) throws AnalysisException { if (node.getSupernames().size() > 1) { int nonFullyAbstract = 0; for(SClassDefinition s : node.getSuperDefs()) { if(!info.getDeclAssistant().isFullyAbstract(s, info)) { nonFullyAbstract++; if (nonFullyAbstract > 1) { info.addUnsupportedNode(node, "Multiple inheritance not supported."); } } } } }
public ClassToInterfaceTrans(TransAssistantIR assist) { this.isFullyAbstract = new HashMap<>(); this.interfaces = new HashMap<>(); for (SClassDeclIR c : assist.getInfo().getClasses()) { INode vdmNode = AssistantBase.getVdmNode(c); // AVoid system as CPU classes if (vdmNode instanceof AClassClassDefinition) { SClassDefinition vdmClazz = (SClassDefinition) vdmNode; isFullyAbstract.put(c.getName(), assist.getInfo().getDeclAssistant().isFullyAbstract(vdmClazz, assist.getInfo())); interfaces.put(c.getName(), convertToInterface(c)); } else { isFullyAbstract.put(c.getName(), false); } // This transformation is only helpful for IR classes that originate // from VDM classes. So we simply ignore classes that originate from // modules since SL does not support inheritance anyway. } }
@Override public void caseAAssignmentStmIR(AAssignmentStmIR node) throws AnalysisException { if(transAssistant.getInfo().getDeclAssistant().parentIsTest(node.getAncestor(ADefaultClassDeclIR.class))) { return; } if(transAssistant.getInfo().getDeclAssistant().isFullyAbstract(transAssistant.getInfo().getDeclAssistant().getSourceClass(node), transAssistant.getInfo())) { return; } handleStateUpdate(node); }
@Override public void caseAMapSeqUpdateStmIR(AMapSeqUpdateStmIR node) throws AnalysisException { if(transAssistant.getInfo().getDeclAssistant().parentIsTest(node.getAncestor(ADefaultClassDeclIR.class))) { return; } if(transAssistant.getInfo().getDeclAssistant().isFullyAbstract(transAssistant.getInfo().getDeclAssistant().getSourceClass(node), transAssistant.getInfo())) { return; } handleStateUpdate(node); }
@Override public void caseAAssignToExpStmIR(AAssignToExpStmIR node) throws AnalysisException { if(transAssistant.getInfo().getDeclAssistant().parentIsTest(node.getAncestor(ADefaultClassDeclIR.class))) { return; } if(transAssistant.getInfo().getDeclAssistant().isFullyAbstract(transAssistant.getInfo().getDeclAssistant().getSourceClass(node), transAssistant.getInfo())) { return; } if (node.getTarget() instanceof SVarExpIR) { SVarExpIR var = (SVarExpIR) node.getTarget(); if (var.getIsLocal()) { return; } } handleStateUpdate(node); }
if(info.getDeclAssistant().isFullyAbstract(info.getDeclAssistant().getSourceClass(node), info))
if(info.getDeclAssistant().isFullyAbstract(info.getDeclAssistant().getSourceClass(node), info))