public static void Attach(
            IMethodSymbol destructor,
            string typeName,
            ImmutableArray <SyntaxNode> statements)
        {
            var info = new CodeGenerationDestructorInfo(typeName, statements);

            s_destructorToInfoMap.Add(destructor, info);
        }
        /// <summary>
        /// Creates a destructor symbol that can be used to describe a destructor declaration.
        /// </summary>
        public static IMethodSymbol CreateDestructorSymbol(
            ImmutableArray <AttributeData> attributes, string typeName,
            ImmutableArray <SyntaxNode> statements = default)
        {
            var result = new CodeGenerationDestructorSymbol(null, attributes);

            CodeGenerationDestructorInfo.Attach(result, typeName, statements);
            return(result);
        }
        protected override CodeGenerationSymbol Clone()
        {
            var result = new CodeGenerationDestructorSymbol(this.ContainingType, this.GetAttributes());

            CodeGenerationDestructorInfo.Attach(result,
                                                CodeGenerationDestructorInfo.GetTypeName(this),
                                                CodeGenerationDestructorInfo.GetStatements(this));

            return(result);
        }
 private static string GetTypeName(CodeGenerationDestructorInfo info, IMethodSymbol constructor)
 => info == null ? constructor.ContainingType.Name : info._typeName;
 private static ImmutableArray <SyntaxNode> GetStatements(CodeGenerationDestructorInfo info)
 => info?._statements ?? default;