def METHOD_NAME(typ):
	if typ.spelling in ("IOHANDLE", "LOCK"):
		return ""
	if typ.kind == TypeKind.AUTO:
		return METHOD_NAME(typ.get_canonical())
	if typ.kind == TypeKind.LVALUEREFERENCE:
		return METHOD_NAME(typ.get_pointee())
	if typ.kind == TypeKind.POINTER:
		return "p" + METHOD_NAME(typ.get_pointee())
	if is_array_type(type):
		return "a" + METHOD_NAME(typ.element_type)
	if typ.kind == TypeKind.FUNCTIONPROTO:
		return "fn"
	if typ.kind == TypeKind.TYPEDEF:
		return METHOD_NAME(typ.get_declaration().underlying_typedef_type)
	if typ.kind == TypeKind.ELABORATED:
		return METHOD_NAME(typ.get_named_type())
	if typ.kind in (TypeKind.UNEXPOSED, TypeKind.RECORD):
		if typ.get_declaration().spelling in "shared_ptr unique_ptr".split():
			return "p" + METHOD_NAME(typ.get_template_argument_type(0))
		if typ.get_declaration().spelling in "array sorted_array".split():
			return "a" + METHOD_NAME(typ.get_template_argument_type(0))
	return ""