summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-parser.cpp')
-rw-r--r--source/slang/slang-parser.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp
index 5b6f30477..196b2efa8 100644
--- a/source/slang/slang-parser.cpp
+++ b/source/slang/slang-parser.cpp
@@ -9388,7 +9388,16 @@ static NodeBase* parseBuiltinRequirementModifier(Parser* parser, void* /*userDat
return modifier;
}
-static NodeBase* parseMagicTypeModifier(Parser* parser, void* /*userData*/)
+enum class MagicTypeModifierKind
+{
+ Type,
+ Enum,
+};
+
+static NodeBase* parseMagicTypeModifierImpl(
+ Parser* parser,
+ void* /*userData*/,
+ MagicTypeModifierKind kind)
{
MagicTypeModifier* modifier = parser->astBuilder->create<MagicTypeModifier>();
parser->ReadToken(TokenType::LParent);
@@ -9398,8 +9407,14 @@ static NodeBase* parseMagicTypeModifier(Parser* parser, void* /*userData*/)
modifier->tag =
uint32_t(stringToInt(parser->ReadToken(TokenType::IntegerLiteral).getContent()));
}
- auto syntaxClass = parser->astBuilder->findSyntaxClass(getName(parser, modifier->magicName));
- if (syntaxClass)
+
+ if (kind == MagicTypeModifierKind::Enum)
+ {
+ modifier->magicNodeType = getSyntaxClass<EnumTypeType>();
+ }
+ else if (
+ auto syntaxClass =
+ parser->astBuilder->findSyntaxClass(getName(parser, modifier->magicName)))
{
modifier->magicNodeType = syntaxClass;
}
@@ -9410,6 +9425,16 @@ static NodeBase* parseMagicTypeModifier(Parser* parser, void* /*userData*/)
return modifier;
}
+static NodeBase* parseMagicTypeModifier(Parser* parser, void* userData)
+{
+ return parseMagicTypeModifierImpl(parser, userData, MagicTypeModifierKind::Type);
+}
+
+static NodeBase* parseMagicEnumModifier(Parser* parser, void* userData)
+{
+ return parseMagicTypeModifierImpl(parser, userData, MagicTypeModifierKind::Enum);
+}
+
static NodeBase* parseIntrinsicTypeModifier(Parser* parser, void* /*userData*/)
{
IntrinsicTypeModifier* modifier = parser->astBuilder->create<IntrinsicTypeModifier>();
@@ -9634,6 +9659,7 @@ static const SyntaxParseInfo g_parseSyntaxEntries[] = {
_makeParseModifier("__builtin_requirement", parseBuiltinRequirementModifier),
_makeParseModifier("__magic_type", parseMagicTypeModifier),
+ _makeParseModifier("__magic_enum", parseMagicEnumModifier),
_makeParseModifier("__intrinsic_type", parseIntrinsicTypeModifier),
_makeParseModifier("__implicit_conversion", parseImplicitConversionModifier),