public override object VisitDotExpression([NotNull] DoshikParser.DotExpressionContext context)
        {
            SetWholeExpression(context);
            VisitChildren(context);
            _compilationContext.SetParsingAntlrContext(context);

            var node = new DotExpressionNode(context);

            node.Left = Sequence.FindExpressionByAntlrContext(context.left);

            if (node.Left is IdentifierExpressionNode leftIdentifier)
            {
                // Устанавливаем флаг того, что этот идентификатор был упомянут как левая часть в dot expression
                // это нужно, т.к. далее при преобразовании ноды в expression (expression tree domain) в случае если этот идентификатор
                // является левой часть dot выражения, значит его стоит в первую очередь пытаться воспринять как тип а во вторую очередь как имя переменной
                // во всех остальных же случаях это всегда должно быть имя переменной
                leftIdentifier.IsLeftOfDotExpression = true;
            }

            if (context.rightIdentifier != null)
            {
                node.RightIdentifier = context.rightIdentifier.Text;
            }
            else
            {
                node.RightMethodCallData = new MethodCallExpressionNodeData();
                GetMethodCallData(context.rightMethodCall, node.RightMethodCallData);
            }

            Sequence.Sequence.Add(node);

            return(null);
        }
Ejemplo n.º 2
0
        private IExpression HandleDotExpressionNode(DotExpressionNode node)
        {
            if (node.RightIdentifier != null)
            {
                throw _compilationContext.ThrowCompilationError("properties are not supported yet");
            }

            var left = FindExpressionByExpressionNode(node.Left, false);

            if (left is TypeHolderDummyExpression typeHolder)
            {
                return(CreateStaticMethodCallExpression(typeHolder.Type, node.RightMethodCallData));
            }
            else
            {
                return(CreateInstanceMethodCallExpression(node.Left, node.RightMethodCallData));
            }
        }