diff options
-rw-r--r-- | giscanner/maintransformer.py | 34 | ||||
-rw-r--r-- | tests/scanner/Regress-1.0-expected.gir | 29 | ||||
-rw-r--r-- | tests/scanner/regress.c | 10 | ||||
-rw-r--r-- | tests/scanner/regress.h | 3 |
4 files changed, 69 insertions, 7 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index e6f04684..d9811cfb 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -1023,15 +1023,35 @@ method or constructor of some type.""" uscored_prefix = self._get_uscored_prefix(func, subsymbol) target = self._transformer.lookup_typenode(func.parameters[0].type) - func.instance_parameter = func.parameters.pop(0) - self._namespace.float(func) - - if not func.is_method: + if not func.is_method and not subsymbol.startswith(uscored_prefix + '_'): + # Uh oh! This function starts with uscored_prefix, but not + # uscored_prefix + '_', so if we split, we're splitting on something + # which is not _ + # Examples of this are g_resources_register() (splits as + # g_resource + _register) and gdk_events_get_angle() (splits as + # gdk_event + _get_angle). + # As the C name suggests, these are not methods, but for backward + # compatibility reasons we need to create a method with the old + # name, and a moved-to annotation pointing to the new variant. + + newfunc = func.clone() + newfunc.moved_to = func.name + newfunc.instance_parameter = newfunc.parameters.pop(0) subsym_idx = func.symbol.find(subsymbol) - func.name = func.symbol[(subsym_idx + len(uscored_prefix) + 1):] - func.is_method = True + newfunc.name = func.symbol[(subsym_idx + len(uscored_prefix) + 1):] + newfunc.is_method = True + + target.methods.append(newfunc) + else: + func.instance_parameter = func.parameters.pop(0) + self._namespace.float(func) + + if not func.is_method: + subsym_idx = func.symbol.find(subsymbol) + func.name = func.symbol[(subsym_idx + len(uscored_prefix) + 1):] + func.is_method = True - target.methods.append(func) + target.methods.append(func) def _get_uscored_prefix(self, func, subsymbol): # Here we check both the c_symbol_prefix and (if that fails), diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir index 5ba2be8b..d25e41c8 100644 --- a/tests/scanner/Regress-1.0-expected.gir +++ b/tests/scanner/Regress-1.0-expected.gir @@ -2140,6 +2140,18 @@ use it should be.</doc> </parameter> </parameters> </constructor> + <method name="_not_a_method" + c:identifier="regress_test_boxeds_not_a_method" + moved-to="test_boxeds_not_a_method"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <instance-parameter name="boxed" transfer-ownership="none"> + <type name="TestBoxed" c:type="RegressTestBoxed*"/> + </instance-parameter> + </parameters> + </method> <method name="copy" c:identifier="regress_test_boxed_copy"> <return-value transfer-ownership="full"> <type name="TestBoxed" c:type="RegressTestBoxed*"/> @@ -5109,6 +5121,23 @@ libgnome-keyring.</doc> </parameter> </parameters> </function> + <function name="test_boxeds_not_a_method" + c:identifier="regress_test_boxeds_not_a_method"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="boxed" transfer-ownership="none"> + <type name="TestBoxed" c:type="RegressTestBoxed*"/> + </parameter> + </parameters> + </function> + <function name="test_boxeds_not_a_static" + c:identifier="regress_test_boxeds_not_a_static"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </function> <function name="test_cairo_context_full_return" c:identifier="regress_test_cairo_context_full_return"> <return-value transfer-ownership="full"> diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c index 4507bc6c..1bad36e3 100644 --- a/tests/scanner/regress.c +++ b/tests/scanner/regress.c @@ -1872,6 +1872,16 @@ regress_test_boxed_equals (RegressTestBoxed *boxed, regress_test_simple_boxed_a_equals(&other->nested_a, &boxed->nested_a)); } +void +regress_test_boxeds_not_a_method (RegressTestBoxed *boxed) +{ +} + +void +regress_test_boxeds_not_a_static (void) +{ +} + static void regress_test_boxed_free (RegressTestBoxed *boxed) { diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h index e6ae1c22..ad2cb1fb 100644 --- a/tests/scanner/regress.h +++ b/tests/scanner/regress.h @@ -426,6 +426,9 @@ RegressTestBoxed *regress_test_boxed_copy (RegressTestBoxed *boxed); gboolean regress_test_boxed_equals (RegressTestBoxed *boxed, RegressTestBoxed *other); +void regress_test_boxeds_not_a_method (RegressTestBoxed *boxed); +void regress_test_boxeds_not_a_static (void); + typedef struct _RegressTestBoxedB RegressTestBoxedB; struct _RegressTestBoxedB |