Exemplo n.º 1
0
    def visit_file(self, file_dir):
        cur_class = None
        cur_func = None
        func_cross_line = False

        with open(file_dir) as fp:
            for line in fp:
                # independent function
                if re.match(r"^def .+:", line):
                    cur_class = self.add_class(cur_class, file_dir)

                    """ extract function name """
                    func_name = _extract_func_name(line)
                    f = func(func_name)

                    """ extract arguments of function """
                    args = _extract_args(line)

                    f.args = args
                    if file_dir.replace(self.dir, "") not in self.file_funcs:
                        self.file_funcs[file_dir.replace(self.dir, "")] = [f]
                    else:
                        self.file_funcs[file_dir.replace(self.dir, "")].append(f)

                # function within a class or function with more indentations
                elif re.search(r"\s+def .+:", line):
                    if line.find("(") != -1 and line.find(")") != -1:
                        """extract function name"""
                        func_name = _extract_func_name(line)
                        f = func(func_name)

                        """ extract arguments of function """
                        args = _extract_args(line)
                        f.args = args

                        if cur_class != None and line.find("self") != -1:
                            cur_class.add_func(f)

                    # function header that occupies at leaset 2 lines
                    elif line.find("(") != -1:
                        """extract function name"""
                        func_name = _extract_func_name(line)
                        f = func(func_name)
                        """ extract arguments of function """
                        args = _extract_args(line)
                        f.args = args
                        cur_func = f

                        func_cross_line = True

                # class
                elif re.search(r"\s*class .+:", line):
                    cur_class = self.add_class(cur_class, file_dir)
                    class_name = _extract_class_name(line)
                    cur_class = Class(class_name)

                elif func_cross_line:
                    args = _extract_args(line)
                    if cur_func != None:
                        for arg in args:
                            cur_func.add_arg(arg)
                    if line.find(")") != -1:
                        func_cross_line = False
                        if cur_class != None and line.find("self") != -1:
                            cur_class.add_func(cur_func)
                        cur_func = None
            fp.close()