class YacGoToDefinitionCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        self.parser = Parser(self.view)
        word = self.parser.getCurrentPositionSymbol()
        try:
            self.cTags = CTags(self.view)
        except CTagsException as e:
            status_message('YAC: CTags exception: ' + str(e))
            return
        if len(word) > 0:
            if self.parser.isCurrentPositionAMethod():
                currentClass = self.cTags.getClassFromName(self.parser.getClassFromMethodInCurrentPosition())
                if currentClass:
                    results = self.cTags.getMethodsFromClass(currentClass, word)
                    if len(results) > 0:
                        self.showQuickPanel(results)
                        return
            if self.parser.isCurrentPositionAFunction():
                results = self.cTags.getFunctionsFromName(word)
                if len(results) > 0:
                    self.showQuickPanel(results)
                    return
            results = self.cTags.getClassesFromName(word)
            if len(results) > 0:
                self.showQuickPanel(results)
                return
        status_message('YAC: current symbol not found')

    def showQuickPanel(self, items):
        self.items = items
        if len(items) == 1:
            self.goToItem(0)
        else:
            sublime.active_window().show_quick_panel([[item.getName(), self.cTags.getRelativeFilePath(item.getFile())] for item in self.items], self.goToItem)

    def goToItem(self, idx):
        if idx >= 0:
            sublime.active_window().open_file(self.items[idx].getFile() + ':' + self.items[idx].getDefinitionLineNumber(), sublime.ENCODED_POSITION)