aboutsummaryrefslogtreecommitdiffstats
path: root/src/shared
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2019-02-01 16:50:29 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2019-02-05 11:31:52 +0000
commit69565d6c88ad66e11817bd661c20af8395b6000e (patch)
tree6bd7fd89e356cf3b810b85b22c6ba077625e35d9 /src/shared
parent719749103a17a6c89cec86bda943232f23e5ee86 (diff)
QmakePM: Respect editor settings when adding files to project
If the user wants to indent with tabs, then consider that when adding source files via the UI. But try not to mix: If the respective variable already uses a different indentation consistently, then keep using that one. Fixes: QTCREATORBUG-8016 Change-Id: I037c9ac4d4e7fbbe5753a846e57d938bbb440d6a Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/proparser/prowriter.cpp65
-rw-r--r--src/shared/proparser/prowriter.h5
2 files changed, 52 insertions, 18 deletions
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);