-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Closed
Labels
@ju1ius
Description
Description
Hi, sorry if I'm mistaking, but gen_stub.php
doesn't seem to support DNF types ATM.
Input stub file:
<?php /** * @generate-class-entries */ class DnfClass { public array|(Traversable&Countable)|\Iterator $dnfProp; public function dnf(array|(Traversable&Countable)|Iterator $dnf): void {} }
$ php build/gen_stub.php -f --generate-classsynopses --generate-methodsynopses
Generated arginfo header:
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_DnfClass_dnf, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_TYPE_MASK(0, dnf, Traversable|Countable|Iterator, MAY_BE_ARRAY, NULL) ZEND_END_ARG_INFO() ZEND_METHOD(DnfClass, dnf); static const zend_function_entry class_DnfClass_methods[] = { ZEND_ME(DnfClass, dnf, arginfo_class_DnfClass_dnf, ZEND_ACC_PUBLIC) ZEND_FE_END }; static zend_class_entry *register_class_DnfClass(void) { zend_class_entry ce, *class_entry; INIT_CLASS_ENTRY(ce, "DnfClass", class_DnfClass_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); zend_string *property_dnfProp_class_Traversable = zend_string_init("Traversable", sizeof("Traversable") - 1, 1); zend_string *property_dnfProp_class_Countable = zend_string_init("Countable", sizeof("Countable") - 1, 1); zend_string *property_dnfProp_class_Iterator = zend_string_init("Iterator", sizeof("Iterator") - 1, 1); zend_type_list *property_dnfProp_type_list = malloc(ZEND_TYPE_LIST_SIZE(3)); property_dnfProp_type_list->num_types = 3; property_dnfProp_type_list->types[0] = (zend_type) ZEND_TYPE_INIT_CLASS(property_dnfProp_class_Traversable, 0, 0); property_dnfProp_type_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(property_dnfProp_class_Countable, 0, 0); property_dnfProp_type_list->types[2] = (zend_type) ZEND_TYPE_INIT_CLASS(property_dnfProp_class_Iterator, 0, 0); zend_type property_dnfProp_type = ZEND_TYPE_INIT_UNION(property_dnfProp_type_list, MAY_BE_ARRAY); zval property_dnfProp_default_value; ZVAL_UNDEF(&property_dnfProp_default_value); zend_string *property_dnfProp_name = zend_string_init("dnfProp", sizeof("dnfProp") - 1, 1); zend_declare_typed_property(class_entry, property_dnfProp_name, &property_dnfProp_default_value, ZEND_ACC_PUBLIC, NULL, property_dnfProp_type); zend_string_release(property_dnfProp_name); return class_entry; }
Generated class/method synopses
<classsynopsis> <!-- header ommited --> <classsynopsisinfo role="comment">&Properties;</classsynopsisinfo> <fieldsynopsis> <modifier>public</modifier> <type class="union"> <type>array</type><type>Traversable</type><type>Countable</type><type>Iterator</type> </type> <varname linkend="dnfclass.props.dnfprop">dnfProp</varname> </fieldsynopsis> <classsynopsisinfo role="comment">&Methods;</classsynopsisinfo> <methodsynopsis role="DnfClass"> <modifier>public</modifier> <type>void</type><methodname>DnfClass::dnf</methodname> <methodparam> <type class="union"> <type>array</type><type>Traversable</type><type>Countable</type><type>Iterator</type> </type> <parameter>dnf</parameter></methodparam> </methodsynopsis> </classsynopsis>
Expected class/method synopses
<fieldsynopsis> <modifier>public</modifier> <type class="union"> <type>array</type> <type class="intersection"> <type>Traversable</type><type>Countable</type> </type> <type>Iterator</type> </type> <varname linkend="dnfclass.props.dnfprop">dnfProp</varname> </fieldsynopsis> <methodsynopsis role="DnfClass"> <modifier>public</modifier> <type>void</type><methodname>DnfClass::dnf</methodname> <methodparam> <type class="union"> <type>array</type> <type class="intersection"> <type>Traversable</type><type>Countable</type> </type> <type>Iterator</type> </type> <parameter>dnf</parameter></methodparam> </methodsynopsis>
Expected arginfo header
I'm not super familiar with the new DNF macros API, so WRT the arginfo for DnfClass::dnf()
IDK, but for the DnfClass::$dnfProp
property I expected the output to look more like the following:
// <snip>, names shortened for readability zend_string *class_Traversable = zend_string_init("Traversable", sizeof("Traversable") - 1, 1); zend_string *class_Countable = zend_string_init("Countable", sizeof("Countable") - 1, 1); zend_string *class_Iterator = zend_string_init("Iterator", sizeof("Iterator") - 1, 1); zend_type_list *traversable_countable_list = malloc(ZEND_TYPE_LIST_SIZE(2)); traversable_countable_list->num_types = 2; traversable_countable_list->types[0] = (zend_type) ZEND_TYPE_INIT_CLASS(class_Traversable, 0, 0); traversable_countable_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(class_Countable, 0, 0); zend_type traversable_countable_type = ZEND_TYPE_INIT_INTERSECTION(traversable_countable_list, 0); zend_type_list *dnfProp_type_list = malloc(ZEND_TYPE_LIST_SIZE(2)); dnfProp_type_list->num_types = 2; dnfProp_type_list->types[0] = traversable_countable_type; dnfProp_type_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(class_Iterator, 0, 0); zend_type dnfProp_type = ZEND_TYPE_INIT_UNION(dnfProp_type_list, MAY_BE_ARRAY); // </snip>
PHP Version
PHP-8.2 (master branch)
Operating System
irrelevant