diff --git a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py index b799aaa7..809a5cfa 100644 --- a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py +++ b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py @@ -13,8 +13,10 @@ # limitations under the License. from ast import literal_eval +import keyword import os import pathlib +import sys from rosidl_cmake import convert_camel_case_to_lower_case_underscore from rosidl_cmake import expand_template @@ -24,6 +26,7 @@ from rosidl_parser.definition import AbstractGenericString from rosidl_parser.definition import AbstractNestedType from rosidl_parser.definition import AbstractSequence +from rosidl_parser.definition import Action from rosidl_parser.definition import Array from rosidl_parser.definition import BasicType from rosidl_parser.definition import CHARACTER_TYPES @@ -31,7 +34,9 @@ from rosidl_parser.definition import IdlContent from rosidl_parser.definition import IdlLocator from rosidl_parser.definition import INTEGER_TYPES +from rosidl_parser.definition import Message from rosidl_parser.definition import NamespacedType +from rosidl_parser.definition import Service from rosidl_parser.parser import parse_idl_file SPECIAL_NESTED_BASIC_TYPES = { @@ -73,6 +78,47 @@ def generate_py(generator_arguments_file, typesupport_impls): idl_file = parse_idl_file(locator) idl_content.elements += idl_file.content.elements + # NOTE(sam): remove when a language specific name mangling is implemented + + def print_warning_if_reserved_keyword(member_name, interface_type, interface_name): + if (keyword.iskeyword(member.name)): + print( + "Member name '{}' in the {} '{}' is a " + 'reserved keyword in Python and is not supported ' + 'at the moment. Please use a different name.' + .format(member_name, interface_type, interface_name), + file=sys.stderr) + + for message in idl_content.get_elements_of_type(Message): + for member in message.structure.members: + print_warning_if_reserved_keyword( + member.name, 'message', + message.structure.namespaced_type.name) + + for service in idl_content.get_elements_of_type(Service): + for member in service.request_message.structure.members: + print_warning_if_reserved_keyword( + member.name, 'service request', + service.namespaced_type.name) + for member in service.response_message.structure.members: + print_warning_if_reserved_keyword( + member.name, 'service response', + service.namespaced_type.name) + + for action in idl_content.get_elements_of_type(Action): + for member in action.goal.structure.members: + print_warning_if_reserved_keyword( + member.name, 'action goal', + action.namespaced_type.name) + for member in action.feedback.structure.members: + print_warning_if_reserved_keyword( + member.name, 'action feedback', + action.namespaced_type.name) + for member in action.result.structure.members: + print_warning_if_reserved_keyword( + member.name, 'action result', + action.namespaced_type.name) + for subfolder in modules.keys(): with open(os.path.join(args['output_dir'], subfolder, '__init__.py'), 'w') as f: for idl_stem in sorted(modules[subfolder]):