Skip to content

Commit

Permalink
Group forward declarations by namespace in GeneratedSerializers.h
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=265046

Reviewed by Alex Christensen.

* Source/WebKit/Scripts/generate-serializers.py:
(Template.forward_declaration):
(generate_header):
* Source/WebKit/Scripts/webkit/tests/GeneratedSerializers.h:

Canonical link: https://commits.webkit.org/270908@main
  • Loading branch information
cdumez committed Nov 17, 2023
1 parent dd7600e commit 54f2b1c
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 65 deletions.
85 changes: 56 additions & 29 deletions Source/WebKit/Scripts/generate-serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ def __init__(self, template_type, namespace, name, enum_storage=None):

def forward_declaration(self):
if self.enum_storage:
return 'namespace ' + self.namespace + ' { ' + self.type + ' ' + self.name + ' : ' + self.enum_storage + '; }'
return 'namespace ' + self.namespace + ' { ' + self.type + ' ' + self.name + '; }'
return self.type + ' ' + self.name + ' : ' + self.enum_storage + ';'
return self.type + ' ' + self.name + ';'

def specialization(self):
return self.namespace + '::' + self.name
Expand Down Expand Up @@ -408,51 +408,78 @@ def alias_struct_or_class(alias):
return match.groups()[0]


def generate_header(serialized_types, serialized_enums, additional_forward_declarations):
def generate_forward_declarations(serialized_types, serialized_enums, additional_forward_declarations):
result = []
result.append(_license_header)
result.append('#pragma once')
result.append('')
for header in ['<wtf/ArgumentCoder.h>', '<wtf/OptionSet.h>', '<wtf/Ref.h>', '<wtf/RetainPtr.h>']:
result.append('#include ' + header)

result.append('')
serialized_enums_by_namespace = dict()
serialized_types_by_namespace = dict()
template_types_by_namespace = dict()
for enum in serialized_enums:
if enum.is_nested():
continue
if enum.condition is not None:
result.append('#if ' + enum.condition)
if enum.namespace is None:
result.append('enum class ' + enum.name + ' : ' + enum.underlying_type + ';')
if enum.namespace in serialized_enums_by_namespace:
serialized_enums_by_namespace[enum.namespace] += [enum, ]
else:
result.append('namespace ' + enum.namespace + ' { enum class ' + enum.name + ' : ' + enum.underlying_type + '; }')
if enum.condition is not None:
result.append('#endif')
serialized_enums_by_namespace[enum.namespace] = [enum, ]
for type in serialized_types:
if type.condition is not None:
result.append('#if ' + type.condition)

if not type.should_skip_forward_declare():
for template in type.templates:
if template.namespace in template_types_by_namespace:
template_types_by_namespace[template.namespace] += [template, ]
else:
template_types_by_namespace[template.namespace] = [template, ]
if type.should_skip_forward_declare():
continue
if type.alias is None and type.cf_type is not None:
continue
if type.namespace in serialized_types_by_namespace:
serialized_types_by_namespace[type.namespace] += [type, ]
else:
serialized_types_by_namespace[type.namespace] = [type, ]
all_namespaces = set(serialized_enums_by_namespace.keys())
all_namespaces = all_namespaces.union(set(serialized_types_by_namespace.keys()))
all_namespaces = all_namespaces.union(set(template_types_by_namespace.keys()))
for namespace in sorted(all_namespaces, key=lambda x: (x is None, x)):
if namespace is not None:
result.append('namespace ' + namespace + ' {')
for enum in serialized_enums_by_namespace.get(namespace, []):
if enum.condition is not None:
result.append('#if ' + enum.condition)
result.append('enum class ' + enum.name + ' : ' + enum.underlying_type + ';')
if enum.condition is not None:
result.append('#endif')
for type in serialized_types_by_namespace.get(namespace, []):
if type.condition is not None:
result.append('#if ' + type.condition)
if type.alias is not None:
result.append('namespace ' + type.namespace + ' {')
result.append('template<' + typenames(type.alias) + '> ' + alias_struct_or_class(type.alias) + ' ' + remove_template_parameters(type.alias) + ';')
result.append('using ' + type.name + ' = ' + remove_alias_struct_or_class(type.alias) + ';')
result.append('}')
elif type.cf_type is None:
if type.namespace is None:
result.append(type.struct_or_class + ' ' + type.name + ';')
else:
result.append('namespace ' + type.namespace + ' { ' + type.struct_or_class + ' ' + type.name + '; }')
for template in type.templates:
result.append(type.struct_or_class + ' ' + type.name + ';')
if type.condition is not None:
result.append('#endif')
for template in template_types_by_namespace.get(namespace, []):
result.append(template.forward_declaration())
if type.condition is not None:
result.append('#endif')
if namespace is not None:
result.append('}')
result.append('')
for declaration in additional_forward_declarations:
if declaration.condition is not None:
result.append('#if ' + declaration.condition)
result.append(declaration.declaration + ';')
if declaration.condition is not None:
result.append('#endif')
return result


def generate_header(serialized_types, serialized_enums, additional_forward_declarations):
result = []
result.append(_license_header)
result.append('#pragma once')
result.append('')
for header in ['<wtf/ArgumentCoder.h>', '<wtf/OptionSet.h>', '<wtf/Ref.h>', '<wtf/RetainPtr.h>']:
result.append('#include ' + header)

result += generate_forward_declarations(serialized_types, serialized_enums, additional_forward_declarations)
result.append('')
result.append('namespace IPC {')
result.append('')
Expand Down
93 changes: 57 additions & 36 deletions Source/WebKit/Scripts/webkit/tests/GeneratedSerializers.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,55 +29,76 @@
#include <wtf/Ref.h>
#include <wtf/RetainPtr.h>

namespace EnumNamespace {
#if ENABLE(BOOL_ENUM)
namespace EnumNamespace { enum class BoolEnumType : bool; }
enum class BoolEnumType : bool;
#endif
enum class EnumWithoutNamespace : uint8_t;
#if ENABLE(UINT16_ENUM)
namespace EnumNamespace { enum class EnumType : uint16_t; }
enum class EnumType : uint16_t;
#endif
enum class OptionSetEnumFirstCondition : uint32_t;
enum class OptionSetEnumLastCondition : uint32_t;
enum class OptionSetEnumAllCondition : uint32_t;
}

namespace JSC {
enum class Incredible;
}

namespace Namespace {
class ReturnRefClass;
struct EmptyConstructorStruct;
class EmptyConstructorWithIf;
#if ENABLE(TEST_FEATURE)
namespace Namespace::Subnamespace { struct StructName; }
class ConditionalCommonClass;
#endif
namespace Namespace { class ReturnRefClass; }
namespace Namespace { struct EmptyConstructorStruct; }
namespace Namespace { class EmptyConstructorWithIf; }
class WithoutNamespace;
class WithoutNamespaceWithAttributes;
namespace WebCore { class InheritsFrom; }
namespace WebCore { class InheritanceGrandchild; }
namespace WTF { class Seconds; }
namespace WTF { class CreateUsingClass; }
class CommonClass;
class AnotherCommonClass;
}

namespace Namespace::Subnamespace {
#if ENABLE(TEST_FEATURE)
struct StructName;
#endif
}

namespace Testing {
enum class StorageSize : uint8_t;
}

namespace WTF {
class Seconds;
class CreateUsingClass;
}

namespace WebCore {
class InheritsFrom;
class InheritanceGrandchild;
template<typename, typename> class ScrollSnapOffsetsInfo;
using FloatBoxExtent = ScrollSnapOffsetsInfo<float, double>;
class TimingFunction;
class MoveOnlyBaseClass;
class MoveOnlyDerivedClass;
class ScrollingStateFrameHostingNode;
class ScrollingStateFrameHostingNodeWithStuffAfterTuple;
struct Amazing;
}

namespace WebKit {
class PlatformClass;
class CustomEncoded;
class LayerProperties;
class RValueWithFunctionCalls;
class Fabulous;
}

enum class EnumWithoutNamespace : uint8_t;
enum class OptionSetEnumFirstCondition : uint32_t;
enum class OptionSetEnumLastCondition : uint32_t;
enum class OptionSetEnumAllCondition : uint32_t;
class WithoutNamespace;
class WithoutNamespaceWithAttributes;
struct SoftLinkedMember;
namespace WebCore { class TimingFunction; }
#if ENABLE(TEST_FEATURE)
namespace Namespace { class ConditionalCommonClass; }
#endif
namespace Namespace { class CommonClass; }
namespace Namespace { class AnotherCommonClass; }
namespace WebCore { class MoveOnlyBaseClass; }
namespace WebCore { class MoveOnlyDerivedClass; }
namespace WebKit { class PlatformClass; }
namespace WebKit { class CustomEncoded; }
namespace WebKit { class LayerProperties; }
namespace WebKit { class Fabulous; }
namespace WebCore { struct Amazing; }
namespace JSC { enum class Incredible; }
namespace Testing { enum class StorageSize : uint8_t; }
namespace WebCore { class ScrollingStateFrameHostingNode; }
namespace WebCore { class ScrollingStateFrameHostingNodeWithStuffAfterTuple; }
struct RequestEncodedWithBody;
struct RequestEncodedWithBodyRValue;
#if USE(CFBAR)
#endif
namespace WebKit { class RValueWithFunctionCalls; }

#if USE(CFBAR)
typedef struct __CFBar * CFBarRef;
#endif
Expand Down

0 comments on commit 54f2b1c

Please sign in to comment.