コード例 #1
0
            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();
            }
コード例 #2
0
            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);
            }