public override Result VisitPropertyCall([NotNull] OclParser.PropertyCallContext context) { if (context.propertyCallParameters() != null) { Result result = this.launcher.LaunchOperation(context.pathName().GetText(), context); if (result != null) { return(result); } Dictionary <string, Result> stack = new Dictionary <string, Result>(); List <string> names = this.funcs[context.pathName().GetText()].Param; OclParser.ExpressionContext contextFunc = this.funcs[context.pathName().GetText()].Context; for (int i = 0; i < names.Count; i++) { stack[names[i]] = this.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[i]); } this.vars.Add(stack); result = this.VisitExpression(contextFunc); this.vars.RemoveAt(this.vars.Count - 1); return(result); } else if (context.Parent is OclParser.PostfixExpressionContext expressionContext) { string element = expressionContext.primaryExpression().GetText(); if (element != "self") { this.Element = this.Model.FindElement(element); } var old = this.Element; if (context.NUMBER() != null) { IElement parent = this.Element; for (int i = 0; i < this.Depth - int.Parse(context.NUMBER().GetText()); i++) { parent = parent.Class; } this.Element = parent; } IAttribute attr = this.Element.Attributes.First(x => x.Name == context.pathName().GetText()); this.Element = old; switch (attr.Kind) { case AttributeKind.Boolean: return(new BoolResult(bool.Parse(attr.StringValue))); case AttributeKind.String: return(new StringResult(attr.StringValue)); case AttributeKind.Int: return(new IntResult(int.Parse(attr.StringValue))); case AttributeKind.Double: return(new DoubleResult(double.Parse(attr.StringValue))); } return(new StringResult(this.Element.Attributes.First(x => x.Name == context.pathName().GetText()).StringValue)); } return(this.VisitPathName(context.pathName())); }
/// <summary> /// Visit a parse tree produced by <see cref="OclParser.expression"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitExpression([NotNull] OclParser.ExpressionContext context) { return(VisitChildren(context)); }