@@ -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
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
9195typedef 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+
178194static 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