internal GenerationResult Generate()
        {
            _usingsResult        = new GenerationResult(_file);
            _parametersResult    = new GenerationResult(_file);
            _inheritsResult      = new GenerationResult(_file);
            _transformTextResult = new GenerationResult(_file);
            _featureResult       = new GenerationResult(_file);
            _file.ProcessDescendants(this);

            var           result  = new GenerationResult(_file);
            StringBuilder builder = result.Builder;

            string ns           = GetNamespace();
            bool   hasNamespace = !String.IsNullOrEmpty(ns);

            if (hasNamespace)
            {
                builder.AppendFormat("namespace {0} {{", ns);
                builder.AppendLine();
            }
            builder.AppendLine("using System;");
            result.Append(_usingsResult);
            builder.AppendFormat("[{0}]", SyntheticAttribute.Name);
            builder.AppendLine();

            builder.AppendFormat("public class {0} : ", ClassName);
            if (_inheritsResult.Builder.Length == 0)
            {
                builder.Append(DefaultBaseClassName);
            }
            else
            {
                result.Append(_inheritsResult);
            }
            builder.AppendLine(" {");

            builder.AppendFormat("[{0}] private static string __\x200CToString(object value) {{ return null; }}", SyntheticAttribute.Name);
            builder.AppendLine();
            if (_hasHost)
            {
                builder.AppendLine("public virtual Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host { get; set; }");
            }
            result.Append(_parametersResult);
            builder.AppendFormat("[System.CodeDom.Compiler.GeneratedCodeAttribute] public override string {0}() {{", TransformTextMethodName);
            builder.AppendLine();
            result.Append(_transformTextResult);
            builder.AppendLine();
            builder.AppendLine("return GenerationEnvironment.ToString();");
            builder.AppendLine("}");
            result.Append(_featureResult);
            builder.AppendLine("}");
            if (hasNamespace)
            {
                builder.AppendLine("}");
            }
            return(result);
        }
		public T4CSharpCodeGenerationIntermediateResult Collect([NotNull] IT4File file)
		{
			var projectFile = file.PhysicalPsiSourceFile.ToProjectFile();
			if (projectFile == null) return new T4CSharpCodeGenerationIntermediateResult(file, Interrupter);
			Results.Push(new T4CSharpCodeGenerationIntermediateResult(file, Interrupter));
			Guard.StartProcessing(file.LogicalPsiSourceFile.GetLocation());
			file.ProcessDescendants(this);
			string suffix = Result.State.ProduceBeforeEof();
			if (!string.IsNullOrEmpty(suffix)) AppendTransformation(suffix, Result.State.FirstNode);
			Guard.EndProcessing();
			return Results.Pop();
		}