summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2013-11-01 14:10:36 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-11-11 09:39:06 +0100
commitb314fe164427b931f2c226512b0603047f8e3103 (patch)
tree6b6fda11a2fe6e4a4b33b1b20539056367f2515c /src
parent7e2df73a397743777e4119e3646af17b5561b1a3 (diff)
downloadqbs-b314fe164427b931f2c226512b0603047f8e3103.tar.gz
Allow lists of patterns in the FileTagger item.
Rationale: It is not uncommon that the same tag is associated with more than one file pattern; more common, in fact, than the other way around. It therefore seems silly to force module authors to create one FileTagger item per file extension. For semantic consistency, the "pattern" property gets renamed to "patterns". The old name is still supported in this minor version. Change-Id: Ia7f744b0903462517582fcb549e2dab004c81dd5 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/lib/language/builtindeclarations.cpp6
-rw-r--r--src/lib/language/language.cpp28
-rw-r--r--src/lib/language/language.h17
-rw-r--r--src/lib/language/projectresolver.cpp30
-rw-r--r--src/lib/language/testdata/filetags.qbs4
-rw-r--r--src/lib/tools/persistence.cpp2
6 files changed, 61 insertions, 26 deletions
diff --git a/src/lib/language/builtindeclarations.cpp b/src/lib/language/builtindeclarations.cpp
index 7b38e7179..87beda2fd 100644
--- a/src/lib/language/builtindeclarations.cpp
+++ b/src/lib/language/builtindeclarations.cpp
@@ -198,7 +198,11 @@ void BuiltinDeclarations::addExportItem()
void BuiltinDeclarations::addFileTaggerItem()
{
QList<PropertyDeclaration> properties;
- properties += PropertyDeclaration(QLatin1String("pattern"), PropertyDeclaration::String);
+
+ // TODO: Remove in 1.3
+ properties += PropertyDeclaration(QLatin1String("pattern"), PropertyDeclaration::StringList);
+
+ properties += PropertyDeclaration(QLatin1String("patterns"), PropertyDeclaration::StringList);
properties += PropertyDeclaration(QLatin1String("fileTags"), PropertyDeclaration::Variant);
m_builtins[QLatin1String("FileTagger")] = properties;
}
diff --git a/src/lib/language/language.cpp b/src/lib/language/language.cpp
index 2d0448abf..131b5e4b4 100644
--- a/src/lib/language/language.cpp
+++ b/src/lib/language/language.cpp
@@ -69,19 +69,37 @@ QT_END_NAMESPACE
namespace qbs {
namespace Internal {
+FileTagger::FileTagger(const QStringList &patterns, const FileTags &fileTags)
+ : m_fileTags(fileTags)
+{
+ setPatterns(patterns);
+}
+
+void FileTagger::setPatterns(const QStringList &patterns)
+{
+ m_patterns.clear();
+ foreach (const QString &pattern, patterns) {
+ QBS_CHECK(!pattern.isEmpty());
+ m_patterns << QRegExp(pattern, Qt::CaseSensitive, QRegExp::Wildcard);
+ }
+}
+
/*!
* \class FileTagger
* \brief The \c FileTagger class maps 1:1 to the respective item in a qbs source file.
*/
void FileTagger::load(PersistentPool &pool)
{
- m_artifactExpression.setPattern(pool.idLoadString());
+ setPatterns(pool.idLoadStringList());
pool.stream() >> m_fileTags;
}
void FileTagger::store(PersistentPool &pool) const
{
- pool.storeString(m_artifactExpression.pattern());
+ QStringList patterns;
+ foreach (const QRegExp &regExp, m_patterns)
+ patterns << regExp.pattern();
+ pool.storeStringList(patterns);
pool.stream() << m_fileTags;
}
@@ -405,8 +423,10 @@ FileTags ResolvedProduct::fileTagsForFileName(const QString &fileName) const
{
FileTags result;
foreach (FileTaggerConstPtr tagger, fileTaggers) {
- if (FileInfo::globMatches(tagger->artifactExpression(), fileName)) {
- result.unite(tagger->fileTags());
+ foreach (const QRegExp &pattern, tagger->patterns())
+ if (FileInfo::globMatches(pattern, fileName)) {
+ result.unite(tagger->fileTags());
+ break;
}
}
return result;
diff --git a/src/lib/language/language.h b/src/lib/language/language.h
index a467adc4d..98bf2f7f1 100644
--- a/src/lib/language/language.h
+++ b/src/lib/language/language.h
@@ -66,26 +66,23 @@ class FileTagger : public PersistentObject
{
public:
static FileTaggerPtr create() { return FileTaggerPtr(new FileTagger); }
- static FileTaggerPtr create(const QRegExp &artifactExpression, const FileTags &fileTags) {
- return FileTaggerPtr(new FileTagger(artifactExpression, fileTags));
+ static FileTaggerPtr create(const QStringList &patterns, const FileTags &fileTags) {
+ return FileTaggerPtr(new FileTagger(patterns, fileTags));
}
- const QRegExp &artifactExpression() const { return m_artifactExpression; }
+ const QList<QRegExp> &patterns() const { return m_patterns; }
const FileTags &fileTags() const { return m_fileTags; }
private:
- FileTagger(const QRegExp &artifactExpression, const FileTags &fileTags)
- : m_artifactExpression(artifactExpression), m_fileTags(fileTags)
- { }
+ FileTagger(const QStringList &patterns, const FileTags &fileTags);
+ FileTagger() {}
- FileTagger()
- : m_artifactExpression(QString(), Qt::CaseSensitive, QRegExp::Wildcard)
- {}
+ void setPatterns(const QStringList &patterns);
void load(PersistentPool &);
void store(PersistentPool &) const;
- QRegExp m_artifactExpression;
+ QList<QRegExp> m_patterns;
FileTags m_fileTags;
};
diff --git a/src/lib/language/projectresolver.cpp b/src/lib/language/projectresolver.cpp
index ef6ecc94b..af6f0a164 100644
--- a/src/lib/language/projectresolver.cpp
+++ b/src/lib/language/projectresolver.cpp
@@ -662,15 +662,29 @@ void ProjectResolver::resolveFileTagger(Item *item, ProjectContext *projectConte
checkCancelation();
QList<FileTaggerConstPtr> &fileTaggers = m_productContext
? m_productContext->product->fileTaggers : projectContext->fileTaggers;
- FileTaggerPtr tagger = FileTagger::create(
- QRegExp(m_evaluator->stringValue(item, QLatin1String("pattern")), Qt::CaseSensitive,
- QRegExp::Wildcard),
- m_evaluator->fileTagsValue(item, "fileTags"));
- if (tagger->artifactExpression().isEmpty())
- throw ErrorInfo(Tr::tr("FileTagger.pattern must not be empty."), item->location());
- if (tagger->fileTags().isEmpty())
+ QStringList patterns = m_evaluator->stringListValue(item, QLatin1String("patterns"));
+ const FileTags fileTags = m_evaluator->fileTagsValue(item, "fileTags");
+ if (fileTags.isEmpty())
throw ErrorInfo(Tr::tr("FileTagger.fileTags must not be empty."), item->location());
- fileTaggers += tagger;
+
+ // TODO: Remove in 1.3.
+ bool patternWasSet;
+ const QStringList oldPatterns = m_evaluator->stringListValue(item, QLatin1String("pattern"),
+ &patternWasSet);
+ if (patternWasSet) {
+ m_logger.printWarning(ErrorInfo(Tr::tr("The 'pattern' property is deprecated. Please "
+ "use 'patterns' instead."), item->location()));
+ patterns << oldPatterns;
+ }
+
+ if (patterns.isEmpty())
+ throw ErrorInfo(Tr::tr("FileTagger.patterns must be a non-empty list."), item->location());
+
+ foreach (const QString &pattern, patterns) {
+ if (pattern.isEmpty())
+ throw ErrorInfo(Tr::tr("A FileTagger pattern must not be empty."), item->location());
+ }
+ fileTaggers += FileTagger::create(patterns, fileTags);
}
void ProjectResolver::resolveTransformer(Item *item, ProjectContext *projectContext)
diff --git a/src/lib/language/testdata/filetags.qbs b/src/lib/language/testdata/filetags.qbs
index 894fe9298..97cccd510 100644
--- a/src/lib/language/testdata/filetags.qbs
+++ b/src/lib/language/testdata/filetags.qbs
@@ -2,7 +2,7 @@ import qbs 1.0
Project {
FileTagger {
- pattern: "*.cpp"
+ patterns: "*.cpp"
fileTags: ["cpp"]
}
@@ -15,7 +15,7 @@ Project {
name: "filetagger_product_scope"
files: ["drawline.asm"]
FileTagger {
- pattern: "*.asm"
+ patterns: "*.asm"
fileTags: ["asm"]
}
}
diff --git a/src/lib/tools/persistence.cpp b/src/lib/tools/persistence.cpp
index c6585012e..c40fa8470 100644
--- a/src/lib/tools/persistence.cpp
+++ b/src/lib/tools/persistence.cpp
@@ -40,7 +40,7 @@
namespace qbs {
namespace Internal {
-static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-53";
+static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-54";
PersistentPool::PersistentPool(const Logger &logger) : m_logger(logger)
{