Skip to content

Commit c60f2e0

Browse files
committed
PowerShell: introduce enum kind
1 parent b307057 commit c60f2e0

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--sort=no
2+
# "qualified" extra doesn't work.
3+
# --extras=+q
4+
--fields=+S
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
EnumName1 input.ps1 /^enum EnumName1 {$/;" g
2+
EnumName2 input.ps1 /^enum EnumName2 {$/;" g
3+
EnumName3 input.ps1 /^Enum EnumName3 {$/;" g
4+
EnumName4 input.ps1 /^[Flags()] enum EnumName4 {$/;" g
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# EnumName1
2+
enum EnumName1 {
3+
Label11
4+
Label12 = 10
5+
}
6+
7+
# EnumName2
8+
enum EnumName2 {
9+
Label21
10+
Label22 = 20
11+
}
12+
13+
# EnumName3
14+
Enum EnumName3 {
15+
Label31
16+
Label32 = 30
17+
}
18+
19+
# EnumName4
20+
[Flags()] enum EnumName4 {
21+
Label41
22+
Label42 = 40
23+
}

parsers/powershell.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ typedef enum {
4141
K_VARIABLE,
4242
K_CLASS,
4343
K_FILTER,
44+
K_ENUM,
4445
COUNT_KIND
4546
} powerShellKind;
4647

@@ -49,6 +50,7 @@ static kindDefinition PowerShellKinds[COUNT_KIND] = {
4950
{ true, 'v', "variable", "variables" },
5051
{ true, 'c', "class", "classes" },
5152
{ true, 'i', "filter", "filter" },
53+
{ true, 'g', "enum", "enum names" },
5254
};
5355

5456

@@ -77,6 +79,7 @@ enum {
7779
KEYWORD_function,
7880
KEYWORD_filter,
7981
KEYWORD_class,
82+
KEYWORD_enum,
8083
};
8184

8285
/* We need an integer that is not an unsigned to allow KEYWORD_NONE. */
@@ -86,6 +89,7 @@ static const keywordTable PowerShellKeywordTable[] = {
8689
{ "function", KEYWORD_function },
8790
{ "filter", KEYWORD_filter },
8891
{ "class", KEYWORD_class },
92+
{ "enum", KEYWORD_enum },
8993
};
9094

9195
typedef struct {
@@ -175,6 +179,18 @@ static void makeClassTag (const tokenInfo *const token)
175179
}
176180
}
177181

182+
static void makeEnumTag (const tokenInfo *const token)
183+
{
184+
if (PowerShellKinds[K_ENUM].enabled)
185+
{
186+
tagEntryInfo e;
187+
188+
initPowerShellEntry (&e, token, K_ENUM, NULL);
189+
190+
makeTagEntry (&e);
191+
}
192+
}
193+
178194
static tokenInfo *newToken (void)
179195
{
180196
tokenInfo *const token = xMalloc (1, tokenInfo);
@@ -600,6 +616,39 @@ static bool parseClass (tokenInfo *const token)
600616
return readNext;
601617
}
602618

619+
/* parse a enum
620+
*
621+
* enum EnumName {}
622+
*/
623+
static bool parseEnum (tokenInfo *const token)
624+
{
625+
bool readNext = true;
626+
vString *nameFree = NULL;
627+
628+
readToken (token);
629+
630+
if (token->type != TOKEN_IDENTIFIER)
631+
return false;
632+
633+
makeEnumTag (token);
634+
nameFree = vStringNewCopy (token->string);
635+
readToken (token);
636+
637+
while (token->type != TOKEN_OPEN_CURLY && token->type != TOKEN_EOF)
638+
{
639+
readToken (token);
640+
}
641+
642+
if (token->type == TOKEN_OPEN_CURLY)
643+
enterScope (token, nameFree, K_ENUM);
644+
else
645+
readNext = false;
646+
647+
vStringDelete (nameFree);
648+
649+
return readNext;
650+
}
651+
603652
/* parses declarations of the form
604653
* $var = VALUE
605654
*/
@@ -675,6 +724,10 @@ static void enterScope (tokenInfo *const parentToken,
675724
readNext = parseClass (token);
676725
break;
677726

727+
case KEYWORD_enum:
728+
readNext = parseEnum (token);
729+
break;
730+
678731
default: break;
679732
}
680733
break;

0 commit comments

Comments
 (0)