From 939be44ca23476e622dfb24a592383fe2a1da61f Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 26 Oct 2022 08:32:24 -0700 Subject: Auto synthesis of Differential type (#2466) --- source/slang/slang-ast-decl.cpp | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'source/slang/slang-ast-decl.cpp') 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 #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(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()) + { + 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 -- cgit v1.2.3