summaryrefslogtreecommitdiffstats
path: root/source/slang/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/parser.cpp')
-rw-r--r--source/slang/parser.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp
index d0e965970..1afc8ebcf 100644
--- a/source/slang/parser.cpp
+++ b/source/slang/parser.cpp
@@ -1769,6 +1769,25 @@ namespace Slang
return typeExpr;
}
+ static RefPtr<Expr> parseTaggedUnionType(Parser* parser)
+ {
+ RefPtr<TaggedUnionTypeExpr> taggedUnionType = new TaggedUnionTypeExpr();
+
+ parser->ReadToken(TokenType::LParent);
+ while(!AdvanceIfMatch(parser, TokenType::RParent))
+ {
+ auto caseType = parser->ParseTypeExp();
+ taggedUnionType->caseTypes.Add(caseType);
+
+ if(AdvanceIf(parser, TokenType::RParent))
+ break;
+
+ parser->ReadToken(TokenType::Comma);
+ }
+
+ return taggedUnionType;
+ }
+
static TypeSpec parseTypeSpec(Parser* parser)
{
TypeSpec typeSpec;
@@ -1812,6 +1831,11 @@ namespace Slang
typeSpec.expr = createDeclRefType(parser, decl);
return typeSpec;
}
+ else if(AdvanceIf(parser, "__TaggedUnion"))
+ {
+ typeSpec.expr = parseTaggedUnionType(parser);
+ return typeSpec;
+ }
Token typeName = parser->ReadToken(TokenType::Identifier);