private static void Walk([NotNull] Agent agent, [NotNull] AssignmentExpressionNode assignmentExpression, bool isStrict)
        {
            //https://tc39.github.io/ecma262/#sec-assignment-operators-static-semantics-early-errors
            if (assignmentExpression.Operator == Operator.Assignment)
            {
                if (assignmentExpression.Left is ArrayPatternNode)
                {
                }
                else if (assignmentExpression.Left is ObjectPatternNode)
                {
                }
                else
                {
                    if (!IsValidSimpleAssignmentTarget(agent, assignmentExpression.Left, isStrict))
                    {
                        throw agent.CreateSyntaxError();
                    }
                }
            }
            else
            {
                if (!IsValidSimpleAssignmentTarget(agent, assignmentExpression.Left, isStrict))
                {
                    throw agent.CreateSyntaxError();
                }
            }

            Walk(agent, assignmentExpression.Left, isStrict);
            Walk(agent, assignmentExpression.Right, isStrict);
        }
Beispiel #2
0
 private void WriteSimpleAssignmentExpression(AssignmentExpressionNode assignmentExpression)
 {
     _builder.Append($"{assignmentExpression.Set} ");
     WriteExpression(assignmentExpression.Left);
     _builder.Append(" ");
     _builder.Append($"{assignmentExpression.To} ");
     WriteExpression(assignmentExpression.Right);
 }
Beispiel #3
0
        private Expression BindAssignmentExpression(AssignmentExpressionNode node)
        {
            var name            = node.Identifier.Text;
            var boundExpression = BindExpression(node.Expression);

            if (!Scope.TryLookupVariable(name, out var variable))
            {
                diagnostics.ReportUndefinedVariable(node.Identifier, name);
                return(boundExpression);
            }

            if (variable.IsReadOnly)
            {
                diagnostics.ReportInvalidAssignmentToReadOnlyVariable(node.Equal, name);
            }

            var convertedExpression = BindConversion(node.Expression, boundExpression, variable.Type);

            return(new AssignmentExpression(variable, convertedExpression));
        }
Beispiel #4
0
        public INode GenerateTree(IParseTree tree, Declaration declaration)
        {
            INode node = default;

            switch (tree)
            {
            case VBAParser.ForNextStmtContext _:
            case VBAParser.ForEachStmtContext _:
            case VBAParser.WhileWendStmtContext _:
            case VBAParser.DoLoopStmtContext _:
                node = new LoopNode(tree);
                break;

            case VBAParser.IfStmtContext _:
            case VBAParser.ElseBlockContext _:
            case VBAParser.ElseIfBlockContext _:
            case VBAParser.SingleLineIfStmtContext _:
            case VBAParser.SingleLineElseClauseContext _:
            case VBAParser.CaseClauseContext _:
            case VBAParser.CaseElseClauseContext _:
                node = new BranchNode(tree);
                break;

            case VBAParser.BlockContext _:
                node = new BlockNode(tree);
                break;

            case VBAParser.LetStmtContext _:
            case VBAParser.SetStmtContext _:
                node = new AssignmentExpressionNode(tree);
                break;
            }

            if (declaration.Context == tree)
            {
                node = new DeclarationNode(tree)
                {
                    Declaration = declaration
                };
            }

            var reference = declaration.References.SingleOrDefault(w => w.Context == tree);

            if (reference != null)
            {
                if (reference.IsAssignment)
                {
                    node = new AssignmentNode(tree)
                    {
                        Reference = reference
                    };
                }
                else
                {
                    node = new ReferenceNode(tree)
                    {
                        Reference = reference
                    };
                }
            }

            if (node == null)
            {
                node = new GenericNode(tree);
            }

            var children = new List <INode>();

            for (var i = 0; i < tree.ChildCount; i++)
            {
                var nextChild = GenerateTree(tree.GetChild(i), declaration);
                nextChild.SortOrder = i;
                nextChild.Parent    = node;

                if (nextChild.Children.Any() || nextChild.GetType() != typeof(GenericNode))
                {
                    children.Add(nextChild);
                }
            }

            node.Children = children.ToImmutableList();

            return(node);
        }