コード例 #1
0
 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)
コード例 #2
0
    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
コード例 #3
0
    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
コード例 #4
0
 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
コード例 #5
0
    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
コード例 #6
0
    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
コード例 #7
0
    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)