Re: [PyQt] Looking for clarification and ideas on %ConvertToSubClassCode for PyKF5
Shaheed Haque <[email protected]>
| Newsgroups | gmane.comp.kde.devel.bindings,gmane.comp.python.pyqt-pykde |
|---|---|
| Message-ID | <CAHAc2jdb=y3LOuet5ETt+o6o6UQiR7OhxcF1nqZV93Uf6sLXAQ@mail.gmail.com> |
Thanks Phil, I'll take a look! On 5 January 2017 at 10:01, Phil Thompson <[email protected]> wrote: > On 5 Jan 2017, at 9:27 am, Shaheed Haque <[email protected]> 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