| File: System\ComponentModel\Design\Serialization\CodeMethodMap.cs | Web Access |
| Project: src\winforms\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); } } }