diff options
| author | Sami Shalayel <sami.shalayel@qt.io> | 2023-09-26 09:55:02 +0200 |
|---|---|---|
| committer | Sami Shalayel <sami.shalayel@qt.io> | 2023-09-26 20:46:38 +0200 |
| commit | 46d77f02e361e59df94ac1e409e779218b4be41f (patch) | |
| tree | e6106c1412de48ba310f153aa9aaf2a32e3b20de /src | |
| parent | 35cdfc32e7f272efbdbc08f395b570ff1d2a75cc (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.h | 20 | ||||
| -rw-r--r-- | src/qmldom/qqmldomitem.cpp | 48 | ||||
| -rw-r--r-- | src/qmldom/qqmldomitem_p.h | 2 | ||||
| -rw-r--r-- | src/qmlls/qqmllsutils.cpp | 9 |
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); |
