aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSami Shalayel <sami.shalayel@qt.io>2023-09-26 09:55:02 +0200
committerSami Shalayel <sami.shalayel@qt.io>2023-09-26 20:46:38 +0200
commit46d77f02e361e59df94ac1e409e779218b4be41f (patch)
treee6106c1412de48ba310f153aa9aaf2a32e3b20de /src
parent35cdfc32e7f272efbdbc08f395b570ff1d2a75cc (diff)
Make LocalSymbolsType enum values independent
Fix LocalSymbolsType to be a real QFlag by replacing the enum values that actually contain multiple values with 'normal' enum values that only contain one bit. This allows to simplify the logic in DomItem::localSymbolNames as the LocalSymbolsType flags can now all be checked independently from each other. Also rename the enum values to be singular. Task-number: QTBUG-116899 Change-Id: Ia9040bd6df3b00cd06f53c97a98156683e9ee2de Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qmldom/qqmldomconstants_p.h20
-rw-r--r--src/qmldom/qqmldomitem.cpp48
-rw-r--r--src/qmldom/qqmldomitem_p.h2
-rw-r--r--src/qmlls/qqmllsutils.cpp9
4 files changed, 37 insertions, 42 deletions
diff --git a/src/qmldom/qqmldomconstants_p.h b/src/qmldom/qqmldomconstants_p.h
index 20ebdf2975..b48f698ae5 100644
--- a/src/qmldom/qqmldomconstants_p.h
+++ b/src/qmldom/qqmldomconstants_p.h
@@ -315,17 +315,15 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(WriteOutChecks)
enum class LocalSymbolsType {
None = 0x0,
- QmlTypes = 0x1,
- Types = 0x3,
- Signals = 0x4,
- Methods = 0xC,
- Attributes = 0x10,
- Ids = 0x20,
- Components = 0x40,
- Namespaces = 0x80,
- Globals = 0x100,
- MethodParameters = 0x200,
- All = 0x3FF
+ ObjectType = 0x1,
+ ValueType = 0x2,
+ Signal = 0x4,
+ Method = 0x8,
+ Attribute = 0x10,
+ Id = 0x20,
+ Namespace = 0x40,
+ Global = 0x80,
+ MethodParameter = 0x100,
};
Q_ENUM_NS(LocalSymbolsType)
Q_DECLARE_FLAGS(LocalSymbolsTypes, LocalSymbolsType)
diff --git a/src/qmldom/qqmldomitem.cpp b/src/qmldom/qqmldomitem.cpp
index 9f84c39b5f..4987710523 100644
--- a/src/qmldom/qqmldomitem.cpp
+++ b/src/qmldom/qqmldomitem.cpp
@@ -1804,21 +1804,19 @@ QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) const
return res;
switch (internalKind()) {
case DomType::QmlObject:
- if (typeFilter & LocalSymbolsType::Attributes) {
+ if (typeFilter & LocalSymbolsType::Attribute) {
res += propertyDefs().keys();
res += bindings().keys();
}
- if (typeFilter & LocalSymbolsType::Methods) {
- if ((typeFilter & LocalSymbolsType::Methods) == LocalSymbolsType::Methods) {
- res += methods().keys();
- } else {
- bool shouldAddSignals = bool(typeFilter & LocalSymbolsType::Signals);
- if (const QmlObject *objPtr = as<QmlObject>()) {
- auto methods = objPtr->methods();
- for (auto it = methods.cbegin(); it != methods.cend(); ++it) {
- if (bool(it.value().methodType == MethodInfo::MethodType::Signal)
- == shouldAddSignals)
- res += it.key();
+ if (typeFilter.testFlag(LocalSymbolsType::Signal)
+ || typeFilter.testFlag(LocalSymbolsType::Method)) {
+ if (const QmlObject *objPtr = as<QmlObject>()) {
+ auto methods = objPtr->methods();
+ for (auto it = methods.cbegin(); it != methods.cend(); ++it) {
+ const bool isSignal = it.value().methodType == MethodInfo::MethodType::Signal;
+ if (((typeFilter & LocalSymbolsType::Signal) && isSignal)
+ || ((typeFilter & LocalSymbolsType::Method) && !isSignal)) {
+ res += it.key();
}
}
}
@@ -1828,11 +1826,11 @@ QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) const
// to do
break;
case DomType::QmlComponent:
- if (typeFilter & LocalSymbolsType::Ids)
+ if (typeFilter & LocalSymbolsType::Id)
res += ids().keys();
break;
case DomType::QmlFile: // subComponents, imported types
- if (typeFilter & LocalSymbolsType::Components) {
+ if (typeFilter & LocalSymbolsType::ObjectType) {
DomItem comps = field(Fields::components);
for (auto k : comps.keys())
if (!k.isEmpty())
@@ -1841,18 +1839,16 @@ QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) const
break;
case DomType::ImportScope: {
const ImportScope *currentPtr = as<ImportScope>();
- if (typeFilter & LocalSymbolsType::Types) {
- if ((typeFilter & LocalSymbolsType::Types) == LocalSymbolsType::Types) {
- res += currentPtr->importedNames(*this);
- } else {
- bool qmlTypes = bool(typeFilter & LocalSymbolsType::QmlTypes);
- for (const QString &typeName : currentPtr->importedNames(*this)) {
- if ((!typeName.isEmpty() && typeName.at(0).isUpper()) == qmlTypes)
- res += typeName;
- }
+ const bool importObjects = typeFilter & LocalSymbolsType::ObjectType;
+ const bool importValues = typeFilter & LocalSymbolsType::ValueType;
+ if (importObjects || importValues) {
+ for (const QString &typeName : currentPtr->importedNames(*this)) {
+ const bool isObject = !typeName.isEmpty() && typeName.at(0).isUpper();
+ if ((isObject && importObjects) || (!isObject && importValues))
+ res += typeName;
}
}
- if (typeFilter & LocalSymbolsType::Namespaces) {
+ if (typeFilter & LocalSymbolsType::Namespace) {
for (const auto &k : currentPtr->subImports().keys())
res.insert(k);
}
@@ -1861,11 +1857,11 @@ QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) const
case DomType::QmltypesComponent:
case DomType::JsResource:
case DomType::GlobalComponent:
- if (typeFilter & LocalSymbolsType::Globals)
+ if (typeFilter & LocalSymbolsType::Global)
res += enumerations().keys();
break;
case DomType::MethodInfo: {
- if (typeFilter & LocalSymbolsType::MethodParameters) {
+ if (typeFilter & LocalSymbolsType::MethodParameter) {
DomItem params = field(Fields::parameters);
params.visitIndexes([&res](const DomItem &p) {
const MethodParameter *pPtr = p.as<MethodParameter>();
diff --git a/src/qmldom/qqmldomitem_p.h b/src/qmldom/qqmldomitem_p.h
index 11273750c3..babb2d8b76 100644
--- a/src/qmldom/qqmldomitem_p.h
+++ b/src/qmldom/qqmldomitem_p.h
@@ -1027,7 +1027,7 @@ public:
LookupOptions = LookupOption::Normal, ErrorHandler h = nullptr,
QSet<quintptr> *visited = nullptr, QList<Path> *visitedRefs = nullptr) const;
bool visitLocalSymbolsNamed(QString name, function_ref<bool(const DomItem &)> visitor) const;
- QSet<QString> localSymbolNames(LocalSymbolsTypes lTypes = LocalSymbolsType::All) const;
+ QSet<QString> localSymbolNames(LocalSymbolsTypes lTypes) const;
bool visitLookup1(QString symbolName, function_ref<bool(const DomItem &)> visitor,
LookupOptions = LookupOption::Normal, ErrorHandler h = nullptr,
QSet<quintptr> *visited = nullptr, QList<Path> *visitedRefs = nullptr) const;
diff --git a/src/qmlls/qqmllsutils.cpp b/src/qmlls/qqmllsutils.cpp
index f9ea7aa9cd..2d0eaf12f8 100644
--- a/src/qmlls/qqmllsutils.cpp
+++ b/src/qmlls/qqmllsutils.cpp
@@ -1691,12 +1691,13 @@ QList<CompletionItem> QQmlLSUtils::reachableSymbols(const DomItem &context,
auto addLocalSymbols = [&typeCompletionType, &symbols](const DomItem &el) {
LocalSymbolsTypes options;
if (typeCompletionType.testFlag(TypeCompletionOption::Types)) {
- options.setFlag(LocalSymbolsType::Namespaces);
- options.setFlag(LocalSymbolsType::Types);
+ options.setFlag(LocalSymbolsType::Namespace);
+ options.setFlag(LocalSymbolsType::ValueType);
+ options.setFlag(LocalSymbolsType::ObjectType);
}
if (typeCompletionType.testFlag(TypeCompletionOption::QmlTypes)) {
- options.setFlag(LocalSymbolsType::QmlTypes);
- options.setFlag(LocalSymbolsType::Namespaces);
+ options.setFlag(LocalSymbolsType::ObjectType);
+ options.setFlag(LocalSymbolsType::Namespace);
}
if (options != LocalSymbolsType::None) {
reachableTypes(symbols[CompletionItemKind::Class], el, options);