public void Parser2ProfileBenchmark()
        {
            var xml = new XElement("root");

            for (int i = 0; i < NamespaceCount; i++)
            {
                String k = randomString();
                String v = randomString();
                ns[i] = v;
                xml.Add(new XAttribute(XNamespace.Xmlns + k, v));
            }
            for (var i = 0; i < NodePerLevelCount; i++)
            {
                xml.Add(createElement(Depth));
            }
            String xmlcode = xml.ToString();

            //Console.WriteLine(xmlcode);
            Console.WriteLine("xml length: {0}", xmlcode.Length);
            String bxlcode = new BxlGenerator().Convert(xml);

            //Console.WriteLine(bxlcode);
            Console.WriteLine("bxl length: {0}", bxlcode.Length);

            for (var i = 0; i < 100; i++)
            {
                new BxlParser().Parse(bxlcode);
            }
        }
        public void ParserBenchmark()
        {
            var xml = new XElement("root");

            for (int i = 0; i < NamespaceCount; i++)
            {
                String k = randomString();
                String v = randomString();
                ns[i] = v;
                xml.Add(new XAttribute(XNamespace.Xmlns + k, v));
            }
            for (var i = 0; i < NodePerLevelCount; i++)
            {
                xml.Add(createElement(Depth));
            }
            String xmlcode = xml.ToString();

            //Console.WriteLine(xmlcode);
            Console.WriteLine("xml length: {0}", xmlcode.Length);
            String bxlcode = new BxlGenerator().Convert(xml);

            //Console.WriteLine(bxlcode);
            Console.WriteLine("bxl length: {0}", bxlcode.Length);

            var sw = Stopwatch.StartNew();

            for (var i = 0; i < 20; i++)
            {
                XElement.Parse(xmlcode);
            }
            sw.Stop();
            var xmltime = sw.ElapsedMilliseconds;

            sw = Stopwatch.StartNew();
            for (var i = 0; i < 20; i++)
            {
                new BxlParser().Parse(bxlcode);
            }
            sw.Stop();
            var bxl1time = sw.ElapsedMilliseconds;

            sw = Stopwatch.StartNew();
            for (var i = 0; i < 20; i++)
            {
                new BxlParser().Parse(bxlcode);
            }
            sw.Stop();
            var bxl2time = sw.ElapsedMilliseconds;

            Console.WriteLine("xml: {0}\nbxl1: {1}\nbxl2: {2}", xmltime, bxl1time, bxl2time);
            Assert.True(bxl2time < bxl1time);
        }
		/// <summary>
		/// 	generates single bxl string from assembly manifests
		/// </summary>
		/// <param name="assemblies"> </param>
		/// <param name="options"> </param>
		/// <returns> </returns>
		public string GenerateManifest(Assembly[] assemblies, ManifestBxlGeneratorOptions options = null) {
			if (assemblies == null) {
				throw new ArgumentNullException("assemblies");
			}
			if (0 == assemblies.Length) {
				throw new ArgumentException("no assemblies given");
			}
			var gen = new BxlGenerator();
			var genopts = new BxlGeneratorOptions
				{
					NoRootElement = true,
					UseTrippleQuotOnValues = false,
					InlineAlwaysAttributes = new[] {"code", "name", "priority"}
				};
			options = options ?? new ManifestBxlGeneratorOptions();
			var xml = new XElement("root");
			IList<IComponentDefinition> componentsToGenerate = new List<IComponentDefinition>();
			foreach (var assembly in assemblies.Distinct()) {
				Console.WriteLine("Enter: " + assembly.GetName().Name);
				var def = new AssemblyManifestDefinition(assembly, NeedExportAttribute);

				if (def.Descriptor != null) {
					Console.WriteLine("IsConfigurable: " + assembly.GetName().Name);
					foreach (var classDefinition in def.ComponentDefinitions) {
						componentsToGenerate.Add(classDefinition.GetComponent());
					}
				}
			}
			var useshortnames = false;
			if (options.UseShortNames) {
				useshortnames = CanUseShortNames(componentsToGenerate);
			}
			if (useshortnames) {
				foreach (var assembly in assemblies) {
					var def = new AssemblyManifestDefinition(assembly, NeedExportAttribute);
					if (def.Descriptor != null) {
						xml.Add(new XElement("ref", new XAttribute("code", assembly.GetName().Name)));
					}
				}
				var namespaces =
					componentsToGenerate.Select(x => x.ServiceType).Union(componentsToGenerate.Select(x => x.ImplementationType))
						.Distinct().Select(x => x.Namespace).Distinct();
				foreach (var ns in namespaces) {
					xml.Add(new XElement("using", new XAttribute("code", ns)));
				}
			}
			foreach (var definition in componentsToGenerate) {
				var elementname = definition.Lifestyle.ToString().ToLowerInvariant();
				var value = GetTypeName(definition.ServiceType, useshortnames);
				var e = new XElement(elementname, value);
				if (definition.Name.IsEmpty()) {
					e.Add(new XAttribute("code", GetTypeName(definition.ImplementationType, useshortnames)));
				}
				else {
					e.Add(new XAttribute("code", definition.Name));
					e.Add(new XAttribute("name", GetTypeName(definition.ImplementationType, useshortnames)));
				}
				e.Add(new XAttribute("priority", definition.Priority));
				if (definition.Role.IsNotEmpty()) {
					e.Add(new XAttribute("role", definition.Role));
				}
				if (definition.Help.IsNotEmpty()) {
					e.Add(new XAttribute("help", definition.Help));
				}
				xml.Add(e);
			}

			var result = gen.Convert(xml, genopts);
			return result;
		}
        /// <summary>
        ///     generates single bxl string from assembly manifests
        /// </summary>
        /// <param name="assemblies"> </param>
        /// <param name="options"> </param>
        /// <returns> </returns>
        public string GenerateManifest(Assembly[] assemblies, ManifestBxlGeneratorOptions options = null)
        {
            if (assemblies == null)
            {
                throw new ArgumentNullException("assemblies");
            }
            if (0 == assemblies.Length)
            {
                throw new ArgumentException("no assemblies given");
            }
            var gen     = new BxlGenerator();
            var genopts = new BxlGeneratorOptions
            {
                NoRootElement          = true,
                UseTrippleQuotOnValues = false,
                InlineAlwaysAttributes = new[] { "code", "name", "priority" }
            };

            options = options ?? new ManifestBxlGeneratorOptions();
            var xml = new XElement("root");
            IList <IComponentDefinition> componentsToGenerate = new List <IComponentDefinition>();

            foreach (var assembly in assemblies.Distinct())
            {
                Console.WriteLine("Enter: " + assembly.GetName().Name);
                var def = new AssemblyManifestDefinition(assembly, NeedExportAttribute);

                if (def.Descriptor != null)
                {
                    Console.WriteLine("IsConfigurable: " + assembly.GetName().Name);
                    foreach (var classDefinition in def.ComponentDefinitions)
                    {
                        componentsToGenerate.Add(classDefinition.GetComponent());
                    }
                }
            }
            var useshortnames = false;

            if (options.UseShortNames)
            {
                useshortnames = CanUseShortNames(componentsToGenerate);
            }
            if (useshortnames)
            {
                foreach (var assembly in assemblies)
                {
                    var def = new AssemblyManifestDefinition(assembly, NeedExportAttribute);
                    if (def.Descriptor != null)
                    {
                        xml.Add(new XElement("ref", new XAttribute("code", assembly.GetName().Name)));
                    }
                }
                var namespaces =
                    componentsToGenerate.Select(x => x.ServiceType).Union(componentsToGenerate.Select(x => x.ImplementationType))
                    .Distinct().Select(x => x.Namespace).Distinct();
                foreach (var ns in namespaces)
                {
                    xml.Add(new XElement("using", new XAttribute("code", ns)));
                }
            }
            foreach (var definition in componentsToGenerate)
            {
                var elementname = definition.Lifestyle.ToString().ToLowerInvariant();
                var value       = GetTypeName(definition.ServiceType, useshortnames);
                var e           = new XElement(elementname, value);
                if (definition.Name.IsEmpty())
                {
                    e.Add(new XAttribute("code", GetTypeName(definition.ImplementationType, useshortnames)));
                }
                else
                {
                    e.Add(new XAttribute("code", definition.Name));
                    e.Add(new XAttribute("name", GetTypeName(definition.ImplementationType, useshortnames)));
                }
                e.Add(new XAttribute("priority", definition.Priority));
                if (definition.Role.IsNotEmpty())
                {
                    e.Add(new XAttribute("role", definition.Role));
                }
                if (definition.Help.IsNotEmpty())
                {
                    e.Add(new XAttribute("help", definition.Help));
                }
                xml.Add(e);
            }

            var result = gen.Convert(xml, genopts);

            return(result);
        }
		protected override void Save(XElement x, string file) {
			var c = new BxlGenerator();
			var opts = new BxlGeneratorOptions {SkipAttributes = new[] {"_line", "_file"}, NoRootElement = true};
			File.WriteAllText(file, c.Convert(x));
		}