[PyQt] Looking for clarification and ideas on %ConvertToSubClassCode for PyKF5

Shaheed Haque srhaque at theiet.org
Thu Jan 5 10:42:55 GMT 2017


Thanks Phil, I'll take a look!

On 5 January 2017 at 10:01, Phil Thompson <phil at riverbankcomputing.com>
wrote:

> On 5 Jan 2017, at 9:27 am, Shaheed Haque <srhaque at theiet.org> wrote:
> >
> > Hi all,
> >
> > The effort to generate PyKF5 semi-automatically (to replace PyKDE4) is
> making some headway but I am uncertain as to how best to tackle the problem
> of %ConvertToSubClassCode. The first clarification question is to check I
> have understood correctly that the basic process for designing
> %ConvertToSubClassCode is:
> >
> >     For each .sip file in a  SIP module
> >         For each type in the .sip
> >             For all known subclass trees
> >                 Generate a fragment of code (like the sample below)
> >
> > Is that right?
> >
> > Assuming that is correct, the second question is about how to implement
> the above. In the PyKDE4 days several thousand lines of code like this were
> lovingly hand-crafted:
> >
> >                %ConvertToSubClassCode
> >                     // CTSCC for subclasses of 'KConfigSkeletonItem'
> >                     sipType = NULL;
> >
> >                     if (dynamic_cast<KCoreConfigSkeleton::ItemBool*
> >(sipCpp))
> >                         sipType = sipType_KCoreConfigSkeleton_ItemBool;
> >                     else if (dynamic_cast<KCoreConfigSkeleton::
> ItemDateTime*>(sipCpp))
> >                         sipType = sipType_KCoreConfigSkeleton_
> ItemDateTime;
> >                     else if (dynamic_cast<KCoreConfigSkeleton::
> ItemDouble*>(sipCpp))
> >                         sipType = sipType_KCoreConfigSkeleton_
> ItemDouble;
> >                     else if (dynamic_cast<KCoreConfigSkeleton::ItemInt*>
> (sipCpp))
> >                         {
> >                         sipType = sipType_KCoreConfigSkeleton_ItemInt;
> >                         if (dynamic_cast<KCoreConfigSkeleton::ItemEnum*
> >(sipCpp))
> >                             sipType = sipType_KCoreConfigSkeleton_
> ItemEnum;
> >                         }
> >                     ...
> >
> > (I have de-duplicated this by hand, and I still have over 1000 lines of
> code). Now I have over 2000 .sip files across over 100 components that make
> up PyKF5 and a minor nightmare in prospect :-). It seems to me that I have
> several manual options:
> >       • Ignore the problem at this level, and only manually create
> %ConvertToSubClassCode on an as-requested basis, release-by-release. (On
> occasion, I may be able to use the PyKDE4 code as a starting point, but the
> shape and details of the type hierarchy in PyKF5 is often rather different).
> >       • For each of the 100+ components, don't release the component
> until the work is done.
> > Neither of these is attractive from a user perspective, and perpetuates
> the problem from a maintainer perspective. The other way forward might be
> some kind of automation in the SIP generation automation layer:
> >       • Let's say that the presence of RTTI is a given.
> >       • We know we are dealing with a Qt-like system including all its
> magic macros and the like.
> >       • We can run some kind of offline analyser (the SIP generator uses
> libclang, and can either operate on a single .h file at a time, or we can
> even run over a whole directory hierarchy if needed).
> > Has anybody attempted this before? Any other suggestions? Can we do
> something at runtime?
> >
> > All input welcome...
>
> For the record I've sent you a copy of the Python scripts I use for PyQt5
> via private email. If anybody else wants a copy then please let me know.
>
> Phil
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20170105/95507fc7/attachment.html>


More information about the PyQt mailing list