14 const auto it = m_types.find(name);
15 auto insertName = [
this, &name, &type]() {
16 if (!name.startsWith(u'$')) {
17 if (!m_names.contains(type.scope, name))
18 m_names.insert(type.scope, name);
21 if (
const QString fileSelector = QQmlJSUtils::fileSelectorFor(type.scope);
22 !fileSelector.isEmpty()) {
23 setFileSelectedType(fileSelector, name, type);
28 if (it == m_types.end()) {
29 m_types.insert(name, type);
35 if (it == m_types.end()) {
36 m_types.insert(name, type);
41 if (it->m_precedence < type.m_precedence)
45 const QQmlJSScope::ConstPtr oldScope = it->scope;
47 const bool isOldScopeStillRefencedAsFileSelected = [&]() {
48 for (
auto [it, end] = m_fileSelectedTypes.equal_range(name); it != end; ++it) {
49 if (it->type.scope == oldScope)
54 if (!isOldScopeStillRefencedAsFileSelected)
55 m_names.remove(oldScope, name);
62 auto insertName = [
this, &name, &type]() {
63 if (!name.startsWith(u'$')) {
64 if (!m_names.contains(type.scope, name))
65 m_names.insert(type.scope, name);
69 auto [it, end] = m_fileSelectedTypes.equal_range(name);
70 auto match = std::find_if(it, end, [&fileSelector](
const FileSelectedType &entry) {
71 return entry.fileSelector == fileSelector;
75 m_fileSelectedTypes.insert(name, { fileSelector, type });
79 if (match->type.m_precedence < type.m_precedence)
82 m_names.remove(type.scope, name);
83 *it = { fileSelector, type };
102 for (
auto [it, end] = m_names.equal_range(scope); it != end; ++it) {
103 if (
auto mainTypeIt = m_types.find(*it); mainTypeIt != m_types.end())
104 result.mainType = mainTypeIt->scope;
106 for (
auto [it2, end2] = m_fileSelectedTypes.equal_range(*it); it2 != end2; ++it2) {
107 result.fileSelectedTypes.append(*it2);
std::optional< ContextualType > fileSelectedTypeFor(const QString &name, const QString &selector) const
void setType(const QString &name, const ContextualType &type)
void setFileSelectedType(const QString &fileSelector, const QString &name, const ContextualType &type)