private void WriteMethods(
     TextWriter textWriter,
     ICodegenClass clazz)
 {
     foreach (var method in clazz.PublicMethods)
     {
         method.Render(textWriter, true);
     }
     foreach (var method in clazz.PrivateMethods)
     {
         method.Render(textWriter, false);
     }
 }
        private void WriteClass(
            TextWriter textWriter,
            ICodegenClass clazz,
            Action textAction)
        {
            textWriter.Write("    public class {0}", clazz.ClassName);
            if (clazz.InterfaceImplemented != null)
            {
                textWriter.Write(" : {0}", clazz.InterfaceImplemented.FullName);
            }

            textWriter.WriteLine();
            textWriter.WriteLine("    {{");
            textWriter.WriteLine("    }}");
        }
        private void WriteFields(
            TextWriter textWriter,
            ICodegenClass clazz)
        {
            if (clazz.Members.HasFirst())
            {
                foreach (var member in clazz.Members)
                {
                    string modifiers = "private";
                    string typeName  = CodeGenerationHelper.CompliantName(member.MemberType);
                    textWriter.WriteLine("{0} {1} {2};", modifiers, typeName, member.MemberName);
                }

                textWriter.WriteLine();
            }
        }
        private string GenerateCode(
            IDictionary <Type, string> namespaces,
            ICodegenClass clazz,
            ICollection <ICodegenMember> memberSet,
            string classLevelComment)
        {
            var writer = new StringWriter();

            WriteUsingDeclarations(writer, namespaces.Values);
            WriteNamespace(writer, clazz.Namespace, () =>
                           WriteClass(writer, clazz, () =>
            {
                WriteFields(writer, clazz);
                WriteConstructor(writer, clazz);
                WriteMethods(writer, clazz);
            }));

            return(writer.ToString());
        }
        public EventPropertyGetter Compile(
            ICodegenClass clazz,
            ClassLoaderProvider classLoaderProvider,
            Type interfaceClass,
            string classLevelComment)
        {
            // build members and namespaces
            var memberSet = new LinkedHashSet <ICodegenMember>(clazz.Members);
            var classes   = clazz.GetReferencedClasses();
            var imports   = CompileImports(classes);

            // generate code
            var code = GenerateCode(imports, clazz, memberSet, classLevelComment);

            var version = LanguageVersion.Latest;
            var options = new CSharpParseOptions(
                languageVersion: version,
                documentationMode: DocumentationMode.None,
                kind: SourceCodeKind.Regular,
                preprocessorSymbols: null);

            var syntaxTree = CSharpSyntaxTree.ParseText(code, options);

            _compilation = _compilation.AddSyntaxTrees(syntaxTree);

            using (var stream = new MemoryStream())
            {
                var emitResult = _compilation.Emit(stream);
                if (emitResult.Success)
                {
                    stream.Seek(0, SeekOrigin.Begin);
                    var assembly = Assembly.Load(stream.ToArray());
                }
                else
                {
                    var failures = emitResult.Diagnostics.Where(diagnostic =>
                                                                diagnostic.IsWarningAsError ||
                                                                diagnostic.Severity == DiagnosticSeverity.Error);
                }
            }
            throw new NotImplementedException();
        }
 private void WriteConstructor(
     TextWriter textWriter,
     ICodegenClass clazz)
 {
     textWriter.Write("public {0}", clazz.ClassName);
     // start constructor arguments
     textWriter.Write("(");
     textWriter.Write(string.Join(",", clazz.Members.Select(CompliantTypeAndName)));
     textWriter.Write(")");
     textWriter.WriteLine();
     // start constructor body
     textWriter.WriteLine("{{");
     // start parameter assignments
     foreach (var member in clazz.Members)
     {
         textWriter.WriteLine("this.{0} = {0};", member.MemberName);
     }
     // end constructor body
     textWriter.WriteLine("}}");
     textWriter.WriteLine("");
 }