public bool SkipExactlyOne()

in src/Microsoft.Diagnostics.Runtime/src/Utilities/SigParser/SigParser.cs [386:489]


        public bool SkipExactlyOne()
        {
            if (!GetElemType(out int typ))
                return false;

            if (!((ClrElementType)typ).IsPrimitive())
            {
                switch (typ)
                {
                    default:
                        return false;

                    case ELEMENT_TYPE_VAR:
                    case ELEMENT_TYPE_MVAR:
                        if (!GetData(out _))
                            return false;

                        break;

                    case ELEMENT_TYPE_OBJECT:
                    case ELEMENT_TYPE_STRING:
                    case ELEMENT_TYPE_TYPEDBYREF:
                        break;

                    case ELEMENT_TYPE_BYREF:
                    case ELEMENT_TYPE_PTR:
                    case ELEMENT_TYPE_PINNED:
                    case ELEMENT_TYPE_SZARRAY:
                        if (!SkipExactlyOne())
                            return false;

                        break;

                    case ELEMENT_TYPE_VALUETYPE:
                    case ELEMENT_TYPE_CLASS:
                        if (!GetToken(out _))
                            return false;

                        break;

                    case ELEMENT_TYPE_FNPTR:
                        if (!SkipSignature())
                            return false;

                        break;

                    case ELEMENT_TYPE_ARRAY:
                        // Skip element type
                        if (!SkipExactlyOne())
                            return false;

                        // Get rank;
                        int rank;
                        if (!GetData(out rank))
                            return false;

                        if (rank > 0)
                        {
                            if (!GetData(out int sizes))
                                return false;

                            while (sizes-- != 0)
                                if (!GetData(out _))
                                    return false;

                            if (!GetData(out int bounds))
                                return false;

                            while (bounds-- != 0)
                                if (!GetData(out _))
                                    return false;
                        }

                        break;

                    case ELEMENT_TYPE_SENTINEL:
                        // Should be unreachable since GetElem strips it
                        break;

                    case ELEMENT_TYPE_INTERNAL:
                        if (!GetData(out _))
                            return false;

                        break;

                    case ELEMENT_TYPE_GENERICINST:
                        // Skip generic type
                        if (!SkipExactlyOne())
                            return false;

                        // Get number of parameters
                        int argCnt;
                        if (!GetData(out argCnt))
                            return false;

                        // Skip the parameters
                        while (argCnt-- != 0)
                            SkipExactlyOne();
                        break;
                }
            }

            return true;
        }