diff options
| -rw-r--r-- | find-modules/sip_generator.py | 20 | ||||
| -rw-r--r-- | tests/GenerateSipBindings/cpplib.h | 10 | ||||
| -rw-r--r-- | tests/GenerateSipBindings/testscript.py | 9 | 
3 files changed, 30 insertions, 9 deletions
diff --git a/find-modules/sip_generator.py b/find-modules/sip_generator.py index ca5f550b..5311e8c5 100644 --- a/find-modules/sip_generator.py +++ b/find-modules/sip_generator.py @@ -159,11 +159,8 @@ class SipGenerator(object):          return body, self.tu.get_includes      CONTAINER_SKIPPABLE_UNEXPOSED_DECL = re.compile("_DECLARE_PRIVATE|friend|;") -    FN_SKIPPABLE_ATTR = re.compile("_EXPORT|Q_REQUIRED_RESULT|format\(printf") -    VAR_SKIPPABLE_ATTR = re.compile("_EXPORT") -    TYPEDEF_SKIPPABLE_ATTR = re.compile("_EXPORT") -    def skippable_attribute(self, parent, member, text, skippable_re): +    def skippable_attribute(self, parent, member, text, sip):          """          We don't seem to have access to the __attribute__(())s, but at least we can look for stuff we care about. @@ -172,7 +169,10 @@ class SipGenerator(object):          """          if member.kind != CursorKind.VISIBILITY_ATTR:              return False -        if skippable_re.search(text): +        if member.spelling == "hidden": +            if self.dump_privates: +                logger.debug("Ignoring private {}".format(SipGenerator.describe(parent))) +            sip["name"] = ""              return True          return False @@ -488,8 +488,9 @@ class SipGenerator(object):                  template_parameters.append(child.type.spelling + " " + child.displayname)              else:                  text = self._read_source(child.extent) -                if self.skippable_attribute(function, child, text, SipGenerator.FN_SKIPPABLE_ATTR): -                    pass +                if self.skippable_attribute(function, child, text, sip): +                    if not sip["name"]: +                        return ""                  else:                      SipGenerator._report_ignoring(function, child)          # @@ -697,8 +698,9 @@ class SipGenerator(object):                  pass              else:                  text = self._read_source(child.extent) -                if self.skippable_attribute(variable, child, text, SipGenerator.VAR_SKIPPABLE_ATTR): -                    pass +                if self.skippable_attribute(variable, child, text, sip): +                    if not sip["name"]: +                        return ""                  else:                      SipGenerator._report_ignoring(variable, child)          # diff --git a/tests/GenerateSipBindings/cpplib.h b/tests/GenerateSipBindings/cpplib.h index a91b5486..b3ea22a8 100644 --- a/tests/GenerateSipBindings/cpplib.h +++ b/tests/GenerateSipBindings/cpplib.h @@ -203,3 +203,13 @@ enum __attribute__((visibility("default"))) EnumWithAttributes {      Foo,      Bar = 2  }; + +#define EXPORT __attribute__((visibility("default"))) +#define NO_EXPORT __attribute__((visibility("hidden"))) + +class EXPORT Visible +{ +public: +  EXPORT int visible_fn() { return 1; } +  NO_EXPORT int invisible_fn() { return 1; } +}; diff --git a/tests/GenerateSipBindings/testscript.py b/tests/GenerateSipBindings/testscript.py index e79706bc..98443d53 100644 --- a/tests/GenerateSipBindings/testscript.py +++ b/tests/GenerateSipBindings/testscript.py @@ -121,3 +121,12 @@ assert(PyTest.CppLib.anotherCustomMethod([2, 3, 5]) == 52)  sdo = PyTest.CppLib.SubdirObject()  assert(sdo.mul(5, 6) == 30) + +visible = PyTest.CppLib.Visible() +assert visible.visible_fn() + +try: +    assert visible.invisible_fn() +    assert False +except AttributeError as e: +    assert str(e) == "'Visible' object has no attribute 'invisible_fn'"  | 
