File: System\ComponentModel\Design\Serialization\CodeMethodMap.cs
Web Access
Project: src\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.CodeDom;
 
namespace System.ComponentModel.Design.Serialization;
 
/// <summary>
///  This structure is used by IntegrateStatements to put statements in the right place.
/// </summary>
internal class CodeMethodMap
{
    private CodeStatementCollection? _container;
    private CodeStatementCollection? _begin;
    private CodeStatementCollection? _end;
    private CodeStatementCollection? _statements;
    private CodeStatementCollection? _locals;
    private CodeStatementCollection? _fields;
    private CodeStatementCollection? _variables;
    private readonly CodeStatementCollection _targetStatements;
 
    internal CodeMethodMap(CodeMemberMethod method)
    {
        Method = method;
        _targetStatements = Method.Statements;
    }
 
    internal CodeMethodMap(CodeStatementCollection targetStatements)
    {
        _targetStatements = targetStatements;
    }
 
    internal CodeStatementCollection BeginStatements => _begin ??= [];
 
    internal CodeStatementCollection EndStatements => _end ??= [];
 
    internal CodeStatementCollection ContainerStatements => _container ??= [];
 
    internal CodeMemberMethod? Method { get; }
 
    internal CodeStatementCollection Statements => _statements ??= [];
 
    internal CodeStatementCollection LocalVariables => _locals ??= [];
 
    internal CodeStatementCollection FieldAssignments => _fields ??= [];
 
    // TODO: Should we update RootCodeDomSerializer as well?
    internal CodeStatementCollection VariableAssignments => _variables ??= [];
 
    internal void Add(CodeStatementCollection statements)
    {
        foreach (CodeStatement statement in statements)
        {
            if (statement.UserData["IContainer"] is "IContainer")
            {
                ContainerStatements.Add(statement);
            }
            else if (statement is CodeAssignStatement { Left: CodeFieldReferenceExpression } fieldAssignment)
            {
                FieldAssignments.Add(fieldAssignment);
            }
            else if (statement is CodeAssignStatement { Left: CodeVariableReferenceExpression } variableAssignment)
            {
                VariableAssignments.Add(variableAssignment);
            }
            else if (statement is CodeVariableDeclarationStatement)
            {
                LocalVariables.Add(statement);
            }
            else
            {
                switch (statement.UserData["statement-ordering"])
                {
                    case "begin":
                        BeginStatements.Add(statement);
                        break;
 
                    case "end":
                        EndStatements.Add(statement);
                        break;
 
                    default:
                        Statements.Add(statement);
                        break;
                }
            }
        }
    }
 
    internal void Combine()
    {
        if (_container is not null)
        {
            _targetStatements.AddRange(_container);
        }
 
        if (_locals is not null)
        {
            _targetStatements.AddRange(_locals);
        }
 
        if (_fields is not null)
        {
            _targetStatements.AddRange(_fields);
        }
 
        if (_variables is not null)
        {
            _targetStatements.AddRange(_variables);
        }
 
        if (_begin is not null)
        {
            _targetStatements.AddRange(_begin);
        }
 
        if (_statements is not null)
        {
            _targetStatements.AddRange(_statements);
        }
 
        if (_end is not null)
        {
            _targetStatements.AddRange(_end);
        }
    }
}