@@ -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 );
@@ -574,30 +590,61 @@ static bool parseFunction (tokenInfo *const token, int kind)
574590static 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