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); }
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); } }
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)); } }
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); }
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); } }