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); }
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)); } }