// GlobalStatement public override bool Walk(GlobalStatement node) { node.Parent = _currentScope; foreach (string n in node.Names) { PythonVariable conflict; // Check current scope for conflicting variable bool assignedGlobal = false; if (_currentScope.TryGetVariable(n, out conflict)) { // conflict? switch (conflict.Kind) { case VariableKind.Global: case VariableKind.Local: assignedGlobal = true; ReportSyntaxWarning($"name '{n}' is assigned to before global declaration", node); break; case VariableKind.Parameter: ReportSyntaxError($"name '{n}' is local and global", node); break; } } // Check for the name being referenced previously. If it has been, issue warning. if (_currentScope.IsReferenced(n) && !assignedGlobal) { ReportSyntaxWarning( String.Format( System.Globalization.CultureInfo.InvariantCulture, "name '{0}' is used prior to global declaration", n), node); } // Create the variable in the global context and mark it as global PythonVariable variable = _globalScope.EnsureGlobalVariable(n); variable.Kind = VariableKind.Global; if (conflict == null) { // no previously definied variables, add it to the current scope _currentScope.AddGlobalVariable(variable); } } return(true); }
// GlobalStatement public override bool Walk(GlobalStatement node) { node.Parent = _currentScope; foreach (string n in node.Names) { PythonVariable conflict; // Check current scope for conflicting variable bool assignedGlobal = false; if (_currentScope.TryGetVariable(n, out conflict)) { // conflict? switch (conflict.Kind) { case VariableKind.Global: break; case VariableKind.Local: assignedGlobal = true; ReportSyntaxError($"name '{n}' is assigned to before global declaration", node); break; case VariableKind.Parameter: ReportSyntaxError($"name '{n}' is parameter and global", node); break; case VariableKind.Nonlocal: ReportSyntaxError($"name '{n}' is nonlocal and global", node); break; } } // Check for the name being referenced previously if (_currentScope.IsReferenced(n) && !assignedGlobal) { ReportSyntaxError($"name '{n}' is used prior to global declaration", node); } // Create the variable in the global context or mark it as global PythonVariable variable = _globalScope.EnsureGlobalVariable(n); if (conflict == null) { // no previously defined variables, add it to the current scope _currentScope.AddGlobalVariable(variable); } } return(true); }