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); }
protected override Void handleAssign(AssignExpressionNode assign, Set <TypeInfo> dependencies, bool nested) { handleExpression(assign.Left, dependencies, true); handleExpression(assign.Right, dependencies, true); return(null); }
public override TreeReference Visit(AssignExpressionNode node, TreeReference state) { return(new TreeAssignNode(_context, node.OperatorToken.Location, Visit(node.LeftOperand), Visit(node.RightOperand))); }