From: Vadim Z. <vz...@ze...> - 2010-11-11 23:26:16
|
On Thu, 19 Aug 2010 19:15:08 +0100 William S Fulton <ws...@fu...> wrote: [... discussion about using parentNode with %rename ...] WSF> > This is what I feared, but thanks for confirming it. It's a nasty surprise WSF> > though, I really looked forward to being able to be able to apply regexes WSF> > to members of a single class. Do you think there is any other way to make WSF> > this work, e.g. provide some variable containing the fully qualified name WSF> > of the current declaration that a regex could be applied to? It turns out that actually this can be made to work by using regextarget in combination with (undocumented) fullname attribute. I.e. with this example: %module n %rename("%(regex:/Do(.*)/Dont\\1/)s", fullname=1, regextarget=1) \ "^NS::Foo::Do.*"; %inline %{ namespace NS{ void DoIt(); struct Foo { void DoThis(); void DoThat(); void JustDoIt(); }; struct Bar { void DoThis(); void DoSomethingElse(); }; } %} only Foo::DoThis() and Foo::DoThat() get renamed. So I can make it work for my own case, although it's a bit ugly (mostly because of the duplication of "Do(.*)" regex in two places, it's not a big deal when it's as simple as that but, of course, it may be rather more hairy). Still, it does work nicely for ignoring stuff, e.g. %rename("$ignore", fullname=1, regextarget=1) \ "NS::Class::Set.*"; saves me a lot of typing as I don't have to exclude dozens of setters manually so I'm happy enough, I just wish I knew about "fullname" before. So I've documented it now and removed the part of the documentation referring to using parentNode inside %rename as this doesn't work. One potential improvement I see would be to use fullname=1 automatically if the rename argument contains "::". At least I don't see how can it be useful to match it against the declaration name itself as this would always fail. Do you think it could be useful to implement this? Thanks, VZ |