summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-parser.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-06-12 09:45:26 -0700
committerGitHub <noreply@github.com>2024-06-12 09:45:26 -0700
commit318adcc27b8d89ec1d47c445a93239dd81be0b31 (patch)
tree939ae1ffe9a3e81a17d03e4c92c8ee13c6d822e8 /source/slang/slang-parser.cpp
parentec35febb7f1dcc981e83c7ee3e52ab516b50be8a (diff)
Add compiler option to treat enum types as unscoped. (#4354)
Diffstat (limited to 'source/slang/slang-parser.cpp')
-rw-r--r--source/slang/slang-parser.cpp28
1 files changed, 26 insertions, 2 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp
index f5a217354..3d9f1c199 100644
--- a/source/slang/slang-parser.cpp
+++ b/source/slang/slang-parser.cpp
@@ -4907,14 +4907,38 @@ namespace Slang
// TODO: diagnose this with a warning some day, and move
// toward deprecating it.
//
- AdvanceIf(parser, "class");
+ bool isEnumClass = AdvanceIf(parser, "class");
+ bool isUnscoped = false;
+
+ if (!isEnumClass)
+ {
+ if (parser->options.optionSet.getBoolOption(CompilerOptionName::UnscopedEnum))
+ {
+ isUnscoped = true;
+ }
+ }
AdvanceIf(parser, TokenType::CompletionRequest);
parser->FillPosition(decl);
- decl->nameAndLoc = expectIdentifier(parser);
+ if (parser->tokenReader.peekTokenType() != TokenType::Identifier)
+ {
+ decl->nameAndLoc.name = generateName(parser);
+ decl->nameAndLoc.loc = decl->loc;
+ isUnscoped = true;
+ }
+ else
+ {
+ decl->nameAndLoc = expectIdentifier(parser);
+ }
+ // If the type needs to be unscoped, insert modifiers to make it so.
+ if (isUnscoped)
+ {
+ addModifier(decl, parser->astBuilder->create<UnscopedEnumAttribute>());
+ addModifier(decl, parser->astBuilder->create<TransparentModifier>());
+ }
return parseOptGenericDecl(parser, [&](GenericDecl*)
{