File indexing completed on 2024-05-12 04:39:40

0001 /*
0002     SPDX-FileCopyrightText: 2015 Sergey Kalinichev <kalinichev.so.0@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "parserwidget.h"
0008 
0009 #include "ui_parserwidget.h"
0010 
0011 #include "compilerprovider/settingsmanager.h"
0012 
0013 #include <util/path.h>
0014 
0015 namespace
0016 {
0017 
0018 QString languageStandard(const QString& arguments)
0019 {
0020     int idx = arguments.indexOf(QLatin1String("-std="));
0021     if(idx == -1){
0022         return QStringLiteral("c++11");
0023     }
0024 
0025     idx += 5;
0026     int end = arguments.indexOf(QLatin1Char(' '), idx) != -1 ? arguments.indexOf(QLatin1Char(' '), idx) : arguments.size();
0027     return arguments.mid(idx, end - idx);
0028 }
0029 
0030 QString languageDefaultStandard(Utils::LanguageType languageType)
0031 {
0032     switch (languageType) {
0033     case Utils::C:
0034         return QStringLiteral("c99");
0035     case Utils::Cpp:
0036         return QStringLiteral("c++11");
0037     case Utils::OpenCl:
0038         return QStringLiteral("CL1.1");
0039     case Utils::Cuda:
0040         return QStringLiteral("c++11");
0041     case Utils::ObjC:
0042         return QStringLiteral("c99");
0043     case Utils::ObjCpp:
0044         return QStringLiteral("c++11");
0045     case Utils::Other:
0046         break;
0047     }
0048     Q_UNREACHABLE();
0049 }
0050 
0051 bool isCustomParserArguments(Utils::LanguageType languageType, const QString& arguments, const QStringList& standards)
0052 {
0053     const auto defaultArguments = SettingsManager::globalInstance()->defaultParserArguments();
0054 
0055     auto standard = languageStandard(arguments);
0056 
0057     auto tmpArgs(arguments);
0058     tmpArgs.replace(standard, languageDefaultStandard(languageType));
0059 
0060     if (tmpArgs == defaultArguments[languageType] && standards.contains(standard)) {
0061         return false;
0062     }
0063 
0064     return true;
0065 }
0066 
0067 const int customProfileIdx = 0;
0068 }
0069 
0070 ParserWidget::ParserWidget(QWidget* parent)
0071     : QWidget(parent)
0072     , m_ui(new Ui::ParserWidget())
0073 {
0074     m_ui->setupUi(this);
0075 
0076     connect(m_ui->parserOptionsC, &QLineEdit::textEdited, this, &ParserWidget::textEdited);
0077     connect(m_ui->parserOptionsCpp, &QLineEdit::textEdited, this, &ParserWidget::textEdited);
0078     connect(m_ui->parserOptionsOpenCl, &QLineEdit::textEdited, this, &ParserWidget::textEdited);
0079     connect(m_ui->parserOptionsCuda, &QLineEdit::textEdited, this, &ParserWidget::textEdited);
0080     connect(m_ui->parseHeadersInPlainC, &QCheckBox::stateChanged, this, &ParserWidget::textEdited);
0081     connect(m_ui->languageStandardsC, &QComboBox::textActivated, this, &ParserWidget::languageStandardChangedC);
0082     connect(m_ui->languageStandardsCpp, &QComboBox::textActivated, this, &ParserWidget::languageStandardChangedCpp);
0083     connect(m_ui->languageStandardsOpenCl, &QComboBox::textActivated, this,
0084             &ParserWidget::languageStandardChangedOpenCl);
0085     connect(m_ui->languageStandardsCuda, &QComboBox::textActivated, this, &ParserWidget::languageStandardChangedCuda);
0086 
0087     updateEnablements();
0088 }
0089 
0090 ParserWidget::~ParserWidget() = default;
0091 
0092 void ParserWidget::textEdited()
0093 {
0094     emit changed();
0095 }
0096 
0097 void ParserWidget::languageStandardChangedC(const QString& standard)
0098 {
0099     if (m_ui->languageStandardsC->currentIndex() == customProfileIdx) {
0100         m_ui->parserOptionsC->setText(SettingsManager::globalInstance()->defaultParserArguments()[Utils::C]);
0101     } else {
0102         auto text = SettingsManager::globalInstance()->defaultParserArguments()[Utils::C];
0103         auto currentStandard = languageStandard(text);
0104         m_ui->parserOptionsC->setText(text.replace(currentStandard, standard));
0105     }
0106 
0107     textEdited();
0108     updateEnablements();
0109 }
0110 
0111 void ParserWidget::languageStandardChangedCpp(const QString& standard)
0112 {
0113     if (m_ui->languageStandardsCpp->currentIndex() == customProfileIdx) {
0114         m_ui->parserOptionsCpp->setText(SettingsManager::globalInstance()->defaultParserArguments()[Utils::Cpp]);
0115     } else {
0116         auto text = SettingsManager::globalInstance()->defaultParserArguments()[Utils::Cpp];
0117         auto currentStandard = languageStandard(text);
0118         m_ui->parserOptionsCpp->setText(text.replace(currentStandard, standard));
0119     }
0120 
0121     textEdited();
0122     updateEnablements();
0123 }
0124 
0125 void ParserWidget::languageStandardChangedOpenCl(const QString& standard)
0126 {
0127     if (m_ui->languageStandardsOpenCl->currentIndex() == customProfileIdx) {
0128         m_ui->parserOptionsOpenCl->setText(SettingsManager::globalInstance()->defaultParserArguments()[Utils::OpenCl]);
0129     } else {
0130         auto text = SettingsManager::globalInstance()->defaultParserArguments()[Utils::OpenCl];
0131         auto currentStandard = languageStandard(text);
0132         m_ui->parserOptionsOpenCl->setText(text.replace(currentStandard, standard));
0133     }
0134 
0135     textEdited();
0136     updateEnablements();
0137 }
0138 
0139 void ParserWidget::languageStandardChangedCuda(const QString& standard)
0140 {
0141     if (m_ui->languageStandardsCuda->currentIndex() == customProfileIdx) {
0142         m_ui->parserOptionsCuda->setText(SettingsManager::globalInstance()->defaultParserArguments()[Utils::Cuda]);
0143     } else {
0144         auto text = SettingsManager::globalInstance()->defaultParserArguments()[Utils::Cuda];
0145         auto currentStandard = languageStandard(text);
0146         m_ui->parserOptionsCuda->setText(text.replace(currentStandard, standard));
0147     }
0148 
0149     textEdited();
0150     updateEnablements();
0151 }
0152 
0153 void ParserWidget::setParserArguments(const ParserArguments& arguments)
0154 {
0155     auto setArguments = [arguments](QComboBox* languageStandards, QLineEdit* parserOptions, Utils::LanguageType languageType) {
0156         QStringList standards;
0157         const int languageStandardsCount = languageStandards->count();
0158         standards.reserve(languageStandardsCount-1);
0159         for (int i = 1; i < languageStandardsCount; ++i) {
0160             standards << languageStandards->itemText(i);
0161         }
0162 
0163         const QString& arg = arguments[languageType];
0164         if (isCustomParserArguments(languageType, arg, standards)) {
0165             languageStandards->setCurrentIndex(customProfileIdx);
0166         } else {
0167             languageStandards->setCurrentText(languageStandard(arg));
0168         }
0169 
0170         parserOptions->setText(arg);
0171     };
0172 
0173     setArguments(m_ui->languageStandardsCpp, m_ui->parserOptionsCpp, Utils::Cpp);
0174     setArguments(m_ui->languageStandardsC, m_ui->parserOptionsC, Utils::C);
0175     setArguments(m_ui->languageStandardsOpenCl, m_ui->parserOptionsOpenCl, Utils::OpenCl);
0176     setArguments(m_ui->languageStandardsCuda, m_ui->parserOptionsCuda, Utils::Cuda);
0177 
0178     m_ui->parseHeadersInPlainC->setChecked(!arguments.parseAmbiguousAsCPP);
0179 
0180     updateEnablements();
0181 }
0182 
0183 ParserArguments ParserWidget::parserArguments() const
0184 {
0185     ParserArguments arguments;
0186     arguments[Utils::C] = m_ui->parserOptionsC->text();
0187     arguments[Utils::Cpp] = m_ui->parserOptionsCpp->text();
0188     arguments[Utils::OpenCl] = m_ui->parserOptionsOpenCl->text();
0189     arguments[Utils::Cuda] = m_ui->parserOptionsCuda->text();
0190     arguments.parseAmbiguousAsCPP = !m_ui->parseHeadersInPlainC->isChecked();
0191     return arguments;
0192 }
0193 
0194 void ParserWidget::updateEnablements()
0195 {
0196     m_ui->parserOptionsCpp->setEnabled(m_ui->languageStandardsCpp->currentIndex() == customProfileIdx);
0197     m_ui->parserOptionsC->setEnabled(m_ui->languageStandardsC->currentIndex() == customProfileIdx);
0198     m_ui->parserOptionsOpenCl->setEnabled(m_ui->languageStandardsOpenCl->currentIndex() == customProfileIdx);
0199     m_ui->parserOptionsCuda->setEnabled(m_ui->languageStandardsCuda->currentIndex() == customProfileIdx);
0200 }
0201 
0202 #include "moc_parserwidget.cpp"