Skip to content

Commit f19748a

Browse files
authored
Add warnings for reserved Python keywords in interface members, services and actions (#96)
Signed-off-by: Samuel <[email protected]>
1 parent 8d99de6 commit f19748a

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

rosidl_generator_py/rosidl_generator_py/generate_py_impl.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
# limitations under the License.
1414

1515
from ast import literal_eval
16+
import keyword
1617
import os
1718
import pathlib
19+
import sys
1820

1921
from rosidl_cmake import convert_camel_case_to_lower_case_underscore
2022
from rosidl_cmake import expand_template
@@ -24,14 +26,17 @@
2426
from rosidl_parser.definition import AbstractGenericString
2527
from rosidl_parser.definition import AbstractNestedType
2628
from rosidl_parser.definition import AbstractSequence
29+
from rosidl_parser.definition import Action
2730
from rosidl_parser.definition import Array
2831
from rosidl_parser.definition import BasicType
2932
from rosidl_parser.definition import CHARACTER_TYPES
3033
from rosidl_parser.definition import FLOATING_POINT_TYPES
3134
from rosidl_parser.definition import IdlContent
3235
from rosidl_parser.definition import IdlLocator
3336
from rosidl_parser.definition import INTEGER_TYPES
37+
from rosidl_parser.definition import Message
3438
from rosidl_parser.definition import NamespacedType
39+
from rosidl_parser.definition import Service
3540
from rosidl_parser.parser import parse_idl_file
3641

3742
SPECIAL_NESTED_BASIC_TYPES = {
@@ -73,6 +78,47 @@ def generate_py(generator_arguments_file, typesupport_impls):
7378
idl_file = parse_idl_file(locator)
7479
idl_content.elements += idl_file.content.elements
7580

81+
# NOTE(sam): remove when a language specific name mangling is implemented
82+
83+
def print_warning_if_reserved_keyword(member_name, interface_type, interface_name):
84+
if (keyword.iskeyword(member.name)):
85+
print(
86+
"Member name '{}' in the {} '{}' is a "
87+
'reserved keyword in Python and is not supported '
88+
'at the moment. Please use a different name.'
89+
.format(member_name, interface_type, interface_name),
90+
file=sys.stderr)
91+
92+
for message in idl_content.get_elements_of_type(Message):
93+
for member in message.structure.members:
94+
print_warning_if_reserved_keyword(
95+
member.name, 'message',
96+
message.structure.namespaced_type.name)
97+
98+
for service in idl_content.get_elements_of_type(Service):
99+
for member in service.request_message.structure.members:
100+
print_warning_if_reserved_keyword(
101+
member.name, 'service request',
102+
service.namespaced_type.name)
103+
for member in service.response_message.structure.members:
104+
print_warning_if_reserved_keyword(
105+
member.name, 'service response',
106+
service.namespaced_type.name)
107+
108+
for action in idl_content.get_elements_of_type(Action):
109+
for member in action.goal.structure.members:
110+
print_warning_if_reserved_keyword(
111+
member.name, 'action goal',
112+
action.namespaced_type.name)
113+
for member in action.feedback.structure.members:
114+
print_warning_if_reserved_keyword(
115+
member.name, 'action feedback',
116+
action.namespaced_type.name)
117+
for member in action.result.structure.members:
118+
print_warning_if_reserved_keyword(
119+
member.name, 'action result',
120+
action.namespaced_type.name)
121+
76122
for subfolder in modules.keys():
77123
with open(os.path.join(args['output_dir'], subfolder, '__init__.py'), 'w') as f:
78124
for idl_stem in sorted(modules[subfolder]):

0 commit comments

Comments
 (0)