php8.1: added enum (#12)
This commit is contained in:
@@ -336,6 +336,43 @@ func (v *Dumper) StmtCatch(n *ast.StmtCatch) {
|
||||
v.print(v.indent, "},\n")
|
||||
}
|
||||
|
||||
func (v *Dumper) StmtEnum(n *ast.StmtEnum) {
|
||||
v.print(0, "&ast.StmtEnum{\n")
|
||||
v.indent++
|
||||
|
||||
v.dumpPosition(n.Position)
|
||||
v.dumpVertexList("AttrGroups", n.AttrGroups)
|
||||
v.dumpToken("EnumTkn", n.EnumTkn)
|
||||
v.dumpVertex("Name", n.Name)
|
||||
v.dumpToken("ColonTkn", n.ColonTkn)
|
||||
v.dumpVertex("Type", n.Type)
|
||||
v.dumpToken("ImplementsTkn", n.ImplementsTkn)
|
||||
v.dumpVertexList("Implements", n.Implements)
|
||||
v.dumpTokenList("ImplementsSeparatorTkns", n.ImplementsSeparatorTkns)
|
||||
v.dumpToken("OpenCurlyBracketTkn", n.OpenCurlyBracketTkn)
|
||||
v.dumpVertexList("Stmts", n.Stmts)
|
||||
v.dumpToken("CloseCurlyBracketTkn", n.CloseCurlyBracketTkn)
|
||||
|
||||
v.indent--
|
||||
v.print(v.indent, "},\n")
|
||||
}
|
||||
|
||||
func (v *Dumper) EnumCase(n *ast.EnumCase) {
|
||||
v.print(0, "&ast.EnumCase{\n")
|
||||
v.indent++
|
||||
|
||||
v.dumpPosition(n.Position)
|
||||
v.dumpVertexList("AttrGroups", n.AttrGroups)
|
||||
v.dumpToken("CaseTkn", n.CaseTkn)
|
||||
v.dumpVertex("Name", n.Name)
|
||||
v.dumpToken("EqualTkn", n.EqualTkn)
|
||||
v.dumpVertex("Expr", n.Expr)
|
||||
v.dumpToken("SemiColonTkn", n.SemiColonTkn)
|
||||
|
||||
v.indent--
|
||||
v.print(v.indent, "},\n")
|
||||
}
|
||||
|
||||
func (v *Dumper) StmtClass(n *ast.StmtClass) {
|
||||
v.print(0, "&ast.StmtClass{\n")
|
||||
v.indent++
|
||||
|
||||
@@ -318,7 +318,65 @@ func (f *formatter) StmtCatch(n *ast.StmtCatch) {
|
||||
n.CloseCurlyBracketTkn = f.newToken('}', []byte("}"))
|
||||
}
|
||||
|
||||
func (f *formatter) StmtEnum(n *ast.StmtEnum) {
|
||||
for _, m := range n.AttrGroups {
|
||||
m.Accept(f)
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
}
|
||||
|
||||
n.EnumTkn = f.newToken(token.T_CLASS, []byte("enum"))
|
||||
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
n.Name.Accept(f)
|
||||
|
||||
n.ColonTkn = f.newToken(':', []byte(":"))
|
||||
n.Type.Accept(f)
|
||||
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
|
||||
if n.Implements != nil {
|
||||
n.ImplementsTkn = f.newToken(token.T_IMPLEMENTS, []byte("implements"))
|
||||
n.ImplementsSeparatorTkns = f.formatList(n.Implements, ',')
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
}
|
||||
|
||||
n.OpenCurlyBracketTkn = f.newToken('{', []byte("{"))
|
||||
|
||||
if len(n.Stmts) > 0 {
|
||||
f.indent++
|
||||
f.formatStmts(&n.Stmts)
|
||||
f.indent--
|
||||
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte("\n"))
|
||||
f.addIndent()
|
||||
}
|
||||
|
||||
n.CloseCurlyBracketTkn = f.newToken('}', []byte("}"))
|
||||
}
|
||||
|
||||
func (f *formatter) EnumCase(n *ast.EnumCase) {
|
||||
for _, m := range n.AttrGroups {
|
||||
m.Accept(f)
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
}
|
||||
|
||||
n.CaseTkn = f.newToken(token.T_CASE, []byte("case"))
|
||||
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
n.Name.Accept(f)
|
||||
|
||||
n.EqualTkn = f.newToken('=', []byte("="))
|
||||
n.Expr.Accept(f)
|
||||
|
||||
n.SemiColonTkn = f.newToken(';', []byte(";"))
|
||||
}
|
||||
|
||||
func (f *formatter) StmtClass(n *ast.StmtClass) {
|
||||
for _, m := range n.AttrGroups {
|
||||
m.Accept(f)
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
}
|
||||
|
||||
for _, m := range n.Modifiers {
|
||||
m.Accept(f)
|
||||
f.addFreeFloating(token.T_WHITESPACE, []byte(" "))
|
||||
|
||||
@@ -70,6 +70,14 @@ func (v *Null) StmtCatch(_ *ast.StmtCatch) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
func (v *Null) StmtEnum(_ *ast.StmtEnum) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
func (v *Null) EnumCase(_ *ast.EnumCase) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
func (v *Null) StmtClass(_ *ast.StmtClass) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@@ -234,6 +234,28 @@ func (p *printer) StmtClass(n *ast.StmtClass) {
|
||||
p.printToken(n.CloseCurlyBracketTkn, []byte("}"))
|
||||
}
|
||||
|
||||
func (p *printer) StmtEnum(n *ast.StmtEnum) {
|
||||
p.printList(n.AttrGroups)
|
||||
p.printToken(n.EnumTkn, []byte("enum"))
|
||||
p.printNode(n.Name)
|
||||
p.printToken(n.ColonTkn, nil)
|
||||
p.printNode(n.Type)
|
||||
p.printToken(n.ImplementsTkn, p.ifNodeList(n.Implements, []byte("implements")))
|
||||
p.printSeparatedList(n.Implements, n.ImplementsSeparatorTkns, []byte(","))
|
||||
p.printToken(n.OpenCurlyBracketTkn, []byte("{"))
|
||||
p.printList(n.Stmts)
|
||||
p.printToken(n.CloseCurlyBracketTkn, []byte("}"))
|
||||
}
|
||||
|
||||
func (p *printer) EnumCase(n *ast.EnumCase) {
|
||||
p.printList(n.AttrGroups)
|
||||
p.printToken(n.CaseTkn, []byte("case"))
|
||||
p.printNode(n.Name)
|
||||
p.printToken(n.EqualTkn, nil)
|
||||
p.printNode(n.Expr)
|
||||
p.printToken(n.SemiColonTkn, []byte(";"))
|
||||
}
|
||||
|
||||
func (p *printer) StmtClassConstList(n *ast.StmtClassConstList) {
|
||||
p.printList(n.AttrGroups)
|
||||
p.printList(n.Modifiers)
|
||||
|
||||
@@ -40,3 +40,37 @@ echo 0o10;
|
||||
echo 0O10;
|
||||
`)
|
||||
}
|
||||
|
||||
func TestEnumPHP81(t *testing.T) {
|
||||
tester.NewParserPrintTestSuite(t).UsePHP8().Run(`<?php
|
||||
enum A {
|
||||
case B;
|
||||
case B = 100;
|
||||
case C = "aa";
|
||||
case
|
||||
D;
|
||||
}
|
||||
|
||||
enum A: int {
|
||||
case B;
|
||||
case B = 100;
|
||||
|
||||
#[Attribute]
|
||||
case C = 100;
|
||||
|
||||
#[Attribute1]
|
||||
#[Attribute2]
|
||||
case D;
|
||||
}
|
||||
|
||||
enum A implements B {
|
||||
case C;
|
||||
public function f(): string {}
|
||||
}
|
||||
|
||||
enum A implements B, C, D {
|
||||
case E;
|
||||
public function f(): string {}
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
||||
@@ -122,6 +122,33 @@ func (t *Traverser) StmtCatch(n *ast.StmtCatch) {
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Traverser) StmtEnum(n *ast.StmtEnum) {
|
||||
n.Accept(t.v)
|
||||
|
||||
for _, nn := range n.AttrGroups {
|
||||
nn.Accept(t)
|
||||
}
|
||||
t.Traverse(n.Name)
|
||||
t.Traverse(n.Type)
|
||||
|
||||
for _, nn := range n.Implements {
|
||||
nn.Accept(t)
|
||||
}
|
||||
for _, nn := range n.Stmts {
|
||||
nn.Accept(t)
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Traverser) EnumCase(n *ast.EnumCase) {
|
||||
n.Accept(t.v)
|
||||
|
||||
for _, nn := range n.AttrGroups {
|
||||
nn.Accept(t)
|
||||
}
|
||||
t.Traverse(n.Name)
|
||||
t.Traverse(n.Expr)
|
||||
}
|
||||
|
||||
func (t *Traverser) StmtClass(n *ast.StmtClass) {
|
||||
n.Accept(t.v)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user