diff options
Diffstat (limited to 'source/slang/slang-ast-decl.cpp')
| -rw-r--r-- | source/slang/slang-ast-decl.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/source/slang/slang-ast-decl.cpp b/source/slang/slang-ast-decl.cpp index 2df9164fb..b2802e304 100644 --- a/source/slang/slang-ast-decl.cpp +++ b/source/slang/slang-ast-decl.cpp @@ -1,5 +1,6 @@ // slang-ast-decl.cpp #include "slang-ast-builder.h" +#include "slang-syntax.h" #include <assert.h> #include "slang-generated-ast-macro.h" @@ -32,4 +33,60 @@ bool isInterfaceRequirement(Decl* decl) return false; } +void ContainerDecl::buildMemberDictionary() +{ + // Don't rebuild if already built + if (isMemberDictionaryValid()) + return; + + // If it's < 0 it means that the dictionaries are entirely invalid + if (dictionaryLastCount < 0) + { + dictionaryLastCount = 0; + memberDictionary.Clear(); + transparentMembers.clear(); + } + + // are we a generic? + GenericDecl* genericDecl = as<GenericDecl>(this); + + const Index membersCount = members.getCount(); + + SLANG_ASSERT(dictionaryLastCount >= 0 && dictionaryLastCount <= membersCount); + + for (Index i = dictionaryLastCount; i < membersCount; ++i) + { + Decl* m = members[i]; + + auto name = m->getName(); + + // Add any transparent members to a separate list for lookup + if (m->hasModifier<TransparentModifier>()) + { + TransparentMemberInfo info; + info.decl = m; + transparentMembers.add(info); + } + + // Ignore members with no name + if (!name) + continue; + + // Ignore the "inner" member of a generic declaration + if (genericDecl && m == genericDecl->inner) + continue; + + m->nextInContainerWithSameName = nullptr; + + Decl* next = nullptr; + if (memberDictionary.TryGetValue(name, next)) + m->nextInContainerWithSameName = next; + + memberDictionary[name] = m; + } + + dictionaryLastCount = membersCount; + SLANG_ASSERT(isMemberDictionaryValid()); +} + } // namespace Slang |
