def get_completion(self, code, offset): token_code = self._tokenize_text(code[:offset]) scopes = self._search_for_scope(token_code) var_segment = self._search_for_completion_segment(token_code) words = var_segment.split('.', 1) words_final = var_segment.rsplit('.', 1) main_attribute = words[0].strip().split('(', 1) attr_name = main_attribute[0] word = '' final_word = '' if var_segment.count(".") > 0: word = words[1].strip() if not var_segment.endswith('.') and len(words_final) > 1: final_word = words_final[1].strip() word = word.rsplit('.', 1)[0].strip() if final_word == word: word = '' self.cdaemon.lock.acquire() module = self.cdaemon.get_module(self.module_id) imports = module.get_imports() result = module.get_type(attr_name, word, scopes) self.cdaemon.lock.release() if result['found'] and result['type'] is not None: prefix = attr_name if result['type'] != attr_name: prefix = result['type'] word = final_word to_complete = "%s.%s" % (prefix, word) if result.get('main_attr_replace', False): to_complete = var_segment.replace(attr_name, result['type'], 1) imports = [imp.split('.')[0] for imp in imports] data = completer.get_all_completions(to_complete, imports) __attrib = [d for d in data.get('attributes', []) if d[:2] == '__'] if __attrib: map(lambda i: data['attributes'].remove(i), __attrib) data['attributes'] += __attrib if data: return data else: result = {'found': None, 'type': None} if result['type'] is not None and len(result['type']) > 0: data = {'attributes': result['type']['attributes'], 'functions': result['type']['functions']} else: clazzes = sorted(set(self.patClass.findall(code))) funcs = sorted(set(self.patFunction.findall(code))) attrs = sorted(set(self.patWords.split(code))) if final_word in attrs: attrs.remove(final_word) if attr_name in attrs: attrs.remove(attr_name) filter_attrs = lambda x: (x not in funcs) and \ not x.isdigit() and (x not in self.keywords) attrs = filter(filter_attrs, attrs) funcs = filter(lambda x: x not in clazzes, funcs) data = {'attributes': attrs, 'functions': funcs, 'classes': clazzes} return data
def _resolve_inheritance(self, clazz, module): for base in clazz.bases: name = base.split('.', 1) main_attr = name[0] child_attrs = '' if len(name) == 2: child_attrs = name[1] result = module.get_type(main_attr, child_attrs) data = model.late_resolution if result.get('found', True): data_type = module.imports[main_attr].get_data_type() if child_attrs: child_attrs = '.%s' % child_attrs name = '%s%s().' % (data_type, child_attrs) imports = module.get_imports() imports = [imp.split('.')[0] for imp in imports] data = completer.get_all_completions(name, imports) data = (name, data) elif result.get('object', False).__class__ is model.Clazz: data = result['object'] clazz.bases[base] = data clazz.update_with_parent_data()
def get_completion(self, code, offset): token_code = self._tokenize_text(code[:offset]) scopes = self._search_for_scope(token_code) var_segment = self._search_for_completion_segment(token_code) words = var_segment.split('.', 1) words_final = var_segment.rsplit('.', 1) main_attribute = words[0].strip().split('(', 1) attr_name = main_attribute[0] word = '' final_word = '' if var_segment.count(".") > 0: word = words[1].strip() if not var_segment.endswith('.') and len(words_final) > 1: final_word = words_final[1].strip() word = word.rsplit('.', 1)[0].strip() if final_word == word: word = '' self.cdaemon.lock.acquire() module = self.cdaemon.get_module(self.module_id) imports = module.get_imports() result = module.get_type(attr_name, word, scopes) self.cdaemon.lock.release() if result['found'] and result['type'] is not None: prefix = attr_name if result['type'] != attr_name: prefix = result['type'] word = final_word to_complete = "%s.%s" % (prefix, word) if result.get('main_attr_replace', False): to_complete = var_segment.replace(attr_name, result['type'], 1) imports = [imp.split('.')[0] for imp in imports] data = completer.get_all_completions(to_complete, imports) __attrib = [d for d in data.get('attributes', []) if d[:2] == '__'] if __attrib: map(lambda i: data['attributes'].remove(i), __attrib) data['attributes'] += __attrib if data: return data else: result = {'found': None, 'type': None} if result['type'] is not None and len(result['type']) > 0: data = { 'attributes': result['type']['attributes'], 'functions': result['type']['functions'] } else: clazzes = sorted(set(self.patClass.findall(code))) funcs = sorted(set(self.patFunction.findall(code))) attrs = sorted(set(self.patWords.split(code))) if final_word in attrs: attrs.remove(final_word) if attr_name in attrs: attrs.remove(attr_name) filter_attrs = lambda x: (x not in funcs) and \ not x.isdigit() and (x not in self.keywords) attrs = filter(filter_attrs, attrs) funcs = filter(lambda x: x not in clazzes, funcs) data = { 'attributes': attrs, 'functions': funcs, 'classes': clazzes } return data