Пример #1
0
        List <ParameterInfo> GetParametersFromDescriptor(out int endParams)
        {
            var signature = Descriptor;

            if (signature == null || signature.Length < "()V".Length)
            {
                throw new InvalidOperationException(string.Format("Invalid method descriptor '{0}'.", signature));
            }
            if (signature [0] != '(')
            {
                throw new InvalidOperationException(string.Format("Invalid method descriptor '{0}'; expected '(' at index 0.", signature));
            }

            int index = 1;

            int c     = 0;
            var first = true;
            var ps    = new List <ParameterInfo> ();

            while (index < signature.Length && signature [index] != ')')
            {
                var type = Signature.ExtractType(signature, ref index);

                if (first)
                {
                    first = false;
                    if (IsConstructor &&
                        !DeclaringType.IsStatic &&
                        DeclaringType.TryGetEnclosingMethodInfo(out var declaringClass, out var _, out var _) &&
                        type == "L" + declaringClass + ";")
                    {
                        continue;
                    }
                    if (IsConstructor &&
                        !DeclaringType.IsStatic &&
                        DeclaringType.InnerClass?.OuterClassName != null &&
                        type == "L" + DeclaringType.InnerClass.OuterClassName + ";")
                    {
                        continue;
                    }
                }

                if (first &&
                    IsConstructor &&
                    DeclaringType.InnerClass?.OuterClassName != null &&
                    type == "L" + DeclaringType.InnerClass.OuterClassName + ";")
                {
                    first = false;
                    continue;
                }

                var p = new ParameterInfo("p" + c, type, type, c);
                c++;
                ps.Add(p);
            }
            endParams = index;
            return(ps);
        }
Пример #2
0
        public ClassSignature(string signature)
        {
            int index = 0;

            Signature.AssertSignatureIndex(signature, index);
            Signature.ExtractFormalTypeParameters(TypeParameters, signature, ref index);
            Signature.AssertSignatureIndex(signature, index);
            SuperclassSignature = Signature.ExtractType(signature, ref index);
            while (index < signature.Length)
            {
                var t = Signature.ExtractType(signature, ref index);
                SuperinterfaceSignatures.Add(t);
            }
        }
Пример #3
0
        static IEnumerable <string> ExtractTypesFromSignature(string signature)
        {
            if (signature == null || signature.Length < "()V".Length)
            {
                throw new InvalidOperationException(string.Format("Invalid method descriptor '{0}'.", signature));
            }
            if (signature [0] != '(')
            {
                throw new InvalidOperationException(string.Format("Invalid method descriptor '{0}'; expected '(' at index 0.", signature));
            }

            int index = 1;

            while (index < signature.Length && signature [index] != ')')
            {
                yield return(Signature.ExtractType(signature, ref index));
            }
        }
Пример #4
0
        List <ParameterInfo> GetParametersFromDescriptor(out int endParams)
        {
            var signature = Descriptor;

            if (signature == null || signature.Length < "()V".Length)
            {
                throw new InvalidOperationException(string.Format("Invalid method descriptor '{0}'.", signature));
            }
            if (signature [0] != '(')
            {
                throw new InvalidOperationException(string.Format("Invalid method descriptor '{0}'; expected '(' at index 0.", signature));
            }

            int index = 1;

            // non-static inner classes have a "hidden" parameter. Skip it.
            if (IsConstructor && DeclaringType.InnerClass != null && !DeclaringType.IsStatic && signature [index] != ')')
            {
                Signature.ExtractType(signature, ref index);
            }

            int c  = 0;
            var ps = new List <ParameterInfo> ();

            while (index < signature.Length && signature [index] != ')')
            {
                var type = Signature.ExtractType(signature, ref index);
                var p    = new ParameterInfo {
                    Position = c,
                    Name     = "p" + (c++),
                };
                p.Type.BinaryName    = type;
                p.Type.TypeSignature = type;
                ps.Add(p);
            }
            endParams = index;
            return(ps);
        }
Пример #5
0
        public MethodTypeSignature(string signature)
        {
            int index = 0;

            Signature.AssertSignatureIndex(signature, index);
            Signature.ExtractFormalTypeParameters(TypeParameters, signature, ref index);
            Signature.AssertSignatureIndex(signature, index);
            if (signature [index] != '(')
            {
                throw new ArgumentException(string.Format("Method signature needs to contain '(' at index {0} in: {1}", index, signature));
            }
            index++;
            while (index < signature.Length && signature [index] != ')')
            {
                Parameters.Add(Signature.ExtractType(signature, ref index));
            }
            if (signature [index] != ')')
            {
                throw new ArgumentException(string.Format("Method signature needs to contain ')' at index {0} in: {1}", index, signature));
            }
            index++;
            ReturnTypeSignature = Signature.ExtractType(signature, ref index);
            if (index == signature.Length)
            {
                return;
            }
            if (signature [index] != '^')
            {
                throw new ArgumentException(string.Format("Method signature should end with exception '^' types; found: '{0}' at {1} in: {2}",
                                                          signature [index], index, signature));
            }
            while (index < signature.Length && signature [index] == '^')
            {
                index++;
                var t = Signature.ExtractType(signature, ref index);
                Throws.Add(t);
            }
        }