From a55314a6dd3c2f4778b3de259748f1ee6ba6e16b Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 17 Mar 2014 18:27:10 +0100 Subject: make PropertyDeclaration implicitly shared Change-Id: Iad2f353371bd64ce8138dc86ed1f07ac994cf237 Reviewed-by: Christian Kandeler --- src/lib/corelib/api/languageinfo.cpp | 4 +- src/lib/corelib/language/builtindeclarations.cpp | 72 ++++++++------ src/lib/corelib/language/evaluatorscriptclass.cpp | 2 +- src/lib/corelib/language/itemreaderastvisitor.cpp | 14 +-- src/lib/corelib/language/moduleloader.cpp | 8 +- src/lib/corelib/language/projectresolver.cpp | 16 +-- src/lib/corelib/language/propertydeclaration.cpp | 114 ++++++++++++++++++++-- src/lib/corelib/language/propertydeclaration.h | 36 +++++-- 8 files changed, 199 insertions(+), 67 deletions(-) (limited to 'src') diff --git a/src/lib/corelib/api/languageinfo.cpp b/src/lib/corelib/api/languageinfo.cpp index 8864a73c9..cda83fee4 100644 --- a/src/lib/corelib/api/languageinfo.cpp +++ b/src/lib/corelib/api/languageinfo.cpp @@ -63,9 +63,9 @@ QByteArray LanguageInfo::qmlTypeInfo() Internal::ItemDeclaration itemDecl = builtins.declarationsForType(typeName); foreach (const Internal::PropertyDeclaration &property, itemDecl.properties()) { result.append(" Property { name=\""); - result.append(property.name.toUtf8()); + result.append(property.name().toUtf8()); result.append("\"; "); - switch (property.type) { + switch (property.type()) { case qbs::Internal::PropertyDeclaration::UnknownType: result.append("type=\"unknown\""); break; diff --git a/src/lib/corelib/language/builtindeclarations.cpp b/src/lib/corelib/language/builtindeclarations.cpp index 187408add..b4cf7cda2 100644 --- a/src/lib/corelib/language/builtindeclarations.cpp +++ b/src/lib/corelib/language/builtindeclarations.cpp @@ -78,13 +78,13 @@ ItemDeclaration BuiltinDeclarations::declarationsForType(const QString &typeName void BuiltinDeclarations::setupItemForBuiltinType(Item *item) const { foreach (const PropertyDeclaration &pd, declarationsForType(item->typeName()).properties()) { - item->m_propertyDeclarations.insert(pd.name, pd); - ValuePtr &value = item->m_properties[pd.name]; + item->m_propertyDeclarations.insert(pd.name(), pd); + ValuePtr &value = item->m_properties[pd.name()]; if (!value) { JSSourceValuePtr sourceValue = JSSourceValue::create(); sourceValue->setFile(item->file()); - sourceValue->setSourceCode(pd.initialValueSource.isEmpty() ? - QLatin1String("undefined") : pd.initialValueSource); + sourceValue->setSourceCode(pd.initialValueSource().isEmpty() ? + QLatin1String("undefined") : pd.initialValueSource()); value = sourceValue; } } @@ -98,7 +98,7 @@ void BuiltinDeclarations::insert(const ItemDeclaration &decl) static PropertyDeclaration conditionProperty() { PropertyDeclaration decl(QLatin1String("condition"), PropertyDeclaration::Boolean); - decl.initialValueSource = QLatin1String("true"); + decl.setInitialValueSource(QLatin1String("true")); return decl; } @@ -110,10 +110,11 @@ static PropertyDeclaration nameProperty() static PropertyDeclaration prepareScriptProperty() { PropertyDeclaration decl(QLatin1String("prepare"), PropertyDeclaration::Verbatim); - decl.functionArgumentNames - << QLatin1String("project") << QLatin1String("product") - << QLatin1String("inputs") << QLatin1String("outputs") - << QLatin1String("input") << QLatin1String("output"); + decl.setFunctionArgumentNames( + QStringList() + << QLatin1String("project") << QLatin1String("product") + << QLatin1String("inputs") << QLatin1String("outputs") + << QLatin1String("input") << QLatin1String("output")); return decl; } @@ -124,7 +125,7 @@ void BuiltinDeclarations::addArtifactItem() item << PropertyDeclaration(QLatin1String("fileName"), PropertyDeclaration::Verbatim); item << PropertyDeclaration(QLatin1String("fileTags"), PropertyDeclaration::Variant); PropertyDeclaration decl(QLatin1String("alwaysUpdated"), PropertyDeclaration::Boolean); - decl.initialValueSource = QLatin1String("true"); + decl.setInitialValueSource(QLatin1String("true")); item << decl; insert(item); } @@ -136,7 +137,7 @@ void BuiltinDeclarations::addDependsItem() item << nameProperty(); item << PropertyDeclaration(QLatin1String("submodules"), PropertyDeclaration::Variant); PropertyDeclaration requiredDecl(QLatin1String("required"), PropertyDeclaration::Boolean); - requiredDecl.initialValueSource = QLatin1String("true"); + requiredDecl.setInitialValueSource(QLatin1String("true")); item << requiredDecl; insert(item); } @@ -180,10 +181,10 @@ void BuiltinDeclarations::addGroupItem() item << PropertyDeclaration(QLatin1String("prefix"), PropertyDeclaration::Variant, PropertyDeclaration::PropertyNotAvailableInConfig); PropertyDeclaration declaration; - declaration.name = QLatin1String("overrideTags"); - declaration.type = PropertyDeclaration::Boolean; - declaration.flags = PropertyDeclaration::PropertyNotAvailableInConfig; - declaration.initialValueSource = QLatin1String("true"); + declaration.setName(QLatin1String("overrideTags")); + declaration.setType(PropertyDeclaration::Boolean); + declaration.setFlags(PropertyDeclaration::PropertyNotAvailableInConfig); + declaration.setInitialValueSource(QLatin1String("true")); item << declaration; insert(item); } @@ -212,7 +213,7 @@ void BuiltinDeclarations::addModuleItem() item << PropertyDeclaration(QLatin1String("additionalProductFileTags"), PropertyDeclaration::Variant); PropertyDeclaration presentDecl(QLatin1String("present"), PropertyDeclaration::Boolean); - presentDecl.initialValueSource = QLatin1String("true"); + presentDecl.setInitialValueSource(QLatin1String("true")); item << presentDecl; insert(item); } @@ -222,7 +223,7 @@ void BuiltinDeclarations::addProbeItem() ItemDeclaration item(QLatin1String("Probe")); item << conditionProperty(); PropertyDeclaration foundProperty(QLatin1String("found"), PropertyDeclaration::Boolean); - foundProperty.initialValueSource = QLatin1String("false"); + foundProperty.setInitialValueSource(QLatin1String("false")); item << foundProperty; item << PropertyDeclaration(QLatin1String("configure"), PropertyDeclaration::Verbatim); insert(item); @@ -242,14 +243,14 @@ void BuiltinDeclarations::addProductItem() << QLatin1String("Rule")); item << conditionProperty(); PropertyDeclaration decl(QLatin1String("type"), PropertyDeclaration::StringList); - decl.initialValueSource = QLatin1String("[]"); + decl.setInitialValueSource(QLatin1String("[]")); item << decl; item << nameProperty(); decl = PropertyDeclaration(QLatin1String("targetName"), PropertyDeclaration::String); - decl.initialValueSource = QLatin1String("name"); + decl.setInitialValueSource(QLatin1String("name")); item << decl; decl = PropertyDeclaration(QLatin1String("destinationDirectory"), PropertyDeclaration::String); - decl.initialValueSource = QLatin1String("'.'"); + decl.setInitialValueSource(QLatin1String("'.'")); item << decl; item << PropertyDeclaration(QLatin1String("consoleApplication"), PropertyDeclaration::Boolean); @@ -303,15 +304,16 @@ void BuiltinDeclarations::addRuleItem() << QLatin1String("Artifact")); item << conditionProperty(); PropertyDeclaration decl(QLatin1String("multiplex"), PropertyDeclaration::Boolean); - decl.initialValueSource = QLatin1String("false"); + decl.setInitialValueSource(QLatin1String("false")); item << decl; item << PropertyDeclaration(QLatin1String("name"), PropertyDeclaration::String); item << PropertyDeclaration(QLatin1String("inputs"), PropertyDeclaration::StringList); item << PropertyDeclaration(QLatin1String("outputFileTags"), PropertyDeclaration::StringList); decl = PropertyDeclaration(QLatin1String("outputArtifacts"), PropertyDeclaration::Verbatim); - decl.functionArgumentNames - << QLatin1String("project") << QLatin1String("product") - << QLatin1String("inputs") << QLatin1String("input"); + decl.setFunctionArgumentNames( + QStringList() + << QLatin1String("project") << QLatin1String("product") + << QLatin1String("inputs") << QLatin1String("input")); item << decl; item << PropertyDeclaration(QLatin1String("usings"), PropertyDeclaration::StringList); item << PropertyDeclaration(QLatin1String("auxiliaryInputs"), @@ -332,9 +334,9 @@ void BuiltinDeclarations::addSubprojectItem() << QLatin1String("Properties")); item << PropertyDeclaration(QLatin1String("filePath"), PropertyDeclaration::Path); PropertyDeclaration inheritProperty; - inheritProperty.name = QLatin1String("inheritProperties"); - inheritProperty.type = PropertyDeclaration::Boolean; - inheritProperty.initialValueSource = QLatin1String("true"); + inheritProperty.setName(QLatin1String("inheritProperties")); + inheritProperty.setType(PropertyDeclaration::Boolean); + inheritProperty.setInitialValueSource(QLatin1String("true")); item << inheritProperty; insert(item); } @@ -358,15 +360,21 @@ void BuiltinDeclarations::addScannerItem() item << conditionProperty(); item << PropertyDeclaration(QLatin1String("inputs"), PropertyDeclaration::StringList); PropertyDeclaration recursive(QLatin1String("recursive"), PropertyDeclaration::Boolean); - recursive.initialValueSource = QLatin1String("false"); + recursive.setInitialValueSource(QLatin1String("false")); item << recursive; PropertyDeclaration searchPaths(QLatin1String("searchPaths"), PropertyDeclaration::Verbatim); - searchPaths.functionArgumentNames << QLatin1String("project") - << QLatin1String("product") << QLatin1String("input"); + searchPaths.setFunctionArgumentNames( + QStringList() + << QLatin1String("project") + << QLatin1String("product") + << QLatin1String("input")); item << searchPaths; PropertyDeclaration scan(QLatin1String("scan"), PropertyDeclaration::Verbatim); - scan.functionArgumentNames << QLatin1String("project") - << QLatin1String("product") << QLatin1String("input"); + scan.setFunctionArgumentNames( + QStringList() + << QLatin1String("project") + << QLatin1String("product") + << QLatin1String("input")); item << scan; insert(item); } diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp index fbcae8170..74677ff56 100644 --- a/src/lib/corelib/language/evaluatorscriptclass.cpp +++ b/src/lib/corelib/language/evaluatorscriptclass.cpp @@ -380,7 +380,7 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS converter.start(); const PropertyDeclaration decl = data->item->propertyDeclarations().value(name.toString()); - convertToPropertyType(decl.type, result); + convertToPropertyType(decl.type(), result); if (debugProperties) m_logger.qbsTrace() << "[SC] cache miss " << name << ": " << resultToString(result); diff --git a/src/lib/corelib/language/itemreaderastvisitor.cpp b/src/lib/corelib/language/itemreaderastvisitor.cpp index 8800536d7..bffd46e46 100644 --- a/src/lib/corelib/language/itemreaderastvisitor.cpp +++ b/src/lib/corelib/language/itemreaderastvisitor.cpp @@ -335,18 +335,18 @@ bool ItemReaderASTVisitor::visit(AST::UiPublicMember *ast) throw ErrorInfo(Tr::tr("public member without type")); if (Q_UNLIKELY(ast->type == AST::UiPublicMember::Signal)) throw ErrorInfo(Tr::tr("public member with signal type not supported")); - p.name = ast->name.toString(); - p.type = PropertyDeclaration::propertyTypeFromString(ast->memberType.toString()); - if (p.type == PropertyDeclaration::UnknownType) + p.setName(ast->name.toString()); + p.setType(PropertyDeclaration::propertyTypeFromString(ast->memberType.toString())); + if (p.type() == PropertyDeclaration::UnknownType) throw ErrorInfo(Tr::tr("Unknown type '%1' in property declaration.") .arg(ast->memberType.toString()), toCodeLocation(ast->typeToken)); if (ast->typeModifier.compare(QLatin1String("list"))) - p.flags |= PropertyDeclaration::ListProperty; + p.setFlags(p.flags() | PropertyDeclaration::ListProperty); else if (Q_UNLIKELY(!ast->typeModifier.isEmpty())) throw ErrorInfo(Tr::tr("public member with type modifier '%1' not supported").arg( ast->typeModifier.toString())); - m_item->m_propertyDeclarations.insert(p.name, p); + m_item->m_propertyDeclarations.insert(p.name(), p); JSSourceValuePtr value = JSSourceValue::create(); value->setFile(m_file); @@ -354,11 +354,11 @@ bool ItemReaderASTVisitor::visit(AST::UiPublicMember *ast) m_sourceValue.swap(value); visitStatement(ast->statement); m_sourceValue.swap(value); - const QStringList bindingName(p.name); + const QStringList bindingName(p.name()); checkDuplicateBinding(m_item, bindingName, ast->colonToken); } - m_item->m_properties.insert(p.name, value); + m_item->m_properties.insert(p.name(), value); return false; } diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 0d92afde1..8078d6e09 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -793,7 +793,7 @@ Item *ModuleLoader::loadModuleFile(ProductContext *productContext, const QString throw ErrorInfo(Tr::tr("Unknown property: %1.%2").arg(fullModuleName, vmit.key())); const PropertyDeclaration decl = firstValidPropertyDeclaration(module, vmit.key()); module->setProperty(vmit.key(), - VariantValue::create(convertToPropertyType(vmit.value(), decl.type, + VariantValue::create(convertToPropertyType(vmit.value(), decl.type(), QStringList(fullModuleName), vmit.key()))); } @@ -913,7 +913,7 @@ void ModuleLoader::instantiateModule(ProductContext *productContext, Item *insta } const PropertyDeclaration decl = firstValidPropertyDeclaration(moduleInstance, vmit.key()); moduleInstance->setProperty(vmit.key(), - VariantValue::create(convertToPropertyType(vmit.value(), decl.type, moduleName, + VariantValue::create(convertToPropertyType(vmit.value(), decl.type(), moduleName, vmit.key()))); } } @@ -1042,7 +1042,7 @@ void ModuleLoader::copyProperties(const Item *sourceProject, Item *targetProject = m_reader->builtins()->declarationsForType(QLatin1String("Project")).properties(); QSet builtinProjectPropertyNames; foreach (const PropertyDeclaration &p, builtinProjectProperties) - builtinProjectPropertyNames << p.name; + builtinProjectPropertyNames << p.name(); for (Item::PropertyDeclarationMap::ConstIterator it = sourceProject->propertyDeclarations().constBegin(); @@ -1134,7 +1134,7 @@ void ModuleLoader::overrideItemProperties(Item *item, const QString &buildConfig Tr::tr("Unknown property: %1.%2").arg(buildConfigKey, it.key())); } item->setProperty(it.key(), - VariantValue::create(convertToPropertyType(it.value(), decl.type, + VariantValue::create(convertToPropertyType(it.value(), decl.type(), QStringList(buildConfigKey), it.key()))); } } diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 66ecb9fd5..528be2a8e 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -213,7 +213,7 @@ void ProjectResolver::resolveProject(Item *item, ProjectContext *projectContext) for (Item::PropertyDeclarationMap::const_iterator it = item->propertyDeclarations().constBegin(); it != item->propertyDeclarations().constEnd(); ++it) { - if (it.value().flags.testFlag(PropertyDeclaration::PropertyNotAvailableInConfig)) + if (it.value().flags().testFlag(PropertyDeclaration::PropertyNotAvailableInConfig)) continue; const ValueConstPtr v = item->property(it.key()); QBS_ASSERT(v && v->type() != Value::ItemValueType, continue); @@ -532,7 +532,7 @@ void ProjectResolver::resolveGroup(Item *item, ProjectContext *projectContext) static QString sourceCodeAsFunction(const JSSourceValueConstPtr &value, const PropertyDeclaration &decl) { - const QString args = decl.functionArgumentNames.join(QLatin1String(",")); + const QString args = decl.functionArgumentNames().join(QLatin1String(",")); if (value->hasFunctionForm()) { // Insert the argument list. QString code = value->sourceCode(); @@ -553,7 +553,7 @@ ScriptFunctionPtr ProjectResolver::scriptFunctionValue(Item *item, const QString if (value) { const PropertyDeclaration decl = item->propertyDeclaration(name); script->sourceCode = sourceCodeAsFunction(value, decl); - script->argumentNames = decl.functionArgumentNames; + script->argumentNames = decl.functionArgumentNames(); script->location = value->location(); script->fileContext = resolvedFileContext(value->file()); } @@ -971,8 +971,8 @@ QVariantMap ProjectResolver::evaluateProperties(Item *item, if (pd.isValid()) break; } - if (pd.type == PropertyDeclaration::Verbatim - || pd.flags.testFlag(PropertyDeclaration::PropertyNotAvailableInConfig)) + if (pd.type() == PropertyDeclaration::Verbatim + || pd.flags().testFlag(PropertyDeclaration::PropertyNotAvailableInConfig)) { break; } @@ -984,13 +984,13 @@ QVariantMap ProjectResolver::evaluateProperties(Item *item, // as such QScriptValues become invalid QVariants. QVariant v = scriptValue.toVariant(); - if (pd.type == PropertyDeclaration::Path) + if (pd.type() == PropertyDeclaration::Path) v = convertPathProperty(v.toString(), m_productContext->product->sourceDirectory); - else if (pd.type == PropertyDeclaration::PathList) + else if (pd.type() == PropertyDeclaration::PathList) v = convertPathListProperty(v.toStringList(), m_productContext->product->sourceDirectory); - else if (pd.type == PropertyDeclaration::StringList) + else if (pd.type() == PropertyDeclaration::StringList) v = v.toStringList(); result[it.key()] = v; break; diff --git a/src/lib/corelib/language/propertydeclaration.cpp b/src/lib/corelib/language/propertydeclaration.cpp index 79236e6da..fef098d45 100644 --- a/src/lib/corelib/language/propertydeclaration.cpp +++ b/src/lib/corelib/language/propertydeclaration.cpp @@ -29,19 +29,45 @@ #include "propertydeclaration.h" +#include + namespace qbs { namespace Internal { +class PropertyDeclarationData : public QSharedData +{ +public: + PropertyDeclarationData() + : type(PropertyDeclaration::UnknownType) + , flags(PropertyDeclaration::DefaultFlags) + { + } + + QString name; + PropertyDeclaration::Type type; + PropertyDeclaration::Flags flags; + QScriptValue allowedValues; + QString description; + QString initialValueSource; + QStringList functionArgumentNames; +}; + + PropertyDeclaration::PropertyDeclaration() - : type(UnknownType) - , flags(DefaultFlags) + : d(new PropertyDeclarationData) { } PropertyDeclaration::PropertyDeclaration(const QString &name, Type type, Flags flags) - : name(name) - , type(type) - , flags(flags) + : d(new PropertyDeclarationData) +{ + d->name = name; + d->type = type; + d->flags = flags; +} + +PropertyDeclaration::PropertyDeclaration(const PropertyDeclaration &other) + : d(other.d) { } @@ -49,9 +75,15 @@ PropertyDeclaration::~PropertyDeclaration() { } +PropertyDeclaration &PropertyDeclaration::operator=(const PropertyDeclaration &other) +{ + d = other.d; + return *this; +} + bool PropertyDeclaration::isValid() const { - return type != UnknownType; + return d && d->type != UnknownType; } PropertyDeclaration::Type PropertyDeclaration::propertyTypeFromString(const QString &typeName) @@ -73,5 +105,75 @@ PropertyDeclaration::Type PropertyDeclaration::propertyTypeFromString(const QStr return PropertyDeclaration::UnknownType; } +const QString &PropertyDeclaration::name() const +{ + return d->name; +} + +void PropertyDeclaration::setName(const QString &name) +{ + d->name = name; +} + +PropertyDeclaration::Type PropertyDeclaration::type() const +{ + return d->type; +} + +void PropertyDeclaration::setType(PropertyDeclaration::Type t) +{ + d->type = t; +} + +PropertyDeclaration::Flags PropertyDeclaration::flags() const +{ + return d->flags; +} + +void PropertyDeclaration::setFlags(Flags f) +{ + d->flags = f; +} + +const QScriptValue &PropertyDeclaration::allowedValues() const +{ + return d->allowedValues; +} + +void PropertyDeclaration::setAllowedValues(const QScriptValue &v) +{ + d->allowedValues = v; +} + +const QString &PropertyDeclaration::description() const +{ + return d->description; +} + +void PropertyDeclaration::setDescripton(const QString &str) +{ + d->description = str; +} + +const QString &PropertyDeclaration::initialValueSource() const +{ + return d->initialValueSource; +} + +void PropertyDeclaration::setInitialValueSource(const QString &str) +{ + d->initialValueSource = str; +} + +const QStringList &PropertyDeclaration::functionArgumentNames() const +{ + return d->functionArgumentNames; +} + +void PropertyDeclaration::setFunctionArgumentNames(const QStringList &lst) +{ + d->functionArgumentNames = lst; +} + } // namespace Internal } // namespace qbs diff --git a/src/lib/corelib/language/propertydeclaration.h b/src/lib/corelib/language/propertydeclaration.h index 441e42af9..9b56e0c7b 100644 --- a/src/lib/corelib/language/propertydeclaration.h +++ b/src/lib/corelib/language/propertydeclaration.h @@ -30,6 +30,7 @@ #ifndef QBS_PROPERTYDECLARATION_H #define QBS_PROPERTYDECLARATION_H +#include #include #include #include @@ -37,6 +38,8 @@ namespace qbs { namespace Internal { +class PropertyDeclarationData; + class PropertyDeclaration { public: @@ -63,19 +66,38 @@ public: PropertyDeclaration(); PropertyDeclaration(const QString &name, Type type, Flags flags = DefaultFlags); + PropertyDeclaration(const PropertyDeclaration &other); ~PropertyDeclaration(); + PropertyDeclaration &operator=(const PropertyDeclaration &other); + bool isValid() const; static Type propertyTypeFromString(const QString &typeName); - QString name; - Type type; - Flags flags; - QScriptValue allowedValues; - QString description; - QString initialValueSource; - QStringList functionArgumentNames; + const QString &name() const; + void setName(const QString &name); + + Type type() const; + void setType(Type t); + + Flags flags() const; + void setFlags(Flags f); + + const QScriptValue &allowedValues() const; + void setAllowedValues(const QScriptValue &v); + + const QString &description() const; + void setDescripton(const QString &str); + + const QString &initialValueSource() const; + void setInitialValueSource(const QString &str); + + const QStringList &functionArgumentNames() const; + void setFunctionArgumentNames(const QStringList &lst); + +private: + QSharedDataPointer d; }; } // namespace Internal -- cgit v1.2.3