File indexing completed on 2024-05-12 09:55:27

0001 /***************************************************************************
0002                           ruby_parser.cpp  -  description
0003                              -------------------
0004     begin                : May 9th 2007
0005     author               : 2007 Massimo Callegari
0006     email                : massimocallegari@yahoo.it
0007  ***************************************************************************/
0008 /***************************************************************************
0009  *                                                                         *
0010  *   SPDX-License-Identifier: GPL-2.0-or-later
0011  *                                                                         *
0012  ***************************************************************************/
0013 #include "plugin_katesymbolviewer.h"
0014 
0015 void KatePluginSymbolViewerView::parseRubySymbols(void)
0016 {
0017     if (!m_mainWindow->activeView()) {
0018         return;
0019     }
0020 
0021     m_macro->setText(i18n("Show Functions"));
0022     m_struct->setText(i18n("Show Methods"));
0023     m_func->setText(i18n("Show Classes"));
0024 
0025     QTreeWidgetItem *node = nullptr;
0026     QTreeWidgetItem *mtdNode = nullptr, *clsNode = nullptr, *functionNode = nullptr;
0027     QTreeWidgetItem *lastMtdNode = nullptr, *lastClsNode = nullptr;
0028 
0029     KTextEditor::Document *kv = m_mainWindow->activeView()->document();
0030 
0031     if (m_treeOn->isChecked()) {
0032         clsNode = new QTreeWidgetItem(m_symbols, QStringList(i18n("Classes")));
0033         functionNode = new QTreeWidgetItem(m_symbols, QStringList(i18n("Functions")));
0034         clsNode->setIcon(0, m_icon_class);
0035         functionNode->setIcon(0, m_icon_function);
0036 
0037         if (m_expandOn->isChecked()) {
0038             m_symbols->expandItem(clsNode);
0039             m_symbols->expandItem(functionNode);
0040         }
0041         lastClsNode = clsNode;
0042         mtdNode = clsNode;
0043         lastMtdNode = clsNode;
0044         m_symbols->setRootIsDecorated(1);
0045     } else {
0046         m_symbols->setRootIsDecorated(0);
0047     }
0048 
0049     static const QRegularExpression function_regexp(QLatin1String("^(\\s*)def\\s+([a-zA-Z0-9_]+)\\s*(\\(.*\\))"));
0050     static const QRegularExpression class_regexp(QLatin1String("^class\\s+([a-zA-Z0-9]+)"));
0051     QRegularExpressionMatch match;
0052 
0053     for (int i = 0; i < kv->lines(); i++) {
0054         QString cl = kv->line(i);
0055 
0056         match = class_regexp.match(cl);
0057         if (match.hasMatch()) {
0058             if (m_func->isChecked()) {
0059                 if (m_treeOn->isChecked()) {
0060                     node = new QTreeWidgetItem(clsNode, lastClsNode);
0061                     if (m_expandOn->isChecked()) {
0062                         m_symbols->expandItem(node);
0063                     }
0064                     lastClsNode = node;
0065                     mtdNode = lastClsNode;
0066                     lastMtdNode = lastClsNode;
0067                 } else {
0068                     node = new QTreeWidgetItem(m_symbols);
0069                 }
0070                 node->setText(0, match.captured(1));
0071                 node->setIcon(0, m_icon_class);
0072                 node->setText(1, QString::number(i, 10));
0073             }
0074             continue;
0075         }
0076 
0077         match = function_regexp.match(cl);
0078         if (match.hasMatch()) {
0079             if (m_struct->isChecked() && match.captured(1).isEmpty()) {
0080                 if (m_treeOn->isChecked()) {
0081                     node = new QTreeWidgetItem(functionNode);
0082                 } else {
0083                     node = new QTreeWidgetItem(m_symbols);
0084                 }
0085             } else if (m_macro->isChecked()) {
0086                 if (m_treeOn->isChecked()) {
0087                     node = new QTreeWidgetItem(mtdNode, lastMtdNode);
0088                     lastMtdNode = node;
0089                 } else {
0090                     node = new QTreeWidgetItem(m_symbols);
0091                 }
0092             }
0093 
0094             node->setToolTip(0, match.captured(2));
0095             if (m_typesOn->isChecked()) {
0096                 node->setText(0, match.captured(2) + match.captured(3));
0097             } else {
0098                 node->setText(0, match.captured(2));
0099             }
0100             node->setIcon(0, m_icon_function);
0101             node->setText(1, QString::number(i, 10));
0102         }
0103     }
0104 }