def traverse_members(self, view, pos, full = False): filename = self.currentfile line = view.line(pos) line.b=pos line=view.substr(line) oldline="" while oldline != line: oldline = line line = re.sub(r'\[[^\[]*\]', '', line) self.debug(line) line = re.split(',|&|;|!|\+|\(|\[|\s+', line.strip())[-1].strip() self.debug(line) chain = [x.split("[", 1)[0] for x in re.split('->|\.|::', line.strip())] self.debug(chain) func = self.current_function(view) if not filename in self.cc.functiontokens or not func in self.cc.functiontokens[filename]: self.debug("Not in a filled function (%s, %s)" % (filename, func)) return [] tokens = [x for x in self.cc.functiontokens[filename][func] if x[Tokenizer.T_NAME] == chain[0]] token = None if len(tokens) > 0: token = tokens[0] else: token = self.cc.tokens[chain[0]] if not token or token[Tokenizer.T_KIND] != Tokenizer.K_VARIABLE: return [] type="" self.debug("Token: %s" % str(token)) if token[Tokenizer.T_KIND] == Tokenizer.K_PARAM: type = token[Tokenizer.T_EXTRA]["type"] elif 'typeref' in token[Tokenizer.T_EXTRA]: type = token[Tokenizer.T_EXTRA]['typeref'] if type[0:7] == "struct:": type=type[7:] elif type[0:6] == "union:": type=type[6:] else: type = Tokenizer.parsevariable(token[Tokenizer.T_SEARCH])[1] type = self.get_base_type(type) self.debug("type: %s" % str(type)) pchain = chain[1:] if not full: pchain = pchain[0:-1] for newtype in pchain: type = type + "::" + newtype type = self.get_base_type(type) self.debug("type: %s" % str(type)) members = self.cc.search_tokens(type + "::") goodmembers = self.filter_members(members,type) return goodmembers
def traverse_members(self, view, pos, full = False): filename = self.currentfile line = view.line(pos) line.b=pos line=view.substr(line) oldline="" while oldline != line: oldline = line line = re.sub(r'\[[^\[]*\]', '', line) print(line) line = re.split(',|;|\(|\[|\s+', line.strip())[-1].strip() print(line) chain = [x.split("[", 1)[0] for x in re.split('->|\.|::', line.strip())] print(chain) func = self.current_function(view) if not filename in self.cc.functiontokens or not func in self.cc.functiontokens[filename]: print("Not in a filled function (%s, %s)" % (filename, func)) return [] tokens = [x for x in self.cc.functiontokens[filename][func] if x[Tokenizer.T_NAME] == chain[0]] token = None if len(tokens) > 0: token = tokens[0] else: token = self.cc.tokens[chain[0].lower()] if not token or token[Tokenizer.T_KIND] != Tokenizer.K_VARIABLE: return [] type="" if token[Tokenizer.T_KIND] == Tokenizer.K_PARAM: type = token[Tokenizer.T_EXTRA]["type"] else: type = Tokenizer.parsevariable(token[Tokenizer.T_SEARCH])[1] type = self.get_base_type(type) pchain = chain[1:] if not full: pchain = pchain[0:-1] for newtype in pchain: type = type + "::" + newtype type = self.get_base_type(type) members = self.cc.search_tokens(type + "::") goodmembers = [x for x in members if x[Tokenizer.T_NAME][len(type)+2:].find("::") == -1] return goodmembers