public virtual void PostWalk(NonlocalStatement node)
 {
 }
 // NonlocalStatement
 public virtual bool Walk(NonlocalStatement node)
 {
     return(true);
 }
 // NonlocalStatement
 public override bool Walk(NonlocalStatement node)
 {
     return(Contains(node));
 }
 public override void PostWalk(NonlocalStatement node)
 {
 }
 // NonlocalStatement
 public override bool Walk(NonlocalStatement node)
 {
     return(false);
 }
        public override bool Walk(NonlocalStatement node)
        {
            foreach (var nameNode in node.Names)
            {
                var n = nameNode.Name;
                if (n == null)
                {
                    continue;
                }

                // Check current scope for conflicting variable
                var assignedLocal = false;
                if (_currentScope.TryGetVariable(n, out var conflict))
                {
                    // conflict?
                    switch (conflict.Kind)
                    {
                    case VariableKind.Global:
                        ReportSyntaxError("name '{0}' is nonlocal and global".FormatUI(n), node);
                        break;

                    case VariableKind.Local:
                        assignedLocal = true;
                        ReportSyntaxWarning(
                            "name '{0}' is assigned to before nonlocal declaration".FormatUI(n),
                            node
                            );
                        break;

                    case VariableKind.Parameter:
                        ReportSyntaxError(
                            "name '{0}' is a parameter and nonlocal".FormatUI(n),
                            node);
                        break;

                    case VariableKind.Nonlocal:
                        // OK to reassign as long as kind is the same.
                        // Consider example from Python test grammar:
                        //  nonlocal x
                        //  nonlocal x, y
                        assignedLocal = true;
                        break;
                    }
                }

                // Check for the name being referenced previously. If it has been, issue warning.
                if (_currentScope.IsReferenced(n) && !assignedLocal)
                {
                    ReportSyntaxWarning(
                        "name '{0}' is used prior to nonlocal declaration".FormatUI(n),
                        node);
                }


                if (conflict == null)
                {
                    // no previously definied variables, add it to the current scope
                    _currentScope.CreateVariable(n, VariableKind.Nonlocal);
                }
                _currentScope.AddNonLocalVariable(nameNode);
                nameNode.AddVariableReference(GlobalScope, BindReferences, Reference(n));
            }
            return(true);
        }