sdbus++: Irritating camelCase from acronyms
The sdbus++ generator we use to generate server bindings from
phosphor-dbus-interfaces has long had an irritating behavior
around how it tries to convert property and method names from YAML
to generated C++ function names.  It had been using a trivial call
to inflection.camelize to create a lowerCamelCase version of
what it found in the YAML.  The problem with this is that many properties,
especially in the networking space, are acronyms.  The camelize function
would turn a property like MACAddress into an awkward mACAddress.
Five years later, I’m getting around to fixing this behavior. Going forward the generator will handle acronyms in, what I think is, a reasonable way. Some examples:
- MACAddressbecomes- macAddress.
- BMCbecomes- bmc.
- IPv6Addressbecomes- ipv6Address.
Generally speaking what the code does is:
- First turn the name into UpperCamelCaseusing Inflection.
- Identify if the multiple letters at the beginning are upper case: an acronym!
- Turn everything except the last upper case letter at the beginning to lower
case.
    - But, there is a special case to handle ‘IPv6’.  Any set of upper case
letters that has a “v” for “version” followed by a number (ie.
[A-Z]+v[0-9]+) is treated as a full acronym.
 
- But, there is a special case to handle ‘IPv6’.  Any set of upper case
letters that has a “v” for “version” followed by a number (ie.
There are probably a few cases that this doesn’t cover in the most ideal way,
but I didn’t find any in the current phosphor-dbus-interfaces.  One that
comes to mind is a sequence of multiple acronyms like DHCPDNSServers would
become dhcpdnsServers, but without a list of known acronyms it would be hard
to figure out DHCP and DNS are two different acronyms.
There is already quite a bit of code that uses the awkward acronyms when
instantiating instances of generated classes, so I had to define a way to
independently migrate the sdbus++ code from the instantiating repositories.
What I’ve done is define a preprocessor constant SDBUSPP_NEW_CAMELCASE
which can be used as a key to use the “new format”.
My plan to get this integrate is as follows:
- Push up to Gerrit the change to sdbus++ for review. (done)
- Find all occurrences I can of old-style acronyms in the openbmc codebase
and push up fixes utilizing the SDBUSPP_NEW_CAMELCASEkey. These will be under the Gerrit topicsdbuspp_camelcase. (done)
- After #2’s are all merged, make a test commit to openbmc/openbmc of the
sdbus++changes to ensure I haven’t missed something in step 2, and make fixes as necessary. (done 2021-05-12)
- Remove the #define SDBUSPP_NEW_CAMELCASEfrom sdbus++ after #3 is merged.
- Clean up the #elseside of the#ifdef’s in #2 so that the old-style acronyms are no longer present.
This work should happen essentially as fast as reviews from #2 can be done, so any help to make that speed along would be greatly appreciated!