private async Task ProcessClassBody(CancellationToken cancellationToken = default) { // 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()) { await SymbolTable.EvaluateAsync(b.ClassDefinition, cancellationToken); } // Process imports foreach (var s in GetStatements <FromImportStatement>(_classDef)) { await FromImportHandler.HandleFromImportAsync(s, cancellationToken); } foreach (var s in GetStatements <ImportStatement>(_classDef)) { await ImportHandler.HandleImportAsync(s, cancellationToken); } UpdateClassMembers(); // Process assignments so we get class variables declared. foreach (var s in GetStatements <AssignmentStatement>(_classDef)) { await AssignmentHandler.HandleAssignmentAsync(s, cancellationToken); } foreach (var s in GetStatements <ExpressionStatement>(_classDef)) { await AssignmentHandler.HandleAnnotatedExpressionAsync(s.Expression as ExpressionWithAnnotation, null, cancellationToken); } UpdateClassMembers(); // Ensure constructors are processed so class members are initialized. await EvaluateConstructorsAsync(_classDef, cancellationToken); UpdateClassMembers(); // Process remaining methods. await SymbolTable.EvaluateScopeAsync(_classDef, cancellationToken); UpdateClassMembers(); }
public override async Task <bool> WalkAsync(AssignmentStatement node, CancellationToken cancellationToken = default) { await AssignmentHandler.HandleAssignmentAsync(node, cancellationToken); return(await base.WalkAsync(node, cancellationToken)); }