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"