Пример #1
0
                public override void Visit(AssignExpressionNode node)
                {
                    var left = node.LeftOperand;
                    var op   = node.OperatorToken;

                    if (!op.IsMissing)
                    {
                        switch (left)
                        {
                        case IndexExpressionNode _:
                        case FieldAccessExpressionNode _:
                            break;

                        case IdentifierExpressionNode inode:
                            var ident = inode.IdentifierToken;

                            if (!ident.IsMissing && !_scope.IsMutable(ident.Text))
                            {
                                Error(node, SyntaxDiagnosticKind.InvalidAssignmentTarget, op.Location,
                                      $"'{ident}' does not represent a mutable variable");
                            }
                            break;

                        default:
                            Error(node, SyntaxDiagnosticKind.InvalidAssignmentTarget, op.Location,
                                  "Assignment target must be an index, field access, or identifier expression");
                            break;
                        }
                    }

                    base.Visit(node);
                }
 protected override AssignmentState handleAssign(AssignExpressionNode assign, HashSet <StatementNode> visited, bool nested)
 {
     if (handleExpression(assign.Right, visited, true) == AssignmentState.Assigned)
     {
         return(AssignmentState.Assigned);
     }
     if (assign.Left.ExpressionKind == ExpressionKind.SimpleName && assign.Operator == AssignOperator.Assign)
     {
         var linfo  = assign.Left.getUserData(typeof(ExpressionInfo));
         var member = linfo.Member;
         if (member.MemberKind == MemberKind.Local && member == assignmentChecker.uninitializedLocalInfo.local)
         {
             return(AssignmentState.Assigned);
         }
     }
     else
     {
         return(handleExpression(assign.Left, visited, true));
     }
     return(AssignmentState.NotAssigned);
 }
Пример #3
0
 protected override Void handleAssign(AssignExpressionNode assign, Set <TypeInfo> dependencies, bool nested)
 {
     handleExpression(assign.Left, dependencies, true);
     handleExpression(assign.Right, dependencies, true);
     return(null);
 }
Пример #4
0
 public override TreeReference Visit(AssignExpressionNode node, TreeReference state)
 {
     return(new TreeAssignNode(_context, node.OperatorToken.Location, Visit(node.LeftOperand),
                               Visit(node.RightOperand)));
 }