LibWeb: Improve Enum generation in IDLGenerator

Generated enums have no underlying type specifier, this adds one
It uses the smallest available, which is mostly u8
This commit is contained in:
Totto16 2025-03-04 15:42:08 +01:00 committed by Sam Atkins
commit 4c54fa10ed
Notes: github-actions[bot] 2025-03-04 16:36:05 +00:00
3 changed files with 45 additions and 29 deletions

View file

@ -6,10 +6,12 @@
#pragma once #pragma once
#include <AK/Types.h>
namespace Web::Bindings { namespace Web::Bindings {
// https://w3c.github.io/encrypted-media/#dom-mediakeysrequirement // https://w3c.github.io/encrypted-media/#dom-mediakeysrequirement
enum class MediaKeysRequirement { enum class MediaKeysRequirement : u8 {
Required, Required,
Optional, Optional,
NotAllowed NotAllowed

View file

@ -59,33 +59,33 @@ namespace Web::Bindings {
class Intrinsics; class Intrinsics;
class OptionConstructor; class OptionConstructor;
enum class AudioContextLatencyCategory; enum class AudioContextLatencyCategory : u8;
enum class CanPlayTypeResult; enum class CanPlayTypeResult : u8;
enum class CanvasFillRule; enum class CanvasFillRule : u8;
enum class CanvasTextAlign; enum class CanvasTextAlign : u8;
enum class CanvasTextBaseline; enum class CanvasTextBaseline : u8;
enum class ColorGamut; enum class ColorGamut : u8;
enum class DOMParserSupportedType; enum class DOMParserSupportedType : u8;
enum class EndingType; enum class EndingType : u8;
enum class HdrMetadataType; enum class HdrMetadataType : u8;
enum class ImageSmoothingQuality; enum class ImageSmoothingQuality : u8;
enum class MediaDecodingType; enum class MediaDecodingType : u8;
enum class MediaEncodingType; enum class MediaEncodingType : u8;
enum class MediaKeysRequirement; enum class MediaKeysRequirement : u8;
enum class ReadableStreamReaderMode; enum class ReadableStreamReaderMode : u8;
enum class ReferrerPolicy; enum class ReferrerPolicy : u8;
enum class RequestCache; enum class RequestCache : u8;
enum class RequestCredentials; enum class RequestCredentials : u8;
enum class RequestDestination; enum class RequestDestination : u8;
enum class RequestDuplex; enum class RequestDuplex : u8;
enum class RequestMode; enum class RequestMode : u8;
enum class RequestPriority; enum class RequestPriority : u8;
enum class RequestRedirect; enum class RequestRedirect : u8;
enum class ResizeObserverBoxOptions; enum class ResizeObserverBoxOptions : u8;
enum class ResponseType; enum class ResponseType : u8;
enum class TextTrackKind; enum class TextTrackKind : u8;
enum class TransferFunction; enum class TransferFunction : u8;
enum class XMLHttpRequestResponseType; enum class XMLHttpRequestResponseType : u8;
} }
namespace Web::Clipboard { namespace Web::Clipboard {

View file

@ -14,6 +14,7 @@
#include "Namespaces.h" #include "Namespaces.h"
#include <AK/Array.h> #include <AK/Array.h>
#include <AK/LexicalPath.h> #include <AK/LexicalPath.h>
#include <AK/NumericLimits.h>
#include <AK/Queue.h> #include <AK/Queue.h>
#include <AK/QuickSort.h> #include <AK/QuickSort.h>
#include <LibIDL/Types.h> #include <LibIDL/Types.h>
@ -2856,6 +2857,18 @@ JS::ThrowCompletionOr<GC::Ref<JS::Object>> @constructor_class@::construct([[mayb
} }
} }
static ByteString get_best_value_for_underlying_enum_type(size_t size)
{
if (size < NumericLimits<u8>::max()) {
return "u8";
} else if (size < NumericLimits<u16>::max()) {
return "u16";
}
VERIFY_NOT_REACHED();
}
static void generate_enumerations(HashMap<ByteString, Enumeration> const& enumerations, StringBuilder& builder) static void generate_enumerations(HashMap<ByteString, Enumeration> const& enumerations, StringBuilder& builder)
{ {
SourceGenerator generator { builder }; SourceGenerator generator { builder };
@ -2865,8 +2878,9 @@ static void generate_enumerations(HashMap<ByteString, Enumeration> const& enumer
continue; continue;
auto enum_generator = generator.fork(); auto enum_generator = generator.fork();
enum_generator.set("enum.type.name", it.key); enum_generator.set("enum.type.name", it.key);
enum_generator.set("enum.underlying_type", get_best_value_for_underlying_enum_type(it.value.translated_cpp_names.size()));
enum_generator.append(R"~~~( enum_generator.append(R"~~~(
enum class @enum.type.name@ { enum class @enum.type.name@ : @enum.underlying_type@ {
)~~~"); )~~~");
for (auto const& entry : it.value.translated_cpp_names) { for (auto const& entry : it.value.translated_cpp_names) {
enum_generator.set("enum.entry", entry.value); enum_generator.set("enum.entry", entry.value);