From: Alexis Laferrière Date: Wed, 2 Sep 2015 19:22:03 +0000 (-0400) Subject: contrib/objcwrapper: avoid conflicts with Nit keywords and top-level methods X-Git-Tag: v0.7.8~42^2~3 X-Git-Url: http://nitlanguage.org contrib/objcwrapper: avoid conflicts with Nit keywords and top-level methods Signed-off-by: Alexis Laferrière --- diff --git a/contrib/objcwrapper/src/objc_generator.nit b/contrib/objcwrapper/src/objc_generator.nit index 925bf06..d6be6f5 100644 --- a/contrib/objcwrapper/src/objc_generator.nit +++ b/contrib/objcwrapper/src/objc_generator.nit @@ -16,6 +16,7 @@ module objc_generator import opts +import gen_nit import objc_model @@ -240,6 +241,8 @@ end if name == "init" then name = "" + name = name.to_nit_name(property=true, pointer=true) + # If class method, prefix with class name if method.is_class_property then name = "{method.objc_class.name.to_snake_case}_{name}" @@ -253,7 +256,7 @@ end var params = new Array[String] for param in method.params do if param.is_single then break - params.add "{param.variable_name}: {param.return_type.objc_to_nit_type}" + params.add "{param.nit_variable_name}: {param.return_type.objc_to_nit_type}" end var params_with_par = "" @@ -279,7 +282,7 @@ end var params = new Array[String] for param in method.params do if not param.is_single then - params.add "{param.name}: {param.variable_name}" + params.add "{param.name}: {param.nit_variable_name}" else params.add param.name end @@ -301,7 +304,7 @@ end var params = new Array[String] for param in method.params do if not param.is_single then - params.add "{param.name}: {param.variable_name}" + params.add "{param.name}: {param.nit_variable_name}" else params.add param.name end @@ -330,6 +333,24 @@ redef class Text return to_s end end + + # Convert to a safe Nit name for a `property`, a property in a subclass of `pointer` or a variable + private fun to_nit_name(property, pointer: nullable Bool): String + do + var name = to_s + name = name.to_snake_case + + while not name.is_empty and name.chars.first == '_' do name = name.substring_from(1) + + if keywords.has(name) then name = name + "0" + + if property == true then + if methods_in_object.has(name) then name = name + "0" + if pointer == true and methods_in_pointer.has(name) then name = name + "0" + end + + return name.to_s + end end redef class ObjcProperty @@ -356,3 +377,8 @@ end redef class ObjcAttribute redef fun doc do return "\t# Wraps: `{objc_class.name}.{name}`" end + +redef class ObjcParam + # `variable_name` mangled for the Nit language + private fun nit_variable_name: String do return variable_name.to_nit_name +end