GenericMethodDescriptor (String signature) { String original = signature; try { List<String> typeParameters = new ArrayList<>(); List<List<GenericType>> typeParameterBounds = new ArrayList<>(); signature = parseFormalParameters(signature, typeParameters, typeParameterBounds); int to = signature.indexOf(")"); String parameters = signature.substring(1, to); signature = signature.substring(to + 1); List<GenericType> parameterTypes = new ArrayList<>(); while (parameters.length() > 0) { String par = GenericType.getNextType(parameters); parameterTypes.add(new GenericType(par)); parameters = parameters.substring(par.length()); } String ret = GenericType.getNextType(signature); GenericType returnType = new GenericType(ret); signature = signature.substring(ret.length()); List<GenericType> exceptionTypes = new ArrayList<>(); if (signature.length() > 0) { String[] exceptions = signature.split("\\^"); for (int i = 1; i < exceptions.length; i++) { exceptionTypes.add(new GenericType(exceptions[i])); } } return new GenericMethodDescriptor(typeParameters, typeParameterBounds, parameterTypes, returnType, exceptionTypes); } catch (RuntimeException e) { DecompilerContext.getLogger().writeMessage("Invalid signature: " + original, IFernflowerLogger.Severity.WARN); return null; } }