Re: [PATCH v2 12/16] scripts/qapi: generate high-level Rust bindings
Paolo Bonzini <[email protected]> Tue, 31 Mar 2026 09:53:38 +0200
| Newsgroups | org.nongnu.qemu-rust,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On 3/4/26 09:09, Markus Armbruster wrote:
> The naming rules should reflect the names the generator wants to use.
> When we add new patterns of generated names, we should update the
> rules. One pattern this series adds is names ending with 'Variant',
> as I pointed out in the review of the generated code I sent yesterday.
I'll add the documentation here.
> * The user's names clashing with themselves.
>
> Naming rules again help avoid such clashes.
>
> Example: struct members 'a_b and 'a-b' would both map to C identifier
> a_b if we didn't reject that. Test case struct-member-name-clash.
>
> The rejection code checks for clashes among the values of c_name().
> This guards against clashes in generated C. To also guard against
> clashes in generated Rust, we'd need to check the values of rs_name().
> I'd accept a TODO comment for now.
Ok, it seems as simple as parameterizing check() and check_clash() and
calling it twice. Will see if that's true.
>>>> def to_camel_case(value: str) -> str:
>>>> result = ''
>>>> for p in re.split(r'[-_]+', value):
>>>> if not p:
>>>> pass
>>>> elif p[0].isalpha() or (result and result[-1].isalpha()):
>>>> result += p[0].upper() + p[1:]
>>>> else:
>>>> result += '_' + p
>>>> return result
>>>
>>> Maps '0123-45' to '_0123_45'. Is the leading '_' intentional?
>>
>> Yes, because otherwise the output is not an identifier; but it doesn't
>> matter since the input is actually an identifier already and
>> to_camel_case('_0123_45') does give '_0123_45'. In neither case you
>> get the invalid identifier '0123_45'.
>
> Shouldn't that be left to rs_name()?
Ok.
>> Yeah, I will drop it. I changed mcgen to allow removing empty lines in
>> the middle of a declaration
>>
>> For the case of a single argument, the result is equivalent to the
>> existing implementation
>
> I wonder how the generated C would change if we used this there.
It doesn't, the new function is a superset of the old one.