File: Instrumentation\CodeSpit.cs
Project: ndp\fx\src\wmi\managed\System\Management\System.Management.csproj (System.Management)

namespace System.Management.Instrumentation
{
    using System;
    using System.IO;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Globalization;
    using System.Runtime.Versioning;
 
    class CodeWriter
    {
        int depth;
        ArrayList children = new ArrayList();
 
        public static explicit operator String(CodeWriter writer)
        {
            return writer.ToString();
        }
 
        public override string ToString()
        {
            StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
            WriteCode(writer);
            string retString = writer.ToString();
            writer.Close();
            return retString;
        }
 
        void WriteCode(TextWriter writer)
        {
            string prefix = new String(' ', depth*4);
            foreach(Object child in children)
            {
                if(null == child)
                {
                    writer.WriteLine();
                }
                else if(child is string)
                {
                    writer.Write(prefix);
                    writer.WriteLine(child);
                }
                else
                    ((CodeWriter)child).WriteCode(writer);
            }
        }
 
        public CodeWriter AddChild(string name)
        {
            Line(name);
            Line("{");
            CodeWriter child =  new CodeWriter();
            child.depth = depth+1;
            children.Add(child);
            Line("}");
            return child;
        }
 
        public CodeWriter AddChild(params string[] parts)
        {
            return AddChild(String.Concat(parts));
        }
 
        public CodeWriter AddChildNoIndent(string name)
        {
            Line(name);
            CodeWriter child =  new CodeWriter();
            child.depth = depth+1;
            children.Add(child);
            return child;
        }
 
        public CodeWriter AddChild(CodeWriter snippet)
        {
            snippet.depth = depth;
            children.Add(snippet);
            return snippet;
        }
        public void Line(string line)
        {
            children.Add(line);
        }
        public void Line(params string[] parts)
        {
            Line(String.Concat(parts));
        }
        public void Line()
        {
            children.Add(null);
        }
    }
 
    class ReferencesCollection
    {
        StringCollection namespaces = new StringCollection();
        public StringCollection Namespaces { get { return namespaces; } }
 
        StringCollection assemblies = new StringCollection();
        public StringCollection Assemblies { get { return assemblies; } }
 
        CodeWriter usingCode = new CodeWriter();
        public CodeWriter UsingCode { get {return usingCode; } }
 
        [ResourceExposure(ResourceScope.None),ResourceConsumption(ResourceScope.Machine,ResourceScope.Machine)]
        public void Add(Type type)
        {
            if(!namespaces.Contains(type.Namespace))
            {
                namespaces.Add(type.Namespace);
                usingCode.Line(String.Format("using {0};", type.Namespace));
            }
            if(!assemblies.Contains(type.Assembly.Location))
                assemblies.Add(type.Assembly.Location);
        }
    }
}