private static int getAbstractTypeFromDescriptor(
            final SymbolTable symbolTable, final String buffer, final int offset) {
        String internalName = null;
        switch (buffer.charAt(offset)) {
            case 'V':
                return 0;
            case 'Z':
            case 'C':
            case 'B':
            case 'S':
            case 'I':
                return INTEGER;
            case 'F':
                return FLOAT;
            case 'J':
                return LONG;
            case 'D':
                return DOUBLE;
            case 'L':
                if (offset == 0) {
                    switch (buffer) {
                        case "Ljava/lang/Object;":
                            internalName = "java/lang/Object";
                            break;
                        case "Ljava/lang/Class;":
                            internalName = "java/lang/Class";
                            break;
                        case "Ljava/lang/String;":
                            internalName = "java/lang/String";
                            break;
                        case "Ljava/util/List;":
                            internalName = "java/util/List";
                            break;
                        case "Ljava/lang/reflect/Type;":
                            internalName = "java/lang/reflect/Type";
                            break;
                        case "Ljava/util/function/Supplier;":
                            internalName = "java/util/function/Supplier";
                            break;
                        case "Lsun/misc/Unsafe;":
                            internalName = "sun/misc/Unsafe";
                            break;
                        case "Lcom/alibaba/fastjson2/JSONReader;":
                            internalName = "com/alibaba/fastjson2/JSONReader";
                            break;
                        case "Lcom/alibaba/fastjson2/reader/FieldReader;":
                            internalName = "com/alibaba/fastjson2/reader/FieldReader";
                            break;
                        case "Lcom/alibaba/fastjson2/reader/ObjectReader;":
                            internalName = "com/alibaba/fastjson2/reader/ObjectReader";
                            break;
                        case "Lcom/alibaba/fastjson2/JSONWriter;":
                            internalName = "com/alibaba/fastjson2/JSONWriter";
                            break;
                        case "Lcom/alibaba/fastjson2/writer/FieldWriter;":
                            internalName = "com/alibaba/fastjson2/writer/FieldWriter";
                            break;
                        default:
                            break;
                    }
                } else if (offset == 2) {
                    switch (buffer) {
                        case "()Ljava/lang/Class;":
                            internalName = "java/lang/Class";
                            break;
                        case "()Ljava/lang/String;":
                            internalName = "java/lang/String";
                            break;
                        default:
                            break;
                    }
                } else if (offset == 3) {
                    switch (buffer) {
                        case "(J)Lcom/alibaba/fastjson2/reader/FieldReader;":
                            internalName = "com/alibaba/fastjson2/reader/FieldReader";
                            break;
                        case "(I)Ljava/lang/Object;":
                            internalName = "java/lang/Object";
                            break;
                        case "(I)Ljava/lang/Integer;":
                            internalName = "java/lang/Integer";
                            break;
                        default:
                            break;
                    }
                } else if (offset == 36) {
                    switch (buffer) {
                        case "(Lcom/alibaba/fastjson2/JSONReader;)Lcom/alibaba/fastjson2/reader/ObjectReader;":
                            internalName = "com/alibaba/fastjson2/reader/ObjectReader";
                            break;
                        case "(Lcom/alibaba/fastjson2/JSONReader;)Ljava/lang/Object;":
                            internalName = "java/lang/Object";
                            break;
                        default:
                            break;
                    }
                } else if (offset == 54) {
                    switch (buffer) {
                        case "(Lcom/alibaba/fastjson2/JSONReader;Ljava/lang/Class;J)Lcom/alibaba/fastjson2/reader/ObjectReader;":
                            internalName = "com/alibaba/fastjson2/reader/ObjectReader";
                            break;
                        case "(Lcom/alibaba/fastjson2/JSONReader;Ljava/lang/Class;J)Ljava/lang/Object;":
                            internalName = "java/lang/Object";
                            break;
                        default:
                            break;
                    }
                } else {
                    switch (buffer) {
                        case "(Lcom/alibaba/fastjson2/JSONWriter;Ljava/lang/Class;)Lcom/alibaba/fastjson2/writer/ObjectWriter;":
                            if (offset == 53) {
                                internalName = "com/alibaba/fastjson2/writer/ObjectWriter";
                            }
                            break;
                        case "(Lcom/alibaba/fastjson2/JSONWriter;Ljava/lang/reflect/Type;)Lcom/alibaba/fastjson2/writer/ObjectWriter;":
                            if (offset == 60) {
                                internalName = "com/alibaba/fastjson2/writer/ObjectWriter";
                            }
                            break;
                        case "(Lcom/alibaba/fastjson2/writer/FieldWriter;Ljava/lang/Object;)Ljava/lang/String;":
                            if (offset == 62) {
                                internalName = "java/lang/String";
                            }
                            break;
                        case "(Lcom/alibaba/fastjson2/JSONReader;Ljava/lang/reflect/Type;Ljava/lang/Object;J)Ljava/lang/Object;":
                            if (offset == 79) {
                                internalName = "java/lang/Object";
                            }
                            break;
                        default:
                            break;
                    }
                }

                if (internalName == null) {
                    internalName = buffer.substring(offset + 1, buffer.length() - 1);
                }
                return REFERENCE_KIND | symbolTable.addType(internalName);
            case '[':
                int elementDescriptorOffset = offset + 1;
                while (buffer.charAt(elementDescriptorOffset) == '[') {
                    ++elementDescriptorOffset;
                }
                int typeValue;
                switch (buffer.charAt(elementDescriptorOffset)) {
                    case 'Z':
                        typeValue = BOOLEAN;
                        break;
                    case 'C':
                        typeValue = CHAR;
                        break;
                    case 'B':
                        typeValue = BYTE;
                        break;
                    case 'S':
                        typeValue = SHORT;
                        break;
                    case 'I':
                        typeValue = INTEGER;
                        break;
                    case 'F':
                        typeValue = FLOAT;
                        break;
                    case 'J':
                        typeValue = LONG;
                        break;
                    case 'D':
                        typeValue = DOUBLE;
                        break;
                    case 'L':
                        if (offset == 0) {
                            switch (buffer) {
                                case "[Lcom/alibaba/fastjson2/writer/FieldWriter;":
                                    internalName = "com/alibaba/fastjson2/reader/FieldReader";
                                    break;
                                case "[Lcom/alibaba/fastjson2/reader/FieldReader;":
                                    internalName = "Lcom/alibaba/fastjson2/reader/FieldReader";
                                    break;
                                default:
                                    break;
                            }
                        }
                        if (internalName == null) {
                            internalName = buffer.substring(elementDescriptorOffset + 1, buffer.length() - 1);
                        }
                        typeValue = REFERENCE_KIND | symbolTable.addType(internalName);
                        break;
                    default:
                        throw new IllegalArgumentException();
                }
                return ((elementDescriptorOffset - offset) << DIM_SHIFT) | typeValue;
            default:
                throw new IllegalArgumentException();
        }
    }
Returns the abstract type corresponding to the given type descriptor.

@param symbolTable the type table to use to lookup and store type {@link Symbol}.
@param buffer      a string ending with a type descriptor.
@param offset      the start offset of the type descriptor in buffer.
@return the abstract type corresponding to the given type descriptor.
core/src/main/java/com/alibaba/fastjson2/internal/asm/Frame.java