Nick Trout wrote:
Possibly, I know wxLua uses ctags to parse wxWindows,
then Lua to parse the output and generate a binding. I'd
hate to have to maintain the binding to something like
wxWindows (its enormous!).
I see ParseTags.lua in the source code, but I'm not convinced that Paul is
using it to generate wxLuaWrap.i. If he's using it as a tool, I'm guessing
he's adding the prototypes it generates to wxLuaWrap.i by hand.
If you look in wxLuaWrap.i, you'll see stuff like wxPalette::GetPixel, which
is stubbed out because the wrappers don't support passing by reference. And
there's stuff like wxList::Insert, which is manually renamed to InsertAt
because the wrappers don't support polymorphism within the same class.
So this stuff isn't entirely autogenerated.
And there's another reason you can't just run ctags to generate the
prototypes, although it's probably fairly unique to wxWindows. wxWindows is
cross-platform, so the implementation of similar-looking classes on different
platforms is accomplished by implementing subclasses which may not exist on
other platforms. For example, consider this (imaginary) scenario:
- The wxDrawable class is implemented in Windows by inheriting
from the Bitmap base class. It inherits the ::DrawLine method.
- The wxDrawable class is implemented in Gtk via the gtk_drawable class.
::DrawLine is implemented in the same class.
- The wxDrawable class is implemented in X11 via inheriting from Pixmap.
::DrawLine is implemented in yet another class, XWindowCalls.
If you ran ctags on the Windows source files, you would end up with prototypes
for the Bitmap base class, which doesn't exist in the Gtk or X11 versions. If
you ran it on the X11 source files, you'd end up including the XWindows
class, which doesn't exist on Windows (Gtk is derived from XWindows and
probably has it, but we'll ignore that).
So what can be done? You can't just automaticall exclude the base classes that
aren't common across platforms, because you wouldn't get a wrapper for
::DrawLine - not using the Windows or X11 source, anyway.
So to get portable wrappers, you have to rely on the documentation, which is
supposed to list only the routines that are common across all platforms.
In the case of wxWindows, you could write a program to parse the documentation
(it's in HTML format) and grabs the prototypes, but you still have to go
through it by hand and make corrections. That's because there are still
polymorphic name conflicts, routines that rely on passing by reference, and
many cases where the documentation is just plain wrong - bad parameters,
deprecated classes, etc.
I'm not sure this is indicitive of anything, other than that sometime wrappers
are tedious, even with automated tools.
-- David Cuny