Skip to content

Commit b66c218

Browse files
authored
Merge pull request #3571 from kumarstack55/develop
PowerShell: introduce enum kind
2 parents 1a9f953 + c60f2e0 commit b66c218

File tree

4 files changed

+88
-6
lines changed

4 files changed

+88
-6
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: 57 additions & 6 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);
@@ -574,30 +590,61 @@ static bool parseFunction (tokenInfo *const token, int kind)
574590
static bool parseClass (tokenInfo *const token)
575591
{
576592
bool readNext = true;
577-
tokenInfo *nameFree = NULL;
593+
vString *nameFree = NULL;
578594

579595
readToken (token);
580596

581597
if (token->type != TOKEN_IDENTIFIER)
582598
return false;
583599

584-
nameFree = newToken ();
585-
copyToken (nameFree, token, true);
600+
makeClassTag (token);
601+
nameFree = vStringNewCopy (token->string);
586602
readToken (token);
587603

588-
makeClassTag (nameFree);
604+
while (token->type != TOKEN_OPEN_CURLY && token->type != TOKEN_EOF)
605+
{
606+
readToken (token);
607+
}
608+
609+
if (token->type == TOKEN_OPEN_CURLY)
610+
enterScope (token, nameFree, K_CLASS);
611+
else
612+
readNext = false;
613+
614+
vStringDelete (nameFree);
615+
616+
return readNext;
617+
}
618+
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);
589636

590637
while (token->type != TOKEN_OPEN_CURLY && token->type != TOKEN_EOF)
591638
{
592639
readToken (token);
593640
}
594641

595642
if (token->type == TOKEN_OPEN_CURLY)
596-
enterScope (token, nameFree->string, K_CLASS);
643+
enterScope (token, nameFree, K_ENUM);
597644
else
598645
readNext = false;
599646

600-
deleteToken (nameFree);
647+
vStringDelete (nameFree);
601648

602649
return readNext;
603650
}
@@ -677,6 +724,10 @@ static void enterScope (tokenInfo *const parentToken,
677724
readNext = parseClass (token);
678725
break;
679726

727+
case KEYWORD_enum:
728+
readNext = parseEnum (token);
729+
break;
730+
680731
default: break;
681732
}
682733
break;

0 commit comments

Comments
 (0)