def __on_typeview_row_activated(self, treeView, path, column, userData=None): storage = self.get_index_storage() treeStore = treeView.get_model() className, = treeStore.get(treeStore.get_iter(path), 0) namespace, className = get_namespace_by_classname(className) filePath, line, column = storage.get_class_position(namespace, className) self.open_by_position(filePath, line, column)
def _sortKeyForProposal(self, proposal): key = None if proposal.get_type() == "class": namespace, className = get_namespace_by_classname(proposal.get_word()) key = self.__sortKey(className) + self.__sortKey(namespace) else: key = self.__sortKey(proposal.get_word()) return key
def _sortKeyForAutocomplete(self, result): key = "" filePath, line, column, typeName, title = result if typeName == "Class": namespace, className = get_namespace_by_classname(title) key = self.__sortKey(className) + self.__sortKey(namespace) else: key = self.__sortKey(title) return key
def get_class_hierarchy(self, className): storage = self.get_index_storage() hierarchy = {className: self.get_class_children_recursive(className)} parentClass = className while True: namespace, parentClass = get_namespace_by_classname(parentClass) parentClass = storage.get_class_parent(namespace, parentClass) if parentClass != None: hierarchy = {parentClass: hierarchy} else: break return hierarchy
def build_info_text(self, storage, decType, decName, containingClass=None): prefix = "<?php\n\n" labelText = None filePath = None infoText = None if decType == 'function': namespace = containingClass labelText = storage.get_function_doccomment(namespace, decName) elif decType in ['const', 'constant']: labelText = storage.get_constant_doccomment(decName) elif decType == 'class': if containingClass != None: namespace, className = get_namespace_by_classname(containingClass) else: namespace, className = get_namespace_by_classname(decName) filePath, line, column = storage.get_class_position(namespace, className) infoText = "<?php\n\nnamespace "+namespace+";\n\n" docComment = storage.get_class_doccomment(namespace, className) if docComment != None: infoText += docComment + "\n" if filePath != None and line != None: infoText += self.__get_text_until_bracket(filePath, line, column) for methodName in storage.get_class_methods(namespace, className): methodFilePath, methodLine, methodColumn = storage.get_method_position(namespace, className, methodName) methodLabelText = self.__get_text_until_bracket(methodFilePath, methodLine, methodColumn) if methodLabelText != None: infoText += "\n" + methodLabelText elif decType == 'method': if containingClass != None: namespace, className = get_namespace_by_classname(containingClass) labelText = storage.get_method_doccomment(namespace, className, decName) filePath, line, column = storage.get_method_position(namespace, className, decName) prefix = "<?php\n\nnamespace "+namespace+";\n\n" elif decType == 'member': if containingClass != None: namespace, className = get_namespace_by_classname(containingClass) labelText = storage.get_member_doccomment(namespace, className, decName) else: print("unknown declaration-type: " + decType) if infoText == None: if labelText == None: labelText = "" if filePath != None and line != None: if len(labelText) > 0: labelText += "\n" labelText += self.__get_text_until_bracket(filePath, line, column) if len(labelText) > 0: labelText = prefix + labelText infoText = labelText return infoText
def do_activate_proposal(self, proposal, textIter): # proposal (GtkSource.CompletionProposal) # textIter (Gtk.TextIter) completion = proposal.get_completion() storage = self.__pluginView.get_index_storage() fileIndex = self.__pluginView.get_php_fileindex() tokens = fileIndex.get_tokens() if proposal.get_type() in ['function', 'method']: line = textIter.get_line() + 1 column = textIter.get_line_offset() + 1 tokenIndex = fileIndex.get_token_index_by_position(line, column) if len(tokens) == tokenIndex-1 or tokens[tokenIndex+1][1] != "(": completion += "(" arguments = [] if proposal.get_type() == 'function': namespace = proposal.get_additional_info() arguments = storage.get_function_arguments(namespace, proposal.get_word()) elif proposal.get_type() == 'method': if proposal.get_additional_info() != None: fullClassName = proposal.get_additional_info() namespace, className = get_namespace_by_classname(fullClassName) arguments = storage.get_method_arguments(namespace, className, proposal.get_word()) if type(arguments) == list and len(arguments) > 0: argumentsCodes = [] for argumentRow in arguments: if len(argumentRow) > 2: argumentType, argumentsCode, argumentDefaultValue = argumentRow elif len(argumentRow) == 2: argumentDefaultValue = None argumentType, argumentsCode = argumentRow argumentsCodes.append(argumentsCode) completion += ", ".join(argumentsCodes) completion += ")" textIter.get_buffer().insert(textIter, completion) if proposal.get_type() == 'class': fullClassName = proposal.get_additional_info() if fullClassName[0] != '\\': fullClassName = '\\' + fullClassName if fullClassName not in fileIndex.get_use_statements().values(): while fullClassName[0] == '\\': fullClassName = fullClassName[1:] useStmsIter = textIter.copy() tokenIndex = fileIndex.get_use_statement_index() appendix = "" if tokenIndex != None: useStmsIter.set_line(tokens[tokenIndex][2]) useStmsIter.set_line_index(tokens[tokenIndex][3]-1) elif tokens[1][0] == T_DOC_COMMENT: useStmsIter.set_line(tokens[2][2]-1) useStmsIter.set_line_index(tokens[2][3]-1) appendix = "\n" else: useStmsIter.set_line(1) useStmsIter.set_line_index(0) textIter.get_buffer().insert(useStmsIter, "use "+fullClassName+";\n"+appendix) return True
def do_populate(self, context): if self.__pluginView == None: return storage = self.__pluginView.get_index_storage() fileIndex = self.__pluginView.get_php_fileindex() proposals = [] textIter = context.get_iter() if type(textIter) is not Gtk.TextIter: hasIter, textIter = textIter line = textIter.get_line()+1 column = textIter.get_line_index()+1 tokens = fileIndex.get_tokens() tokenIndex = fileIndex.get_token_index_by_position(line, column) word = "" if tokens[tokenIndex][0] == T_COMMENT: lineInComment = line - tokens[tokenIndex][2] columnInComment = column - tokens[tokenIndex][3] - 1 commentLines = tokens[tokenIndex][1].split("\n") commentLine = commentLines[lineInComment] while re.match("[a-zA-Z0-9_]", commentLine[columnInComment]): word = commentLine[columnInComment] + word columnInComment -= 1 if tokens[tokenIndex][0] == T_STRING or tokens[tokenIndex-1][1] in ['::', '->']: word = tokens[tokenIndex][1] tokenIndex -= 1 if tokens[tokenIndex][0] == T_VARIABLE: word = tokens[tokenIndex][1] token = tokens[tokenIndex] self.colm = token[3]-1 self.mark_position(textIter) members = [] functions = [] methods = [] consts = [] variables = [] className = None if tokens[tokenIndex][1] == '::': # static members, static methods and class-constants returnType = fileIndex.get_type_by_token_index(tokenIndex-1) self.type = returnType className = returnType members = [] while True: namespace, className = get_namespace_by_classname(className) methods += storage.get_static_class_methods(namespace, className) members += storage.get_static_class_members(namespace, className) consts += storage.get_class_constants(namespace, className) className = storage.get_class_parent(namespace, className) if className == None: break elif tokens[tokenIndex][1] == '->': # members and methods returnType = fileIndex.get_type_by_token_index(tokenIndex-1) self.type = returnType className = returnType members = [] parentClassName = className while True: namespace, parentClassName = get_namespace_by_classname(parentClassName) methods += storage.get_class_methods(namespace, parentClassName) members += storage.get_class_members(namespace, parentClassName) parentClassName = storage.get_class_parent(namespace, parentClassName) if parentClassName == None: break elif token[0] == T_VARIABLE: # local or global variables variables += ["$_REQUEST", "$_GET", "$_POST", "$_COOKIE", "$_SESSION", "$_SERVER"] variables += fileIndex.get_variables_in_scope(tokenIndex) else: # classes, constants and functions classes = storage.get_all_classnames(True) consts = storage.get_all_constants() functions = storage.get_all_functions() for name in classes: fullClassName = name if "\\" in name: name = name[name.rfind("\\")+1:] if name.startswith(word) or word=="": proposals.append(AutocompleteProposal(fullClassName, name[len(word):], "class", fullClassName)) for name in methods: if name.startswith(word) or word=="": proposals.append(AutocompleteProposal(name, name[len(word):], "method", className)) for name in set(members): if name.startswith(word) or word=="": proposals.append(AutocompleteProposal(name, name[len(word):], "member", className)) for namespace, name in functions: if name.startswith(word) or word=="": proposals.append(AutocompleteProposal(name, name[len(word):], "function", namespace)) for name in set(consts): if name.startswith(word) or word=="": proposals.append(AutocompleteProposal(name, name[len(word):], "const")) for name in variables: if name.startswith(word) or word=="": proposals.append(AutocompleteProposal(name, name[len(word):], "variable")) if len(proposals) < 10000: proposals.sort(key=self._sortKeyForProposal) context.add_proposals(self, proposals, True)