<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[213960] trunk/Source/JavaScriptCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/213960">213960</a></dd>
<dt>Author</dt> <dd>bburg@apple.com</dd>
<dt>Date</dt> <dd>2017-03-14 16:44:01 -0700 (Tue, 14 Mar 2017)</dd>
</dl>
<h3>Log Message</h3>
<pre>[Cocoa] Web Inspector: generated code for parsing an array of primitive-type enums from payload does not work
https://bugs.webkit.org/show_bug.cgi?id=169629
Reviewed by Joseph Pecoraro.
This was encountered while trying to compile new protocol definitions that support the Actions API.
* inspector/scripts/codegen/models.py:
(EnumType.__repr__): Improve debug logging so fields match the class member names.
* inspector/scripts/codegen/objc_generator.py:
(ObjCGenerator.payload_to_objc_expression_for_member):
If the array elements are actually a primitive type, then there's no need to do any
conversion from a payload. This happens for free since the payload is a tree of
NSDictionary, NSString, NSNumber, etc.
* inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
Rebaseline.
* inspector/scripts/tests/generic/type-declaration-object-type.json:
Add new cases for properties that contain an array with enum type references and an array of anonymous enums.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenmodelspy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generatorpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedshadowedoptionaltypesettersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationobjecttypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenerictypedeclarationobjecttypejson">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2017-03-14 Brian Burg <bburg@apple.com>
+
+ [Cocoa] Web Inspector: generated code for parsing an array of primitive-type enums from payload does not work
+ https://bugs.webkit.org/show_bug.cgi?id=169629
+
+ Reviewed by Joseph Pecoraro.
+
+ This was encountered while trying to compile new protocol definitions that support the Actions API.
+
+ * inspector/scripts/codegen/models.py:
+ (EnumType.__repr__): Improve debug logging so fields match the class member names.
+
+ * inspector/scripts/codegen/objc_generator.py:
+ (ObjCGenerator.payload_to_objc_expression_for_member):
+ If the array elements are actually a primitive type, then there's no need to do any
+ conversion from a payload. This happens for free since the payload is a tree of
+ NSDictionary, NSString, NSNumber, etc.
+
+ * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
+ * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
+ Rebaseline.
+
+ * inspector/scripts/tests/generic/type-declaration-object-type.json:
+ Add new cases for properties that contain an array with enum type references and an array of anonymous enums.
+
</ins><span class="cx"> 2017-03-14 Filip Pizlo <fpizlo@apple.com>
</span><span class="cx">
</span><span class="cx"> Record the HashSet/HashMap operations in DFG/FTL/B3 and replay them in a benchmark
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenmodelspy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/models.py        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -258,7 +258,7 @@
</span><span class="cx"> self.is_anonymous = is_anonymous
</span><span class="cx">
</span><span class="cx"> def __repr__(self):
</span><del>- return 'EnumType[value_type=%s; values=%s]' % (self.qualified_name(), ', '.join(map(str, self.enum_values())))
</del><ins>+ return 'EnumType[primitive_type=%s; enum_values=%s]' % (self.qualified_name(), ', '.join(map(str, self.enum_values())))
</ins><span class="cx">
</span><span class="cx"> def is_enum(self):
</span><span class="cx"> return True
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generatorpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -486,9 +486,17 @@
</span><span class="cx"> objc_class = self.objc_class_for_type(member.type)
</span><span class="cx"> return '[[%s alloc] initWithPayload:payload[@"%s"]]' % (objc_class, member.member_name)
</span><span class="cx"> if isinstance(_type, ArrayType):
</span><del>- objc_class = self.objc_class_for_type(member.type.element_type)
- return 'objcArrayFromPayload<%s>(payload[@"%s"])' % (objc_class, member.member_name)
</del><ins>+ element_type = member.type.element_type
+ if isinstance(element_type, EnumType):
+ element_type = element_type.primitive_type
</ins><span class="cx">
</span><ins>+ # In this case, there is no conversion that needs to be done, the array already contains an ObjC type.
+ if isinstance(element_type, PrimitiveType):
+ return 'payload[@"%s"]' % member.member_name
+ else:
+ objc_class = self.objc_class_for_type(element_type)
+ return 'objcArrayFromPayload<%s>(payload[@"%s"])' % (objc_class, member.member_name)
+
</ins><span class="cx"> # JSON object setter/getter selectors for types.
</span><span class="cx">
</span><span class="cx"> @staticmethod
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedshadowedoptionaltypesettersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -1061,7 +1061,7 @@
</span><span class="cx">
</span><span class="cx"> self.string = payload[@"string"];
</span><span class="cx">
</span><del>- self.array = objcArrayFromPayload<NSString>(payload[@"array"]);
</del><ins>+ self.array = payload[@"array"];
</ins><span class="cx">
</span><span class="cx"> return self;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationobjecttypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -28,6 +28,11 @@
</span><span class="cx">
</span><span class="cx"> // DO NOT EDIT THIS FILE. It is automatically generated from type-declaration-object-type.json
</span><span class="cx"> // by the script: Source/JavaScriptCore/inspector/scripts/generate-inspector-protocol-bindings.py
</span><ins>+
+// Database.
+InspectorBackend.registerEnum("Database.MouseButton", {None: "None", Left: "Left", Middle: "Middle", Right: "Right"});
+InspectorBackend.registerEnum("Database.OptionalParameterBundleDirectionality", {LTR: "LTR", RTL: "RTL"});
+InspectorBackend.registerEnum("Database.ParameterBundleDirectionality", {LTR: "LTR", RTL: "RTL"});
</ins><span class="cx"> ### End File: InspectorBackendCommands.js
</span><span class="cx">
</span><span class="cx"> ### Begin File: TestAlternateBackendDispatchers.h
</span><span class="lines">@@ -320,6 +325,7 @@
</span><span class="cx"> class ParameterBundle;
</span><span class="cx"> class ObjectWithPropertyNameConflicts;
</span><span class="cx"> class DummyObject;
</span><ins>+enum class MouseButton;
</ins><span class="cx"> } // Database
</span><span class="cx">
</span><span class="cx"> namespace Test {
</span><span class="lines">@@ -334,6 +340,17 @@
</span><span class="cx"> } // Database
</span><span class="cx"> // End of typedefs.
</span><span class="cx">
</span><ins>+namespace TestHelpers {
+
+String getEnumConstantValue(int code);
+
+template<typename T> String getEnumConstantValue(T enumValue)
+{
+ return getEnumConstantValue(static_cast<int>(enumValue));
+}
+
+} // namespace TestHelpers
+
</ins><span class="cx"> namespace Database {
</span><span class="cx"> /* Database error. */
</span><span class="cx"> class Error : public Inspector::InspectorObjectBase {
</span><span class="lines">@@ -400,8 +417,20 @@
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+/* Enumerates different mouse buttons that can be used. */
+enum class MouseButton {
+ None = 0,
+ Left = 1,
+ Middle = 2,
+ Right = 3,
+}; // enum class MouseButton
</ins><span class="cx"> class OptionalParameterBundle : public Inspector::InspectorObjectBase {
</span><span class="cx"> public:
</span><ins>+ // Named after property name 'directionality' while generating OptionalParameterBundle.
+ enum class Directionality {
+ LTR = 4,
+ RTL = 5,
+ }; // enum class Directionality
</ins><span class="cx"> enum {
</span><span class="cx"> NoFieldsSet = 0,
</span><span class="cx"> AllFieldsSet = 0
</span><span class="lines">@@ -450,6 +479,16 @@
</span><span class="cx"> InspectorObjectBase::setArray(ASCIILiteral("columnNames"), WTFMove(value));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ void setButtons(RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Database::MouseButton>> value)
+ {
+ InspectorObjectBase::setArray(ASCIILiteral("buttons"), WTFMove(value));
+ }
+
+ void setDirectionality(Directionality value)
+ {
+ InspectorObjectBase::setString(ASCIILiteral("directionality"), Inspector::Protocol::TestHelpers::getEnumConstantValue(value));
+ }
+
</ins><span class="cx"> void setNotes(const String& value)
</span><span class="cx"> {
</span><span class="cx"> InspectorObjectBase::setString(ASCIILiteral("notes"), value);
</span><span class="lines">@@ -483,16 +522,23 @@
</span><span class="cx">
</span><span class="cx"> class ParameterBundle : public Inspector::InspectorObjectBase {
</span><span class="cx"> public:
</span><ins>+ // Named after property name 'directionality' while generating ParameterBundle.
+ enum class Directionality {
+ LTR = 4,
+ RTL = 5,
+ }; // enum class Directionality
</ins><span class="cx"> enum {
</span><span class="cx"> NoFieldsSet = 0,
</span><span class="cx"> ColumnNamesSet = 1 << 0,
</span><del>- NotesSet = 1 << 1,
- TimestampSet = 1 << 2,
- ValuesSet = 1 << 3,
- PayloadSet = 1 << 4,
- ErrorSet = 1 << 5,
- ErrorListSet = 1 << 6,
- AllFieldsSet = (ColumnNamesSet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet | ErrorListSet)
</del><ins>+ ButtonsSet = 1 << 1,
+ DirectionalitySet = 1 << 2,
+ NotesSet = 1 << 3,
+ TimestampSet = 1 << 4,
+ ValuesSet = 1 << 5,
+ PayloadSet = 1 << 6,
+ ErrorSet = 1 << 7,
+ ErrorListSet = 1 << 8,
+ AllFieldsSet = (ColumnNamesSet | ButtonsSet | DirectionalitySet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet | ErrorListSet)
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<int STATE>
</span><span class="lines">@@ -520,6 +566,20 @@
</span><span class="cx"> return castState<ColumnNamesSet>();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ Builder<STATE | ButtonsSet>& setButtons(RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Database::MouseButton>> value)
+ {
+ COMPILE_ASSERT(!(STATE & ButtonsSet), property_buttons_already_set);
+ m_result->setArray(ASCIILiteral("buttons"), value);
+ return castState<ButtonsSet>();
+ }
+
+ Builder<STATE | DirectionalitySet>& setDirectionality(Directionality value)
+ {
+ COMPILE_ASSERT(!(STATE & DirectionalitySet), property_directionality_already_set);
+ m_result->setString(ASCIILiteral("directionality"), Inspector::Protocol::TestHelpers::getEnumConstantValue(value));
+ return castState<DirectionalitySet>();
+ }
+
</ins><span class="cx"> Builder<STATE | NotesSet>& setNotes(const String& value)
</span><span class="cx"> {
</span><span class="cx"> COMPILE_ASSERT(!(STATE & NotesSet), property_notes_already_set);
</span><span class="lines">@@ -576,6 +636,8 @@
</span><span class="cx"> * Synthetic constructor:
</span><span class="cx"> * Ref<ParameterBundle> result = ParameterBundle::create()
</span><span class="cx"> * .setColumnNames(...)
</span><ins>+ * .setButtons(...)
+ * .setDirectionality(...)
</ins><span class="cx"> * .setNotes(...)
</span><span class="cx"> * .setTimestamp(...)
</span><span class="cx"> * .setValues(...)
</span><span class="lines">@@ -687,15 +749,22 @@
</span><span class="cx"> namespace Test {
</span><span class="cx"> class ParameterBundle : public Inspector::InspectorObjectBase {
</span><span class="cx"> public:
</span><ins>+ // Named after property name 'directionality' while generating ParameterBundle.
+ enum class Directionality {
+ LTR = 4,
+ RTL = 5,
+ }; // enum class Directionality
</ins><span class="cx"> enum {
</span><span class="cx"> NoFieldsSet = 0,
</span><del>- ColumnNamesSet = 1 << 0,
- NotesSet = 1 << 1,
- TimestampSet = 1 << 2,
- ValuesSet = 1 << 3,
- PayloadSet = 1 << 4,
- ErrorSet = 1 << 5,
- AllFieldsSet = (ColumnNamesSet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet)
</del><ins>+ DirectionalitySet = 1 << 0,
+ ButtonsSet = 1 << 1,
+ ColumnNamesSet = 1 << 2,
+ NotesSet = 1 << 3,
+ TimestampSet = 1 << 4,
+ ValuesSet = 1 << 5,
+ PayloadSet = 1 << 6,
+ ErrorSet = 1 << 7,
+ AllFieldsSet = (DirectionalitySet | ButtonsSet | ColumnNamesSet | NotesSet | TimestampSet | ValuesSet | PayloadSet | ErrorSet)
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<int STATE>
</span><span class="lines">@@ -716,6 +785,20 @@
</span><span class="cx"> friend class ParameterBundle;
</span><span class="cx"> public:
</span><span class="cx">
</span><ins>+ Builder<STATE | DirectionalitySet>& setDirectionality(Directionality value)
+ {
+ COMPILE_ASSERT(!(STATE & DirectionalitySet), property_directionality_already_set);
+ m_result->setString(ASCIILiteral("directionality"), Inspector::Protocol::TestHelpers::getEnumConstantValue(value));
+ return castState<DirectionalitySet>();
+ }
+
+ Builder<STATE | ButtonsSet>& setButtons(RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Database::MouseButton>> value)
+ {
+ COMPILE_ASSERT(!(STATE & ButtonsSet), property_buttons_already_set);
+ m_result->setArray(ASCIILiteral("buttons"), value);
+ return castState<ButtonsSet>();
+ }
+
</ins><span class="cx"> Builder<STATE | ColumnNamesSet>& setColumnNames(RefPtr<Inspector::Protocol::Array<String>> value)
</span><span class="cx"> {
</span><span class="cx"> COMPILE_ASSERT(!(STATE & ColumnNamesSet), property_columnNames_already_set);
</span><span class="lines">@@ -771,6 +854,8 @@
</span><span class="cx"> /*
</span><span class="cx"> * Synthetic constructor:
</span><span class="cx"> * Ref<ParameterBundle> result = ParameterBundle::create()
</span><ins>+ * .setDirectionality(...)
+ * .setButtons(...)
</ins><span class="cx"> * .setColumnNames(...)
</span><span class="cx"> * .setNotes(...)
</span><span class="cx"> * .setTimestamp(...)
</span><span class="lines">@@ -789,6 +874,25 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><ins>+namespace TestHelpers {
+
+template<typename ProtocolEnumType>
+std::optional<ProtocolEnumType> parseEnumValueFromString(const String&);
+
+// Enums in the 'Database' Domain
+template<>
+std::optional<Inspector::Protocol::Database::MouseButton> parseEnumValueFromString<Inspector::Protocol::Database::MouseButton>(const String&);
+template<>
+std::optional<Inspector::Protocol::Database::OptionalParameterBundle::Directionality> parseEnumValueFromString<Inspector::Protocol::Database::OptionalParameterBundle::Directionality>(const String&);
+template<>
+std::optional<Inspector::Protocol::Database::ParameterBundle::Directionality> parseEnumValueFromString<Inspector::Protocol::Database::ParameterBundle::Directionality>(const String&);
+
+// Enums in the 'Test' Domain
+template<>
+std::optional<Inspector::Protocol::Test::ParameterBundle::Directionality> parseEnumValueFromString<Inspector::Protocol::Test::ParameterBundle::Directionality>(const String&);
+
+} // namespace TestHelpers
+
</ins><span class="cx"> } // namespace Protocol
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -835,8 +939,87 @@
</span><span class="cx">
</span><span class="cx"> namespace Protocol {
</span><span class="cx">
</span><ins>+namespace TestHelpers {
</ins><span class="cx">
</span><ins>+static const char* const enum_constant_values[] = {
+ "None",
+ "Left",
+ "Middle",
+ "Right",
+ "LTR",
+ "RTL",
+};
</ins><span class="cx">
</span><ins>+String getEnumConstantValue(int code) {
+ return enum_constant_values[code];
+}
+
+// Enums in the 'Database' Domain
+template<>
+std::optional<Inspector::Protocol::Database::MouseButton> parseEnumValueFromString<Inspector::Protocol::Database::MouseButton>(const String& protocolString)
+{
+ static const size_t constantValues[] = {
+ (size_t)Inspector::Protocol::Database::MouseButton::None,
+ (size_t)Inspector::Protocol::Database::MouseButton::Left,
+ (size_t)Inspector::Protocol::Database::MouseButton::Middle,
+ (size_t)Inspector::Protocol::Database::MouseButton::Right,
+ };
+ for (size_t i = 0; i < 4; ++i)
+ if (protocolString == enum_constant_values[constantValues[i]])
+ return (Inspector::Protocol::Database::MouseButton)constantValues[i];
+
+ return std::nullopt;
+}
+
+template<>
+std::optional<Inspector::Protocol::Database::OptionalParameterBundle::Directionality> parseEnumValueFromString<Inspector::Protocol::Database::OptionalParameterBundle::Directionality>(const String& protocolString)
+{
+ static const size_t constantValues[] = {
+ (size_t)Inspector::Protocol::Database::OptionalParameterBundle::Directionality::LTR,
+ (size_t)Inspector::Protocol::Database::OptionalParameterBundle::Directionality::RTL,
+ };
+ for (size_t i = 0; i < 2; ++i)
+ if (protocolString == enum_constant_values[constantValues[i]])
+ return (Inspector::Protocol::Database::OptionalParameterBundle::Directionality)constantValues[i];
+
+ return std::nullopt;
+}
+
+template<>
+std::optional<Inspector::Protocol::Database::ParameterBundle::Directionality> parseEnumValueFromString<Inspector::Protocol::Database::ParameterBundle::Directionality>(const String& protocolString)
+{
+ static const size_t constantValues[] = {
+ (size_t)Inspector::Protocol::Database::ParameterBundle::Directionality::LTR,
+ (size_t)Inspector::Protocol::Database::ParameterBundle::Directionality::RTL,
+ };
+ for (size_t i = 0; i < 2; ++i)
+ if (protocolString == enum_constant_values[constantValues[i]])
+ return (Inspector::Protocol::Database::ParameterBundle::Directionality)constantValues[i];
+
+ return std::nullopt;
+}
+
+
+// Enums in the 'Test' Domain
+template<>
+std::optional<Inspector::Protocol::Test::ParameterBundle::Directionality> parseEnumValueFromString<Inspector::Protocol::Test::ParameterBundle::Directionality>(const String& protocolString)
+{
+ static const size_t constantValues[] = {
+ (size_t)Inspector::Protocol::Test::ParameterBundle::Directionality::LTR,
+ (size_t)Inspector::Protocol::Test::ParameterBundle::Directionality::RTL,
+ };
+ for (size_t i = 0; i < 2; ++i)
+ if (protocolString == enum_constant_values[constantValues[i]])
+ return (Inspector::Protocol::Test::ParameterBundle::Directionality)constantValues[i];
+
+ return std::nullopt;
+}
+
+
+} // namespace TestHelpers
+
+
+
</ins><span class="cx"> } // namespace Protocol
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1129,8 +1312,29 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx">
</span><ins>+typedef NS_ENUM(NSInteger, TestProtocolDatabaseMouseButton) {
+ TestProtocolDatabaseMouseButtonNone,
+ TestProtocolDatabaseMouseButtonLeft,
+ TestProtocolDatabaseMouseButtonMiddle,
+ TestProtocolDatabaseMouseButtonRight,
+};
</ins><span class="cx">
</span><ins>+typedef NS_ENUM(NSInteger, TestProtocolDatabaseOptionalParameterBundleDirectionality) {
+ TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR,
+ TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL,
+};
</ins><span class="cx">
</span><ins>+typedef NS_ENUM(NSInteger, TestProtocolDatabaseParameterBundleDirectionality) {
+ TestProtocolDatabaseParameterBundleDirectionalityLTR,
+ TestProtocolDatabaseParameterBundleDirectionalityRTL,
+};
+
+typedef NS_ENUM(NSInteger, TestProtocolTestParameterBundleDirectionality) {
+ TestProtocolTestParameterBundleDirectionalityLTR,
+ TestProtocolTestParameterBundleDirectionalityRTL,
+};
+
+
</ins><span class="cx"> __attribute__((visibility ("default")))
</span><span class="cx"> @interface TestProtocolDatabaseError : RWIProtocolJSONObject
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
</span><span class="lines">@@ -1145,6 +1349,8 @@
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
</span><span class="cx"> - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
</span><span class="cx"> /* optional */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
</span><ins>+/* optional */ @property (nonatomic, copy) NSArray/*<NSString>*/ *buttons;
+/* optional */ @property (nonatomic, assign) TestProtocolDatabaseOptionalParameterBundleDirectionality directionality;
</ins><span class="cx"> /* optional */ @property (nonatomic, copy) NSString *notes;
</span><span class="cx"> /* optional */ @property (nonatomic, assign) double timestamp;
</span><span class="cx"> /* optional */ @property (nonatomic, retain) RWIProtocolJSONObject *values;
</span><span class="lines">@@ -1157,8 +1363,10 @@
</span><span class="cx"> @interface TestProtocolDatabaseParameterBundle : RWIProtocolJSONObject
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
</span><span class="cx"> - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList;
</del><ins>+- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames buttons:(NSArray/*<NSString>*/ *)buttons directionality:(TestProtocolDatabaseParameterBundleDirectionality)directionality notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList;
</ins><span class="cx"> /* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
</span><ins>+/* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *buttons;
+/* required */ @property (nonatomic, assign) TestProtocolDatabaseParameterBundleDirectionality directionality;
</ins><span class="cx"> /* required */ @property (nonatomic, copy) NSString *notes;
</span><span class="cx"> /* required */ @property (nonatomic, assign) double timestamp;
</span><span class="cx"> /* required */ @property (nonatomic, retain) RWIProtocolJSONObject *values;
</span><span class="lines">@@ -1189,7 +1397,9 @@
</span><span class="cx"> @interface TestProtocolTestParameterBundle : RWIProtocolJSONObject
</span><span class="cx"> - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
</span><span class="cx"> - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
</del><ins>+- (instancetype)initWithDirectionality:(TestProtocolTestParameterBundleDirectionality)directionality buttons:(NSArray/*<NSString>*/ *)buttons columnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
+/* required */ @property (nonatomic, assign) TestProtocolTestParameterBundleDirectionality directionality;
+/* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *buttons;
</ins><span class="cx"> /* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
</span><span class="cx"> /* required */ @property (nonatomic, copy) NSString *notes;
</span><span class="cx"> /* required */ @property (nonatomic, assign) double timestamp;
</span><span class="lines">@@ -1314,9 +1524,95 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx">
</span><ins>+inline String toProtocolString(TestProtocolDatabaseMouseButton value)
+{
+ switch(value) {
+ case TestProtocolDatabaseMouseButtonNone:
+ return ASCIILiteral("None");
+ case TestProtocolDatabaseMouseButtonLeft:
+ return ASCIILiteral("Left");
+ case TestProtocolDatabaseMouseButtonMiddle:
+ return ASCIILiteral("Middle");
+ case TestProtocolDatabaseMouseButtonRight:
+ return ASCIILiteral("Right");
+ }
+}
</ins><span class="cx">
</span><ins>+template<>
+inline std::optional<TestProtocolDatabaseMouseButton> fromProtocolString(const String& value)
+{
+ if (value == "None")
+ return TestProtocolDatabaseMouseButtonNone;
+ if (value == "Left")
+ return TestProtocolDatabaseMouseButtonLeft;
+ if (value == "Middle")
+ return TestProtocolDatabaseMouseButtonMiddle;
+ if (value == "Right")
+ return TestProtocolDatabaseMouseButtonRight;
+ return std::nullopt;
+}
</ins><span class="cx">
</span><ins>+inline String toProtocolString(TestProtocolDatabaseOptionalParameterBundleDirectionality value)
+{
+ switch(value) {
+ case TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR:
+ return ASCIILiteral("LTR");
+ case TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL:
+ return ASCIILiteral("RTL");
+ }
+}
</ins><span class="cx">
</span><ins>+template<>
+inline std::optional<TestProtocolDatabaseOptionalParameterBundleDirectionality> fromProtocolString(const String& value)
+{
+ if (value == "LTR")
+ return TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR;
+ if (value == "RTL")
+ return TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL;
+ return std::nullopt;
+}
+
+inline String toProtocolString(TestProtocolDatabaseParameterBundleDirectionality value)
+{
+ switch(value) {
+ case TestProtocolDatabaseParameterBundleDirectionalityLTR:
+ return ASCIILiteral("LTR");
+ case TestProtocolDatabaseParameterBundleDirectionalityRTL:
+ return ASCIILiteral("RTL");
+ }
+}
+
+template<>
+inline std::optional<TestProtocolDatabaseParameterBundleDirectionality> fromProtocolString(const String& value)
+{
+ if (value == "LTR")
+ return TestProtocolDatabaseParameterBundleDirectionalityLTR;
+ if (value == "RTL")
+ return TestProtocolDatabaseParameterBundleDirectionalityRTL;
+ return std::nullopt;
+}
+
+
+inline String toProtocolString(TestProtocolTestParameterBundleDirectionality value)
+{
+ switch(value) {
+ case TestProtocolTestParameterBundleDirectionalityLTR:
+ return ASCIILiteral("LTR");
+ case TestProtocolTestParameterBundleDirectionalityRTL:
+ return ASCIILiteral("RTL");
+ }
+}
+
+template<>
+inline std::optional<TestProtocolTestParameterBundleDirectionality> fromProtocolString(const String& value)
+{
+ if (value == "LTR")
+ return TestProtocolTestParameterBundleDirectionalityLTR;
+ if (value == "RTL")
+ return TestProtocolTestParameterBundleDirectionalityRTL;
+ return std::nullopt;
+}
+
</ins><span class="cx"> } // namespace Inspector
</span><span class="cx">
</span><span class="cx"> ### End File: TestProtocolTypeConversions.h
</span><span class="lines">@@ -1364,6 +1660,7 @@
</span><span class="cx">
</span><span class="cx"> + (void)_parseError:(TestProtocolDatabaseError **)outValue fromPayload:(id)payload;
</span><span class="cx"> + (void)_parseErrorList:(NSArray/*<TestProtocolDatabaseError>*/ **)outValue fromPayload:(id)payload;
</span><ins>++ (void)_parseMouseButton:(NSNumber **)outValue fromPayload:(id)payload;
</ins><span class="cx"> + (void)_parseOptionalParameterBundle:(TestProtocolDatabaseOptionalParameterBundle **)outValue fromPayload:(id)payload;
</span><span class="cx"> + (void)_parseParameterBundle:(TestProtocolDatabaseParameterBundle **)outValue fromPayload:(id)payload;
</span><span class="cx"> + (void)_parseObjectWithPropertyNameConflicts:(TestProtocolDatabaseObjectWithPropertyNameConflicts **)outValue fromPayload:(id)payload;
</span><span class="lines">@@ -1390,6 +1687,14 @@
</span><span class="cx"> *outValue = (NSArray/*<TestProtocolDatabaseError>*/ *)payload;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>++ (void)_parseMouseButton:(NSNumber **)outValue fromPayload:(id)payload
+{
+ THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
+ std::optional<TestProtocolDatabaseMouseButton> result = Inspector::fromProtocolString<TestProtocolDatabaseMouseButton>(payload);
+ THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @"MouseButton");
+ *outValue = @(result.value());
+}
+
</ins><span class="cx"> + (void)_parseOptionalParameterBundle:(TestProtocolDatabaseOptionalParameterBundle **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx"> THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSDictionary class]);
</span><span class="lines">@@ -1534,8 +1839,14 @@
</span><span class="cx"> if (!(self = [super init]))
</span><span class="cx"> return nil;
</span><span class="cx">
</span><del>- self.columnNames = objcArrayFromPayload<NSString>(payload[@"columnNames"]);
</del><ins>+ self.columnNames = payload[@"columnNames"];
</ins><span class="cx">
</span><ins>+ self.buttons = payload[@"buttons"];
+
+ std::optional<TestProtocolDatabaseOptionalParameterBundleDirectionality> directionality = fromProtocolString<TestProtocolDatabaseOptionalParameterBundleDirectionality>(payload[@"directionality"]);
+ if (directionality)
+ self.directionality = directionality.value();
+
</ins><span class="cx"> self.notes = payload[@"notes"];
</span><span class="cx">
</span><span class="cx"> self.timestamp = [payload[@"timestamp"] doubleValue];
</span><span class="lines">@@ -1568,6 +1879,26 @@
</span><span class="cx"> return objcStringArray([super inspectorArrayForKey:@"columnNames"]);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)setButtons:(NSArray/*<NSString>*/ *)buttons
+{
+ [super setInspectorArray:inspectorStringArray(buttons) forKey:@"buttons"];
+}
+
+- (NSArray/*<NSString>*/ *)buttons
+{
+ return objcStringArray([super inspectorArrayForKey:@"buttons"]);
+}
+
+- (void)setDirectionality:(TestProtocolDatabaseOptionalParameterBundleDirectionality)directionality
+{
+ [super setString:toProtocolString(directionality) forKey:@"directionality"];
+}
+
+- (TestProtocolDatabaseOptionalParameterBundleDirectionality)directionality
+{
+ return fromProtocolString<TestProtocolDatabaseOptionalParameterBundleDirectionality>([super stringForKey:@"directionality"]).value();
+}
+
</ins><span class="cx"> - (void)setNotes:(NSString *)notes
</span><span class="cx"> {
</span><span class="cx"> [super setString:notes forKey:@"notes"];
</span><span class="lines">@@ -1639,8 +1970,16 @@
</span><span class="cx"> return nil;
</span><span class="cx">
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"columnNames"], @"columnNames");
</span><del>- self.columnNames = objcArrayFromPayload<NSString>(payload[@"columnNames"]);
</del><ins>+ self.columnNames = payload[@"columnNames"];
</ins><span class="cx">
</span><ins>+ THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"buttons"], @"buttons");
+ self.buttons = payload[@"buttons"];
+
+ THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"directionality"], @"directionality");
+ std::optional<TestProtocolDatabaseParameterBundleDirectionality> directionality = fromProtocolString<TestProtocolDatabaseParameterBundleDirectionality>(payload[@"directionality"]);
+ THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(directionality, @"directionality");
+ self.directionality = directionality.value();
+
</ins><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"notes"], @"notes");
</span><span class="cx"> self.notes = payload[@"notes"];
</span><span class="cx">
</span><span class="lines">@@ -1669,12 +2008,13 @@
</span><span class="cx"> return self;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList
</del><ins>+- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames buttons:(NSArray/*<NSString>*/ *)buttons directionality:(TestProtocolDatabaseParameterBundleDirectionality)directionality notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList
</ins><span class="cx"> {
</span><span class="cx"> if (!(self = [super init]))
</span><span class="cx"> return nil;
</span><span class="cx">
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @"columnNames");
</span><ins>+ THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(buttons, @"buttons");
</ins><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @"notes");
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @"values");
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @"payload");
</span><span class="lines">@@ -1683,6 +2023,8 @@
</span><span class="cx"> THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(errorList, [TestProtocolDatabaseError class]);
</span><span class="cx">
</span><span class="cx"> self.columnNames = columnNames;
</span><ins>+ self.buttons = buttons;
+ self.directionality = directionality;
</ins><span class="cx"> self.notes = notes;
</span><span class="cx"> self.timestamp = timestamp;
</span><span class="cx"> self.values = values;
</span><span class="lines">@@ -1703,6 +2045,26 @@
</span><span class="cx"> return objcStringArray([super inspectorArrayForKey:@"columnNames"]);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)setButtons:(NSArray/*<NSString>*/ *)buttons
+{
+ [super setInspectorArray:inspectorStringArray(buttons) forKey:@"buttons"];
+}
+
+- (NSArray/*<NSString>*/ *)buttons
+{
+ return objcStringArray([super inspectorArrayForKey:@"buttons"]);
+}
+
+- (void)setDirectionality:(TestProtocolDatabaseParameterBundleDirectionality)directionality
+{
+ [super setString:toProtocolString(directionality) forKey:@"directionality"];
+}
+
+- (TestProtocolDatabaseParameterBundleDirectionality)directionality
+{
+ return fromProtocolString<TestProtocolDatabaseParameterBundleDirectionality>([super stringForKey:@"directionality"]).value();
+}
+
</ins><span class="cx"> - (void)setNotes:(NSString *)notes
</span><span class="cx"> {
</span><span class="cx"> [super setString:notes forKey:@"notes"];
</span><span class="lines">@@ -1897,8 +2259,16 @@
</span><span class="cx"> if (!(self = [super init]))
</span><span class="cx"> return nil;
</span><span class="cx">
</span><ins>+ THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"directionality"], @"directionality");
+ std::optional<TestProtocolTestParameterBundleDirectionality> directionality = fromProtocolString<TestProtocolTestParameterBundleDirectionality>(payload[@"directionality"]);
+ THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(directionality, @"directionality");
+ self.directionality = directionality.value();
+
+ THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"buttons"], @"buttons");
+ self.buttons = payload[@"buttons"];
+
</ins><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"columnNames"], @"columnNames");
</span><del>- self.columnNames = objcArrayFromPayload<NSString>(payload[@"columnNames"]);
</del><ins>+ self.columnNames = payload[@"columnNames"];
</ins><span class="cx">
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"notes"], @"notes");
</span><span class="cx"> self.notes = payload[@"notes"];
</span><span class="lines">@@ -1925,11 +2295,12 @@
</span><span class="cx"> return self;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error
</del><ins>+- (instancetype)initWithDirectionality:(TestProtocolTestParameterBundleDirectionality)directionality buttons:(NSArray/*<NSString>*/ *)buttons columnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error
</ins><span class="cx"> {
</span><span class="cx"> if (!(self = [super init]))
</span><span class="cx"> return nil;
</span><span class="cx">
</span><ins>+ THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(buttons, @"buttons");
</ins><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @"columnNames");
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @"notes");
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @"values");
</span><span class="lines">@@ -1936,6 +2307,8 @@
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @"payload");
</span><span class="cx"> THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(error, @"error");
</span><span class="cx">
</span><ins>+ self.directionality = directionality;
+ self.buttons = buttons;
</ins><span class="cx"> self.columnNames = columnNames;
</span><span class="cx"> self.notes = notes;
</span><span class="cx"> self.timestamp = timestamp;
</span><span class="lines">@@ -1946,6 +2319,26 @@
</span><span class="cx"> return self;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)setDirectionality:(TestProtocolTestParameterBundleDirectionality)directionality
+{
+ [super setString:toProtocolString(directionality) forKey:@"directionality"];
+}
+
+- (TestProtocolTestParameterBundleDirectionality)directionality
+{
+ return fromProtocolString<TestProtocolTestParameterBundleDirectionality>([super stringForKey:@"directionality"]).value();
+}
+
+- (void)setButtons:(NSArray/*<NSString>*/ *)buttons
+{
+ [super setInspectorArray:inspectorStringArray(buttons) forKey:@"buttons"];
+}
+
+- (NSArray/*<NSString>*/ *)buttons
+{
+ return objcStringArray([super inspectorArrayForKey:@"buttons"]);
+}
+
</ins><span class="cx"> - (void)setColumnNames:(NSArray/*<NSString>*/ *)columnNames
</span><span class="cx"> {
</span><span class="cx"> [super setInspectorArray:inspectorStringArray(columnNames) forKey:@"columnNames"];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenerictypedeclarationobjecttypejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json (213959 => 213960)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json        2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/type-declaration-object-type.json        2017-03-14 23:44:01 UTC (rev 213960)
</span><span class="lines">@@ -18,10 +18,23 @@
</span><span class="cx"> "items": { "$ref": "Error" }
</span><span class="cx"> },
</span><span class="cx"> {
</span><ins>+ "id": "MouseButton",
+ "type": "string",
+ "description": "Enumerates different mouse buttons that can be used.",
+ "enum": [
+ "None",
+ "Left",
+ "Middle",
+ "Right"
+ ]
+ },
+ {
</ins><span class="cx"> "id": "OptionalParameterBundle",
</span><span class="cx"> "type": "object",
</span><span class="cx"> "properties": [
</span><span class="cx"> { "name": "columnNames", "type": "array", "optional": true, "items": { "type": "string" } },
</span><ins>+ { "name": "buttons", "type": "array", "optional": true, "items": { "$ref": "MouseButton" } },
+ { "name": "directionality", "type": "string", "enum": ["LTR", "RTL"], "optional": true },
</ins><span class="cx"> { "name": "notes", "type": "string", "optional": true },
</span><span class="cx"> { "name": "timestamp", "type": "number", "optional": true },
</span><span class="cx"> { "name": "values", "type": "object", "optional": true },
</span><span class="lines">@@ -35,6 +48,8 @@
</span><span class="cx"> "type": "object",
</span><span class="cx"> "properties": [
</span><span class="cx"> { "name": "columnNames", "type": "array", "items": { "type": "string" } },
</span><ins>+ { "name": "buttons", "type": "array", "items": { "$ref": "MouseButton" } },
+ { "name": "directionality", "type": "string", "enum": ["LTR", "RTL"] },
</ins><span class="cx"> { "name": "notes", "type": "string" },
</span><span class="cx"> { "name": "timestamp", "type": "number" },
</span><span class="cx"> { "name": "values", "type": "object" },
</span><span class="lines">@@ -70,6 +85,8 @@
</span><span class="cx"> "id": "ParameterBundle",
</span><span class="cx"> "type": "object",
</span><span class="cx"> "properties": [
</span><ins>+ { "name": "directionality", "type": "string", "enum": ["LTR", "RTL"] },
+ { "name": "buttons", "type": "array", "items": { "$ref": "Database.MouseButton" } },
</ins><span class="cx"> { "name": "columnNames", "type": "array", "items": { "type": "string" } },
</span><span class="cx"> { "name": "notes", "type": "string" },
</span><span class="cx"> { "name": "timestamp", "type": "number" },
</span></span></pre>
</div>
</div>
</body>
</html>