2323namespace PackageFactory \ComponentEngine \Target \Php \Transpiler \EnumDeclaration ;
2424
2525use PackageFactory \ComponentEngine \Parser \Ast \EnumDeclarationNode ;
26+ use PackageFactory \ComponentEngine \Parser \Ast \EnumMemberDeclarationNode ;
27+ use PackageFactory \ComponentEngine \Parser \Ast \NumberLiteralNode ;
28+ use PackageFactory \ComponentEngine \Parser \Ast \StringLiteralNode ;
2629
2730final class EnumDeclarationTranspiler
2831{
@@ -43,16 +46,40 @@ public function transpile(EnumDeclarationNode $enumDeclarationNode): string
4346 $ lines [] = '' ;
4447 $ lines [] = 'namespace ' . $ className ->getNamespace () . '; ' ;
4548 $ lines [] = '' ;
46- $ lines [] = 'enum ' . $ className ->getShortClassName () . ' : string ' ;
49+ $ lines [] = 'enum ' . $ className ->getShortClassName () . ' : ' . $ this -> transpileBackingType ( $ enumDeclarationNode ) ;
4750 $ lines [] = '{ ' ;
4851
4952 foreach ($ enumDeclarationNode ->memberDeclarations ->items as $ memberDeclarationNode ) {
50- $ lines [] = ' case ' . $ memberDeclarationNode ->name . ' = \'' . $ memberDeclarationNode -> name . '\ '; ' ;
53+ $ lines [] = ' case ' . $ memberDeclarationNode ->name . ' = ' . $ this -> transpileMemberValue ( $ memberDeclarationNode ) . '; ' ;
5154 }
5255
5356 $ lines [] = '} ' ;
5457 $ lines [] = '' ;
5558
5659 return join ("\n" , $ lines );
5760 }
61+
62+ private function transpileBackingType (EnumDeclarationNode $ enumDeclarationNode ): string
63+ {
64+ foreach ($ enumDeclarationNode ->memberDeclarations ->items as $ memberDeclarationNode ) {
65+ if ($ memberDeclarationNode ->value instanceof NumberLiteralNode) {
66+ return 'int ' ;
67+ } else {
68+ return 'string ' ;
69+ }
70+ }
71+
72+ return 'string ' ;
73+ }
74+
75+ private function transpileMemberValue (EnumMemberDeclarationNode $ enumMemberDeclarationNode ): string
76+ {
77+ if ($ enumMemberDeclarationNode ->value instanceof NumberLiteralNode) {
78+ return $ enumMemberDeclarationNode ->value ->value ;
79+ } else if ($ enumMemberDeclarationNode ->value instanceof StringLiteralNode) {
80+ return '\'' . $ enumMemberDeclarationNode ->value ->value . '\'' ;
81+ } else {
82+ return '\'' . $ enumMemberDeclarationNode ->name . '\'' ;
83+ }
84+ }
5885}
0 commit comments