public virtual void Visit(OperationCallExp node) { AssignIsPartOfIteratorBody(node); OclExpression[] arguments = new OclExpression[node.Arguments.Count + 1]; if (node.Source is PropertyCallExp) { this.Visit((PropertyCallExp)node.Source, true); } else { node.Source.Accept(this); } arguments[0] = node.Source; for (int i = 0; i < node.Arguments.Count; i++) { if (node.Arguments[i] is PropertyCallExp) { this.Visit((PropertyCallExp)node.Arguments[i], true); } else { node.Arguments[i].Accept(this); } arguments[i + 1] = node.Arguments[i]; } TranslationOption option = new TranslationOption(); option.FormatString = OperationHelper.CreateBasicFormatString(node, arguments); this.SubexpressionTranslations.AddTranslationOption(node, option, arguments); }
public override void Visit(OperationCallExp node) { if (node.ReferredOperation != null && node.ReferredOperation.Tag is NextOperationTag) { node.Source.Accept(this); TranslationOption option = new TranslationOption(); option.FormatString = "oclX:apply-templates({0})"; SubexpressionTranslations.AddTranslationOption(node, option, node.Source); return; } base.Visit(node); if (OperationRewritings.IsEmpty()) { OperationRewritings[OperationHelper.firstOperationInfo] = AddFirstRewritings; OperationRewritings[OperationHelper.lastOperationInfo] = AddLastRewritings; OperationRewritings[OperationHelper.atOperationInfo] = AddAtRewritings; } { TranslationOption standardTranslation = SubexpressionTranslations.GetSubexpressionTranslation(node); OperationInfo? operationInfo = OperationHelper.LookupOperation(node, standardTranslation.OptionsContainer.SubExpressions.ToArray()); if (operationInfo != null && OperationRewritings.ContainsKey(operationInfo.Value)) { OperationRewritings[operationInfo.Value](node, operationInfo.Value); } } }
public virtual void Visit(PropertyCallExp node, bool isOperationArgument) { AssignIsPartOfIteratorBody(node); PSMPath psmPath = PSMPathBuilder.BuildPSMPath(node, OclContext, VariableNamer, buildPathParams); string xpath = psmPath.ToXPath(delayFirstVariableStep: true); if (!isOperationArgument) { string wrapString = OperationHelper.WrapAtomicOperand(node, null, 0); xpath = string.Format(wrapString, xpath); } var steps = psmPath.Steps.OfType <IPSMPathStepWithCardinality>().Where(s => s.Lower == 0); if (steps.Any()) { Log.AddWarningTaggedFormat("Navigation using '{0}' may result in 'null', which will be an empty sequence in XPath. ", node, steps.ConcatWithSeparator(s => s.ToXPath(), ",")); } TranslationOption option = new TranslationOption(); if (psmPath.StartingVariableExp != null) { option.ContextVariableSubstitution = true; option.StartingVariable = psmPath.StartingVariableExp.referredVariable; } option.FormatString = xpath; SubexpressionTranslations.AddTranslationOption(node, option, psmPath.SubExpressions.ToArray()); }
public string TranslateExpression(OclExpression expression) { OperationHelper = new OperationHelper(); OperationHelper.PSMSchema = Bridge.Schema; OperationHelper.Log = Log; OperationHelper.ExplicitCastAtomicOperands = !Settings.SchemaAware; OperationHelper.PSMBridge = Bridge; OperationHelper.InitStandard(); TranslatedOclExpression = expression; VariableNamer = new VariableNamer(); SubexpressionTranslations = new SubexpressionTranslations { XPathContextVariableReplacementMode = ContextVariableReplacementMode }; SubexpressionTranslations.Log = Log; expression.Accept(this); SubexpressionTranslations.SelfVariableDeclaration = OclContext.Self; string result = SubexpressionTranslations.GetSubexpressionTranslation(expression).GetString(true); return(result); }