Title: [213960] trunk/Source/_javascript_Core
Revision
213960
Author
[email protected]
Date
2017-03-14 16:44:01 -0700 (Tue, 14 Mar 2017)

Log Message

[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.

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (213959 => 213960)


--- trunk/Source/_javascript_Core/ChangeLog	2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-03-14 23:44:01 UTC (rev 213960)
@@ -1,3 +1,28 @@
+2017-03-14  Brian Burg  <[email protected]>
+
+        [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.
+
 2017-03-14  Filip Pizlo  <[email protected]>
 
         Record the HashSet/HashMap operations in DFG/FTL/B3 and replay them in a benchmark

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/models.py (213959 => 213960)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/models.py	2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/models.py	2017-03-14 23:44:01 UTC (rev 213960)
@@ -258,7 +258,7 @@
         self.is_anonymous = is_anonymous
 
     def __repr__(self):
-        return 'EnumType[value_type=%s; values=%s]' % (self.qualified_name(), ', '.join(map(str, self.enum_values())))
+        return 'EnumType[primitive_type=%s; enum_values=%s]' % (self.qualified_name(), ', '.join(map(str, self.enum_values())))
 
     def is_enum(self):
         return True

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


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/objc_generator.py	2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/objc_generator.py	2017-03-14 23:44:01 UTC (rev 213960)
@@ -486,9 +486,17 @@
             objc_class = self.objc_class_for_type(member.type)
             return '[[%s alloc] initWithPayload:payload[@"%s"]]' % (objc_class, member.member_name)
         if isinstance(_type, ArrayType):
-            objc_class = self.objc_class_for_type(member.type.element_type)
-            return 'objcArrayFromPayload<%s>(payload[@"%s"])' % (objc_class, member.member_name)
+            element_type = member.type.element_type
+            if isinstance(element_type, EnumType):
+                element_type = element_type.primitive_type
 
+            # 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)
+
     # JSON object setter/getter selectors for types.
 
     @staticmethod

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


--- trunk/Source/_javascript_Core/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result	2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result	2017-03-14 23:44:01 UTC (rev 213960)
@@ -1061,7 +1061,7 @@
 
     self.string = payload[@"string"];
 
-    self.array = objcArrayFromPayload<NSString>(payload[@"array"]);
+    self.array = payload[@"array"];
 
     return self;
 }

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


--- trunk/Source/_javascript_Core/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result	2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result	2017-03-14 23:44:01 UTC (rev 213960)
@@ -28,6 +28,11 @@
 
 // DO NOT EDIT THIS FILE. It is automatically generated from type-declaration-object-type.json
 // by the script: Source/_javascript_Core/inspector/scripts/generate-inspector-protocol-bindings.py
+
+// 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"});
 ### End File: InspectorBackendCommands.js
 
 ### Begin File: TestAlternateBackendDispatchers.h
@@ -320,6 +325,7 @@
 class ParameterBundle;
 class ObjectWithPropertyNameConflicts;
 class DummyObject;
+enum class MouseButton;
 } // Database
 
 namespace Test {
@@ -334,6 +340,17 @@
 } // Database
 // End of typedefs.
 
+namespace TestHelpers {
+
+String getEnumConstantValue(int code);
+
+template<typename T> String getEnumConstantValue(T enumValue)
+{
+    return getEnumConstantValue(static_cast<int>(enumValue));
+}
+
+} // namespace TestHelpers
+
 namespace Database {
 /* Database error. */
 class Error : public Inspector::InspectorObjectBase {
@@ -400,8 +417,20 @@
     }
 };
 
+/* Enumerates different mouse buttons that can be used. */
+enum class MouseButton {
+    None = 0,
+    Left = 1,
+    Middle = 2,
+    Right = 3,
+}; // enum class MouseButton
 class OptionalParameterBundle : public Inspector::InspectorObjectBase {
 public:
+    // Named after property name 'directionality' while generating OptionalParameterBundle.
+    enum class Directionality {
+        LTR = 4,
+        RTL = 5,
+    }; // enum class Directionality
     enum {
         NoFieldsSet = 0,
         AllFieldsSet = 0
@@ -450,6 +479,16 @@
         InspectorObjectBase::setArray(ASCIILiteral("columnNames"), WTFMove(value));
     }
 
+    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));
+    }
+
     void setNotes(const String& value)
     {
         InspectorObjectBase::setString(ASCIILiteral("notes"), value);
@@ -483,16 +522,23 @@
 
 class ParameterBundle : public Inspector::InspectorObjectBase {
 public:
+    // Named after property name 'directionality' while generating ParameterBundle.
+    enum class Directionality {
+        LTR = 4,
+        RTL = 5,
+    }; // enum class Directionality
     enum {
         NoFieldsSet = 0,
         ColumnNamesSet = 1 << 0,
-        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)
+        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)
     };
 
     template<int STATE>
@@ -520,6 +566,20 @@
             return castState<ColumnNamesSet>();
         }
 
+        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>();
+        }
+
         Builder<STATE | NotesSet>& setNotes(const String& value)
         {
             COMPILE_ASSERT(!(STATE & NotesSet), property_notes_already_set);
@@ -576,6 +636,8 @@
      * Synthetic constructor:
      * Ref<ParameterBundle> result = ParameterBundle::create()
      *     .setColumnNames(...)
+     *     .setButtons(...)
+     *     .setDirectionality(...)
      *     .setNotes(...)
      *     .setTimestamp(...)
      *     .setValues(...)
@@ -687,15 +749,22 @@
 namespace Test {
 class ParameterBundle : public Inspector::InspectorObjectBase {
 public:
+    // Named after property name 'directionality' while generating ParameterBundle.
+    enum class Directionality {
+        LTR = 4,
+        RTL = 5,
+    }; // enum class Directionality
     enum {
         NoFieldsSet = 0,
-        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)
+        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)
     };
 
     template<int STATE>
@@ -716,6 +785,20 @@
         friend class ParameterBundle;
     public:
 
+        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>();
+        }
+
         Builder<STATE | ColumnNamesSet>& setColumnNames(RefPtr<Inspector::Protocol::Array<String>> value)
         {
             COMPILE_ASSERT(!(STATE & ColumnNamesSet), property_columnNames_already_set);
@@ -771,6 +854,8 @@
     /*
      * Synthetic constructor:
      * Ref<ParameterBundle> result = ParameterBundle::create()
+     *     .setDirectionality(...)
+     *     .setButtons(...)
      *     .setColumnNames(...)
      *     .setNotes(...)
      *     .setTimestamp(...)
@@ -789,6 +874,25 @@
 
 
 
+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
+
 } // namespace Protocol
 
 } // namespace Inspector
@@ -835,8 +939,87 @@
 
 namespace Protocol {
 
+namespace TestHelpers {
 
+static const char* const enum_constant_values[] = {
+    "None",
+    "Left",
+    "Middle",
+    "Right",
+    "LTR",
+    "RTL",
+};
 
+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
+
+
+
 } // namespace Protocol
 
 } // namespace Inspector
@@ -1129,8 +1312,29 @@
 };
 
 
+typedef NS_ENUM(NSInteger, TestProtocolDatabaseMouseButton) {
+    TestProtocolDatabaseMouseButtonNone,
+    TestProtocolDatabaseMouseButtonLeft,
+    TestProtocolDatabaseMouseButtonMiddle,
+    TestProtocolDatabaseMouseButtonRight,
+};
 
+typedef NS_ENUM(NSInteger, TestProtocolDatabaseOptionalParameterBundleDirectionality) {
+    TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR,
+    TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL,
+};
 
+typedef NS_ENUM(NSInteger, TestProtocolDatabaseParameterBundleDirectionality) {
+    TestProtocolDatabaseParameterBundleDirectionalityLTR,
+    TestProtocolDatabaseParameterBundleDirectionalityRTL,
+};
+
+typedef NS_ENUM(NSInteger, TestProtocolTestParameterBundleDirectionality) {
+    TestProtocolTestParameterBundleDirectionalityLTR,
+    TestProtocolTestParameterBundleDirectionalityRTL,
+};
+
+
 __attribute__((visibility ("default")))
 @interface TestProtocolDatabaseError : RWIProtocolJSONObject
 - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
@@ -1145,6 +1349,8 @@
 - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
 /* optional */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
+/* optional */ @property (nonatomic, copy) NSArray/*<NSString>*/ *buttons;
+/* optional */ @property (nonatomic, assign) TestProtocolDatabaseOptionalParameterBundleDirectionality directionality;
 /* optional */ @property (nonatomic, copy) NSString *notes;
 /* optional */ @property (nonatomic, assign) double timestamp;
 /* optional */ @property (nonatomic, retain) RWIProtocolJSONObject *values;
@@ -1157,8 +1363,10 @@
 @interface TestProtocolDatabaseParameterBundle : RWIProtocolJSONObject
 - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error errorList:(NSArray/*<TestProtocolDatabaseError>*/ *)errorList;
+- (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;
 /* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
+/* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *buttons;
+/* required */ @property (nonatomic, assign) TestProtocolDatabaseParameterBundleDirectionality directionality;
 /* required */ @property (nonatomic, copy) NSString *notes;
 /* required */ @property (nonatomic, assign) double timestamp;
 /* required */ @property (nonatomic, retain) RWIProtocolJSONObject *values;
@@ -1189,7 +1397,9 @@
 @interface TestProtocolTestParameterBundle : RWIProtocolJSONObject
 - (instancetype)initWithPayload:(NSDictionary<NSString *, id> *)payload;
 - (instancetype)initWithJSONObject:(RWIProtocolJSONObject *)jsonObject;
-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error;
+- (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;
 /* required */ @property (nonatomic, copy) NSArray/*<NSString>*/ *columnNames;
 /* required */ @property (nonatomic, copy) NSString *notes;
 /* required */ @property (nonatomic, assign) double timestamp;
@@ -1314,9 +1524,95 @@
 }
 
 
+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");
+    }
+}
 
+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;
+}
 
+inline String toProtocolString(TestProtocolDatabaseOptionalParameterBundleDirectionality value)
+{
+    switch(value) {
+    case TestProtocolDatabaseOptionalParameterBundleDirectionalityLTR:
+        return ASCIILiteral("LTR");
+    case TestProtocolDatabaseOptionalParameterBundleDirectionalityRTL:
+        return ASCIILiteral("RTL");
+    }
+}
 
+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;
+}
+
 } // namespace Inspector
 
 ### End File: TestProtocolTypeConversions.h
@@ -1364,6 +1660,7 @@
 
 + (void)_parseError:(TestProtocolDatabaseError **)outValue fromPayload:(id)payload;
 + (void)_parseErrorList:(NSArray/*<TestProtocolDatabaseError>*/ **)outValue fromPayload:(id)payload;
++ (void)_parseMouseButton:(NSNumber **)outValue fromPayload:(id)payload;
 + (void)_parseOptionalParameterBundle:(TestProtocolDatabaseOptionalParameterBundle **)outValue fromPayload:(id)payload;
 + (void)_parseParameterBundle:(TestProtocolDatabaseParameterBundle **)outValue fromPayload:(id)payload;
 + (void)_parseObjectWithPropertyNameConflicts:(TestProtocolDatabaseObjectWithPropertyNameConflicts **)outValue fromPayload:(id)payload;
@@ -1390,6 +1687,14 @@
     *outValue = (NSArray/*<TestProtocolDatabaseError>*/ *)payload;
 }
 
++ (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());
+}
+
 + (void)_parseOptionalParameterBundle:(TestProtocolDatabaseOptionalParameterBundle **)outValue fromPayload:(id)payload
 {
     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSDictionary class]);
@@ -1534,8 +1839,14 @@
     if (!(self = [super init]))
         return nil;
 
-    self.columnNames = objcArrayFromPayload<NSString>(payload[@"columnNames"]);
+    self.columnNames = payload[@"columnNames"];
 
+    self.buttons = payload[@"buttons"];
+
+    std::optional<TestProtocolDatabaseOptionalParameterBundleDirectionality> directionality = fromProtocolString<TestProtocolDatabaseOptionalParameterBundleDirectionality>(payload[@"directionality"]);
+    if (directionality)
+        self.directionality = directionality.value();
+
     self.notes = payload[@"notes"];
 
     self.timestamp = [payload[@"timestamp"] doubleValue];
@@ -1568,6 +1879,26 @@
     return objcStringArray([super inspectorArrayForKey:@"columnNames"]);
 }
 
+- (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();
+}
+
 - (void)setNotes:(NSString *)notes
 {
     [super setString:notes forKey:@"notes"];
@@ -1639,8 +1970,16 @@
         return nil;
 
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"columnNames"], @"columnNames");
-    self.columnNames = objcArrayFromPayload<NSString>(payload[@"columnNames"]);
+    self.columnNames = payload[@"columnNames"];
 
+    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();
+
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"notes"], @"notes");
     self.notes = payload[@"notes"];
 
@@ -1669,12 +2008,13 @@
     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
+- (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
 {
     if (!(self = [super init]))
         return nil;
 
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @"columnNames");
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(buttons, @"buttons");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @"notes");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @"values");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @"payload");
@@ -1683,6 +2023,8 @@
     THROW_EXCEPTION_FOR_BAD_TYPE_IN_ARRAY(errorList, [TestProtocolDatabaseError class]);
 
     self.columnNames = columnNames;
+    self.buttons = buttons;
+    self.directionality = directionality;
     self.notes = notes;
     self.timestamp = timestamp;
     self.values = values;
@@ -1703,6 +2045,26 @@
     return objcStringArray([super inspectorArrayForKey:@"columnNames"]);
 }
 
+- (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();
+}
+
 - (void)setNotes:(NSString *)notes
 {
     [super setString:notes forKey:@"notes"];
@@ -1897,8 +2259,16 @@
     if (!(self = [super init]))
         return nil;
 
+    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"];
+
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"columnNames"], @"columnNames");
-    self.columnNames = objcArrayFromPayload<NSString>(payload[@"columnNames"]);
+    self.columnNames = payload[@"columnNames"];
 
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@"notes"], @"notes");
     self.notes = payload[@"notes"];
@@ -1925,11 +2295,12 @@
     return self;
 }
 
-- (instancetype)initWithColumnNames:(NSArray/*<NSString>*/ *)columnNames notes:(NSString *)notes timestamp:(double)timestamp values:(RWIProtocolJSONObject *)values payload:(RWIProtocolJSONObject *)payload error:(TestProtocolDatabaseError *)error
+- (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
 {
     if (!(self = [super init]))
         return nil;
 
+    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(buttons, @"buttons");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(columnNames, @"columnNames");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(notes, @"notes");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(values, @"values");
@@ -1936,6 +2307,8 @@
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload, @"payload");
     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(error, @"error");
 
+    self.directionality = directionality;
+    self.buttons = buttons;
     self.columnNames = columnNames;
     self.notes = notes;
     self.timestamp = timestamp;
@@ -1946,6 +2319,26 @@
     return self;
 }
 
+- (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"]);
+}
+
 - (void)setColumnNames:(NSArray/*<NSString>*/ *)columnNames
 {
     [super setInspectorArray:inspectorStringArray(columnNames) forKey:@"columnNames"];

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/generic/type-declaration-object-type.json (213959 => 213960)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/generic/type-declaration-object-type.json	2017-03-14 23:41:53 UTC (rev 213959)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/generic/type-declaration-object-type.json	2017-03-14 23:44:01 UTC (rev 213960)
@@ -18,10 +18,23 @@
             "items": { "$ref": "Error" }
         },
         {
+            "id": "MouseButton",
+            "type": "string",
+            "description": "Enumerates different mouse buttons that can be used.",
+            "enum": [
+                "None",
+                "Left",
+                "Middle",
+                "Right"
+            ]
+        },
+        {
             "id": "OptionalParameterBundle",
             "type": "object",
             "properties": [
                 { "name": "columnNames", "type": "array", "optional": true, "items": { "type": "string" } },
+                { "name": "buttons", "type": "array", "optional": true, "items": { "$ref": "MouseButton" } },
+                { "name": "directionality", "type": "string", "enum": ["LTR", "RTL"], "optional": true },
                 { "name": "notes", "type": "string", "optional": true },
                 { "name": "timestamp", "type": "number", "optional": true },
                 { "name": "values", "type": "object", "optional": true },
@@ -35,6 +48,8 @@
             "type": "object",
             "properties": [
                 { "name": "columnNames", "type": "array", "items": { "type": "string" } },
+                { "name": "buttons", "type": "array", "items": { "$ref": "MouseButton" } },
+                { "name": "directionality", "type": "string", "enum": ["LTR", "RTL"] },
                 { "name": "notes", "type": "string" },
                 { "name": "timestamp", "type": "number" },
                 { "name": "values", "type": "object" },
@@ -70,6 +85,8 @@
             "id": "ParameterBundle",
             "type": "object",
             "properties": [
+                { "name": "directionality", "type": "string", "enum": ["LTR", "RTL"] },
+                { "name": "buttons", "type": "array", "items": { "$ref": "Database.MouseButton" } },
                 { "name": "columnNames", "type": "array", "items": { "type": "string" } },
                 { "name": "notes", "type": "string" },
                 { "name": "timestamp", "type": "number" },
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to