コード例 #1
0
def check_reply_field_type(ctxt: IDLCompatibilityContext,
                           old_field_type: Optional[Union[syntax.Enum,
                                                          syntax.Struct,
                                                          syntax.Type]],
                           new_field_type: Optional[Union[syntax.Enum,
                                                          syntax.Struct,
                                                          syntax.Type]],
                           cmd_name: str, field_name: str,
                           old_idl_file: syntax.IDLParsedSpec,
                           new_idl_file: syntax.IDLParsedSpec,
                           old_idl_file_path: str, new_idl_file_path: str):
    """Check compatibility between old and new reply field type."""
    # pylint: disable=too-many-arguments,too-many-branches
    if check_array_type(ctxt, "reply_field", old_field_type, new_field_type,
                        cmd_name, 'type', old_idl_file_path,
                        new_idl_file_path):
        old_field_type = old_field_type.element_type
        new_field_type = new_field_type.element_type

    if old_field_type is None:
        ctxt.add_reply_field_type_invalid_error(cmd_name, field_name,
                                                old_idl_file_path)
        ctxt.errors.dump_errors()
        sys.exit(1)
    if new_field_type is None:
        ctxt.add_reply_field_type_invalid_error(cmd_name, field_name,
                                                new_idl_file_path)
        ctxt.errors.dump_errors()
        sys.exit(1)

    if isinstance(old_field_type, syntax.Type):
        check_reply_field_type_recursive(ctxt, old_field_type, new_field_type,
                                         cmd_name, field_name, old_idl_file,
                                         new_idl_file, old_idl_file_path,
                                         new_idl_file_path)

    elif isinstance(old_field_type, syntax.Enum):
        if isinstance(new_field_type, syntax.Enum):
            check_subset(ctxt, cmd_name, field_name, new_field_type.name,
                         new_field_type.values, old_field_type.values,
                         new_idl_file_path)
        else:
            ctxt.add_new_reply_field_type_not_enum_error(
                cmd_name, field_name, new_field_type.name, old_field_type.name,
                new_idl_file_path)
    elif isinstance(old_field_type, syntax.Struct):
        if isinstance(new_field_type, syntax.Struct):
            check_reply_fields(ctxt, old_field_type, new_field_type, cmd_name,
                               old_idl_file, new_idl_file, old_idl_file_path,
                               new_idl_file_path)
        else:
            ctxt.add_new_reply_field_type_not_struct_error(
                cmd_name, field_name, new_field_type.name, old_field_type.name,
                new_idl_file_path)
コード例 #2
0
def check_reply_field_type(ctxt: IDLCompatibilityContext,
                           old_field_type: Optional[Union[syntax.Enum, syntax.Struct, syntax.Type]],
                           new_field_type: Optional[Union[syntax.Enum, syntax.Struct, syntax.Type]],
                           cmd_name: str, field_name: str, old_idl_file_path: str,
                           new_idl_file_path: str):
    """Check compatibility between old and new reply field type."""
    # pylint: disable=too-many-arguments,too-many-branches
    if old_field_type is None:
        ctxt.add_reply_field_type_invalid_error(cmd_name, field_name, old_idl_file_path)
        ctxt.errors.dump_errors()
        sys.exit(1)
    if new_field_type is None:
        ctxt.add_reply_field_type_invalid_error(cmd_name, field_name, new_idl_file_path)
        ctxt.errors.dump_errors()
        sys.exit(1)

    if isinstance(old_field_type, syntax.Type):
        if isinstance(new_field_type, syntax.Type):
            if "any" in old_field_type.bson_serialization_type:
                ctxt.add_old_reply_field_bson_any_error(cmd_name, field_name, old_field_type.name,
                                                        old_idl_file_path)
            elif "any" in new_field_type.bson_serialization_type:
                ctxt.add_new_reply_field_bson_any_error(cmd_name, field_name, new_field_type.name,
                                                        new_idl_file_path)
            else:
                check_subset(ctxt, cmd_name, field_name, new_field_type.name,
                             new_field_type.bson_serialization_type,
                             old_field_type.bson_serialization_type, new_idl_file_path)
        else:
            ctxt.add_new_reply_field_type_enum_or_struct_error(
                cmd_name, field_name, new_field_type.name, old_field_type.name, new_idl_file_path)
    elif isinstance(old_field_type, syntax.Enum):
        if isinstance(new_field_type, syntax.Enum):
            check_subset(ctxt, cmd_name, field_name, new_field_type.name, new_field_type.values,
                         old_field_type.values, new_idl_file_path)
        else:
            ctxt.add_new_reply_field_type_not_enum_error(cmd_name, field_name, new_field_type.name,
                                                         old_field_type.name, new_idl_file_path)
    elif isinstance(old_field_type, syntax.Struct):
        if not isinstance(new_field_type, syntax.Struct):
            ctxt.add_new_reply_field_type_not_struct_error(
                cmd_name, field_name, new_field_type.name, old_field_type.name, new_idl_file_path)