예제 #1
0
        public static void WriteTo(this MethodSig sig, ITextOutput writer)
        {
            if (sig.ExplicitThis)
            {
                writer.Write("instance", TextTokenType.Keyword);
                writer.WriteSpace();
                writer.Write("explicit", TextTokenType.Keyword);
                writer.WriteSpace();
            }
            else if (sig.HasThis)
            {
                writer.Write("instance", TextTokenType.Keyword);
                writer.WriteSpace();
            }
            sig.RetType.WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            writer.WriteSpace();
            writer.Write('(', TextTokenType.Operator);
            var parameters = sig.GetParameters();

            for (int i = 0; i < parameters.Count; ++i)
            {
                if (i > 0)
                {
                    writer.Write(',', TextTokenType.Operator);
                    writer.WriteSpace();
                }
                parameters[i].WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            }
            writer.Write(")", TextTokenType.Operator);
        }
        public static void WriteMethodTo(this IMethod method, ITextOutput writer)
        {
            MethodSig sig = method.MethodSig;

            if (sig.ExplicitThis)
            {
                writer.Write("instance explicit ");
            }
            else if (sig.HasThis)
            {
                writer.Write("instance ");
            }
            sig.RetType.WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            writer.Write(' ');
            if (method.DeclaringType != null)
            {
                method.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName);
                writer.Write("::");
            }
            MethodDef md = method as MethodDef;

            if (md != null && md.IsCompilerControlled)
            {
                writer.WriteReference(Escape(method.Name + "$PST" + method.MDToken.ToInt32().ToString("X8")), method);
            }
            else
            {
                writer.WriteReference(Escape(method.Name), method);
            }
            MethodSpec gim = method as MethodSpec;

            if (gim != null)
            {
                writer.Write('<');
                for (int i = 0; i < gim.GenericInstMethodSig.GenericArguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(", ");
                    }
                    gim.GenericInstMethodSig.GenericArguments[i].WriteTo(writer);
                }
                writer.Write('>');
            }
            writer.Write("(");
            var parameters = sig.GetParameters();

            for (int i = 0; i < parameters.Count; ++i)
            {
                if (i > 0)
                {
                    writer.Write(", ");
                }
                parameters[i].WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            }
            writer.Write(")");
        }
예제 #3
0
        public void MethodTest()
        {
            Type me = typeof(Stack <GenericsUnitTest>);
            MethodTableCursor cur = f[TableNames.Method].GetCursor() as MethodTableCursor;

            foreach (MethodInfo m in me.GetMethods(
                         BindingFlags.DeclaredOnly | BindingFlags.Static |
                         BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
            {
                cur.Goto(m.MetadataToken & 0xFFFFFF);
                Assert.AreEqual(m.Name, f.Strings[cur.Name]);
                MethodSig s = cur.GetMethodSignature();
                // Type instantiation is not known by looking only at metadata, we must help the resolver here!
                Assert.AreSame(s.ReturnType.GetReflectionType(me.GetGenericArguments()), m.ReturnType);
                IEnumerator <CLIType> cp = s.GetParameters().GetEnumerator();
                foreach (ParameterInfo p in m.GetParameters())
                {
                    Assert.IsTrue(cp.MoveNext());
                    Assert.AreSame(cp.Current.GetReflectionType(me.GetGenericArguments()), p.ParameterType);
                }
            }
        }
        public static void WriteTo(this MethodSig sig, ITextOutput writer)
        {
            if (sig.ExplicitThis)
            {
                writer.Write("instance explicit ");
            }
            else if (sig.HasThis)
            {
                writer.Write("instance ");
            }
            sig.RetType.WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            writer.Write(" (");
            var parameters = sig.GetParameters();

            for (int i = 0; i < parameters.Count; ++i)
            {
                if (i > 0)
                {
                    writer.Write(", ");
                }
                parameters[i].WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            }
            writer.Write(")");
        }
예제 #5
0
        public static void Write(this ITextOutput writer, MethodSig sig, IMethod method = null)
        {
            if (sig == null && method != null)
            {
                sig = method.MethodSig;
            }
            if (sig == null)
            {
                return;
            }
            if (sig.ExplicitThis)
            {
                writer.Write("instance", TextTokenType.Keyword);
                writer.WriteSpace();
                writer.Write("explicit", TextTokenType.Keyword);
                writer.WriteSpace();
            }
            else if (sig.HasThis)
            {
                writer.Write("instance", TextTokenType.Keyword);
                writer.WriteSpace();
            }
            sig.RetType.WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            writer.WriteSpace();
            if (method != null)
            {
                if (method.DeclaringType != null)
                {
                    method.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName);
                    writer.Write("::", TextTokenType.Operator);
                }
                MethodDef md = method as MethodDef;
                if (md != null && md.IsCompilerControlled)
                {
                    writer.WriteReference(Escape(method.Name + "$PST" + method.MDToken.ToInt32().ToString("X8")), method, TextTokenHelper.GetTextTokenType(method));
                }
                else
                {
                    writer.WriteReference(Escape(method.Name), method, TextTokenHelper.GetTextTokenType(method));
                }
            }
            MethodSpec gim = method as MethodSpec;

            if (gim != null && gim.GenericInstMethodSig != null)
            {
                writer.Write('<', TextTokenType.Operator);
                for (int i = 0; i < gim.GenericInstMethodSig.GenericArguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(',', TextTokenType.Operator);
                        writer.WriteSpace();
                    }
                    gim.GenericInstMethodSig.GenericArguments[i].WriteTo(writer);
                }
                writer.Write('>', TextTokenType.Operator);
            }
            writer.Write("(", TextTokenType.Operator);
            var parameters = sig.GetParameters();

            for (int i = 0; i < parameters.Count; ++i)
            {
                if (i > 0)
                {
                    writer.Write(',', TextTokenType.Operator);
                    writer.WriteSpace();
                }
                parameters[i].WriteTo(writer, ILNameSyntax.SignatureNoNamedTypeParameters);
            }
            writer.Write(")", TextTokenType.Operator);
        }