class InheritanceTree(XmlElement): def __init__(self, path): super(InheritanceTree, self).__init__("root") print "Retriving XML tree..." self.regex_parser = RegexParser() nodes = self.get_nodes(path) self.extend(nodes) self.extend(self.get_edges(nodes)) def get_edges(self, nodes): edges = [] for target in nodes: for source in nodes: if self.are_connected(target, source): edges.append(Edge(source, target)) print "Connecting: %s ---> %s" % (source.text, target.text) return edges def are_connected(self, target, source): regex = re.compile(r'[\s\{\}\,\;]'+ source.text + r'[\s\{\}\,\;]+', re.MULTILINE|re.DOTALL) return self.regex_parser.is_in_text(target.tail, regex) def search_for_classes(self, file_abs_path, regexes = {"template":re.compile(".*"), "class":re.compile(".*"), "comment":re.compile(".*")}): clean_text = self.regex_parser.get_text_without_from_file(file_abs_path, regexes["comment"]) clean_text = self.regex_parser.get_text_without(clean_text, regexes["template"]) return self.regex_parser.search_in_text(clean_text, regexes["class"]) def get_nodes(self, path): stored_classes = set() regexes = { "class": re.compile(r'class\s+(?P<name>\w+)[\s\:]+(?P<tail>.*?[\n\{\}\;])', re.MULTILINE), "template": re.compile(r'template\s*<\s*[^\>]*\s*\>', re.MULTILINE), "comment":re.compile(r'(\/\/.*?\n)|(\/\*.*?\*\/)', re.MULTILINE|re.DOTALL), "file_name": re.compile(r'\w+\.(cxx|hxx|cpp|h|c)') } result = [] counter = 0 for root, dirs, files in os.walk(path): for _file in files: if not self.regex_parser.is_in_text(_file, regexes["file_name"]): continue print "Searching in %s..." % _file file_abs_path = "/".join([root, _file]) for record in self.search_for_classes(file_abs_path, regexes): if record["name"] in stored_classes: continue args = {"name":record["name"], "id":counter, "tail":record["tail"]} result.append(Node(args)) stored_classes.add(record["name"]) counter+=1 print " Found %s class" % record["name"] print "Done" return result
def __init__(self, path): super(InheritanceTree, self).__init__("root") print "Retriving XML tree..." self.regex_parser = RegexParser() nodes = self.get_nodes(path) self.extend(nodes) self.extend(self.get_edges(nodes))
class MethodFinder(object): def __init__(self): self.regex_parser = RegexParser() def huj(self, text): regex = re.compile(r'(?P<text>\w+\s+\w+)\(') positions = self.regex_parser.find_positions_in_text(text, regex)
class ImportTree(XmlElement): def __init__(self, path): super(ImportTree, self).__init__("root") print "Retriving XML tree..." self.regex_parser = RegexParser() nodes = self.get_nodes(path) self.extend(nodes) self.extend(self.get_edges(nodes)) def get_edges(self, nodes): edges = [] comment_regex = re.compile(r'(\/\/.*?\n)|(\/\*.*?\*\/)', re.MULTILINE|re.DOTALL) for target in nodes: for source in nodes: if self.are_connected(target, source, comment_regex): edges.append(Edge(source, target)) print "Connecting: %s ---> %s" % (source.text, target.text) return edges def are_connected(self, target, source, comment_regex = re.compile(".*")): clean_target_text = self.regex_parser.get_text_without_from_file(target.path, comment_regex) source_name_regex = re.compile(source.text.replace(".", "\.")) return self.regex_parser.is_in_text(clean_target_text, source_name_regex) def get_nodes(self, path): regex = re.compile(r'(?P<name>\w+)\.(?P<type>cxx|hxx|cpp|h|c)') result = [] counter = 0 for root, dirs, files in os.walk(path): for _file in files: print "Searching in %s..." % _file if not self.regex_parser.is_in_text(_file, regex): continue args = {"dir":root, "name":_file, "id":counter} result.append(Node(args)) counter+=1 print "Found %s" % _file return result
def __init__(self): self.regex_parser = RegexParser()