diff options
| author | Lauro Oyen <15063951+laurooyen@users.noreply.github.com> | 2024-12-02 20:46:43 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-02 11:46:43 -0800 |
| commit | eaa8dcfcc9deabb906cc09bf31fc17ab6f343ff4 (patch) | |
| tree | 8e0f4658de3efb5e7696e8588c55471f9d65ba18 /tools/slang-cpp-parser/identifier-lookup.h | |
| parent | 7aaf7009e2c6055a714ba4a93ab3dd73d2d2cdb7 (diff) | |
Move c++ parsing code from slang-cpp-extractor to static library (#5675)
* Move c++ parsing code from slang-cpp-extractor to static library
* Format code
* Remove relative includes
---------
Co-authored-by: slangbot <ellieh+slangbot@nvidia.com>
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'tools/slang-cpp-parser/identifier-lookup.h')
| -rw-r--r-- | tools/slang-cpp-parser/identifier-lookup.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/tools/slang-cpp-parser/identifier-lookup.h b/tools/slang-cpp-parser/identifier-lookup.h new file mode 100644 index 000000000..226d00667 --- /dev/null +++ b/tools/slang-cpp-parser/identifier-lookup.h @@ -0,0 +1,121 @@ +#pragma once + +#include "diagnostics.h" + +namespace CppParse +{ +using namespace Slang; + +enum class IdentifierStyle +{ + None, ///< It's not an identifier + + Identifier, ///< Just an identifier + + PreDeclare, ///< Declare a type (not visible in C++ code) + TypeSet, ///< TypeSet + + TypeModifier, ///< const, volatile etc + Keyword, ///< A keyword C/C++ keyword that is not another type + + Class, ///< class + Struct, ///< struct + Namespace, ///< namespace + Enum, ///< enum + + TypeDef, ///< typedef + + Access, ///< public, protected, private + + Reflected, + Unreflected, + + CallingConvention, ///< Used on a method + Virtual, ///< + + Template, + + Static, + + IntegerModifier, + + Extern, + + CallableMisc, ///< For SLANG_NO_THROW etc + + IntegerType, ///< Built in integer type + + Default, /// default + + CountOf, +}; + +typedef uint32_t IdentifierFlags; +struct IdentifierFlag +{ + enum Enum : IdentifierFlags + { + StartScope = 0x1, ///< namespace, struct or class + ClassLike = 0x2, ///< Struct or class + Keyword = 0x4, + Reflection = 0x8, + }; +}; + + +class IdentifierLookup +{ +public: + struct Pair + { + const char* name; + IdentifierStyle style; + }; + + IdentifierStyle get(const UnownedStringSlice& slice) const + { + Index index = m_pool.findIndex(slice); + return (index >= 0) ? m_styles[index] : IdentifierStyle::None; + } + + void set(const char* name, IdentifierStyle style) { set(UnownedStringSlice(name), style); } + + void set(const UnownedStringSlice& name, IdentifierStyle style); + + void set(const char* const* names, size_t namesCount, IdentifierStyle style); + + void set(const Pair* pairs, Index pairsCount); + + void reset() + { + m_styles.clear(); + m_pool.clear(); + } + + void initDefault(const UnownedStringSlice& markPrefix); + + IdentifierLookup() + : m_pool(StringSlicePool::Style::Empty) + { + SLANG_ASSERT(m_pool.getSlicesCount() == 0); + } + + static const IdentifierFlags kIdentifierFlags[Index(IdentifierStyle::CountOf)]; + +protected: + List<IdentifierStyle> m_styles; + StringSlicePool m_pool; +}; + + +SLANG_FORCE_INLINE IdentifierFlags getFlags(IdentifierStyle style) +{ + return IdentifierLookup::kIdentifierFlags[Index(style)]; +} + +SLANG_FORCE_INLINE bool hasFlag(IdentifierStyle style, IdentifierFlag::Enum flag) +{ + return (getFlags(style) & flag) != 0; +} + +} // namespace CppParse |
