<div dir="ltr">Thanks Phil, I'll take a look!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 5 January 2017 at 10:01, Phil Thompson <span dir="ltr"><<a href="mailto:phil@riverbankcomputing.com" target="_blank">phil@riverbankcomputing.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 5 Jan 2017, at 9:27 am, Shaheed Haque <<a href="mailto:srhaque@theiet.org">srhaque@theiet.org</a>> wrote:<br>
><br>
> Hi all,<br>
><br>
> 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:<br>
><br>
>     For each .sip file in a  SIP module<br>
>         For each type in the .sip<br>
>             For all known subclass trees<br>
>                 Generate a fragment of code (like the sample below)<br>
><br>
> Is that right?<br>
><br>
> 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:<br>
><br>
>                %ConvertToSubClassCode<br>
>                     // CTSCC for subclasses of 'KConfigSkeletonItem'<br>
>                     sipType = NULL;<br>
><br>
>                     if (dynamic_cast<<wbr>KCoreConfigSkeleton::ItemBool*<wbr>>(sipCpp))<br>
>                         sipType = sipType_KCoreConfigSkeleton_<wbr>ItemBool;<br>
>                     else if (dynamic_cast<<wbr>KCoreConfigSkeleton::<wbr>ItemDateTime*>(sipCpp))<br>
>                         sipType = sipType_KCoreConfigSkeleton_<wbr>ItemDateTime;<br>
>                     else if (dynamic_cast<<wbr>KCoreConfigSkeleton::<wbr>ItemDouble*>(sipCpp))<br>
>                         sipType = sipType_KCoreConfigSkeleton_<wbr>ItemDouble;<br>
>                     else if (dynamic_cast<<wbr>KCoreConfigSkeleton::ItemInt*><wbr>(sipCpp))<br>
>                         {<br>
>                         sipType = sipType_KCoreConfigSkeleton_<wbr>ItemInt;<br>
>                         if (dynamic_cast<<wbr>KCoreConfigSkeleton::ItemEnum*<wbr>>(sipCpp))<br>
>                             sipType = sipType_KCoreConfigSkeleton_<wbr>ItemEnum;<br>
>                         }<br>
>                     ...<br>
><br>
> (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:<br>
>       • 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).<br>
>       • For each of the 100+ components, don't release the component until the work is done.<br>
> 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:<br>
>       • Let's say that the presence of RTTI is a given.<br>
>       • We know we are dealing with a Qt-like system including all its magic macros and the like.<br>
>       • 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).<br>
> Has anybody attempted this before? Any other suggestions? Can we do something at runtime?<br>
><br>
> All input welcome...<br>
<br>
</div></div>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.<br>
<span class="HOEnZb"><font color="#888888"><br>
Phil</font></span></blockquote></div><br></div>