public override bool Walk(NonlocalStatement node) { foreach (NameExpression nameNode in node.Names) { string n = nameNode.Name; if (n == null) { continue; } PythonVariable conflict; // Check current scope for conflicting variable bool assignedLocal = false; if (_currentScope.TryGetVariable(n, out 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; } } // 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); }
public override bool Walk(NonlocalStatement node) { node.Parent = _currentScope; foreach (string n in node.Names) { PythonVariable conflict; // Check current scope for conflicting variable bool assignedLocal = false; if (_currentScope.TryGetVariable(n, out conflict)) { // conflict? switch (conflict.Kind) { case VariableKind.Global: ReportSyntaxError(String.Format("name '{0}' is nonlocal and global", n), node); break; case VariableKind.Local: assignedLocal = true; ReportSyntaxWarning( String.Format( System.Globalization.CultureInfo.InvariantCulture, "name '{0}' is assigned to before nonlocal declaration", n ), node ); break; case VariableKind.Parameter: ReportSyntaxError( String.Format( System.Globalization.CultureInfo.InvariantCulture, "name '{0}' is a parameter and nonlocal", n), node); break; } } // Check for the name being referenced previously. If it has been, issue warning. if (_currentScope.IsReferenced(n) && !assignedLocal) { ReportSyntaxWarning( String.Format( System.Globalization.CultureInfo.InvariantCulture, "name '{0}' is used prior to nonlocal declaration", n), node); } _currentScope.AddNonLocalVariable(n); } return(true); }