コード例 #1
0
 def case_five(self, view_information, query_description, extra={}):
     ################################################################
     #		<level> [<level_index>] <adjective> (argument <argument_index>|caller [<sub_index>])
     ###############################################################
     selection = self._get_selection(view_information, extra)
     build = self.general_build if self.general_build else line_partial(
         self.code, selection[0])
     if not build or not build[0]:
         return None, None
     root, atok, m, r = build
     selection = m.forward(selection)
     origin = nearest_node_from_offset(
         root, atok,
         selection[0]) if selection[0] == selection[1] else node_from_range(
             root, atok, selection)
     statement_node = self.get_statement(origin, atok)
     priority = {}
     if query_description["level_index"] == 0:
         query_description["level_index"] = -1
     _, calling_parents = search_upwards_log(origin,
                                             targets=ast.stmt,
                                             log_targets=(ast.Call))
     index = query_description["level_index"]
     if index < len(calling_parents):
         priority["child_level"] = 1
         origin = calling_parents[index]
     result, alternatives = self.process_line(
         q=query_description,
         root=statement_node,
         atok=atok,
         origin=origin,
         select_node=origin if selection[0] != selection[1] else None,
         tiebreaker=lambda x: tiebreak_on_lca(statement_node, origin, x),
         priority=priority)
     return self._backward_result(result, alternatives, build)
コード例 #2
0
    def case_three(self, view_information, query_description, extra={}):
        ################################################################
        # <vertical_abstract_only_direction> [<ndir>] <big_roi> [<big_roi_sub_index>]
        ###############################################################
        build, selection, origin, definition_node = self.preliminary(
            view_information, query_description, extra)
        targets, exclusions, information = self.decode(query_description,
                                                       build)
        root, atok, m, r = build
        temporary_information = lambda x: information(x) if match_node(
            x, targets, exclusions) and generic_fix(x, atok) else None

        direction = query_description["vertical_direction"]
        ndir = query_description["ndir"]
        row, column = view_information["rowcol"](m.backward(selection)[0])

        # bug fixing
        test_result = decode_abstract_vertical(root,
                                               atok,
                                               targets,
                                               row + 1,
                                               1,
                                               direction,
                                               True,
                                               temporary_information,
                                               want_alternatives=False)
        l = search_upwards_log(origin, ast.stmt)
        if (test_result in [l[0]] + l[1]
                and row + 1 >= test_result.first_token.start[0]
                and row + 1 <= test_result.last_token.end[0]):

            ndir = ndir + 1

        result, alternatives = decode_abstract_vertical(root,
                                                        atok,
                                                        targets,
                                                        row + 1,
                                                        ndir,
                                                        direction,
                                                        True,
                                                        temporary_information,
                                                        want_alternatives=True)

        if result:
            new_definition_node = search_upwards(result, ast.FunctionDef)
            if definition_node is not new_definition_node and new_definition_node is not None:
                alternatives = tiebreak_on_lca(
                    new_definition_node, result,
                    find_all_nodes(new_definition_node, targets, exclusions))

        result, alternatives = obtain_result(result, alternatives)
        information = getattr(information, "secondary", information)
        result = information(result) if result else None
        alternatives = [information(x)
                        for x in alternatives] if alternatives else []
        return self._backward_result(result, alternatives, build)
コード例 #3
0
    def case_one(self, v, q):
        """	
				<adjective> argument <argument_index> 
		"""
        selection = v["selection"]
        build = self.general_build if self.general_build else line_partial(
            selection[0])
        print(build)
        if not build:
            return None, None
        root, atok, m, r = build
        selection = m.forward(selection)

        # after build we set up some variables
        result = None
        alternatives = None

        origin = nearest_node_from_offset(root, atok, selection[0])
        calling_node = search_upwards(origin, ast.Call)
        statement_node, callers = search_upwards_log(origin,
                                                     ast.stmt,
                                                     log_targets=ast.Call)
        information = lambda x: info.get_argument_from_call(
            x, q["argument_index"] - 1)
        candidates = sorted_by_source_region(
            atok, find_matching(statement_node, info.identity(information)))
        every_caller = find_all_nodes(statement_node, (ast.Call))

        ################################################################
        # if no adjective is given
        ################################################################
        if q["adjective"] == "None":
            if calling_node:
                result = information(calling_node)
            candidates = [
                information(x)
                for x in tiebreak_on_lca(statement_node, origin, candidates)
                if x != calling_node
            ]
            result, alternatives = obtain_result(result, candidates)

        ################################################################
        # adjective is even
        ################################################################
        if q["adjective"] != "None":
            additional_parameters = {}
            if selection[0] != selection[1]:
                small_root = node_from_range(root, atok, selection)
                additional_parameters["small_root"] = small_root
                print("dumping the small root\n", ast.dump(small_root))
            additional_parameters["special"] = [calling_node]
            if calling_node:
                print(ast.dump(calling_node))
                additional_parameters["penalized"] = [calling_node]
            result, alternatives = adjective_strategy(
                atok=atok,
                root=root,
                adjective_word=q["adjective"],
                level_nodes=every_caller,
                information_nodes=candidates,
                **additional_parameters)
            result = information(result) if result else m.forward(
                v["selection"])
            alternatives = [information(x)
                            for x in alternatives] if alternatives else []

        # translate those nodes back to offsets and forward them through the modification under
        print("\n\nnow finally printing result and alternatives\n\n")
        print(result)
        print(
            ast.dump(result) if isinstance(result, ast.AST
                                           ) else " not known node")
        print(alternatives)
        result = m.backward(get_source_region(atok, result))
        alternatives = [
            m.backward(get_source_region(atok, x)) for x in alternatives
        ]
        return result, alternatives
コード例 #4
0
    def process_line(self,
                     q,
                     root,
                     atok,
                     origin=None,
                     select_node=None,
                     tiebreaker=lambda x: x,
                     line=None,
                     transformation=None,
                     inverse_transformation=None,
                     priority={},
                     constrained_space=(),
                     second_tiebreaker=None,
                     invert_then_tiebreak=True):
        result = None
        alternatives = None
        additional_parameters = {"priority": priority}
        if constrained_space:
            additional_parameters["constrained_space"] = constrained_space

        information = self.get_information(q)
        information_nodes = sorted_by_source_region(
            atok, find_matching(root, information))

        if origin:
            calling_node = search_upwards(origin, ast.Call)
            statement_node, callers = search_upwards_log(origin,
                                                         ast.stmt,
                                                         log_targets=ast.Call)

        every_caller = find_all_nodes(root, (ast.Call))
        additional = find_all_nodes(root, (ast.Tuple, ast.List, ast.ListComp))
        if additional:
            additional_parameters["additional_level_nodes"] = additional
            additional_parameters["try_alternative"] = True

        ################################################################
        # go to handle the special Casey's
        ################################################################
        if transformation:
            temporary = {transformation(x) for x in information_nodes}
            information_nodes = sorted_by_source_region(
                atok, [x for x in temporary if x])

        ################################################################
        # if no adjective is given
        ################################################################
        if "nth" not in q:
            if origin and calling_node:
                result = calling_node if calling_node in information_nodes else None
                information_nodes = [
                    x for x in tiebreaker(information_nodes)
                    if x is not calling_node
                ]
            else:
                result = None
                information_nodes = [x for x in tiebreaker(information_nodes)]
            result, alternatives = obtain_result(result, information_nodes)

        ################################################################
        # adjective is given
        ################################################################
        if "nth" in q:
            additional_parameters["small_root"] = select_node
            if origin and calling_node:
                additional_parameters["penalized"] = [
                    calling_node
                ] if calling_node else []
                additional_parameters["special"] = [calling_node]
            result, alternatives = adjective_strategy(
                atok=atok,
                root=root,
                adjective_word=q["nth"],
                level_nodes=every_caller,
                information_nodes=information_nodes,
                **additional_parameters)

        ##############################################################
        # reverse transformation if any
        ##############################################################
        if transformation:
            helpful = [result] if result else []
            if alternatives:
                helpful.extend(alternatives)
            if invert_then_tiebreak:
                temporary = make_flat(
                    [tiebreaker(inverse_transformation(x)) for x in helpful])
            else:
                temporary = tiebreaker(
                    make_flat([inverse_transformation(x) for x in helpful]))
            result, alternatives = obtain_result(None, temporary)

        ################################################################
        # Extract information
        ################################################################
        if line and result and alternatives:
            temporary = [result] + alternatives
            temporary = [(i, x) for i, x in enumerate(temporary)]
            temporary = sorted(
                temporary,
                key=lambda x: (atok._line_numbers.offset_to_line(
                    get_source_region(atok, x[1])[0])[0] != line, x[0]))
            temporary = [x[1] for x in temporary]
            result, alternatives = obtain_result(None, temporary)

        if result and second_tiebreaker:
            alternatives = second_tiebreaker(result, alternatives)

        if self.global_constrained_space:
            inside = lambda x, y: (y[0] <= x[0] < y[1] and y[0] < x[1] <= y[1])
            result = result if inside(get_source_region(atok, result),
                                      self.global_constrained_space) else None
            alternatives = [
                x for x in alternatives if inside(
                    get_source_region(atok, x), self.global_constrained_space)
            ]
            result, alternatives = obtain_result(result, alternatives)

        result = information(result) if result else None
        alternatives = [information(x)
                        for x in alternatives] if alternatives else []
        return result, alternatives