File indexing completed on 2024-04-14 04:31:16
0001 /* This file is part of KDevelop 0002 * 0003 * Copyright 2006-2010 Alexander Dymo <adymo@kdevelop.org> 0004 * Copyright (C) 2014-2015 Miquel Sabaté Solà <mikisabate@gmail.com> 0005 * 0006 * This program is free software; you can redistribute it and/or modify 0007 * it under the terms of the GNU Library General Public License as 0008 * published by the Free Software Foundation; either version 2 of the 0009 * License, or (at your option) any later version. 0010 * 0011 * This program is distributed in the hope that it will be useful, 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0014 * GNU General Public License for more details. 0015 * 0016 * You should have received a copy of the GNU General Public 0017 * License along with this program; if not, write to the 0018 * Free Software Foundation, Inc., 0019 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0020 */ 0021 0022 #include <languagesupport.h> 0023 0024 #include <QProcess> 0025 #include <QStandardPaths> 0026 0027 #include <KPluginFactory> 0028 0029 #include <interfaces/contextmenuextension.h> 0030 #include <interfaces/icore.h> 0031 #include <interfaces/ilanguagecontroller.h> 0032 #include <interfaces/iplugincontroller.h> 0033 #include <language/codecompletion/codecompletion.h> 0034 #include <language/interfaces/editorcontext.h> 0035 0036 #include <completion/model.h> 0037 #include <codegen/refactoring.h> 0038 #include <debug.h> 0039 #include <duchain/helpers.h> 0040 #include <highlighting.h> 0041 #include <launcher.h> 0042 #include <parsejob.h> 0043 #include <rails/helpers.h> 0044 #include <rails/support.h> 0045 0046 K_PLUGIN_FACTORY_WITH_JSON(KDevRubySupportFactory, "kdevrubylanguagesupport.json", registerPlugin<ruby::LanguageSupport>();) 0047 0048 using namespace ruby; 0049 using namespace KDevelop; 0050 0051 LanguageSupport::LanguageSupport(QObject *parent, const QVariantList &) 0052 : IPlugin(QStringLiteral("kdevrubysupport"), parent) 0053 , ILanguageSupport() 0054 { 0055 m_rails = new rails::Support(this); 0056 m_launcher = new Launcher(this); 0057 0058 setXMLFile("kdevrubysupport.rc"); 0059 m_highlighting = new Highlighting(this); 0060 m_refactoring = new Refactoring(this); 0061 CodeCompletionModel *rModel = new CodeCompletionModel(this); 0062 new CodeCompletion(this, rModel, "Ruby"); 0063 0064 /* Retrieving Ruby version */ 0065 QString path = QStandardPaths::findExecutable("ruby"); 0066 if (!path.isEmpty()) { 0067 QProcess ruby; 0068 ruby.start(path, QStringList{ "--version" }); 0069 ruby.waitForFinished(3000); 0070 QList<QByteArray> byteArr = ruby.readAllStandardOutput().split(' '); 0071 if (byteArr.size() > 1) { 0072 const QString &output = byteArr[1]; 0073 QStringList version = output.split('.'); 0074 if (version.size() > 1) { 0075 if (version[0] == "1") { 0076 m_version = (version[1] == "8") ? ruby18 : ruby19; 0077 } else if (version[1] == "0") { 0078 m_version = ruby20; 0079 } else { 0080 m_version = ruby21; 0081 } 0082 } 0083 } 0084 } else { 0085 qWarning() << "ruby might not be installed!"; 0086 } 0087 } 0088 0089 LanguageSupport::~LanguageSupport() 0090 { 0091 } 0092 0093 QString LanguageSupport::name() const 0094 { 0095 return QStringLiteral("Ruby"); 0096 } 0097 0098 KDevelop::ParseJob * LanguageSupport::createParseJob(const IndexedString &url) 0099 { 0100 return new ruby::ParseJob(url, this); 0101 } 0102 0103 ICodeHighlighting * LanguageSupport::codeHighlighting() const 0104 { 0105 return m_highlighting; 0106 } 0107 0108 ContextMenuExtension LanguageSupport::contextMenuExtension(Context* context, QWidget* parent) 0109 { 0110 ContextMenuExtension cm; 0111 EditorContext *ed = dynamic_cast<EditorContext *>(context); 0112 0113 if (ed && ICore::self()->languageController()->languagesForUrl(ed->url()). 0114 contains(this)) { 0115 // It's safe to add our own ContextMenuExtension. 0116 m_refactoring->fillContextMenu(cm, context, parent); 0117 } 0118 return cm; 0119 } 0120 0121 enum ruby_version LanguageSupport::version() const 0122 { 0123 return m_version; 0124 } 0125 0126 void LanguageSupport::createActionsForMainWindow(Sublime::MainWindow *, 0127 QString &_xmlFile, 0128 KActionCollection &actions) 0129 { 0130 _xmlFile = xmlFile(); 0131 0132 m_rails->setupActions(actions); 0133 m_launcher->setupActions(actions); 0134 } 0135 0136 #include "languagesupport.moc" 0137