summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp25
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeparsernodes.h2
-rw-r--r--src/shared/proparser/prowriter.cpp65
-rw-r--r--src/shared/proparser/prowriter.h5
4 files changed, 76 insertions, 21 deletions
diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
index 21d5627f0f..c0034972d6 100644
--- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
@@ -36,10 +36,14 @@
#include <coreplugin/iversioncontrol.h>
#include <coreplugin/vcsmanager.h>
#include <cpptools/cpptoolsconstants.h>
+#include <projectexplorer/editorconfiguration.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
#include <qtsupport/profilereader.h>
+#include <texteditor/icodestylepreferences.h>
+#include <texteditor/tabsettings.h>
+#include <texteditor/texteditorsettings.h>
#include <utils/algorithm.h>
#include <utils/filesystemwatcher.h>
@@ -378,6 +382,19 @@ void QmakePriFile::watchFolders(const QSet<FileName> &folders)
m_watchedFolders = folderStrings;
}
+QString QmakePriFile::continuationIndent() const
+{
+ const EditorConfiguration *editorConf = project()->editorConfiguration();
+ const TextEditor::TabSettings &tabSettings = editorConf->useGlobalSettings()
+ ? TextEditor::TextEditorSettings::codeStyle()->tabSettings()
+ : editorConf->codeStyle()->tabSettings();
+ if (tabSettings.m_continuationAlignBehavior == TextEditor::TabSettings::ContinuationAlignWithIndent
+ && tabSettings.m_tabPolicy == TextEditor::TabSettings::TabsOnlyTabPolicy) {
+ return QString("\t");
+ }
+ return QString(tabSettings.m_indentSize, ' ');
+}
+
bool QmakePriFile::knowsFile(const FileName &filePath) const
{
return m_recursiveEnumerateFiles.contains(filePath);
@@ -747,7 +764,8 @@ bool QmakePriFile::renameFile(const QString &oldName,
ProWriter::addFiles(includeFile, &lines,
QStringList(newName),
- varNameForAdding(mimeType));
+ varNameForAdding(mimeType),
+ continuationIndent());
if (mode == Change::Save)
save(lines);
includeFile->deref();
@@ -777,7 +795,8 @@ void QmakePriFile::changeFiles(const QString &mimeType,
if (change == AddToProFile) {
// Use the first variable for adding.
- ProWriter::addFiles(includeFile, &lines, filePaths, varNameForAdding(mimeType));
+ ProWriter::addFiles(includeFile, &lines, filePaths, varNameForAdding(mimeType),
+ continuationIndent());
notChanged->clear();
} else { // RemoveFromProFile
QDir priFileDir = QDir(m_qmakeProFile->directoryPath().toString());
@@ -818,7 +837,7 @@ bool QmakePriFile::setProVariable(const QString &var, const QStringList &values,
ProWriter::putVarValues(includeFile, &lines, values, var,
ProWriter::PutFlags(flags),
- scope);
+ scope, continuationIndent());
save(lines);
includeFile->deref();
diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h
index f2bb612b7e..6f0e13a5c9 100644
--- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h
+++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h
@@ -216,6 +216,8 @@ private:
static void processValues(Internal::QmakePriFileEvalResult &result);
void watchFolders(const QSet<Utils::FileName> &folders);
+ QString continuationIndent() const;
+
QmakeProject *m_project = nullptr;
QmakeProFile *m_qmakeProFile = nullptr;
QmakePriFile *m_parent = nullptr;
diff --git a/src/shared/proparser/prowriter.cpp b/src/shared/proparser/prowriter.cpp
index 98547f89ed..3ca7220621 100644
--- a/src/shared/proparser/prowriter.cpp
+++ b/src/shared/proparser/prowriter.cpp
@@ -246,6 +246,7 @@ bool ProWriter::locateVarValues(const ushort *tokPtr, const ushort *tokPtrEnd,
struct LineInfo
{
+ QString indent;
int continuationPos = 0;
bool hasComment = false;
};
@@ -260,14 +261,29 @@ static LineInfo lineInfo(const QString &line)
li.continuationPos = idx;
for (int i = idx - 1; i >= 0 && (line.at(i) == ' ' || line.at(i) == '\t'); --i)
--li.continuationPos;
+ for (int i = 0; i < line.length() && (line.at(i) == ' ' || line.at(i) == '\t'); ++i)
+ li.indent += line.at(i);
return li;
}
-static int skipContLines(QStringList *lines, int lineNo, bool addCont)
+struct ContinuationInfo {
+ QString indent; // Empty means use default
+ int lineNo;
+};
+
+static ContinuationInfo skipContLines(QStringList *lines, int lineNo, bool addCont)
{
+ bool hasConsistentIndent = true;
+ QString lastIndent;
for (; lineNo < lines->count(); lineNo++) {
const QString line = lines->at(lineNo);
LineInfo li = lineInfo(line);
+ if (hasConsistentIndent) {
+ if (lastIndent.isEmpty())
+ lastIndent = li.indent;
+ else if (lastIndent != li.indent)
+ hasConsistentIndent = false;
+ }
if (li.continuationPos == 0) {
if (li.hasComment)
continue;
@@ -280,34 +296,45 @@ static int skipContLines(QStringList *lines, int lineNo, bool addCont)
break;
}
}
- return lineNo;
+ ContinuationInfo ci;
+ if (hasConsistentIndent)
+ ci.indent = lastIndent;
+ ci.lineNo = lineNo;
+ return ci;
}
-void ProWriter::putVarValues(ProFile *profile, QStringList *lines,
- const QStringList &values, const QString &var, PutFlags flags, const QString &scope)
+void ProWriter::putVarValues(ProFile *profile, QStringList *lines, const QStringList &values,
+ const QString &var, PutFlags flags, const QString &scope,
+ const QString &continuationIndent)
{
- QString indent = scope.isEmpty() ? QString() : QLatin1String(" ");
+ QString indent = scope.isEmpty() ? QString() : continuationIndent;
+ const auto effectiveContIndent = [indent, continuationIndent](const ContinuationInfo &ci) {
+ return !ci.indent.isEmpty() ? ci.indent : continuationIndent + indent;
+ };
int scopeStart = -1, lineNo;
if (locateVarValues(profile->tokPtr(), profile->tokPtrEnd(), scope, var, &scopeStart, &lineNo)) {
if (flags & ReplaceValues) {
// remove continuation lines with old values
- int lNo = skipContLines(lines, lineNo, false);
- lines->erase(lines->begin() + lineNo + 1, lines->begin() + lNo);
+ const ContinuationInfo contInfo = skipContLines(lines, lineNo, false);
+ lines->erase(lines->begin() + lineNo + 1, lines->begin() + contInfo.lineNo);
// remove rest of the line
QString &line = (*lines)[lineNo];
int eqs = line.indexOf(QLatin1Char('='));
if (eqs >= 0) // If this is not true, we mess up the file a bit.
line.truncate(eqs + 1);
// put new values
- foreach (const QString &v, values)
- line += ((flags & MultiLine) ? QLatin1String(" \\\n ") + indent : QString::fromLatin1(" ")) + v;
+ foreach (const QString &v, values) {
+ line += ((flags & MultiLine) ? QLatin1String(" \\\n") + effectiveContIndent(contInfo)
+ : QString::fromLatin1(" ")) + v;
+ }
} else {
- int endLineNo = skipContLines(lines, lineNo, false);
+ const ContinuationInfo contInfo = skipContLines(lines, lineNo, false);
+ int endLineNo = contInfo.lineNo;
for (const QString &v : values) {
int curLineNo = lineNo + 1;
while (curLineNo < endLineNo && v >= lines->at(curLineNo).trimmed())
++curLineNo;
- QString newLine = " " + indent + v;
+ QString newLine = effectiveContIndent(contInfo) + v;
if (curLineNo == endLineNo) {
QString &oldLastLine = (*lines)[endLineNo - 1];
oldLastLine.insert(lineInfo(oldLastLine).continuationPos, " \\");
@@ -322,6 +349,7 @@ void ProWriter::putVarValues(ProFile *profile, QStringList *lines,
// Create & append new variable item
QString added;
int lNo = lines->count();
+ ContinuationInfo contInfo;
if (!scope.isEmpty()) {
if (scopeStart < 0) {
added = QLatin1Char('\n') + scope + QLatin1String(" {");
@@ -329,8 +357,10 @@ void ProWriter::putVarValues(ProFile *profile, QStringList *lines,
QRegExp rx(QLatin1String("(\\s*") + scope + QLatin1String("\\s*:\\s*)[^\\s{].*"));
if (rx.exactMatch(lines->at(scopeStart))) {
(*lines)[scopeStart].replace(0, rx.cap(1).length(),
- QString(scope + QLatin1String(" {\n ")));
- lNo = skipContLines(lines, scopeStart, false);
+ QString(scope + QLatin1String(" {\n")
+ + continuationIndent));
+ contInfo = skipContLines(lines, scopeStart, false);
+ lNo = contInfo.lineNo;
scopeStart = -1;
}
}
@@ -357,14 +387,16 @@ void ProWriter::putVarValues(ProFile *profile, QStringList *lines,
added += QLatin1Char('\n');
added += indent + var + QLatin1String((flags & AppendOperator) ? " +=" : " =");
foreach (const QString &v, values)
- added += ((flags & MultiLine) ? QLatin1String(" \\\n ") + indent : QString::fromLatin1(" ")) + v;
+ added += ((flags & MultiLine) ? QLatin1String(" \\\n") + effectiveContIndent(contInfo)
+ : QString::fromLatin1(" ")) + v;
if (!scope.isEmpty() && scopeStart < 0)
added += QLatin1String("\n}");
lines->insert(lNo, added);
}
}
-void ProWriter::addFiles(ProFile *profile, QStringList *lines, const QStringList &values, const QString &var)
+void ProWriter::addFiles(ProFile *profile, QStringList *lines, const QStringList &values,
+ const QString &var, const QString &continuationIndent)
{
QStringList valuesToWrite;
QString prefixPwd;
@@ -374,7 +406,8 @@ void ProWriter::addFiles(ProFile *profile, QStringList *lines, const QStringList
foreach (const QString &v, values)
valuesToWrite << (prefixPwd + baseDir.relativeFilePath(v));
- putVarValues(profile, lines, valuesToWrite, var, AppendValues | MultiLine | AppendOperator);
+ putVarValues(profile, lines, valuesToWrite, var, AppendValues | MultiLine | AppendOperator,
+ QString(), continuationIndent);
}
static void findProVariables(const ushort *tokPtr, const QStringList &vars,
diff --git a/src/shared/proparser/prowriter.h b/src/shared/proparser/prowriter.h
index 808884837b..7d3dca765d 100644
--- a/src/shared/proparser/prowriter.h
+++ b/src/shared/proparser/prowriter.h
@@ -51,11 +51,12 @@ public:
static void putVarValues(ProFile *profile, QStringList *lines,
const QStringList &values, const QString &var, PutFlags flags,
- const QString &scope = QString());
+ const QString &scope, const QString &continuationIndent);
static QList<int> removeVarValues(ProFile *profile, QStringList *lines,
const QStringList &values, const QStringList &vars);
- static void addFiles(ProFile *profile, QStringList *lines, const QStringList &filePaths, const QString &var);
+ static void addFiles(ProFile *profile, QStringList *lines, const QStringList &filePaths,
+ const QString &var, const QString &continuationIndent);
static QStringList removeFiles(ProFile *profile, QStringList *lines,
const QDir &proFileDir, const QStringList &filePaths, const QStringList &vars);