
    \j>m                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S\S\4S jrS\S\4S jrS\S\S\SS 4S! jr S\S\SS 4S" jr!S\S\SS 4S# jr"S\S\S\S$\SS 4
S% jr#S&\S'\S\S\4S( jr$S'\S\4S) jr%S\4S* jr&S'\S\4S+ jr'S'\S\S\4S, jr(S'\S\S\4S- jr)S'\S\S\4S. jr*S'\S\S\4S/ jr+S'\S\S\4S0 jr,S'\S\S\4S1 jr-S'\S\S\4S2 jr.S'\S\S\4S3 jr/S'\S\4S4 jr0S'\S\4S5 jr1S'\S\4S6 jr2S'\S\4S7 jr3S'\S\S\4S8 jr4S'\S\S\4S9 jr5S'\S\S\4S: jr6S'\S\4S; jr7S'\S\S\4S< jr8S'\S\S\4S= jr9S>\S?\S\S$\S\:\\4   4
S@ jr;S\S'\S\S$\S\4
SA jr<S\S'\S\S$\S\4
SB jr=S'\S\S\4SC jr>S\S'\S\S$\S\4
SD jr? SQSE\S'\S\S$\SF\@S\4SG jjrASH\S'\S\S$\S\4
SI jrBS'\S\S\4SJ jrCSK\S'\S\S$\S\4
SL jrDS\S'\S\S\4SM jrESN\S'\S\S$\S\4
SO jrFS\S'\S\S$\S\4
SP jrGg )R    )TextIO)GenerationContext)add_binding_include_for_typeadd_buffer_source_type_include)cpp_name)cpp_type_details)cpp_type_for_idl_type)cpp_type_for_idl_type_details)#implementation_header_for_interface) interface_like_type_for_idl_type)is_buffer_source_type)is_optional_without_default)is_string_type)GeneratedIncludes)make_name_acceptable_cpp)string_to_cpp_enum_name)title_case_to_snake_case)
Dictionary)DictionaryMember)Enumeration)IDLParameterizedType)IDLType)IDLUnionTypeidl_typereturnc                 4    [        SU R                   S35      e)Nz&Unsupported IDL value conversion for '')RuntimeErrorname)r   s    Y/mnt/mint/home/seanl/public/Repos/ladybird/Meta/Generators/libweb_bindings/to_js_value.pyunsupported_to_javascript_valuer"      s    
?aP
QQ    
dictionaryc                 D    [        [        U R                  5      5       S3$ )N	_to_value)r   r   r    )r$   s    r!   to_value_function_namer'   #   s     &'?
'PQRR[\\r#   outenumerationincludesNc                 d    UR                  S5        U R                  SUR                   S35        g )NzAK/Utf16String.hzUtf16String idl_enum_to_string(z);

)addwriter    )r(   r)   r*   s      r!   1write_enumeration_to_javascript_value_declarationr.   '   s.    
 LL#$II/0@0@/AHIr#   c                 |    SUR                   ;  a  g U R                  S[        U5       SUR                   S35        g )NGenerateToValue
JS::Value z(JS::Realm&, z const&);

)extended_attributesr-   r'   r    )r(   r$   s     r!   0write_dictionary_to_javascript_value_declarationr3   1   s;    
 > >>II
1*=>mJOOK\\ijkr#   c           	      
   U R                  SUR                   S35        UR                   HC  nU R                  SUR                   S[        U5       S35        U R                  SU S35        ME     U R                  S5        g )	NzR// https://webidl.spec.whatwg.org/#idl-enumeration
Utf16String idl_enum_to_string(z value)
{
    // The result of converting an IDL enumeration type value to a JavaScript value is the String value that represents the same sequence of code units as the enumeration value.
    switch (value) {
z	    case z::z:
z        return "z	"_utf16;
z#    }
    VERIFY_NOT_REACHED();
}

)r-   r    valuesr   )r(   r)   values      r!   0write_enumeration_to_javascript_value_conversionr7   8   s    II  + 0 01 2	 ##		Ik../r2I%2P1QQTUV		$UG:67 $ II	r#   contextc                     SUR                   ;  a  g UR                  S5        U R                  S[        U5       SUR                   S[        [        UR                  5      SX#5       S35        g )Nr0   LibJS/Runtime/Object.hr1   z(JS::Realm& realm, z< const& dictionary)
{
    auto& vm = realm.vm();
    return r$   z;
}

)r2   r,   r-   r'   r    to_javascript_valuer   )r(   r$   r*   r8   s       r!   /write_dictionary_to_javascript_value_conversionr<   O   ss     
 > >>LL)*II-j9::MjooM^ _  
 8,Z[ \	r#   cpp_type_namer6   c                 6    UR                  S5        SU  SU S3$ )NzLibWeb/WebIDL/Types.hzJS::Value(static_cast<z>())r,   )r=   r6   r*   s      r!   integer_to_javascript_valuerA   d   s$    LL()#M?"UG2>>r#   c                     U $ )N r6   s    r!   any_to_javascript_valuerE   j   s	     Lr#   c                      g)NzJS::js_undefined()rC   rC   r#   r!   undefined_to_javascript_valuerG   q   s    r#   c                     SU  S3$ Nz
JS::Value()rC   rD   s    r!   boolean_to_javascript_valuerK   w        wa  r#   c                     [        SX5      $ )NzWebIDL::ByterA   r6   r*   s     r!   byte_to_javascript_valuerP   ~        '~uGGr#   c                     [        SX5      $ )NzWebIDL::OctetrN   rO   s     r!   octet_to_javascript_valuerS           'HHr#   c                     [        SX5      $ )NzWebIDL::ShortrN   rO   s     r!   short_to_javascript_valuerV      rT   r#   c                     [        SX5      $ )NzWebIDL::UnsignedShortrN   rO   s     r!   "unsigned_short_to_javascript_valuerX      s     ''>PPr#   c                     [        SX5      $ )NzWebIDL::LongrN   rO   s     r!   long_to_javascript_valuerZ      rQ   r#   c                     [        SX5      $ )NzWebIDL::UnsignedLongrN   rO   s     r!   !unsigned_long_to_javascript_valuer\      s     ''=uOOr#   c                     [        SX5      $ NdoublerN   rO   s     r!   long_long_to_javascript_valuer`          
 'xAAr#   c                     [        SX5      $ r^   rN   rO   s     r!   &unsigned_long_long_to_javascript_valuerc      ra   r#   c                     SU  S3$ rI   rC   rD   s    r!   float_to_javascript_valuere      rL   r#   c                     SU  S3$ rI   rC   rD   s    r!   &unrestricted_float_to_javascript_valuerg      rL   r#   c                     SU  S3$ rI   rC   rD   s    r!   double_to_javascript_valueri      rL   r#   c                     SU  S3$ rI   rC   rD   s    r!   'unrestricted_double_to_javascript_valuerk      rL   r#   c                 0    UR                  S5        SU  S3$ Nz"LibWeb/WebIDL/AbstractOperations.hz)WebIDL::primitive_string_from_string(vm, rJ   r@   rO   s     r!   domstring_to_javascript_valuern      s    LL566ugQ??r#   c                 0    UR                  S5        SU  S3$ rm   r@   rO   s     r!   bytestring_to_javascript_valuerp      s     LL56 7ugQ??r#   c                 0    UR                  S5        SU  S3$ rm   r@   rO   s     r!   usvstring_to_javascript_valuerr      s    LL566ugQ??r#   c                     SU  S3$ rI   rC   rD   s    r!   object_to_javascript_valuert      rL   r#   c                 D    UR                  UR                  5        SU  S3$ rI   )r,   implementation_header)r6   r*   interface_like_types      r!   interface_to_javascript_valuerx      s&    LL$::; wa  r#   c                 @    UR                  [        U5      5        U  S3$ )Nz->callback().callback)r,   r   )r6   r*   	interfaces      r!   &callback_interface_to_javascript_valuer{      s$     LL4Y?@W)**r#   memberdictionary_valuec                    U S[        U 5       3nU R                  nSn[        U 5      (       a  [        X5      nUR                  (       a  U R                  R
                  (       d  UnOoU S3nU S3nU R                  R
                  (       aJ  [        U R                  [        5      (       d+  UR                  (       d  U R                  R                  5       nU[        XTX#5      4$ )N. .has_value().value())r   typer   r	   gc_ref_target_typenullable
isinstancer   is_optional_presencewithout_nullabler;   )r|   r}   r*   r8   member_valuemember_typemember_existscpp_types           r!   *dictionary_member_to_javascript_conversionr     s     ''q&)9(:;L++KM"6**#F4&&v{{/C/C(M+nL9M*^84L{{##Jv{{L,Q,QZbZwZw$kk::<-k[[[r#   c                    UR                  U 5      nUc  [        SU R                   S35      e[        XU5        UR	                  S5        Sn[        UR                  U5      5       H]  nUR                   HJ  n[        XqX#5      u  pUS-  nU(       a	  USU S3-  nUSUR                   S	U	 S
3-  nU(       d  ME  US-  nML     M_     US-  nU$ )NzUnknown dictionary 'r   r:   z[&]() -> JS::Value {
        // 1. Let O be OrdinaryObjectCreate(%Object.prototype%).
        auto dictionary_object = JS::Object::create(realm, realm.intrinsics().object_prototype());
zZ
        // 1. Let key be the identifier of member.
        // 2. If V[key] exists, then:
z        if (z) {
z
        // 1. Let idlValue be V[key].
        // 2. Let value be the result of converting idlValue to a JavaScript value.
        // 3. Perform ! CreateDataPropertyOrThrow(O, key, value).
        MUST(dictionary_object->create_data_property("z"_utf16_fly_string, z));
z
        }
zB
        // 4. Return O.
        return dictionary_object;
    }())	r$   r   r    r   r,   reverseddictionary_inheritance_stackmembersr   )
r   r6   r*   r8   r$   generated_conversiondictionary_in_stackr|   r   converted_member_values
             r!   dictionary_to_javascript_valuer     s    ##H-J1(--BCC W=LL)*  ((L(LZ(XY)11F4^x51M ! %   $,}oV(LL$  )7 8>{{mCWXnWo p	%   }$5$' 2  Z.     r#   c                 H    [        XU5        UR                  S5        SU S3$ )NzLibJS/Runtime/PrimitiveString.hz3JS::PrimitiveString::create(vm, idl_enum_to_string(r?   )r   r,   )r   r6   r*   r8   s       r!   enumeration_to_javascript_valuer   K  s-     !W=LL23 ArJJr#   c                 .    UR                  S5        U  S3$ )NzLibWeb/WebIDL/CallbackType.hz
->callbackr@   rO   s     r!   %callback_function_to_javascript_valuer   Y  s    LL/0 WJr#   c           	          U R                  S5      n[        [        X5      R                  5      nU(       a  UOU S3nU(       a  UOU S3nSU S[	        XFX#5       S3$ )NFr   r   z~[&]() -> JS::Value {
        // 1. If the IDL nullable type T? value is null, then the JavaScript value is null.
        if (!z)
            return JS::js_null();

        // 2. Otherwise, the JavaScript value is the result of converting the IDL nullable type value to the inner IDL type T.
        return JS::Value(z
);
    }())clone_with_nullableboolr   r   r;   )r   r6   r*   r8   
inner_typevalue_is_nullable_pointerinner_value	has_values           r!   nullable_to_javascript_valuer   a  sy     --e4J $%B8%U%h%h i4%UG8:LK25'8NI[  .jxYZ [	 r#   sequence_typefreezec                 f   UR                  S5        U R                  S   nSnSnSnSn	Sn
[        XYX#5      nSnU(       a  S	U S
3nSR                  / SPU PSPU PSPU PSPU PSPU PSPU PSPU PSPU PSPU	 PSPU PSPU PSPU
 PSPU PSPU PSPU PSPU
 PSPU PSPU PSP5      $ )NzLibJS/Runtime/Array.hr   sequence_lengthsequence_arraysequence_indexsequence_elementjs_sequence_elementr   z
        MUST(z<->set_integrity_level(JS::Object::IntegrityLevel::Frozen));
z[&]() -> JS::Value {
        // An IDL sequence<T> value S is converted to a JavaScript value as follows:
        // 1. Let n be the length of S.
        auto z = ze.size();

        // 2. Let A be a new Array object created as if by the expression [].
        auto z! = MUST(JS::Array::create(realm, zX));

        // 3. Initialize i to be 0.
        // 4. While i < n:
        for (size_t z = 0; z < z; ++zL) {
            // 1. Let V be the value in S at index i.
            auto& z.at(zg);

            // 2. Let E be the result of converting V to a JavaScript value.
            JS::Value z;

            // 3. Let P be the result of calling ! ToString(i).
            // 4. Perform ! CreateDataPropertyOrThrow(A, P, E).
            MUST(z)->create_data_property(JS::PropertyKey { z }, z1));

            // 5. Set i to i + 1.
        }
z(
        // 5. Return A.
        return 	;
    }())r,   
parametersr;   join)r   r6   r*   r8   r   element_typelength_name
array_name
index_nameelement_namejs_element_nameconverted_elementfreeze_arrays                r!   sequence_to_javascript_valuer   v  s    LL() ++A.L#K!J!J%L+O+LZL\     ]  $W% \ ; <G-H  L !' (2l 36 7B] CG HRlS  . !$ %*7 +/ 0:l; '' (+ ,=*=>& '& H'& IS|'& TY'& ZiXi'&j'. /./2 |32	3 r#   record_typec                    [        U R                  5      S:w  a  [        S5      eU R                  S   n[        UR                  5      (       d  [        SUR                   S35      eUR                  S5        UR                  S5        U R                  S   nS	nS
nSn[        XXX#5      n	SU SU SU SU SU SU SU	 SU S3$ )N   z$Record type must have two parametersr   zUnsupported record key type 'r   zAK/Utf16FlyString.hr:      record_object
record_keyrecord_valuezh[&]() -> JS::Value {
        // 1. Let result be OrdinaryObjectCreate(%Object.prototype%).
        auto u    = JS::Object::create(realm, realm.intrinsics().object_prototype());

        // 2. For each key → value of D:
        for (auto const& [z, z] : a  ) {
            // 1. Let jsKey be key converted to a JavaScript value.
            // 2. Let jsValue be value converted to a JavaScript value.
            // 3. Let created be ! CreateDataProperty(result, jsKey, jsValue).
            // 4. Assert: created is true.
            MUST(z1->create_data_property(Utf16FlyString::from_utf8(z), z;));
        }

        // 3. Return result.
        return r   )lenr   r   r   r    r,   r;   )
r   r6   r*   r8   key_type
value_typeobject_namekey_name
value_nameconverted_values
             r!   record_to_javascript_valuer     s     ;!!"a'ABB%%a(H(--((:8==/KLLLL&'LL)*''*J!KHJ)*(TO]  $*Bzl$ug >
 OPXzY\]l\m n } 	 r#   c                 t    UR                  S5        UR                  S5        UR                  S5        SU  S3$ )NzAK/TypeCasts.hzLibJS/Runtime/Promise.hzLibWeb/WebIDL/Promise.hzGC::Ref { as<JS::Promise>(*z->promise()) }r@   rO   s     r!   promise_to_javascript_valuer     s:    LL!"LL*+LL*+ *%@@r#   
union_typec           
         UR                  S5        / n[        U R                  5       5       H_  u  pVUR                  S:X  a  M  UR	                  S5      nSU 3n[        Xs5      n	[        XxX#5      n
UR                  SU	 SU SU
 S35        Ma     U R                  5       (       a  UR                  S	5        O&U R                  5       (       a  UR                  S
5        SR                  U5      nU SU S3$ )NzAK/Variant.h	undefinedFvisited_union_valuez        [&](z const& z,) -> JS::Value
        {
            return z;
        }zT        [](Empty) -> JS::Value
        {
            return JS::js_null();
        }zY        [](Empty) -> JS::Value
        {
            return JS::js_undefined();
        }z,
z.visit(
z
    ))r,   	enumerateflattened_member_typesr    r   r
   r;   appendincludes_nullable_typeincludes_undefinedr   )r   r6   r*   r8   conversionsindexr   r   visited_valuevisited_cpp_typer   joined_conversionss               r!   union_to_javascript_valuer     s"    LL  K'
(I(I(KL{* 44U;
-eW50E-j[-.h}o F#$ %	
 M ((**	
 
	&	&	(	(	
 K0w   	 	r#   c                 $    [        X5        SU S3$ rI   r   )r   r6   r*   s      r!   !buffer_source_to_javascript_valuer   	  s    "86 wa  r#   frozen_array_typec                     [        XX#SS9$ )NT)r   )r   )r   r6   r*   r8   s       r!    frozen_array_to_javascript_valuer     s     ((9(\`aar#   c                    UR                  S5        U R                  n[        U [        5      (       a  [	        XX#5      $ U R
                  (       a  [        XX#5      $ US:X  a
  [        5       $ US:X  a  [        U5      $ US:X  a  [        U5      $ [        U 5      (       a  [        XU5      $ US:X  a  [        U5      $ US:X  a  [        X5      $ US:X  a  [        X5      $ US:X  a  [        X5      $ US	:X  a  [!        X5      $ US
:X  a  [#        X5      $ US:X  a  [%        X5      $ US:X  a  ['        X5      $ US:X  a  [)        X5      $ US:X  a  [+        U5      $ US:X  a  [-        U5      $ US:X  a  [/        U5      $ US:X  a  [1        U5      $ US;   a  [3        X5      $ US;   a  [5        X5      $ US;   a  [7        X5      $ UR9                  U 5      b  [;        XX#5      $ UR=                  U 5      b  [?        XX#5      $ US:X  a  [A        X5      $ [C        X5      nUb  [E        XU5      $ URG                  U 5      nUb  URH                  (       a  [K        XU5      $ URM                  U 5      b  [O        X5      $ [        U [P        5      (       a  US:X  a  [S        XX#5      $ [        U [P        5      (       a  US:X  a  [U        XX#5      $ [        U [P        5      (       a  US:X  a  [W        XX#5      $ [Y        U 5      $ )NzLibJS/Runtime/Value.hr   anyobjectbooleanbyteoctetshortzunsigned shortlongzunsigned longz	long longzunsigned long longfloatzunrestricted floatr_   zunrestricted double)	DOMStringUtf16DOMString)
ByteString)	USVStringUtf16USVStringPromisesequencerecordFrozenArray)-r,   r    r   r   r   r   r   rG   rE   rt   r   r   rK   rP   rS   rV   rX   rZ   r\   r`   rc   re   rg   ri   rk   rn   rp   rr   r)   r   r$   r   r   r   rx   rz   is_callback_interfacer{   callback_functionr   r   r   r   r   r"   )r   r6   r*   r8   	type_namerw   rz   s          r!   r;   r;     s    LL()I(L))((LL+HXOOK,..E&u--H)%00X&&0(KKI*511F'88G(99G(99$$1%BBF'88O#0AAK,U==((5eFFG(//((5e<<H)%00))6u==33,U==O#-e>>33,U==8$0.xRR(#/-hxQQI*5;;:8M&,U>QRR!!(+I!@!@5eyQQ  *64UEE(011i:6M+HXOO(011i86K)(8MM(011i=6P/SS*844r#   )F)Htypingr   "Generators.libweb_bindings.contextr   $Generators.libweb_bindings.cpp_typesr   r   r   r	   r
   r   r   r   r   r   r   #Generators.libweb_bindings.includesr   Utils.utilsr   r   r   Utils.webidl_parserr   r   r   r   r   r   strr"   r'   r.   r3   r7   r<   rA   rE   rG   rK   rP   rS   rV   rX   rZ   r\   r`   rc   re   rg   ri   rk   rn   rp   rr   rt   rx   r{   tupler   r   r   r   r   r   r   r   r   r   r   r   r;   rC   r#   r!   <module>r      s  
  @ M O 9 A F N T Q F L ? A 0 / 0 * 0 + 4 ' ,Rg R# R]z ]c ]J	JJ  J 
	Jl& lj l]a l& { _c .	   	
 
*?s ?3 ?J[ ?`c ?3 3  s  !s !s !HC H3D H HIS I4E I# IIS I4E I# IQc Q=N QSV QHC H3D H HPS P<M PRU PB B8I Bc BB# BAR BWZ B!S !S !!# !# !!c !c !!3 !3 !@ @8I @c @@# @9J @s @@ @8I @c @!c !c !! !8I !cf !+# +AR +be +\\\  \ 	\
 38_\0- - -   -  	- 
 	- b
K
K
K  
K 	
K
 	
K   @Q  VY     	
 	4 0'00  0 	0
 0 	0h#%##  # 	#
 	#NAs A6G AC A*	*	*	  *	 	*	
 	*	\! ! !O` !eh !b+bb  b 	b
 	bV5V5V5  V5 	V5
 	V5r#   