def _generate_init_method_for_required_members(self, domain, declaration, required_members): pairs = [] for member in required_members: objc_type = self.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) pairs.append('%s:(%s)%s' % (var_name, objc_type, var_name)) pairs[0] = ucfirst(pairs[0]) lines = [] lines.append('- (instancetype)initWith%s' % ' '.join(pairs)) lines.append('{') lines.append(' if (!(self = [super init]))') lines.append(' return nil;') lines.append('') required_pointer_members = filter(lambda member: ObjCGenerator.is_type_objc_pointer_type(member.type), required_members) if required_pointer_members: for member in required_pointer_members: var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(member.type) if objc_array_class and objc_array_class.startswith(self.objc_prefix()): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) lines.append('') for member in required_members: var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) lines.append(' self.%s = %s;' % (var_name, var_name)) lines.append('') lines.append(' return self;') lines.append('}') return '\n'.join(lines)
def _generate_event(self, domain, event): lines = [] lines.append(self._generate_event_signature(domain, event)) lines.append('{') lines.append(' InspectorFrontendChannel* frontendChannel = _controller->frontendChannel();') lines.append(' if (!frontendChannel)') lines.append(' return;') lines.append('') required_pointer_parameters = filter(lambda parameter: not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters) for parameter in required_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name)) optional_pointer_parameters = filter(lambda parameter: parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters) for parameter in optional_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name)) if required_pointer_parameters or optional_pointer_parameters: lines.append('') lines.append(' RefPtr<InspectorObject> jsonMessage = InspectorObject::create();') lines.append(' jsonMessage->setString(ASCIILiteral("method"), ASCIILiteral("%s.%s"));' % (domain.domain_name, event.event_name)) if event.event_parameters: lines.extend(self._generate_event_out_parameters(domain, event)) lines.append(' frontendChannel->sendMessageToFrontend(jsonMessage->toJSONString());') lines.append('}') return '\n'.join(lines)
def _generate_event(self, domain, event): lines = [] lines.append(self._generate_event_signature(domain, event)) lines.append('{') lines.append(' const FrontendRouter& router = _controller->frontendRouter();') lines.append('') required_pointer_parameters = filter(lambda parameter: not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters) for parameter in required_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(self.objc_prefix()): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) optional_pointer_parameters = filter(lambda parameter: parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters) for parameter in optional_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(self.objc_prefix()): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_OPTIONAL_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) if required_pointer_parameters or optional_pointer_parameters: lines.append('') lines.append(' Ref<InspectorObject> jsonMessage = InspectorObject::create();') lines.append(' jsonMessage->setString(ASCIILiteral("method"), ASCIILiteral("%s.%s"));' % (domain.domain_name, event.event_name)) if event.event_parameters: lines.extend(self._generate_event_out_parameters(domain, event)) lines.append(' router.sendEvent(jsonMessage->toJSONString());') lines.append('}') return '\n'.join(lines)
def _generate_event(self, domain, event): lines = [] lines.append(self._generate_event_signature(domain, event)) lines.append('{') lines.append(' InspectorFrontendChannel* frontendChannel = _controller->frontendChannel();') lines.append(' if (!frontendChannel)') lines.append(' return;') lines.append('') required_pointer_parameters = filter(lambda parameter: not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters) for parameter in required_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = ObjCGenerator.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(ObjCGenerator.OBJC_PREFIX): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) optional_pointer_parameters = filter(lambda parameter: parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), event.event_parameters) for parameter in optional_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = ObjCGenerator.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(ObjCGenerator.OBJC_PREFIX): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_OPTIONAL_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) if required_pointer_parameters or optional_pointer_parameters: lines.append('') lines.append(' Ref<InspectorObject> jsonMessage = InspectorObject::create();') lines.append(' jsonMessage->setString(ASCIILiteral("method"), ASCIILiteral("%s.%s"));' % (domain.domain_name, event.event_name)) if event.event_parameters: lines.extend(self._generate_event_out_parameters(domain, event)) lines.append(' frontendChannel->sendMessageToFrontend(jsonMessage->toJSONString());') lines.append('}') return '\n'.join(lines)
def _generate_event(self, domain, event): lines = [] lines.append(self._generate_event_signature(domain, event)) lines.append('{') lines.append( ' const FrontendRouter& router = _controller->frontendRouter();' ) lines.append('') required_pointer_parameters = [ parameter for parameter in event.event_parameters if not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type) ] for parameter in required_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier( parameter.parameter_name) lines.append( ' THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith( self.objc_prefix()): lines.append( ' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) optional_pointer_parameters = [ parameter for parameter in event.event_parameters if parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type) ] for parameter in optional_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier( parameter.parameter_name) lines.append( ' THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith( self.objc_prefix()): lines.append( ' THROW_EXCEPTION_FOR_BAD_TYPE_IN_OPTIONAL_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) if required_pointer_parameters or optional_pointer_parameters: lines.append('') lines.append(' auto protocol_jsonMessage = JSON::Object::create();') lines.append( ' protocol_jsonMessage->setString("method"_s, "%s.%s"_s);' % (domain.domain_name, event.event_name)) if event.event_parameters: lines.extend(self._generate_event_out_parameters(domain, event)) lines.append( ' router.sendEvent(protocol_jsonMessage->toJSONString());') lines.append('}') return self.wrap_with_guard_for_condition(event.condition, '\n'.join(lines))
def _generate_success_block_for_command(self, domain, command): lines = [] if command.return_parameters: success_block_parameters = [] for parameter in command.return_parameters: objc_type = self.objc_type_for_param(domain, command.command_name, parameter) var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) success_block_parameters.append(join_type_and_name(objc_type, var_name)) lines.append(' id successCallback = ^(%s) {' % ', '.join(success_block_parameters)) else: lines.append(' id successCallback = ^{') if command.return_parameters: lines.append(' Ref<JSON::Object> resultObject = JSON::Object::create();') required_pointer_parameters = [parameter for parameter in command.return_parameters if not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type)] for parameter in required_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(self.objc_prefix()): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) optional_pointer_parameters = [parameter for parameter in command.return_parameters if parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type)] for parameter in optional_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = self.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(self.objc_prefix()): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_OPTIONAL_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) for parameter in command.return_parameters: keyed_set_method = CppGenerator.cpp_setter_method_for_type(parameter.type) var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) var_expression = '*%s' % var_name if parameter.is_optional else var_name export_expression = self.objc_protocol_export_expression_for_variable(parameter.type, var_expression) if not parameter.is_optional: lines.append(' resultObject->%s("%s"_s, %s);' % (keyed_set_method, parameter.parameter_name, export_expression)) else: lines.append(' if (%s)' % var_name) lines.append(' resultObject->%s("%s"_s, %s);' % (keyed_set_method, parameter.parameter_name, export_expression)) lines.append(' backendDispatcher()->sendResponse(requestId, WTFMove(resultObject), false);') else: lines.append(' backendDispatcher()->sendResponse(requestId, JSON::Object::create(), false);') lines.append(' };') return '\n'.join(lines)
def _generate_success_block_for_command(self, domain, command): lines = [] if command.return_parameters: success_block_parameters = [] for parameter in command.return_parameters: objc_type = ObjCGenerator.objc_type_for_param(domain, command.command_name, parameter) var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) success_block_parameters.append(join_type_and_name(objc_type, var_name)) lines.append(' id successCallback = ^(%s) {' % ', '.join(success_block_parameters)) else: lines.append(' id successCallback = ^{') if command.return_parameters: lines.append(' Ref<InspectorObject> resultObject = InspectorObject::create();') required_pointer_parameters = filter(lambda parameter: not parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), command.return_parameters) for parameter in required_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = ObjCGenerator.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(ObjCGenerator.OBJC_PREFIX): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) optional_pointer_parameters = filter(lambda parameter: parameter.is_optional and ObjCGenerator.is_type_objc_pointer_type(parameter.type), command.return_parameters) for parameter in optional_pointer_parameters: var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) lines.append(' THROW_EXCEPTION_FOR_BAD_OPTIONAL_PARAMETER(%s, @"%s");' % (var_name, var_name)) objc_array_class = ObjCGenerator.objc_class_for_array_type(parameter.type) if objc_array_class and objc_array_class.startswith(ObjCGenerator.OBJC_PREFIX): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_OPTIONAL_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) for parameter in command.return_parameters: keyed_set_method = CppGenerator.cpp_setter_method_for_type(parameter.type) var_name = ObjCGenerator.identifier_to_objc_identifier(parameter.parameter_name) var_expression = '*%s' % var_name if parameter.is_optional else var_name export_expression = ObjCGenerator.objc_protocol_export_expression_for_variable(parameter.type, var_expression) if not parameter.is_optional: lines.append(' resultObject->%s(ASCIILiteral("%s"), %s);' % (keyed_set_method, parameter.parameter_name, export_expression)) else: lines.append(' if (%s)' % var_name) lines.append(' resultObject->%s(ASCIILiteral("%s"), %s);' % (keyed_set_method, parameter.parameter_name, export_expression)) lines.append(' backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));') else: lines.append(' backendDispatcher()->sendResponse(requestId, InspectorObject::create());') lines.append(' };') return '\n'.join(lines)
def _generate_init_method_for_payload(self, domain, declaration): lines = [] lines.append( '- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload' ) lines.append('{') lines.append(' if (!(self = [super init]))') lines.append(' return nil;') lines.append('') for member in declaration.type_members: var_name = ObjCGenerator.identifier_to_objc_identifier( member.member_name) if not member.is_optional: lines.append( ' THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"%s"], @"%s");' % (var_name, var_name)) conversion_expression = self.payload_to_objc_expression_for_member( declaration, member) lines.append(' self.%s = %s;' % (var_name, conversion_expression)) lines.append('') lines.append(' return self;') lines.append('}') return '\n'.join(lines)
def _generate_init_method_for_payload(self, domain, declaration): lines = [] lines.append('- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload') lines.append('{') lines.append(' if (!(self = [super init]))') lines.append(' return nil;') lines.append('') for member in declaration.type_members: member_name = member.member_name if not member.is_optional: lines.append(' THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"%s"], @"%s");' % (member_name, member_name)) objc_type = self.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member_name) conversion_expression = self.payload_to_objc_expression_for_member(declaration, member) if isinstance(member.type, EnumType): lines.append(' std::optional<%s> %s = %s;' % (objc_type, var_name, conversion_expression)) if not member.is_optional: lines.append(' THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(%s, @"%s");' % (var_name, member_name)) lines.append(' self.%s = %s.value();' % (var_name, var_name)) else: lines.append(' if (%s)' % var_name) lines.append(' self.%s = %s.value();' % (var_name, var_name)) else: lines.append(' self.%s = %s;' % (var_name, conversion_expression)) lines.append('') lines.append(' return self;') lines.append('}') return '\n'.join(lines)
def _generate_getter_for_member(self, domain, declaration, member): objc_type = self.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier( member.member_name) getter_method = ObjCGenerator.objc_getter_method_for_member( declaration, member) basic_expression = '[super %s:@"%s"]' % (getter_method, member.member_name) category = ObjCTypeCategory.category_for_type(member.type) if category is ObjCTypeCategory.Object: lines = [] lines.append('- (%s)%s' % (objc_type, var_name)) lines.append('{') lines.append( self.protocol_to_objc_code_block_for_object_member( declaration, member, basic_expression)) lines.append('}') else: conversion_expression = self.protocol_to_objc_expression_for_member( declaration, member, basic_expression) lines = [] lines.append('- (%s)%s' % (objc_type, var_name)) lines.append('{') lines.append(' return %s;' % conversion_expression) lines.append('}') return '\n'.join(lines)
def _generate_init_method_for_required_members(self, domain, declaration, required_members): pairs = [] for member in required_members: objc_type = self.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) pairs.append('%s:(%s)%s' % (var_name, objc_type, var_name)) pairs[0] = ucfirst(pairs[0]) return '- (instancetype)initWith%s;' % ' '.join(pairs)
def _generate_init_method_for_required_members(self, domain, declaration, required_members): pairs = [] for member in required_members: objc_type = ObjCGenerator.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) pairs.append('%s:(%s)%s' % (var_name, objc_type, var_name)) pairs[0] = ucfirst(pairs[0]) return '- (instancetype)initWith%s;' % ' '.join(pairs)
def _generate_member_property(self, declaration, member): accessor_type = self.objc_accessor_type_for_member(member) objc_type = self.objc_type_for_member(declaration, member) return '@property (nonatomic, %s) %s;' % ( accessor_type, join_type_and_name( objc_type, ObjCGenerator.identifier_to_objc_identifier( member.member_name)))
def _generate_setter_for_member(self, domain, declaration, member): objc_type = ObjCGenerator.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) setter_method = ObjCGenerator.objc_setter_method_for_member(declaration, member) conversion_expression = ObjCGenerator.objc_to_protocol_expression_for_member(declaration, member, var_name) lines = [] lines.append('- (void)set%s:(%s)%s' % (ucfirst(var_name), objc_type, var_name)) lines.append('{') lines.append(' [super %s:%s forKey:@"%s"];' % (setter_method, conversion_expression, member.member_name)) lines.append('}') return '\n'.join(lines)
def _generate_getter_for_member(self, domain, declaration, member): objc_type = self.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) getter_method = ObjCGenerator.objc_getter_method_for_member(declaration, member) basic_expression = '[super %s:@"%s"]' % (getter_method, member.member_name) conversion_expression = self.protocol_to_objc_expression_for_member(declaration, member, basic_expression) lines = [] lines.append('- (%s)%s' % (objc_type, var_name)) lines.append('{') lines.append(' return %s;' % conversion_expression) lines.append('}') return '\n'.join(lines)
def _generate_setter_for_member(self, domain, declaration, member): objc_type = self.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier(member.member_name) setter_method = ObjCGenerator.objc_setter_method_for_member(declaration, member) conversion_expression = self.objc_to_protocol_expression_for_member(declaration, member, var_name) lines = [] lines.append('- (void)set%s:(%s)%s' % (ucfirst(var_name), objc_type, var_name)) lines.append('{') objc_array_class = self.objc_class_for_array_type(member.type) if objc_array_class and objc_array_class.startswith(self.objc_prefix()): lines.append(' THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(%s, [%s class]);' % (var_name, objc_array_class)) lines.append(' [super %s:%s forKey:@"%s"];' % (setter_method, conversion_expression, member.member_name)) lines.append('}') return '\n'.join(lines)
def _generate_getter_for_member(self, domain, declaration, member): objc_type = ObjCGenerator.objc_type_for_member(declaration, member) var_name = ObjCGenerator.identifier_to_objc_identifier( member.member_name) getter_method = ObjCGenerator.objc_getter_method_for_member( declaration, member) basic_expression = '[super %s:@"%s"]' % (getter_method, member.member_name) conversion_expression = ObjCGenerator.protocol_to_objc_expression_for_member( declaration, member, basic_expression) lines = [] lines.append('- (%s)%s' % (objc_type, var_name)) lines.append('{') lines.append(' return %s;' % conversion_expression) lines.append('}') return '\n'.join(lines)
def _generate_member_property(self, declaration, member): accessor_type = ObjCGenerator.objc_accessor_type_for_member(member) objc_type = ObjCGenerator.objc_type_for_member(declaration, member) return '@property (nonatomic, %s) %s;' % (accessor_type, join_type_and_name(objc_type, ObjCGenerator.identifier_to_objc_identifier(member.member_name)))