private string TranslateInvariantToXPath(ClassifierConstraintBlock constraintBlock, IBridgeToOCL bridge, OclExpression invariant, TranslationSettings translationSettings, bool forceTranslation = false) { invariant.IsInvariant = true; invariant.ConstraintContext = constraintBlock; PSMOCLtoXPathConverter xpathConverter; if (translationSettings.Functional) { xpathConverter = new PSMOCLtoXPathConverterFunctional(); } else { xpathConverter = new PSMOCLtoXPathConverterDynamic(); } xpathConverter.Bridge = (PSMBridge)bridge; xpathConverter.OclContext = constraintBlock; xpathConverter.Log = Log; xpathConverter.Settings = translationSettings; if (forceTranslation || !translationSettings.Retranslation) { try { string invariantStr = xpathConverter.TranslateExpression(invariant); translationSettings.SubexpressionTranslations.XPathContextVariableReplacementMode = xpathConverter.ContextVariableReplacementMode; translationSettings.SubexpressionTranslations.Merge(xpathConverter.SubexpressionTranslations); return(invariantStr); } catch (ExpressionNotSupportedInXPath e) { Log.AddError(e.Message, e.Expression); } catch { Log.AddError("Unable to translate invariant. ", invariant); } } else { try { // this must stay here because of the string comparison - translation renames some variables xpathConverter.TranslateExpression(invariant); foreach (OclExpression translatedExp in translationSettings.SubexpressionTranslations.Translations.Keys) { if (translatedExp.ToString() == invariant.ToString()) { translationSettings.SubexpressionTranslations.SelfVariableDeclaration = translatedExp.ConstraintContext.Self; return(translationSettings.SubexpressionTranslations.GetSubexpressionTranslation(translatedExp).GetString(true)); } } } catch (ExpressionNotSupportedInXPath e) { Log.AddError(e.Message, e.Expression); } catch { Log.AddError("Unable to translate invariant. ", invariant); } } return("### ERROR"); }
public void testTupleLiteralExp() { AstOclModelElementFactory factory1 = AstOclModelElementFactoryManager.getInstance(umlModel.getOclPackage()); OclExpression init1 = factory1.createIntegerLiteralExp(100, getClassifier("Integer")); VariableDeclaration part1 = factory1.createVariableDeclaration("a", getClassifier("Integer"), init1); OclExpression init2 = factory1.createRealLiteralExp("100.38", getClassifier("Real")); VariableDeclaration part2 = factory1.createVariableDeclaration("b", getClassifier("Real"), init2); OclExpression init3 = factory1.createBooleanLiteralExp(true, getClassifier("Boolean")); VariableDeclaration part3 = factory1.createVariableDeclaration("c", getClassifier("Boolean"), init3); List <object> parts = new List <object> (); parts.Add(part1); parts.Add(part2); parts.Add(part3); TupleTypeImpl tupleType = (TupleTypeImpl)factory1.createTupleType(); tupleType.addElement("a", getClassifier("Integer")); tupleType.addElement("b", getClassifier("Real")); tupleType.addElement("c", getClassifier("Boolean")); Assert.AreEqual("Tuple(a : Integer, b : Real, c : Boolean)", tupleType.getName()); // TuplePartType part1Type = factory1.createTuplePartType(tupleType, "a", getClassifier("Integer")); // TuplePartType part2Type = factory1.createTuplePartType(tupleType, "b", getClassifier("Real")); // TuplePartType part3Type = factory1.createTuplePartType(tupleType, "c", getClassifier("Boolean")); OclExpression exp = factory1.createTupleLiteralExp(parts, tupleType); Assert.AreEqual("Tuple{ a : Integer = 100, b : Real = 100.38, c : Boolean = True }", exp.ToString()); Assert.AreEqual("Tuple(a : Integer, b : Real, c : Boolean)", exp.getType().getName()); Assert.IsNotNull(exp.getType().lookupAttribute("a")); Assert.IsNull(exp.getType().lookupAttribute("d")); }