public void Emit(IAssembly assembly, TextWriter textWriter) { textWriter.Write("using FluentLang.Runtime;"); textWriter.Write("using FluentLang.Runtime.Metadata;"); textWriter.Write("using System;"); textWriter.Write("using AssemblyFileVersionAttribute = System.Reflection.AssemblyFileVersionAttribute;"); MetadataEmitter.EmitAssemblyNameAttribute(assembly.Name, textWriter); MetadataEmitter.EmitAssemblyFileVersionAttribute(assembly.Version, textWriter); foreach (var dependency in assembly.ReferencedAssembliesAndSelf.Where(x => x.Name != assembly.Name)) { MetadataEmitter.EmitDependencyAttribute(dependency, textWriter); } foreach (var @interface in assembly.Interfaces.Where(x => x.IsExported)) { MetadataEmitter.EmitInterfaceAttribute(@interface, textWriter); } textWriter.Write("public static class "); textWriter.Write(Utils.GetAssemblyLevelMethodsClassName(assembly.Name.ToString())); textWriter.Write("{"); foreach (var method in assembly.Methods) { Emit(method, textWriter); } textWriter.Write("}"); textWriter.Flush(); }
private void Emit(IMethod method, TextWriter textWriter) { if (method.IsExported) { MetadataEmitter.EmitMethodAttribute(method, textWriter); } if (method.DeclaringMethod is null) { if (method.IsExported) { textWriter.Write("public "); } textWriter.Write("static "); } Emit(method.ReturnType, textWriter); textWriter.Write(' '); if (method.DeclaringMethod is null) { textWriter.Write(Escape(method.FullyQualifiedName)); } else { textWriter.Write(method.Name); } if (!method.TypeParameters.IsEmpty) { textWriter.Write("<"); for (var i = 0; i < method.TypeParameters.Length; i++) { if (i != 0) { textWriter.Write(","); } var typeParameter = method.TypeParameters[i]; textWriter.Write(typeParameter.Name); } textWriter.Write(">"); } textWriter.Write('('); for (var i = 0; i < method.Parameters.Length; i++) { if (i != 0) { textWriter.Write(","); } var parameter = method.Parameters[i]; Emit(parameter.Type, textWriter); textWriter.Write(' '); textWriter.Write(parameter.Name); } var paramNames = _keyGenerator.EnterMethodAndReturnMethodKeyParamNames(method); var isFirst = true; foreach (var paramName in paramNames) { if (!isFirst || !method.Parameters.IsEmpty) { textWriter.Write(", "); } isFirst = false; textWriter.Write("MethodKey "); textWriter.Write(paramName); } textWriter.Write(")"); foreach (var tp in method.TypeParameters) { if (tp.ConstrainedTo is { } constrainedTo) { textWriter.Write(" where "); Emit(tp, textWriter); textWriter.Write(" : "); Emit(constrainedTo, textWriter); } } textWriter.Write("{"); foreach (var statement in method.Statements) { Emit(statement, method.ReturnType, textWriter); } foreach (var localMethod in method.LocalMethods) { Emit(localMethod, textWriter); } textWriter.Write("}"); _keyGenerator.ExitMethod(method); }