QmlDesigner: Add tracing points to abstract property

Change-Id: Id980b75df7d84f2a993c867e30b4e6d2684e0b97
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Burak Hancerli
2025-05-12 13:59:02 +02:00
parent e3b5a16bc3
commit afb63e8cdf
6 changed files with 144 additions and 70 deletions

View File

@@ -5,12 +5,9 @@
#include "qmldesignercorelib_global.h" #include "qmldesignercorelib_global.h"
#include <utils/smallstring.h> #include <designercore/tracing/qmldesignertracing.h>
#include <QPointer> #include <QPointer>
#include <QSharedPointer>
#include <memory>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QTextStream; class QTextStream;
@@ -47,6 +44,8 @@ class QMLDESIGNERCORE_EXPORT AbstractProperty
friend ModelNode; friend ModelNode;
friend Internal::ModelPrivate; friend Internal::ModelPrivate;
using SL = ModelTracing::SourceLocation;
public: public:
AbstractProperty() = default; AbstractProperty() = default;
AbstractProperty(const AbstractProperty &) = default; AbstractProperty(const AbstractProperty &) = default;
@@ -67,27 +66,27 @@ public:
bool exists() const; bool exists() const;
ModelNode parentModelNode() const; ModelNode parentModelNode() const;
bool isDefaultProperty() const; bool isDefaultProperty(SL sl = {}) const;
VariantProperty toVariantProperty() const; VariantProperty toVariantProperty(SL sl = {}) const;
NodeListProperty toNodeListProperty() const; NodeListProperty toNodeListProperty(SL sl = {}) const;
NodeAbstractProperty toNodeAbstractProperty() const; NodeAbstractProperty toNodeAbstractProperty(SL sl = {}) const;
BindingProperty toBindingProperty() const; BindingProperty toBindingProperty(SL sl = {}) const;
NodeProperty toNodeProperty() const; NodeProperty toNodeProperty(SL sl = {}) const;
SignalHandlerProperty toSignalHandlerProperty() const; SignalHandlerProperty toSignalHandlerProperty(SL sl = {}) const;
SignalDeclarationProperty toSignalDeclarationProperty() const; SignalDeclarationProperty toSignalDeclarationProperty(SL sl = {}) const;
bool isVariantProperty() const; bool isVariantProperty(SL sl = {}) const;
bool isNodeListProperty() const; bool isNodeListProperty(SL sl = {}) const;
bool isNodeAbstractProperty() const; bool isNodeAbstractProperty(SL sl = {}) const;
bool isBindingProperty() const; bool isBindingProperty(SL sl = {}) const;
bool isNodeProperty() const; bool isNodeProperty(SL sl = {}) const;
bool isSignalHandlerProperty() const; bool isSignalHandlerProperty(SL sl = {}) const;
bool isSignalDeclarationProperty() const; bool isSignalDeclarationProperty(SL sl = {}) const;
PropertyType type() const; PropertyType type(SL sl = {}) const;
bool isDynamic() const; bool isDynamic(SL sl = {}) const;
TypeName dynamicTypeName() const; TypeName dynamicTypeName(SL sl = {}) const;
template<typename... TypeName> template<typename... TypeName>
bool hasDynamicTypeName(const TypeName &...typeName) const bool hasDynamicTypeName(const TypeName &...typeName) const

View File

@@ -3,18 +3,14 @@
#include "abstractproperty.h" #include "abstractproperty.h"
#include "internalnode_p.h" #include "internalnode_p.h"
#include <model.h>
#include "model_p.h" #include "model_p.h"
#include <modelnode.h>
#include "variantproperty.h"
#include "bindingproperty.h"
#include "signalhandlerproperty.h"
#include "nodeproperty.h"
#include "nodeabstractproperty.h"
#include "nodelistproperty.h" #include "nodelistproperty.h"
#include <QTextStream> #include "nodeproperty.h"
#include "signalhandlerproperty.h"
#include "variantproperty.h"
#include <QByteArrayView> #include <QByteArrayView>
#include <QTextStream>
namespace QmlDesigner { namespace QmlDesigner {
@@ -47,13 +43,11 @@ AbstractProperty::AbstractProperty(const Internal::InternalPropertyPointer &prop
} }
AbstractProperty::AbstractProperty(const AbstractProperty &property, AbstractView *view) AbstractProperty::AbstractProperty(const AbstractProperty &property, AbstractView *view)
: m_propertyName(property.name()), : m_propertyName(property.name())
m_internalNode(property.internalNode()), , m_internalNode(property.internalNode())
m_model(property.model()), , m_model(property.model())
m_view(view) , m_view(view)
{ {}
}
AbstractProperty::~AbstractProperty() = default; AbstractProperty::~AbstractProperty() = default;
@@ -105,104 +99,141 @@ ModelNode AbstractProperty::parentModelNode() const
/*! /*!
Returns whether the property is the default property for the model node. Returns whether the property is the default property for the model node.
*/ */
bool AbstractProperty::isDefaultProperty() const bool AbstractProperty::isDefaultProperty(SL sl) const
{ {
return ModelNode(m_internalNode, m_model.data(), view()).metaInfo().defaultPropertyName() == m_propertyName; NanotraceHR::Tracer tracer{"abstract property is default property",
ModelTracing::category(),
keyValue("caller location", sl)};
return ModelNode(m_internalNode, m_model.data(), view()).metaInfo(sl).defaultPropertyName(sl)
== m_propertyName;
} }
VariantProperty AbstractProperty::toVariantProperty() const VariantProperty AbstractProperty::toVariantProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to variant property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
VariantProperty propertyVariant(name(), internalNodeSharedPointer(), model(), view()); VariantProperty propertyVariant(name(), internalNodeSharedPointer(), model(), view());
if (propertyVariant.isVariantProperty()) if (propertyVariant.isVariantProperty(sl))
return propertyVariant; return propertyVariant;
return VariantProperty(); return VariantProperty();
} }
NodeProperty AbstractProperty::toNodeProperty() const NodeProperty AbstractProperty::toNodeProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to node property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
NodeProperty propertyNode(name(), internalNodeSharedPointer(), model(), view()); NodeProperty propertyNode(name(), internalNodeSharedPointer(), model(), view());
if (propertyNode.isNodeProperty()) if (propertyNode.isNodeProperty(sl))
return propertyNode; return propertyNode;
return NodeProperty(); return NodeProperty();
} }
SignalHandlerProperty AbstractProperty::toSignalHandlerProperty() const SignalHandlerProperty AbstractProperty::toSignalHandlerProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to signal handler property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
SignalHandlerProperty propertyNode(name(), internalNodeSharedPointer(), model(), view()); SignalHandlerProperty propertyNode(name(), internalNodeSharedPointer(), model(), view());
if (propertyNode.isSignalHandlerProperty()) if (propertyNode.isSignalHandlerProperty(sl))
return propertyNode; return propertyNode;
return SignalHandlerProperty(); return SignalHandlerProperty();
} }
SignalDeclarationProperty AbstractProperty::toSignalDeclarationProperty() const SignalDeclarationProperty AbstractProperty::toSignalDeclarationProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to signal declaration property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
SignalDeclarationProperty propertyNode(name(), internalNodeSharedPointer(), model(), view()); SignalDeclarationProperty propertyNode(name(), internalNodeSharedPointer(), model(), view());
if (propertyNode.isSignalDeclarationProperty()) if (propertyNode.isSignalDeclarationProperty(sl))
return propertyNode; return propertyNode;
return SignalDeclarationProperty(); return SignalDeclarationProperty();
} }
NodeListProperty AbstractProperty::toNodeListProperty() const NodeListProperty AbstractProperty::toNodeListProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to node list property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
NodeListProperty propertyNodeList(name(), internalNodeSharedPointer(), model(), view()); NodeListProperty propertyNodeList(name(), internalNodeSharedPointer(), model(), view());
if (propertyNodeList.isNodeListProperty()) if (propertyNodeList.isNodeListProperty(sl))
return propertyNodeList; return propertyNodeList;
return NodeListProperty(); return NodeListProperty();
} }
NodeAbstractProperty AbstractProperty::toNodeAbstractProperty() const NodeAbstractProperty AbstractProperty::toNodeAbstractProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to node abstract property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
NodeAbstractProperty propertyNodeAbstract(name(), internalNodeSharedPointer(), model(), view()); NodeAbstractProperty propertyNodeAbstract(name(), internalNodeSharedPointer(), model(), view());
if (propertyNodeAbstract.isNodeAbstractProperty()) if (propertyNodeAbstract.isNodeAbstractProperty(sl))
return propertyNodeAbstract; return propertyNodeAbstract;
return NodeAbstractProperty(); return NodeAbstractProperty();
} }
BindingProperty AbstractProperty::toBindingProperty() const BindingProperty AbstractProperty::toBindingProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property to binding property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};
BindingProperty propertyBinding(name(), internalNodeSharedPointer(), model(), view()); BindingProperty propertyBinding(name(), internalNodeSharedPointer(), model(), view());
if (propertyBinding.isBindingProperty()) if (propertyBinding.isBindingProperty(sl))
return propertyBinding; return propertyBinding;
return BindingProperty(); return BindingProperty();
} }
bool AbstractProperty::isVariantProperty() const bool AbstractProperty::isVariantProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is variant property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -212,8 +243,12 @@ bool AbstractProperty::isVariantProperty() const
return false; return false;
} }
bool AbstractProperty::isNodeAbstractProperty() const bool AbstractProperty::isNodeAbstractProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is node abstract property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -223,8 +258,12 @@ bool AbstractProperty::isNodeAbstractProperty() const
return false; return false;
} }
bool AbstractProperty::isNodeListProperty() const bool AbstractProperty::isNodeListProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is node list property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -234,8 +273,12 @@ bool AbstractProperty::isNodeListProperty() const
return false; return false;
} }
bool AbstractProperty::isNodeProperty() const bool AbstractProperty::isNodeProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is node property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -245,8 +288,12 @@ bool AbstractProperty::isNodeProperty() const
return false; return false;
} }
bool AbstractProperty::isSignalHandlerProperty() const bool AbstractProperty::isSignalHandlerProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is signal handler property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -256,8 +303,12 @@ bool AbstractProperty::isSignalHandlerProperty() const
return false; return false;
} }
bool AbstractProperty::isSignalDeclarationProperty() const bool AbstractProperty::isSignalDeclarationProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is signal declaration property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -267,8 +318,12 @@ bool AbstractProperty::isSignalDeclarationProperty() const
return false; return false;
} }
PropertyType AbstractProperty::type() const PropertyType AbstractProperty::type(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property type",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return PropertyType::None; return PropertyType::None;
@@ -278,8 +333,12 @@ PropertyType AbstractProperty::type() const
return PropertyType::None; return PropertyType::None;
} }
bool AbstractProperty::isBindingProperty() const bool AbstractProperty::isBindingProperty(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property is binding property",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return false; return false;
@@ -289,13 +348,21 @@ bool AbstractProperty::isBindingProperty() const
return false; return false;
} }
bool AbstractProperty::isDynamic() const bool AbstractProperty::isDynamic(SL sl) const
{ {
return !dynamicTypeName().isEmpty(); NanotraceHR::Tracer tracer{"abstract property is dynamic",
ModelTracing::category(),
keyValue("caller location", sl)};
return !dynamicTypeName(sl).isEmpty();
} }
TypeName AbstractProperty::dynamicTypeName() const TypeName AbstractProperty::dynamicTypeName(SL sl) const
{ {
NanotraceHR::Tracer tracer{"abstract property dynamic type name",
ModelTracing::category(),
keyValue("caller location", sl)};
if (!isValid()) if (!isValid())
return {}; return {};

View File

@@ -59,7 +59,7 @@ public:
int majorVersion, int majorVersion,
int minorVersion, int minorVersion,
qint32 internalId, qint32 internalId,
ModelTracing::Category::FlowTokenType flowTraceToken) ModelTracing::StringCategory::FlowTokenType flowTraceToken)
: typeName(typeName.toByteArray()) : typeName(typeName.toByteArray())
, majorVersion(majorVersion) , majorVersion(majorVersion)
, minorVersion(minorVersion) , minorVersion(minorVersion)

View File

@@ -348,7 +348,8 @@ public:
NotNullPointer<ProjectStorageType> projectStorage = nullptr; NotNullPointer<ProjectStorageType> projectStorage = nullptr;
NotNullPointer<PathCacheType> pathCache = nullptr; NotNullPointer<PathCacheType> pathCache = nullptr;
NotNullPointer<ProjectStorageTriggerUpdateInterface> projectStorageTriggerUpdate = nullptr; NotNullPointer<ProjectStorageTriggerUpdateInterface> projectStorageTriggerUpdate = nullptr;
ModelTracing::AsynchronousToken traceToken = ModelTracing::category().beginAsynchronous("Model"); ModelTracing::AsynchronousToken traceToken = ModelTracing::stringCategory().beginAsynchronous(
"Model");
private: private:
Model *m_model = nullptr; Model *m_model = nullptr;

View File

@@ -55,7 +55,8 @@ StringEventQueue &stringEventQueue()
namespace ModelTracing { namespace ModelTracing {
namespace { namespace {
thread_local Category category_{"model", Tracing::stringEventQueue(), category}; thread_local Category category_{"model", Tracing::eventQueueWithStringArguments(), category};
thread_local StringCategory stringCategory_{"model", Tracing::stringEventQueue(), stringCategory};
} // namespace } // namespace
@@ -64,6 +65,11 @@ Category &category()
return category_; return category_;
} }
StringCategory &stringCategory()
{
return stringCategory_;
}
} // namespace ModelTracing } // namespace ModelTracing
namespace ProjectStorageTracing { namespace ProjectStorageTracing {

View File

@@ -39,11 +39,12 @@ constexpr NanotraceHR::Tracing tracingStatus()
#endif #endif
} }
using Category = NanotraceHR::StringCategory<tracingStatus()>; using Category = NanotraceHR::StringViewWithStringArgumentsCategory<tracingStatus()>;
using StringCategory = NanotraceHR::StringCategory<tracingStatus()>;
using SourceLocation = Category::SourceLocation; using SourceLocation = Category::SourceLocation;
using AsynchronousToken = Category::AsynchronousTokenType; using AsynchronousToken = StringCategory::AsynchronousTokenType;
[[gnu::pure]] QMLDESIGNERCORE_EXPORT Category &category(); [[gnu::pure]] QMLDESIGNERCORE_EXPORT Category &category();
[[gnu::pure]] QMLDESIGNERCORE_EXPORT StringCategory &stringCategory();
} // namespace ModelTracing } // namespace ModelTracing
namespace ProjectStorageTracing { namespace ProjectStorageTracing {