diff --git a/pom.xml b/pom.xml index 7b07f17de240dbea060ec3adf0c6df1824cfc076..d1926b8f05b5d688af14d1e689b92cfbf3fcbb7e 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ de.monticore.lang.monticar embedded-montiarc - 0.1.1-SNAPSHOT + 0.1.2-SNAPSHOT diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorBuilder.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorBuilder.java index 38da356aa3cf85c841b19f9715c15903a9cd6837..738f09fea4c1e7636efc91b5f17b1d678e30ac79 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorBuilder.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorBuilder.java @@ -31,7 +31,7 @@ import java.util.Optional; public class EMAConnectorBuilder { protected Optional source = Optional.empty(); protected Optional target = Optional.empty(); - protected Optional portSymbol = Optional.empty(); + protected Optional portSymbol = Optional.empty(); public static EMAConnectorSymbol clone(EMAConnectorSymbol con) { return new EMAConnectorBuilder().setSource(con.getSource()). @@ -48,7 +48,7 @@ public class EMAConnectorBuilder { return this; } - public EMAConnectorBuilder setConstantPortSymbol(EMAConstantPortSymbol portSymbol) { + public EMAConnectorBuilder setConstantPortSymbol(EMAPortSymbol portSymbol) { this.portSymbol = Optional.of(portSymbol); return this; } @@ -59,7 +59,7 @@ public class EMAConnectorBuilder { con.setSource(this.source.get()); con.setTarget(this.target.get()); if(portSymbol.orElse(null) != null) { - con.setEMAConstantPortSymbol(portSymbol.get()); + con.setConstantEMAPortSymbol(portSymbol.get()); } return con; } @@ -72,7 +72,7 @@ public class EMAConnectorBuilder { connectorInstance.setSource(connector.getSource()); connectorInstance.setTarget(connector.getTarget()); connectorInstance.setIsConstantConnector(connector.isConstant); - connectorInstance.setEMAConstantPortSymbol(connector.emaConstantPortSymbol); + connectorInstance.setConstantEMAPortSymbol(connector.constantEmaPortSymbol); connectorInstance.setPackageName(packageName); connectorInstance.setFullName(packageName + "." + connectorInstance.getName()); return connectorInstance; diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorSymbol.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorSymbol.java index e79190afbee441c1f1204bdd4526a151e77fff7e..41c41ca2128b1843dc56ba66cb3c159dbe58e6a4 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorSymbol.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConnectorSymbol.java @@ -58,7 +58,7 @@ public class EMAConnectorSymbol extends CommonSymbol implements EMAElementSymbol /** * is null if not a constantConnector */ - protected EMAConstantPortSymbol emaConstantPortSymbol = null; + protected EMAPortSymbol constantEmaPortSymbol = null; /** * use {@link #builder()} @@ -83,9 +83,9 @@ public class EMAConnectorSymbol extends CommonSymbol implements EMAElementSymbol return isConstant; } - public void setEMAConstantPortSymbol(EMAConstantPortSymbol portSymbol) { - this.emaConstantPortSymbol = portSymbol; - setIsConstantConnector(true); + public void setConstantEMAPortSymbol(EMAPortSymbol portSymbol) { + this.constantEmaPortSymbol = portSymbol; + setIsConstantConnector(portSymbol != null && portSymbol.isConstant()); } /** @@ -164,7 +164,7 @@ public class EMAConnectorSymbol extends CommonSymbol implements EMAElementSymbol */ public EMAPortSymbol getSourcePort() { if (isConstant()) - return emaConstantPortSymbol; + return constantEmaPortSymbol; return getPort(this.getSource()); } diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConstantPortSymbol.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConstantPortSymbol.java deleted file mode 100644 index d8a706381c7b5f68973483a8db4657a95ff15886..0000000000000000000000000000000000000000 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAConstantPortSymbol.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * - * ****************************************************************************** - * MontiCAR Modeling Family, www.se-rwth.de - * Copyright (c) 2017, Software Engineering Group at RWTH Aachen, - * All rights reserved. - * - * This project is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this project. If not, see . - * ******************************************************************************* - */ -package de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel; - - -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.EmbeddedMontiArcSymbolTableCreator; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant.EMAConstantBoolean; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant.EMAConstantSIUnit; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant.EMAConstantValue; -import de.monticore.literals.literals._ast.ASTBooleanLiteral; -import de.monticore.numberunit._ast.ASTNumberWithUnit; -import de.se_rwth.commons.logging.Log; -import org.jscience.mathematics.number.Rational; - -import javax.measure.unit.Unit; - -import static de.monticore.lang.embeddedmontiarc.helper.EMATypeHelper.initTypeRefGeneralType; -import static de.monticore.numberunit.Rationals.doubleToRational; - -//import de.monticore.literals.literals._ast.*; - -/** - * The EMAConstantPortSymbol is a port which has a constant value assigned and is used - * by a ConstantConnector to connect this value to other ports. - * - * @author Sascha Schneiders - */ -public class EMAConstantPortSymbol extends EMAPortSymbol { - EMAConstantValue constantValue; - - /** - * use this constructor for automatic naming of constant ports - */ - public EMAConstantPortSymbol() { - super(EMAConstantPortSymbol.getNextConstantPortName()); - setDirection(true); - } - - public EMAConstantPortSymbol(String name) { - super(name); - setDirection(true); - } - - - public EMAConstantValue getConstantValue() { - return constantValue; - } - - - public void setConstantValue(EMAConstantValue value) { - Log.debug("" + value.getValue().toString(), "value setting"); - this.constantValue = value; - } - - - /** - * initializes ConstantPort from a UnitNumberLiteral - */ - public void initConstantPortSymbol(ASTNumberWithUnit si_unit) { - Unit unit = si_unit.getUnit(); - Rational rational = doubleToRational(si_unit.getNumber().get()); - - setConstantValue(new EMAConstantSIUnit(rational, unit)); - } - - /** - * initializes ConstantPort from a BooleanLiteral - */ - public void initConstantPortSymbol(ASTBooleanLiteral astBooleanLiteral) { - setConstantValue(new EMAConstantBoolean(astBooleanLiteral.getSource() == 1)); - } - - private static int lastID = 1; - - public static String getNextConstantPortName() { - return "CONSTANTPORT" + lastID++; - } - - public static void resetLastID() { - lastID = 1; - } - - @Override - public boolean isConstant() { - return true; - } - - public static EMAConstantPortSymbol createConstantPortSymbol(de.monticore.lang.embeddedmontiarc.embeddedmontiarc._ast.ASTConnector node, EmbeddedMontiArcSymbolTableCreator symbolTableCreator) { - EMAConstantPortSymbol emaConstantPortSymbol = new EMAConstantPortSymbol(); - - if (node.getUnitNumberResolutionOpt().isPresent()) { - emaConstantPortSymbol.initConstantPortSymbol(node.getUnitNumberResolution().getNumberWithUnit()); - String typeName; - typeName = "UnitNumberResolution"; - emaConstantPortSymbol.setTypeReference(initTypeRefGeneralType(typeName, symbolTableCreator)); - } else if (node.getBoolLiteralOpt().isPresent()) { - emaConstantPortSymbol.initConstantPortSymbol(node.getBoolLiteral()); - String typeName; - typeName = "B"; - emaConstantPortSymbol.setTypeReference(initTypeRefGeneralType(typeName, symbolTableCreator)); - } else { - Log.info("Case not handled", "ConstantPortInit"); - } - - return emaConstantPortSymbol; - } -} diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortArraySymbol.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortArraySymbol.java index f13fb32d7e93b4264ecf3bc7f287fe6cb9a93a49..c4d80df3bbf10466a0605441d21fa119e5392f1a 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortArraySymbol.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortArraySymbol.java @@ -122,20 +122,13 @@ public class EMAPortArraySymbol extends EMAPortSymbol { } private void createPortSymbolForArrayIndex(EMAComponentSymbolReference emaComponentSymbolReference, ASTPort node, String name, MCTypeReference typeRef) { - EMAPortSymbol ps; - if (name.startsWith("CONSTANTPORT")) { - ps = new EMAConstantPortSymbol(name); - } else { - ps = new EMAPortSymbol(name); - } + EMAPortSymbol ps = new EMAPortSymbol(name); ps.setNameDependsOn(nameSizeDependsOn); ps.setTypeReference(typeRef); ps.setDirection(node.isIncoming()); getEnclosingScope().getAsMutableScope().add(ps); - //emastc.addToScopeAndLinkWithNode(ps, node); - Log.debug(name + " " + emaComponentSymbolReference.getAllIncomingPorts().size(), "Added EMAPortSymbol From PortArray:"); } diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortBuilder.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortBuilder.java index 95a4509b68a9b5c589283213cbaa45262de45491..24ba844bfa849817d2c55548120df0f2f10e6707 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortBuilder.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortBuilder.java @@ -40,14 +40,15 @@ public class EMAPortBuilder { protected Optional middlewareSymbol = Optional.empty(); public static EMAPortSymbol clone(EMAPortSymbol port) { - if (port.isConstant()) - return new EMAPortBuilder().setName(port.getName()).setDirection(port.isIncoming()). - setTypeReference(port.getTypeReference()).setConstantValue(((EMAConstantPortSymbol) port).getConstantValue()).setASTNode(port.getAstNode()) - .buildConstantPort(); - else { - return new EMAPortBuilder().setName(port.getName()).setDirection(port.isIncoming()) - .setTypeReference(port.getTypeReference()).setASTNode(port.getAstNode()).setConfig(port.isConfig()).setMiddlewareSymbol(port.getMiddlewareSymbol()).build(); - } + return new EMAPortBuilder() + .setName(port.getName()) + .setDirection(port.isIncoming()) + .setTypeReference(port.getTypeReference()) + .setConstantValue(port.getConstantValue().orElse(null)) + .setMiddlewareSymbol(port.getMiddlewareSymbol().orElse(null)) + .setASTNode(port.getAstNode()) + .setConfig(port.isConfig()) + .build(); } public EMAPortBuilder setDirection(boolean incoming) { @@ -61,7 +62,7 @@ public class EMAPortBuilder { } public EMAPortBuilder setConstantValue(EMAConstantValue constantValue) { - this.constantValue = Optional.of(constantValue); + this.constantValue = Optional.ofNullable(constantValue); return this; } @@ -74,8 +75,8 @@ public class EMAPortBuilder { this.astNode = astNode; return this; } - public EMAPortBuilder setMiddlewareSymbol(Optional middlewareSymbol){ - this.middlewareSymbol = middlewareSymbol; + public EMAPortBuilder setMiddlewareSymbol(MiddlewareSymbol middlewareSymbol){ + this.middlewareSymbol = Optional.ofNullable(middlewareSymbol); return this; } @@ -90,6 +91,8 @@ public class EMAPortBuilder { EMAPortSymbol p = new EMAPortSymbol(this.name.get()); p.setDirection(this.incoming.get()); p.setTypeReference(this.typeReference.get()); + if(constantValue.isPresent()) + p.setConstantValue(constantValue.get()); if (astNode.isPresent()) p.setAstNode(astNode.get()); if (config.isPresent()) @@ -102,25 +105,6 @@ public class EMAPortBuilder { throw new Error("not all parameters have been set before to build the port symbol"); } - public EMAConstantPortSymbol buildConstantPort() { - if (typeReference == null) { - Log.error("not all parameters have been set before to build the port symbol"); - throw new Error("not all parameters have been set before to build the port symbol"); - } - EMAConstantPortSymbol p = new EMAConstantPortSymbol(name.get()); - p.setDirection(this.incoming.get()); - p.setTypeReference(typeReference.get()); - p.setConstantValue(constantValue.get()); - if (astNode.isPresent()) - p.setAstNode(astNode.get()); - if (config.isPresent()) - p.setConfig(config.get()); - if(middlewareSymbol.isPresent()) - p.setMiddlewareSymbol(middlewareSymbol.get()); - return p; - } - - public static EMAPortInstanceSymbol instantiate(EMAPortSymbol port, String packageName) { EMAPortInstanceSymbol portInstance = new EMAPortInstanceSymbol(port.getName()); portInstance.setDirection(port.isIncoming()); diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortHelper.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortHelper.java index a793896648fd5ec0603cd54636266366cb5ed779..aad37031dbd27e1d004fc4252c12a3b70d3953f5 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortHelper.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortHelper.java @@ -23,6 +23,7 @@ package de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncMode import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._ast.ASTConnector; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._ast.ASTPort; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._ast.ASTSubComponent; +import de.monticore.lang.embeddedmontiarc.helper.ConstantPortHelper; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.EmbeddedMontiArcSymbolTableCreator; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.instanceStructure.EMAComponentInstantiationSymbol; import de.monticore.lang.monticar.common2._ast.ASTArrayAccess; @@ -340,7 +341,7 @@ public class EMAPortHelper { de.monticore.lang.embeddedmontiarc.embeddedmontiarc._ast.ASTConnector node, EmbeddedMontiArcSymbolTableCreator symbolTableCreator) { int counter = 0, targetnum = 0; - EMAConstantPortSymbol emaConstantPortSymbol = EMAConstantPortSymbol.createConstantPortSymbol(node, + EMAPortSymbol emaConstantPortSymbol = ConstantPortHelper.createConstantPortSymbol(node, symbolTableCreator); symbolTableCreator.addToScope(emaConstantPortSymbol); for (ASTQualifiedNameWithArray target : node.getTargets().getQualifiedNameWithArrayList()) { @@ -352,7 +353,7 @@ public class EMAPortHelper { Log.debug("" + targetName, "target"); EMAConnectorSymbol sym = new EMAConnectorSymbol(targetName); - sym.setEMAConstantPortSymbol(emaConstantPortSymbol); + sym.setConstantEMAPortSymbol(emaConstantPortSymbol); sym.setSource(emaConstantPortSymbol.getName()); sym.setTarget(targetName); Log.debug(sym.getTarget(), "TARGETNAME SET TO"); diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortSymbol.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortSymbol.java index f6b143c158f1b881bc34ac76b4f3ce845b0c390a..4c6dc7f4260c6745fd6aa1af807c01625ad8183f 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortSymbol.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/cncModel/EMAPortSymbol.java @@ -21,6 +21,7 @@ package de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.instanceStructure.EMAComponentInstanceSymbol; +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant.EMAConstantValue; import de.monticore.lang.embeddedmontiarc.helper.SymbolPrinter; import de.monticore.lang.embeddedmontiarc.tagging.middleware.MiddlewareSymbol; import de.monticore.lang.embeddedmontiarc.tagging.middleware.ros.RosConnectionSymbol; @@ -66,6 +67,8 @@ public class EMAPortSymbol extends CommonSymbol implements EMAElementSymbol { private Optional middlewareSymbol = Optional.empty(); + private Optional constantValue = Optional.empty(); + /** * use {@link #builder()} */ @@ -186,9 +189,17 @@ public class EMAPortSymbol extends CommonSymbol implements EMAElementSymbol { public String toString() { return SymbolPrinter.printPort(this); } - + + public void setConstantValue(EMAConstantValue constantValue){ + this.constantValue = Optional.ofNullable(constantValue); + } + + public Optional getConstantValue(){ + return constantValue; + } + public boolean isConstant() { - return false; + return constantValue.isPresent(); } public String getNameWithoutArrayBracketPart() { diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/instanceStructure/EMAConnectorInstanceSymbol.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/instanceStructure/EMAConnectorInstanceSymbol.java index d0d3814d404a45c86755429e7e81f975a27b3356..a5bc801782948bda986bd039613fe16a0f35ba11 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/instanceStructure/EMAConnectorInstanceSymbol.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/_symboltable/instanceStructure/EMAConnectorInstanceSymbol.java @@ -20,10 +20,7 @@ */ package de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.instanceStructure; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.EMAComponentSymbol; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.EMAConnectorBuilder; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.EMAConnectorSymbol; -import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.EMAConstantPortSymbol; +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.*; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.types.TypesPrinter; import de.monticore.lang.embeddedmontiarc.helper.SymbolPrinter; import de.se_rwth.commons.Joiners; @@ -59,7 +56,7 @@ public class EMAConnectorInstanceSymbol extends EMAConnectorSymbol implements EM /** * is null if not a constantConnector */ - protected EMAConstantPortSymbol emaConstantPortSymbol = null; + protected EMAPortSymbol constantEmaPortSymbol = null; /** * use {@link #builder()} @@ -80,9 +77,9 @@ public class EMAConnectorInstanceSymbol extends EMAConnectorSymbol implements EM return isConstant; } - public void setEMAConstantPortSymbol(EMAConstantPortSymbol portSymbol) { - this.emaConstantPortSymbol = portSymbol; - setIsConstantConnector(true); + public void setConstantEMAPortSymbol(EMAPortSymbol portSymbol) { + this.constantEmaPortSymbol = portSymbol; + setIsConstantConnector(portSymbol != null && portSymbol.isConstant()); } /** diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/unit/constant/EMAConstantValue.java b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/unit/constant/EMAConstantValue.java index 3284e6c6b1b32b5627b5ebec4b59e45cca3e91be..b97a885f5fcf67fb8ea2199e760479741fd5b7e9 100644 --- a/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/unit/constant/EMAConstantValue.java +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/embeddedmontiarc/unit/constant/EMAConstantValue.java @@ -21,8 +21,8 @@ package de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant; /** - * The base type of every constant that can be stored by a EMAConstantPortSymbol - * which is used by a ConstantConnector + * The base type of every constant that can be stored by a constant EMAPortSymbol + * which is used by a constant Connector */ public abstract class EMAConstantValue { protected T value; diff --git a/src/main/java/de/monticore/lang/embeddedmontiarc/helper/ConstantPortHelper.java b/src/main/java/de/monticore/lang/embeddedmontiarc/helper/ConstantPortHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..b9054a635cf154213b9170199460ee003eb5c1a0 --- /dev/null +++ b/src/main/java/de/monticore/lang/embeddedmontiarc/helper/ConstantPortHelper.java @@ -0,0 +1,92 @@ +/** + * + * ****************************************************************************** + * MontiCAR Modeling Family, www.se-rwth.de + * Copyright (c) 2017, Software Engineering Group at RWTH Aachen, + * All rights reserved. + * + * This project is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this project. If not, see . + * ******************************************************************************* + */ +package de.monticore.lang.embeddedmontiarc.helper; + + +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.EmbeddedMontiArcSymbolTableCreator; +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.EMAPortBuilder; +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel.EMAPortSymbol; +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant.EMAConstantBoolean; +import de.monticore.lang.embeddedmontiarc.embeddedmontiarc.unit.constant.EMAConstantSIUnit; +import de.monticore.literals.literals._ast.ASTBooleanLiteral; +import de.monticore.numberunit._ast.ASTNumberWithUnit; +import de.se_rwth.commons.logging.Log; +import org.jscience.mathematics.number.Rational; + +import javax.measure.unit.Unit; + +import static de.monticore.lang.embeddedmontiarc.helper.EMATypeHelper.initTypeRefGeneralType; +import static de.monticore.numberunit.Rationals.doubleToRational; + +/** + * The ConstantPortHelper manages constant Port names and sets the constantValue from the AST elements. Constant Ports are used + * by constant Connectors to connect their value to other ports. + * + * @author Sascha Schneiders, Alexander Hellwig + */ +public class ConstantPortHelper { + private static int lastID = 1; + + public static String getNextConstantPortName() { + return "CONSTANTPORT" + lastID++; + } + + public static void resetLastID() { + lastID = 1; + } + + /** + * converts a UnitNumberLiteral to EMAConstantValue for a constant Port + */ + public static EMAConstantSIUnit getConstantValue(ASTNumberWithUnit si_unit) { + Unit unit = si_unit.getUnit(); + Rational rational = doubleToRational(si_unit.getNumber().get()); + + return new EMAConstantSIUnit(rational, unit); + } + + /** + * converts a BooleanLiteral to EMAConstantValue for a constant Port + */ + public static EMAConstantBoolean getConstantValue(ASTBooleanLiteral astBooleanLiteral) { + return new EMAConstantBoolean(astBooleanLiteral.getSource() == 1); + } + + public static EMAPortSymbol createConstantPortSymbol(de.monticore.lang.embeddedmontiarc.embeddedmontiarc._ast.ASTConnector node, EmbeddedMontiArcSymbolTableCreator symbolTableCreator) { + EMAPortBuilder builder = EMAPortSymbol.builder(); + builder.setName(getNextConstantPortName()); + builder.setDirection(EMAPortSymbol.INCOMING); + + if (node.getUnitNumberResolutionOpt().isPresent()) { + builder.setConstantValue(getConstantValue(node.getUnitNumberResolution().getNumberWithUnit())); + String typeName = "UnitNumberResolution"; + builder.setTypeReference(initTypeRefGeneralType(typeName, symbolTableCreator)); + } else if (node.getBoolLiteralOpt().isPresent()) { + builder.setConstantValue(getConstantValue(node.getBoolLiteral())); + String typeName = "B"; + builder.setTypeReference(initTypeRefGeneralType(typeName, symbolTableCreator)); + } else { + Log.info("Case not handled", "ConstantPortInit"); + } + + return builder.build(); + } +} diff --git a/src/test/java/de/monticore/lang/embeddedmontiarc/ExpandedComponentInstanceTest.java b/src/test/java/de/monticore/lang/embeddedmontiarc/ExpandedComponentInstanceTest.java index d71acc6bbc588cad982810143dd0149a0b638c8d..25a5c558d981b2a4571bd5150deb357d4ed0a4ef 100644 --- a/src/test/java/de/monticore/lang/embeddedmontiarc/ExpandedComponentInstanceTest.java +++ b/src/test/java/de/monticore/lang/embeddedmontiarc/ExpandedComponentInstanceTest.java @@ -26,6 +26,7 @@ import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.cncModel import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.instanceStructure.EMAComponentInstanceSymbol; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.instanceStructure.EMAConnectorInstanceSymbol; import de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.instanceStructure.InstanceInformation; +import de.monticore.lang.embeddedmontiarc.helper.ConstantPortHelper; import de.monticore.lang.monticar.si._symboltable.ResolutionDeclarationSymbol; import de.monticore.symboltable.Scope; import de.se_rwth.commons.logging.Log; @@ -126,7 +127,7 @@ public class ExpandedComponentInstanceTest extends AbstractSymtabTest { @Test public void testConnectorInstancing() { - EMAConstantPortSymbol.resetLastID(); + ConstantPortHelper.resetLastID(); Scope symTab = createSymTab("src/test/resources"); EMAComponentInstanceSymbol inst = symTab.resolve( "testing.connectorInstancing", EMAComponentInstanceSymbol.KIND).orElse(null); @@ -136,7 +137,7 @@ public class ExpandedComponentInstanceTest extends AbstractSymtabTest { assertEquals(3, inst.getConnectorInstances().size()); // Todo: make ConstantPorts Instances - //EMAConstantPortSymbol portSymbol = (EMAConstantPortSymbol) inst.getPortInstance("CONSTANTPORT1").get(); + //ConstantPortHelper portSymbol = (ConstantPortHelper) inst.getPortInstance("CONSTANTPORT1").get(); } @Test diff --git a/src/test/java/de/monticore/lang/embeddedmontiarc/SymtabTest.java b/src/test/java/de/monticore/lang/embeddedmontiarc/SymtabTest.java index 10403b14cfb4eb7ee45e0576a848e06c2f6a81c4..65a7f848d18bc123248dfd22a03eb56498fd3eba 100644 --- a/src/test/java/de/monticore/lang/embeddedmontiarc/SymtabTest.java +++ b/src/test/java/de/monticore/lang/embeddedmontiarc/SymtabTest.java @@ -264,10 +264,10 @@ public class SymtabTest extends AbstractSymtabTest { EMAConnectorSymbol emaConnectorSymbol = cs.getConnector("steering").get(); assertTrue(emaConnectorSymbol.getSourcePort().isConstant()); - EMAConstantPortSymbol cps = (EMAConstantPortSymbol) emaConnectorSymbol.getSourcePort(); - assertTrue(cps.getConstantValue().isSIUnit()); + EMAPortSymbol cps = emaConnectorSymbol.getSourcePort(); + assertTrue(cps.getConstantValue().get().isSIUnit()); - EMAConstantSIUnit constantSIUnit = (EMAConstantSIUnit) cps.getConstantValue(); + EMAConstantSIUnit constantSIUnit = (EMAConstantSIUnit) cps.getConstantValue().get(); assertEquals(0.1, constantSIUnit.getRational().doubleValue(), 0.0000000001); assertEquals("cm", constantSIUnit.getUnit().toString()); @@ -301,12 +301,12 @@ public class SymtabTest extends AbstractSymtabTest { //check that this is a constant connector assertTrue(emaConnectorSymbol.isConstant()); assertTrue(emaConnectorSymbol.getSourcePort().isConstant()); - EMAConstantPortSymbol cps = ((EMAConstantPortSymbol) emaConnectorSymbol.getSourcePort()); + EMAPortSymbol cps = emaConnectorSymbol.getSourcePort(); - assertTrue(cps.getConstantValue().isBoolean()); + assertTrue(cps.getConstantValue().get().isBoolean()); - assertTrue((Boolean) cps.getConstantValue().getValue() == false); + assertEquals(false, cps.getConstantValue().get().getValue()); }