Skip to content

Commit d34fff1

Browse files
authored
Merge pull request #4339 from iaalm/tsp-improve
TypeSpec: Add enumerator support
2 parents 4df2e10 + 027af24 commit d34fff1

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

Units/parser-typespec.r/simple-typespec.d/expected.tags

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Name.Space input.tsp /^namespace Name.Space;$/;" n
22
Inner input.tsp /^namespace Inner {$/;" n namespace:Name.Space
33
Versions input.tsp /^ enum Versions {$/;" g namespace:Name.Space.Inner
4+
v2024_05_01_preview input.tsp /^ v2024_05_01_preview: "2024-05-01-preview",$/;" e enum:Name.Space.Inner.Versions
5+
v2024_05_02_preview input.tsp /^ v2024_05_02_preview,$/;" e enum:Name.Space.Inner.Versions
46
OpA input.tsp /^ op OpA<T extends TypeSpec.Reflection.Model> is OpB<$/;" o namespace:Name.Space.Inner
57
InterfaceA input.tsp /^ interface InterfaceA extends InterfaceB {$/;" i namespace:Name.Space.Inner
68
opA input.tsp /^ opA is OpA<{$/;" p interface:Name.Space.Inner.InterfaceA

Units/parser-typespec.r/simple-typespec.d/input.tsp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace Inner {
1616
enum Versions {
1717
@doc("May 01, 2024 Preview API Version")
1818
v2024_05_01_preview: "2024-05-01-preview",
19+
v2024_05_02_preview,
1920
}
2021

2122
@summary("Example operation summary for demonstration purposes.")

parsers/typespec.c

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ typedef enum {
3232
K_UNION,
3333
K_ALIAS,
3434
K_PROPERTY,
35+
K_ENUMERATOR,
3536
COUNT_KIND
3637
} typeSpecKind;
3738

@@ -43,7 +44,8 @@ static kindDefinition TypeSpecKinds[COUNT_KIND] = {
4344
{ true, 'm', "model", "models" },
4445
{ true, 'u', "union", "unions" },
4546
{ true, 'a', "alias", "aliases" },
46-
{ true, 'p', "property", "properties" }
47+
{ true, 'p', "property", "properties" },
48+
{ true, 'e', "enumerator", "enumerators (values inside an enumeration)", .version = 1 },
4749
};
4850

4951
typedef enum eTokenType {
@@ -388,8 +390,12 @@ static void parseNamespace(tokenInfo *const token)
388390
vStringDelete(name);
389391
}
390392

391-
static void parseEnum(tokenInfo *const token)
393+
static void parseEnum(tokenInfo *const parentToken)
392394
{
395+
tokenInfo *token = newToken();
396+
copyToken (token, parentToken);
397+
setScope(token, parentToken->scope);
398+
393399
readToken(token);
394400

395401
if (token->type == TOKEN_IDENTIFIER)
@@ -399,9 +405,40 @@ static void parseEnum(tokenInfo *const token)
399405

400406
if (token->type == TOKEN_OPEN_CURLY)
401407
{
402-
enterScope(token, enumIndex);
408+
/* Parse enum body */
409+
while (token->type != TOKEN_CLOSE_CURLY && token->type != TOKEN_EOF)
410+
{
411+
if (token->type == TOKEN_IDENTIFIER)
412+
{
413+
/* Create tag for enumerator */
414+
setScope (token, enumIndex);
415+
makeTypeSpecTag(token, K_ENUMERATOR);
416+
readToken(token);
417+
418+
/* Skip value assignment if any */
419+
if (token->type == TOKEN_COLON)
420+
{
421+
readToken(token);
422+
/* Skip the value */
423+
while (token->type != TOKEN_COMMA &&
424+
token->type != TOKEN_CLOSE_CURLY &&
425+
token->type != TOKEN_EOF)
426+
{
427+
readToken(token);
428+
}
429+
}
430+
431+
/* Skip comma if present */
432+
if (token->type == TOKEN_COMMA)
433+
readToken(token);
434+
}
435+
else
436+
readToken(token);
437+
}
403438
}
404439
}
440+
441+
deleteToken (token);
405442
}
406443

407444
static void parseProperty(tokenInfo *const token)
@@ -678,5 +715,7 @@ extern parserDefinition* TypeSpecParser (void)
678715
def->keywordCount = ARRAY_SIZE (TypeSpecKeywordTable);
679716
def->defaultScopeSeparator = SCOPE_SEPARATOR;
680717
def->useCork = CORK_QUEUE;
718+
def->versionCurrent = 1;
719+
def->versionAge = 1;
681720
return def;
682721
}

0 commit comments

Comments
 (0)