Title: [197689] trunk/Source/_javascript_Core
Revision
197689
Author
[email protected]
Date
2016-03-07 10:41:30 -0800 (Mon, 07 Mar 2016)

Log Message

Web Inspector: It should be possible to initialize generated ObjC protocol types from an NSDictionary payload
https://bugs.webkit.org/show_bug.cgi?id=155102
<rdar://problem/25002015>

Reviewed by Timothy Hatcher.

In Objective-C code, we sometimes prefer to parse JSON using Cocoa rather
than the InspectorValue classes. Support initializing protocol objects
directly from an NSDictionary payload. This delegates validation of values to
the setter methods that already exist on the protocol object classes.

* inspector/scripts/codegen/generate_objc_header.py:
(ObjCHeaderGenerator._generate_type_interface):
* inspector/scripts/codegen/generate_objc_protocol_types_implementation.py:
(ObjCProtocolTypesImplementationGenerator.generate_type_implementation):
(ObjCProtocolTypesImplementationGenerator._generate_init_method_for_payload):
* inspector/scripts/codegen/objc_generator.py:
(ObjCGenerator.payload_to_objc_expression_for_member):
Add a new helper method to generate an _expression_ to unpack the value
from an NSDictionary. If it's not a primitive, the setter performs
validation of the value's kind using -[NSObject isKindOfClass:].

Rebaseline relevant tests.

* inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
* inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
* inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
* inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
* inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/expected/type-declaration-object-type.json-result:
* inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (197688 => 197689)


--- trunk/Source/_javascript_Core/ChangeLog	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-03-07 18:41:30 UTC (rev 197689)
@@ -1,3 +1,37 @@
+2016-03-07  Brian Burg  <[email protected]>
+
+        Web Inspector: It should be possible to initialize generated ObjC protocol types from an NSDictionary payload
+        https://bugs.webkit.org/show_bug.cgi?id=155102
+        <rdar://problem/25002015>
+
+        Reviewed by Timothy Hatcher.
+
+        In Objective-C code, we sometimes prefer to parse JSON using Cocoa rather
+        than the InspectorValue classes. Support initializing protocol objects
+        directly from an NSDictionary payload. This delegates validation of values to
+        the setter methods that already exist on the protocol object classes.
+
+        * inspector/scripts/codegen/generate_objc_header.py:
+        (ObjCHeaderGenerator._generate_type_interface):
+        * inspector/scripts/codegen/generate_objc_protocol_types_implementation.py:
+        (ObjCProtocolTypesImplementationGenerator.generate_type_implementation):
+        (ObjCProtocolTypesImplementationGenerator._generate_init_method_for_payload):
+        * inspector/scripts/codegen/objc_generator.py:
+        (ObjCGenerator.payload_to_objc_expression_for_member):
+        Add a new helper method to generate an _expression_ to unpack the value
+        from an NSDictionary. If it's not a primitive, the setter performs
+        validation of the value's kind using -[NSObject isKindOfClass:].
+
+        Rebaseline relevant tests.
+
+        * inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
+        * inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
+        * inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
+        * inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
+        * inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result:
+        * inspector/scripts/tests/expected/type-declaration-object-type.json-result:
+        * inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:
+
 2016-03-07  Benjamin Poulain  <[email protected]>
 
         [JSC] Simplify the overflow check of ArithAbs

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_objc_header.py (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_objc_header.py	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_objc_header.py	2016-03-07 18:41:30 UTC (rev 197689)
@@ -159,6 +159,11 @@
         objc_name = self.objc_name_for_type(declaration.type)
         lines.append('__attribute__((visibility ("default")))')
         lines.append('@interface %s : %sJSONObject' % (objc_name, ObjCGenerator.OBJC_STATIC_PREFIX))
+
+        # The initializer that takes a payload is only needed by the frontend.
+        if self.get_generator_setting('generate_frontend', False):
+            lines.append('- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;')
+
         required_members = filter(lambda member: not member.is_optional, declaration.type_members)
         optional_members = filter(lambda member: member.is_optional, declaration.type_members)
         if required_members:

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py	2016-03-07 18:41:30 UTC (rev 197689)
@@ -90,6 +90,10 @@
     def generate_type_implementation(self, domain, declaration):
         lines = []
         lines.append('@implementation %s' % self.objc_name_for_type(declaration.type))
+        # The initializer that takes a payload is only needed by the frontend.
+        if self.get_generator_setting('generate_frontend', False):
+            lines.append('')
+            lines.append(self._generate_init_method_for_payload(domain, declaration))
         required_members = filter(lambda member: not member.is_optional, declaration.type_members)
         if required_members:
             lines.append('')
@@ -103,6 +107,26 @@
         lines.append('@end')
         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_required_members(self, domain, declaration, required_members):
         pairs = []
         for member in required_members:

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/objc_generator.py (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/objc_generator.py	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/objc_generator.py	2016-03-07 18:41:30 UTC (rev 197689)
@@ -457,6 +457,31 @@
                 return 'objcIntegerArray(%s)' % sub_expression
             return 'objcArray<%s>(%s)' % (objc_class, sub_expression)
 
+    def payload_to_objc_expression_for_member(self, declaration, member):
+        _type = member.type
+        if isinstance(_type, AliasedType):
+            _type = _type.aliased_type
+        if isinstance(_type, PrimitiveType):
+            sub_expression = 'payload[@"%s"]' % member.member_name
+            raw_name = _type.raw_name()
+            if raw_name is 'boolean':
+                return '[%s boolValue]' % sub_expression
+            if raw_name is 'integer':
+                return '[%s integerValue]' % sub_expression
+            if raw_name is 'number':
+                return '[%s doubleValue]' % sub_expression
+            if raw_name in ['any', 'object', 'array', 'string']:
+                return sub_expression  # The setter will check the incoming value.
+            return None
+        if isinstance(member.type, EnumType):
+            sub_expression = 'payload[@"%s"]' % member.member_name
+            if member.type.is_anonymous:
+                return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_anonymous_enum_member(declaration, member), sub_expression)
+            else:
+                return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_non_anonymous_enum(member.type), sub_expression)
+        if isinstance(_type, (ObjectType, ArrayType)):
+            return 'payload[@"%s"]' % member.member_name
+
     # JSON object setter/getter selectors for types.
 
     @staticmethod

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-async-attribute.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-async-attribute.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-async-attribute.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -1489,6 +1489,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseError : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 /* required */ @property (nonatomic, copy) NSString *message;
 /* required */ @property (nonatomic, assign) int code;
@@ -1592,6 +1593,20 @@
 
 @implementation TestProtocolDatabaseError
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"message"], @"message");
+    self.message = payload[@"message"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"code"], @"code");
+    self.code = [payload[@"code"] integerValue];
+
+    return self;
+}
+
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 {
     self = [super init];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -1346,6 +1346,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseError : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 /* required */ @property (nonatomic, copy) NSString *message;
 /* required */ @property (nonatomic, assign) int code;
@@ -1447,6 +1448,20 @@
 
 @implementation TestProtocolDatabaseError
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"message"], @"message");
+    self.message = payload[@"message"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"code"], @"code");
+    self.code = [payload[@"code"] integerValue];
+
+    return self;
+}
+
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 {
     self = [super init];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/events-with-optional-parameters.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/events-with-optional-parameters.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/events-with-optional-parameters.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -962,6 +962,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseError : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 /* required */ @property (nonatomic, copy) NSString *message;
 /* required */ @property (nonatomic, assign) int code;
@@ -1065,6 +1066,20 @@
 
 @implementation TestProtocolDatabaseError
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"message"], @"message");
+    self.message = payload[@"message"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"code"], @"code");
+    self.code = [payload[@"code"] integerValue];
+
+    return self;
+}
+
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 {
     self = [super init];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -1013,6 +1013,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolNetwork2NetworkError : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 /* required */ @property (nonatomic, copy) NSString *message;
 /* required */ @property (nonatomic, assign) int code;
@@ -1120,6 +1121,20 @@
 
 @implementation TestProtocolNetwork2NetworkError
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"message"], @"message");
+    self.message = payload[@"message"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"code"], @"code");
+    self.code = [payload[@"code"] integerValue];
+
+    return self;
+}
+
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 {
     self = [super init];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -840,6 +840,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolRuntimeKeyPath : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithType:(TestProtocolRuntimeKeyPathType)type;
 /* required */ @property (nonatomic, assign) TestProtocolRuntimeKeyPathType type;
 /* optional */ @property (nonatomic, copy) NSString *string;
@@ -938,6 +939,21 @@
 
 @implementation TestProtocolRuntimeKeyPath
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"type"], @"type");
+    self.type = fromProtocolString<TestProtocolRuntimeKeyPathType>(payload[@"type"]);
+
+    self.string = payload[@"string"];
+
+    self.array = payload[@"array"];
+
+    return self;
+}
+
 - (instancetype)initWithType:(TestProtocolRuntimeKeyPathType)type;
 {
     self = [super init];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/type-declaration-object-type.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/type-declaration-object-type.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/type-declaration-object-type.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -1211,6 +1211,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseError : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 /* required */ @property (nonatomic, copy) NSString *message;
 /* required */ @property (nonatomic, assign) int code;
@@ -1218,6 +1219,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseOptionalParameterBundle : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 /* optional */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
 /* optional */ @property (nonatomic, copy) NSString *notes;
 /* optional */ @property (nonatomic, assign) double timestamp;
@@ -1229,6 +1231,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseParameterBundle : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList;
 /* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
 /* required */ @property (nonatomic, copy) NSString *notes;
@@ -1241,6 +1244,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseObjectWithPropertyNameConflicts : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithInteger:(NSString *)integer array:(NSString *)array string:(NSString *)string value:(NSString *)value object:(NSString *)object;
 /* required */ @property (nonatomic, copy) NSString *integer;
 /* required */ @property (nonatomic, copy) NSString *array;
@@ -1251,10 +1255,12 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseDummyObject : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 @end
 
 __attribute__((visibility ("default")))
 @interface TestProtocolTestParameterBundle : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
 /* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
 /* required */ @property (nonatomic, copy) NSString *notes;
@@ -1356,6 +1362,20 @@
 
 @implementation TestProtocolDatabaseError
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"message"], @"message");
+    self.message = payload[@"message"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"code"], @"code");
+    self.code = [payload[@"code"] integerValue];
+
+    return self;
+}
+
 - (instancetype)initWithMessage:(NSString *)message code:(int)code;
 {
     self = [super init];
@@ -1394,6 +1414,28 @@
 
 @implementation TestProtocolDatabaseOptionalParameterBundle
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    self.columnNames = payload[@"columnNames"];
+
+    self.notes = payload[@"notes"];
+
+    self.timestamp = [payload[@"timestamp"] doubleValue];
+
+    self.values = payload[@"values"];
+
+    self.payload = payload[@"payload"];
+
+    self.error = payload[@"error"];
+
+    self.errorList = payload[@"errorList"];
+
+    return self;
+}
+
 - (void)setColumnNames:(NSArray/*<NSString>*/ *)columnNames
 {
     [super setInspectorArray:inspectorStringArray(columnNames) forKey:@"columnNames"];
@@ -1469,6 +1511,35 @@
 
 @implementation TestProtocolDatabaseParameterBundle
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"columnNames"], @"columnNames");
+    self.columnNames = payload[@"columnNames"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"notes"], @"notes");
+    self.notes = payload[@"notes"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"timestamp"], @"timestamp");
+    self.timestamp = [payload[@"timestamp"] doubleValue];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"values"], @"values");
+    self.values = payload[@"values"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"payload"], @"payload");
+    self.payload = payload[@"payload"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"error"], @"error");
+    self.error = payload[@"error"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"errorList"], @"errorList");
+    self.errorList = payload[@"errorList"];
+
+    return self;
+}
+
 - (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList;
 {
     self = [super init];
@@ -1569,6 +1640,29 @@
 
 @implementation TestProtocolDatabaseObjectWithPropertyNameConflicts
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"integer"], @"integer");
+    self.integer = payload[@"integer"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"array"], @"array");
+    self.array = payload[@"array"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"string"], @"string");
+    self.string = payload[@"string"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"value"], @"value");
+    self.value = payload[@"value"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"object"], @"object");
+    self.object = payload[@"object"];
+
+    return self;
+}
+
 - (instancetype)initWithInteger:(NSString *)integer array:(NSString *)array string:(NSString *)string value:(NSString *)value object:(NSString *)object;
 {
     self = [super init];
@@ -1644,11 +1738,45 @@
 
 @implementation TestProtocolDatabaseDummyObject
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    return self;
+}
+
 @end
 
 
 @implementation TestProtocolTestParameterBundle
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"columnNames"], @"columnNames");
+    self.columnNames = payload[@"columnNames"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"notes"], @"notes");
+    self.notes = payload[@"notes"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"timestamp"], @"timestamp");
+    self.timestamp = [payload[@"timestamp"] doubleValue];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"values"], @"values");
+    self.values = payload[@"values"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"payload"], @"payload");
+    self.payload = payload[@"payload"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"error"], @"error");
+    self.error = payload[@"error"];
+
+    return self;
+}
+
 - (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
 {
     self = [super init];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result (197688 => 197689)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result	2016-03-07 18:30:31 UTC (rev 197688)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result	2016-03-07 18:41:30 UTC (rev 197689)
@@ -1161,6 +1161,7 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolTestTypeNeedingCast : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithString:(NSString *)string number:(int)number animals:(TestProtocolTestCastedAnimals)animals identifier:(int)identifier tree:(TestProtocolTestRecursiveObject1 *)tree;
 /* required */ @property (nonatomic, copy) NSString *string;
 /* required */ @property (nonatomic, assign) int number;
@@ -1171,11 +1172,13 @@
 
 __attribute__((visibility ("default")))
 @interface TestProtocolTestRecursiveObject1 : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 /* optional */ @property (nonatomic, retain) TestProtocolTestRecursiveObject2 *obj;
 @end
 
 __attribute__((visibility ("default")))
 @interface TestProtocolTestRecursiveObject2 : RWIProtocolJSONObject
+- (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 /* optional */ @property (nonatomic, retain) TestProtocolTestRecursiveObject1 *obj;
 @end
 
@@ -1271,6 +1274,29 @@
 
 @implementation TestProtocolTestTypeNeedingCast
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"string"], @"string");
+    self.string = payload[@"string"];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"number"], @"number");
+    self.number = [payload[@"number"] integerValue];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"animals"], @"animals");
+    self.animals = fromProtocolString<TestProtocolTestCastedAnimals>(payload[@"animals"]);
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"identifier"], @"identifier");
+    self.identifier = [payload[@"id"] integerValue];
+
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"tree"], @"tree");
+    self.tree = payload[@"tree"];
+
+    return self;
+}
+
 - (instancetype)initWithString:(NSString *)string number:(int)number animals:(TestProtocolTestCastedAnimals)animals identifier:(int)identifier tree:(TestProtocolTestRecursiveObject1 *)tree;
 {
     self = [super init];
@@ -1343,6 +1369,16 @@
 
 @implementation TestProtocolTestRecursiveObject1
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    self.obj = payload[@"obj"];
+
+    return self;
+}
+
 - (void)setObj:(TestProtocolTestRecursiveObject2 *)obj
 {
     [super setObject:obj forKey:@"obj"];
@@ -1357,6 +1393,16 @@
 
 @implementation TestProtocolTestRecursiveObject2
 
+- (instancetype)initWithPayload:(nonnull NSDictionary<NSString *, id> *)payload
+{
+    if (!(self = [super init]))
+        return nil;
+
+    self.obj = payload[@"obj"];
+
+    return self;
+}
+
 - (void)setObj:(TestProtocolTestRecursiveObject1 *)obj
 {
     [super setObject:obj forKey:@"obj"];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to