Ejemplo n.º 1
0
 def extract_primitives(self, node, gs, analysis, rosmodel):
     for call in (CodeQuery(gs).all_calls.where_name(
             "advertise").where_result("ros::Publisher").get()):
         name = analysis._extract_topic(call)
         msg_type = analysis._extract_message_type(call)
         queue_size = analysis._extract_queue_size(call)
         pub = publisher(name, msg_type)
         rosmodel.pubs.append(pub)
     for call in (CodeQuery(gs).all_calls.where_name(
             "subscribe").where_result("ros::Subscriber").get()):
         name = analysis._extract_topic(call)
         msg_type = analysis._extract_message_type(call)
         queue_size = analysis._extract_queue_size(call)
         sub = subscriber(name, msg_type)
         rosmodel.subs.append(sub)
     for call in (CodeQuery(gs).all_calls.where_name(
             "advertiseService").where_result("ros::ServiceServer").get()):
         name = analysis._extract_topic(call)
         srv_type = analysis._extract_message_type(call)
         srv_server = service_server(name, srv_type)
         rosmodel.srvsrvs.append(srv_server)
     for call in (CodeQuery(gs).all_calls.where_name(
             "serviceClient").where_result("ros::ServiceClient").get()):
         name = analysis._extract_topic(call)
         srv_type = analysis._extract_message_type(call)
         srv_client = service_client(name, srv_type)
         rosmodel.srvcls.append(srv_client)
Ejemplo n.º 2
0
 def _query_param_primitives(self, node, gs):
     ros_prefix = "c:@N@ros@N@param@"
     reads = ("get", "getCached", "param", "has")
     for call in CodeQuery(gs).all_calls.where_name(reads).get():
         if (call.full_name.startswith("ros::param")
                 or (isinstance(call.reference, str)
                     and call.reference.startswith(ros_prefix))):
             self._on_read_param(node, "", call)
     for call in (CodeQuery(gs).all_calls.where_name("search")
                  .where_result("bool").get()):
         if (call.full_name.startswith("ros::param")
                 or (isinstance(call.reference, str)
                     and call.reference.startswith(ros_prefix))):
             if len(call.arguments) > 2:
                 ns = resolve_expression(call.arguments[0])
                 if not isinstance(ns, basestring):
                     ns = "?"
             else:
                 ns = "~"
             self._on_read_param(node, ns, call)
     writes = ("set", "del")
     for call in CodeQuery(gs).all_calls.where_name(writes).get():
         if (call.full_name.startswith("ros::param")
                 or (isinstance(call.reference, str)
                     and call.reference.startswith(ros_prefix))):
             self._on_write_param(node, "", call)
Ejemplo n.º 3
0
 def _query_comm_primitives(self, node, gs):
     for call in (CodeQuery(gs).all_calls.where_name("advertise")
                  .where_result("ros::Publisher").get()):
         self._on_publication(node, self._resolve_node_handle(call), call)
     for call in (CodeQuery(gs).all_calls.where_name("subscribe")
                  .where_result("ros::Subscriber").get()):
         self._on_subscription(node, self._resolve_node_handle(call), call)
     for call in (CodeQuery(gs).all_calls.where_name("advertiseService")
                  .where_result("ros::ServiceServer").get()):
         self._on_service(node, self._resolve_node_handle(call), call)
     for call in (CodeQuery(gs).all_calls.where_name("serviceClient")
                  .where_result("ros::ServiceClient").get()):
         self._on_client(node, self._resolve_node_handle(call), call)
Ejemplo n.º 4
0
 def _query_nh_param_primitives(self, node, gs):
     nh_prefix = "c:@N@ros@S@NodeHandle@"
     reads = ("getParam", "getParamCached", "param", "hasParam", "searchParam")
     for call in CodeQuery(gs).all_calls.where_name(reads).get():
         if (call.full_name.startswith("ros::NodeHandle")
                 or (isinstance(call.reference, str)
                     and call.reference.startswith(nh_prefix))):
             self._on_read_param(node, self._resolve_node_handle(call), call)
     writes = ("setParam", "deleteParam")
     for call in CodeQuery(gs).all_calls.where_name(writes).get():
         if (call.full_name.startswith("ros::NodeHandle")
                 or (isinstance(call.reference, str)
                     and call.reference.startswith(nh_prefix))):
             self._on_write_param(node, self._resolve_node_handle(call), call)
Ejemplo n.º 5
0
    def find_star(self, node, module_name):
        if isinstance(node, basestring):
            node = self.parser._parse_file(node)[0]

        top_level_definitions = (CodeQuery(node)
                                 .definitions
                                 .get())
        try:
            all_star = next(
                    definition
                    for definition in top_level_definitions
                    if definition.name == '__all__'
            )
            return (
                '{}.{}'.format(module_name, getattr(item, 'value', item))
                for item in all_star.value
            )
        except StopIteration:
            pass

        top_level_names = (
            '{}.{}'.format(module_name, entity.name)
            for entity in top_level_definitions
        )
        return top_level_names
    def extract_primitives(self, node, gs, analysis, rosmodel, roscomponent,
                           pkg_name, node_name, art_name):

        for call in (CodeQuery(gs).all_calls.where_name(
                "advertise").where_result("ros::Publisher").get()):
            if len(call.arguments) > 1:
                name = analysis._extract_topic(call)
                msg_type = analysis._extract_message_type(call)
                queue_size = analysis._extract_queue_size(call)
                pub = publisher(name, msg_type)
                rosmodel.pubs.append(pub)
                roscomponent.add_interface(
                    name, "pubs",
                    pkg_name + "." + art_name + "." + node_name + "." + name)
        for call in (CodeQuery(gs).all_calls.where_name(
                "subscribe").where_result("ros::Subscriber").get()):
            if len(call.arguments) > 1:
                name = analysis._extract_topic(call)
                msg_type = analysis._extract_message_type(call)
                queue_size = analysis._extract_queue_size(call)
                sub = subscriber(name, msg_type)
                rosmodel.subs.append(sub)
                roscomponent.add_interface(
                    name, "subs",
                    pkg_name + "." + art_name + "." + node_name + "." + name)
        for call in (CodeQuery(gs).all_calls.where_name(
                "advertiseService").where_result("ros::ServiceServer").get()):
            if len(call.arguments) > 1:
                name = analysis._extract_topic(call)
                srv_type = analysis._extract_message_type(call)
                srv_server = service_server(name, srv_type)
                rosmodel.srvsrvs.append(srv_server)
                roscomponent.add_interface(
                    name, "srvsrvs",
                    pkg_name + "." + art_name + "." + node_name + "." + name)
        for call in (CodeQuery(gs).all_calls.where_name(
                "serviceClient").where_result("ros::ServiceClient").get()):
            if len(call.arguments) > 1:
                name = analysis._extract_topic(call)
                srv_type = analysis._extract_message_type(call)
                srv_client = service_client(name, srv_type)
                rosmodel.srvcls.append(srv_client)
                roscomponent.add_interface(
                    name, "srvcls",
                    pkg_name + "." + art_name + "." + node_name + "." + name)
Ejemplo n.º 7
0
 def extract_primitives(self, node, parser, analysis, rosmodel,
                        roscomponent, pkg_name, node_name, art_name):
     gs = parser.global_scope
     node.source_tree = parser.global_scope
     if node.language == "cpp":
         for call in (CodeQuery(gs).all_calls.where_name(
                 "SimpleActionServer").get()):
             if len(call.arguments) > 0:
                 name = analysis._extract_action(call)
                 action_type = analysis._extract_action_type(call).split(
                     "_<", 1)[0]
                 act_server = action_server(name, action_type)
                 rosmodel.actsrvs.append(act_server)
                 roscomponent.add_interface(
                     name, "actsrvs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name(
                 "SimpleActionClient").get()):
             if len(call.arguments) > 0:
                 name = analysis._extract_action(call)
                 action_type = analysis._extract_action_type(call).split(
                     "_<", 1)[0]
                 act_client = action_client(name, action_type)
                 rosmodel.actcls.append(act_client)
                 roscomponent.add_interface(
                     name, "actcls",
                     str(pkg_name) + "." + str(art_name) + "." +
                     str(node_name) + "." + str(name))
         for call in (CodeQuery(gs).all_calls.where_name(
                 "advertise").where_result("ros::Publisher").get()):
             if len(call.arguments) > 1:
                 name = analysis._extract_topic(call, topic_pos=0)
                 msg_type = analysis._extract_message_type(call)
                 queue_size = analysis._extract_queue_size(call,
                                                           queue_pos=1)
                 pub = publisher(name, msg_type)
                 rosmodel.pubs.append(pub)
                 roscomponent.add_interface(
                     name, "pubs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name(
                 "subscribe").where_result("ros::Subscriber").get()):
             if len(call.arguments) > 1:
                 name = analysis._extract_topic(call, topic_pos=0)
                 msg_type = analysis._extract_message_type(call)
                 queue_size = analysis._extract_queue_size(call,
                                                           queue_pos=1)
                 sub = subscriber(name, msg_type)
                 rosmodel.subs.append(sub)
                 roscomponent.add_interface(
                     name, "subs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name("advertiseService")
                      .where_result("ros::ServiceServer").get()):
             if len(call.arguments) > 1:
                 name = analysis._extract_topic(call)
                 srv_type = analysis._extract_message_type(call)
                 srv_server = service_server(name, srv_type)
                 rosmodel.srvsrvs.append(srv_server)
                 roscomponent.add_interface(
                     name, "srvsrvs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name(
                 "serviceClient").where_result("ros::ServiceClient").get()):
             if len(call.arguments) > 1:
                 name = analysis._extract_topic(call)
                 srv_type = analysis._extract_message_type(call)
                 srv_client = service_client(name, srv_type)
                 rosmodel.srvcls.append(srv_client)
                 roscomponent.add_interface(
                     name, "srvcls", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
     if node.language == "py":
         msgs_list = []
         for i in parser.imported_names_list:
             if "msg" in str(i) or "srv" in str(i):
                 msgs_list.append((i.split(".")[0], i.split(".")[2]))
         for call in (CodeQuery(gs).all_calls.where_name(
             ('Publisher', 'rospy.Publisher'))).get():
             if len(call.arguments) > 1:
                 ns, name = analysis._extract_topic(call)
                 msg_type = analysis._extract_message_type(
                     call, 'data_class', msgs_list)
                 queue_size = analysis._extract_queue_size(call)
                 pub = publisher(name, msg_type)
                 rosmodel.pubs.append(pub)
                 roscomponent.add_interface(
                     name, "pubs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name(
             ('Subscriber', 'rospy.Subscriber'))).get():
             if len(call.arguments) > 1:
                 ns, name = analysis._extract_topic(call)
                 msg_type = analysis._extract_message_type(
                     call, 'data_class', msgs_list)
                 queue_size = analysis._extract_queue_size(call)
                 sub = subscriber(name, msg_type)
                 rosmodel.subs.append(sub)
                 roscomponent.add_interface(
                     name, "subs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name(
                 analysis.all_rospy_names('service-def'))).get():
             if len(call.arguments) > 1:
                 ns, name = analysis._extract_topic(call)
                 srv_type = analysis._extract_message_type(
                     call, 'service_class', msgs_list)
                 srv_server = service_server(name, srv_type)
                 rosmodel.srvsrvs.append(srv_server)
                 roscomponent.add_interface(
                     name, "srvsrvs", pkg_name + "." + art_name + "." +
                     node_name + "." + name)
         for call in (CodeQuery(gs).all_calls.where_name(
                 analysis.all_rospy_names('service-call'))).get():
             if len(call.arguments) > 1:
                 ns, name = analysis._extract_topic(call)
                 srv_type = analysis._extract_message_type(
                     call, 'service_class', msgs_list)
                 srv_client = service_client(name, srv_type)
                 rosmodel.srvcls.append(srv_client)
                 roscomponent.add_interface(
                     name, "srvcls", pkg_name + "." + art_name + "." +
                     node_name + "." + name)