private void ProcessClassBody() { // Class is handled in a specific order rather than in the order of // the statement appearance. This is because we need all members // properly declared and added to the class type so when we process // methods, the class variables are all declared and constructors // are evaluated. // Process bases. foreach (var b in _class.Bases.Select(b => b.GetPythonType <IPythonClassType>()).ExcludeDefault()) { SymbolTable.Evaluate(b.ClassDefinition); } // Process imports foreach (var s in GetStatements <FromImportStatement>(_classDef)) { ImportHandler.HandleFromImport(s); } foreach (var s in GetStatements <ImportStatement>(_classDef)) { ImportHandler.HandleImport(s); } UpdateClassMembers(); // Process assignments so we get class variables declared. // Note that annotated definitions and assignments can be intermixed // and must be processed in order. Consider // class A: // x: int // x = 1 foreach (var s in GetStatements <Statement>(_classDef)) { switch (s) { case AssignmentStatement assignment: AssignmentHandler.HandleAssignment(assignment); break; case ExpressionStatement e: AssignmentHandler.HandleAnnotatedExpression(e.Expression as ExpressionWithAnnotation, null); break; } } UpdateClassMembers(); // Ensure constructors are processed so class members are initialized. EvaluateConstructors(_classDef); UpdateClassMembers(); // Process remaining methods. SymbolTable.EvaluateScope(_classDef); UpdateClassMembers(); }
public override bool Walk(AssignmentStatement node) { AssignmentHandler.HandleAssignment(node); return(base.Walk(node)); }