From b4672d4abf6377837afd761a33ca65ad386e672f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20W=2E=20V=2E=20Tran-J=C3=B8rgensen?= Date: Thu, 13 Oct 2016 11:07:37 +0200 Subject: [PATCH] Fix issue with CG of multiple inheritance Related to issue #606 --- .../vdm2java/ClassToInterfaceTrans.java | 17 +++++++-- .../codegen/vdm2java/JavaCodeGen.java | 38 ++++++++++--------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/ClassToInterfaceTrans.java b/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/ClassToInterfaceTrans.java index de4a41d3ed..c75c68b21a 100644 --- a/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/ClassToInterfaceTrans.java +++ b/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/ClassToInterfaceTrans.java @@ -5,10 +5,12 @@ import java.util.List; import java.util.Map; +import org.apache.commons.lang.BooleanUtils; import org.overture.ast.definitions.AClassClassDefinition; import org.overture.ast.definitions.SClassDefinition; import org.overture.ast.node.INode; import org.overture.codegen.assistant.AssistantBase; +import org.overture.codegen.ir.IRGeneratedTag; import org.overture.codegen.ir.PIR; import org.overture.codegen.ir.analysis.AnalysisException; import org.overture.codegen.ir.analysis.DepthFirstAnalysisAdaptor; @@ -44,6 +46,10 @@ public ClassToInterfaceTrans(TransAssistantIR assist) { 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. @@ -65,7 +71,7 @@ public void caseACpuClassDeclIR(ACpuClassDeclIR node) throws AnalysisException { @Override public void caseADefaultClassDeclIR(ADefaultClassDeclIR node) throws AnalysisException { - if (isFullyAbstract.get(node.getName())) { + if (isFullyAbstract(node.getName())) { result = interfaces.get(node.getName()); @@ -76,7 +82,7 @@ public void caseADefaultClassDeclIR(ADefaultClassDeclIR node) throws AnalysisExc List toMove = new LinkedList<>(); for (ATokenNameIR s : node.getSuperNames()) { - if (isFullyAbstract.get(s.getName())) { + if (isFullyAbstract(s.getName())) { toMove.add(s); } } @@ -98,7 +104,7 @@ private AInterfaceDeclIR convertToInterface(SClassDeclIR c) { List clonedMethods = new LinkedList<>(); for (AMethodDeclIR m : c.getMethods()) { - if (!m.getIsConstructor()) { + if (!m.getIsConstructor() && !(m.getTag() instanceof IRGeneratedTag)) { clonedMethods.add(m.clone()); } } @@ -118,6 +124,11 @@ private AInterfaceDeclIR convertToInterface(SClassDeclIR c) { return inter; } + + private boolean isFullyAbstract(String name) + { + return BooleanUtils.isTrue(isFullyAbstract.get(name)); + } @Override public PIR getResult() { diff --git a/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/JavaCodeGen.java b/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/JavaCodeGen.java index 750ca47f35..6e286c4a46 100644 --- a/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/JavaCodeGen.java +++ b/core/codegen/javagen/src/main/java/org/overture/codegen/vdm2java/JavaCodeGen.java @@ -221,24 +221,6 @@ protected GeneratedData genVdmToTargetLang(List> statuses) } } - ClassToInterfaceTrans class2interfaceTr = new ClassToInterfaceTrans(transAssistant); - - for (IRStatus status : statuses) - { - try - { - generator.applyTotalTransformation(status, class2interfaceTr); - - } catch (org.overture.codegen.ir.analysis.AnalysisException e) - { - log.error("Error when generating code for module " - + status.getIrNodeName() + ": " + e.getMessage()); - log.error("Skipping module.."); - e.printStackTrace(); - } - } - List> interfaceStatuses = IRStatus.extract(statuses, AInterfaceDeclIR.class); - /** * Note that this will include the system class, whereas the CPU and BUS classes have been filtered out when the * IR status was generated @@ -287,6 +269,26 @@ protected GeneratedData genVdmToTargetLang(List> statuses) } } } + + ClassToInterfaceTrans class2interfaceTr = new ClassToInterfaceTrans(transAssistant); + + List> tmp = IRStatus.extract(canBeGenerated); + for (IRStatus status : tmp) + { + try + { + generator.applyTotalTransformation(status, class2interfaceTr); + + } catch (org.overture.codegen.ir.analysis.AnalysisException e) + { + log.error("Error when generating code for module " + + status.getIrNodeName() + ": " + e.getMessage()); + log.error("Skipping module.."); + e.printStackTrace(); + } + } + canBeGenerated = IRStatus.extract(tmp, SClassDeclIR.class); + List> interfaceStatuses = IRStatus.extract(tmp, AInterfaceDeclIR.class); cleanup(IRStatus.extract(canBeGenerated));