[Bindings] Declare dictionary / enumeration template specializations in the header
https://bugs.webkit.org/show_bug.cgi?id=162929

Reviewed by Darin Adler.

Declare dictionary / enumeration template specializations in the header
so that:
- They can be used from custom bindings code.
- Dictionaries / enumerations can be used to their own IDL files to
  share them (Bug 162912).

No new tests, rebaselined bindings tests.

* WebCore.xcodeproj/project.pbxproj:
* bindings/generic/IDLTypes.h:
* bindings/js/JSDOMConvert.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateInterface):
(GenerateEnumerationImplementationContent):
(GenerateEnumerationHeaderContent):
(GenerateDictionaryHeaderContent):
(GenerateHeader):
(GenerateCallbackHeader):
(GenerateCallbackImplementation):
(GenerateDefaultValue): Deleted.
(GenerateDictionaryImplementationContent): Deleted.
(GenerateParametersCheck): Deleted.
* bindings/scripts/test/JS/JSTestObj.cpp:
* bindings/scripts/test/JS/JSTestObj.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@206812 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h
index 91d7ea9..0791139 100644
--- a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h
+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h
@@ -20,6 +20,7 @@
 
 #pragma once
 
+#include "JSDOMConvert.h"
 #include "JSDOMWrapper.h"
 #include "TestObj.h"
 #include <wtf/NeverDestroyed.h>
@@ -104,5 +105,119 @@
 template<> struct JSDOMWrapperConverterTraits<TestObj> {
     using WrapperClass = JSTestObj;
 };
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumType);
+
+template<> struct JSValueTraits<TestObj::EnumType> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumType value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumType> parse<TestObj::EnumType>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumType convert<TestObj::EnumType>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumType>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Optional);
+
+template<> struct JSValueTraits<TestObj::Optional> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Optional value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Optional> parse<TestObj::Optional>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Optional convert<TestObj::Optional>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Optional>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, AlternateEnumName);
+
+template<> struct JSValueTraits<AlternateEnumName> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, AlternateEnumName value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<AlternateEnumName> parse<AlternateEnumName>(JSC::ExecState&, JSC::JSValue);
+template<> AlternateEnumName convert<AlternateEnumName>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<AlternateEnumName>();
+
+#if ENABLE(Condition1)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumA);
+
+template<> struct JSValueTraits<TestObj::EnumA> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumA value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumA> parse<TestObj::EnumA>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumA convert<TestObj::EnumA>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumA>();
+
+#endif
+
+#if ENABLE(Condition1) && ENABLE(Condition2)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumB);
+
+template<> struct JSValueTraits<TestObj::EnumB> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumB value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumB> parse<TestObj::EnumB>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumB convert<TestObj::EnumB>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumB>();
+
+#endif
+
+#if ENABLE(Condition1) || ENABLE(Condition2)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumC);
+
+template<> struct JSValueTraits<TestObj::EnumC> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumC value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumC> parse<TestObj::EnumC>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumC convert<TestObj::EnumC>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumC>();
+
+#endif
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Kind);
+
+template<> struct JSValueTraits<TestObj::Kind> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Kind value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Kind> parse<TestObj::Kind>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Kind convert<TestObj::Kind>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Kind>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Size);
+
+template<> struct JSValueTraits<TestObj::Size> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Size value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Size> parse<TestObj::Size>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Size convert<TestObj::Size>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Size>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Confidence);
+
+template<> struct JSValueTraits<TestObj::Confidence> {
+    static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Confidence value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Confidence> parse<TestObj::Confidence>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Confidence convert<TestObj::Confidence>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Confidence>();
+
+template<> Optional<TestObj::Dictionary> convertDictionary<TestObj::Dictionary>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::DictionaryThatShouldNotTolerateNull> convertDictionary<TestObj::DictionaryThatShouldNotTolerateNull>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::DictionaryThatShouldTolerateNull> convertDictionary<TestObj::DictionaryThatShouldTolerateNull>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<AlternateDictionaryName> convertDictionary<AlternateDictionaryName>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::ParentDictionary> convertDictionary<TestObj::ParentDictionary>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::ChildDictionary> convertDictionary<TestObj::ChildDictionary>(JSC::ExecState&, JSC::JSValue);
+
 
 } // namespace WebCore