refactoring: update ast structure of "Class", "Interface" and "Trait" nodes

This commit is contained in:
Vadym Slizov
2020-12-28 10:10:15 +02:00
parent 2990f0cc2d
commit c29e8ec0e0
17 changed files with 1769 additions and 2107 deletions

View File

@@ -9945,74 +9945,66 @@ func TestStmtClass_ClassExtends(t *testing.T) {
},
Value: []byte("foo"),
},
Extends: &ast.StmtClassExtends{
ExtendsTkn: &token.Token{
ID: token.T_EXTENDS,
Value: []byte("extends"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 19,
EndPos: 30,
EndPos: 26,
},
ExtendTkn: &token.Token{
ID: token.T_EXTENDS,
Value: []byte("extends"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 19,
EndPos: 26,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 18,
EndPos: 19,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 18,
EndPos: 19,
},
},
},
ClassName: &ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 27,
EndPos: 30,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
Extends: &ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 27,
EndPos: 30,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 27,
EndPos: 30,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 27,
EndPos: 30,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 27,
EndPos: 30,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 26,
EndPos: 27,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 26,
EndPos: 27,
},
},
},
Value: []byte("bar"),
},
Value: []byte("bar"),
},
},
},
@@ -10187,75 +10179,67 @@ func TestStmtClass_ClassImplement(t *testing.T) {
},
Value: []byte("foo"),
},
Implements: &ast.StmtClassImplements{
ImplementsTkn: &token.Token{
ID: token.T_IMPLEMENTS,
Value: []byte("implements"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 19,
EndPos: 33,
EndPos: 29,
},
ImplementsTkn: &token.Token{
ID: token.T_IMPLEMENTS,
Value: []byte("implements"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 19,
EndPos: 29,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 18,
EndPos: 19,
},
},
},
},
InterfaceNames: []ast.Vertex{
&ast.NameName{
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
StartPos: 18,
EndPos: 19,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
},
},
Implements: []ast.Vertex{
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 29,
EndPos: 30,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 29,
EndPos: 30,
},
},
},
Value: []byte("bar"),
},
Value: []byte("bar"),
},
},
},
@@ -10431,129 +10415,121 @@ func TestStmtClass_ClassImplements(t *testing.T) {
},
Value: []byte("foo"),
},
Implements: &ast.StmtClassImplements{
ImplementsTkn: &token.Token{
ID: token.T_IMPLEMENTS,
Value: []byte("implements"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 19,
EndPos: 38,
EndPos: 29,
},
ImplementsTkn: &token.Token{
ID: token.T_IMPLEMENTS,
Value: []byte("implements"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 19,
EndPos: 29,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 18,
EndPos: 19,
},
},
},
},
InterfaceNames: []ast.Vertex{
&ast.NameName{
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
StartPos: 18,
EndPos: 19,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
},
},
Implements: []ast.Vertex{
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 29,
EndPos: 30,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 29,
EndPos: 30,
},
},
},
Value: []byte("bar"),
},
Value: []byte("bar"),
},
},
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 35,
EndPos: 38,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 35,
EndPos: 38,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 35,
EndPos: 38,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("baz"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 35,
EndPos: 38,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("baz"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 35,
EndPos: 38,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 34,
EndPos: 35,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 34,
EndPos: 35,
},
},
},
Value: []byte("baz"),
},
Value: []byte("baz"),
},
},
},
SeparatorTkns: []*token.Token{
{
ID: token.ID(44),
Value: []byte(","),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 33,
EndPos: 34,
},
},
ImplementsSeparatorTkns: []*token.Token{
{
ID: token.ID(44),
Value: []byte(","),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 33,
EndPos: 34,
},
},
},
@@ -19076,75 +19052,67 @@ func TestStmtInterface_Extend(t *testing.T) {
},
Value: []byte("Foo"),
},
Extends: &ast.StmtInterfaceExtends{
ExtendsTkn: &token.Token{
ID: token.T_EXTENDS,
Value: []byte("extends"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 17,
EndPos: 28,
EndPos: 24,
},
ExtendsTkn: &token.Token{
ID: token.T_EXTENDS,
Value: []byte("extends"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 17,
EndPos: 24,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 16,
EndPos: 17,
},
},
},
},
InterfaceNames: []ast.Vertex{
&ast.NameName{
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
StartPos: 16,
EndPos: 17,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
},
},
Extends: []ast.Vertex{
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("Bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("Bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 24,
EndPos: 25,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 24,
EndPos: 25,
},
},
},
Value: []byte("Bar"),
},
Value: []byte("Bar"),
},
},
},
@@ -19275,129 +19243,121 @@ func TestStmtInterface_Extends(t *testing.T) {
},
Value: []byte("Foo"),
},
Extends: &ast.StmtInterfaceExtends{
ExtendsTkn: &token.Token{
ID: token.T_EXTENDS,
Value: []byte("extends"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 17,
EndPos: 33,
EndPos: 24,
},
ExtendsTkn: &token.Token{
ID: token.T_EXTENDS,
Value: []byte("extends"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 17,
EndPos: 24,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 16,
EndPos: 17,
},
},
},
},
InterfaceNames: []ast.Vertex{
&ast.NameName{
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
StartPos: 16,
EndPos: 17,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
},
},
Extends: []ast.Vertex{
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("Bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("Bar"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 25,
EndPos: 28,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 24,
EndPos: 25,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 24,
EndPos: 25,
},
},
},
Value: []byte("Bar"),
},
Value: []byte("Bar"),
},
},
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
},
&ast.NameName{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
Parts: []ast.Vertex{
&ast.NameNamePart{
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("Baz"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
StringTkn: &token.Token{
ID: token.T_STRING,
Value: []byte("Baz"),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 30,
EndPos: 33,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 29,
EndPos: 30,
},
FreeFloating: []*token.Token{
{
ID: token.T_WHITESPACE,
Value: []byte(" "),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 29,
EndPos: 30,
},
},
},
Value: []byte("Baz"),
},
Value: []byte("Baz"),
},
},
},
SeparatorTkns: []*token.Token{
{
ID: token.ID(44),
Value: []byte(","),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 28,
EndPos: 29,
},
},
ExtendsSeparatorTkns: []*token.Token{
{
ID: token.ID(44),
Value: []byte(","),
Position: &position.Position{
StartLine: 1,
EndLine: 1,
StartPos: 28,
EndPos: 29,
},
},
},

928
internal/php5/php5.go generated

File diff suppressed because it is too large Load Diff

View File

@@ -1280,36 +1280,55 @@ unticked_class_declaration_statement:
{
switch n := $1.(type) {
case *ast.StmtClass :
n.Position = yylex.(*Parser).builder.NewNodeTokenPosition($1, $7)
n.ClassName = &ast.Identifier{
Position: yylex.(*Parser).builder.NewTokenPosition($2),
className := &ast.Identifier{
Position: yylex.(*Parser).builder.NewTokenPosition($2),
IdentifierTkn: $2,
Value: $2.Value,
}
n.Extends = $3
n.Implements = $4
n.OpenCurlyBracketTkn = $5
n.Stmts = $6
n.Position = yylex.(*Parser).builder.NewNodeTokenPosition($1, $7)
n.ClassName = className
n.OpenCurlyBracketTkn = $5
n.Stmts = $6
n.CloseCurlyBracketTkn = $7
if $3 != nil {
n.ExtendsTkn = $3.(*ast.StmtClass).ExtendsTkn
n.Extends = $3.(*ast.StmtClass).Extends
}
if $4 != nil {
n.ImplementsTkn = $4.(*ast.StmtClass).ImplementsTkn
n.Implements = $4.(*ast.StmtClass).Implements
n.ImplementsSeparatorTkns = $4.(*ast.StmtClass).ImplementsSeparatorTkns
}
case *ast.StmtTrait :
n.Position = yylex.(*Parser).builder.NewNodeTokenPosition($1, $7)
n.TraitName = &ast.Identifier{
Position: yylex.(*Parser).builder.NewTokenPosition($2),
traitName := &ast.Identifier{
Position: yylex.(*Parser).builder.NewTokenPosition($2),
IdentifierTkn: $2,
Value: $2.Value,
}
n.Extends = $3
n.Implements = $4
n.OpenCurlyBracketTkn = $5
n.Stmts = $6
n.Position = yylex.(*Parser).builder.NewNodeTokenPosition($1, $7)
n.TraitName = traitName
n.OpenCurlyBracketTkn = $5
n.Stmts = $6
n.CloseCurlyBracketTkn = $7
if $3 != nil {
yylex.(*Parser).errHandlerFunc(errors.NewError("A trait cannot extend a class. Traits can only be composed from other traits with the 'use' keyword", $3.(*ast.StmtClass).Position))
}
if $4 != nil {
yylex.(*Parser).errHandlerFunc(errors.NewError("A trait cannot implement an interface", $4.(*ast.StmtClass).Position))
}
}
$$ = $1
}
| interface_entry T_STRING interface_extends_list '{' class_statement_list '}'
{
$$ = &ast.StmtInterface{
iface := &ast.StmtInterface{
Position: yylex.(*Parser).builder.NewTokensPosition($1, $6),
InterfaceTkn: $1,
InterfaceName: &ast.Identifier{
@@ -1317,11 +1336,18 @@ unticked_class_declaration_statement:
IdentifierTkn: $2,
Value: $2.Value,
},
Extends: $3,
OpenCurlyBracketTkn: $4,
Stmts: $5,
CloseCurlyBracketTkn: $6,
}
if $3 != nil {
iface.ExtendsTkn = $3.(*ast.StmtInterface).ExtendsTkn
iface.Extends = $3.(*ast.StmtInterface).Extends
iface.ExtendsSeparatorTkns = $3.(*ast.StmtInterface).ExtendsSeparatorTkns
}
$$ = iface
}
;
@@ -1378,10 +1404,10 @@ extends_from:
}
| T_EXTENDS fully_qualified_class_name
{
$$ = &ast.StmtClassExtends{
Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2),
ExtendTkn: $1,
ClassName: $2,
$$ = &ast.StmtClass{
Position: yylex.(*Parser).builder.NewTokenNodePosition($1, $2),
ExtendsTkn: $1,
Extends: $2,
}
}
;
@@ -1400,11 +1426,11 @@ interface_extends_list:
}
| T_EXTENDS interface_list
{
$$ = &ast.StmtInterfaceExtends{
Position: yylex.(*Parser).builder.NewTokenNodeListPosition($1, $2.(*ast.ParserSeparatedList).Items),
ExtendsTkn: $1,
InterfaceNames: $2.(*ast.ParserSeparatedList).Items,
SeparatorTkns: $2.(*ast.ParserSeparatedList).SeparatorTkns,
$$ = &ast.StmtInterface{
Position: yylex.(*Parser).builder.NewTokenNodeListPosition($1, $2.(*ast.ParserSeparatedList).Items),
ExtendsTkn: $1,
Extends: $2.(*ast.ParserSeparatedList).Items,
ExtendsSeparatorTkns: $2.(*ast.ParserSeparatedList).SeparatorTkns,
};
}
;
@@ -1416,11 +1442,11 @@ implements_list:
}
| T_IMPLEMENTS interface_list
{
$$ = &ast.StmtClassImplements{
Position: yylex.(*Parser).builder.NewTokenNodeListPosition($1, $2.(*ast.ParserSeparatedList).Items),
ImplementsTkn: $1,
InterfaceNames: $2.(*ast.ParserSeparatedList).Items,
SeparatorTkns: $2.(*ast.ParserSeparatedList).SeparatorTkns,
$$ = &ast.StmtClass{
Position: yylex.(*Parser).builder.NewTokenNodeListPosition($1, $2.(*ast.ParserSeparatedList).Items),
ImplementsTkn: $1,
Implements: $2.(*ast.ParserSeparatedList).Items,
ImplementsSeparatorTkns: $2.(*ast.ParserSeparatedList).SeparatorTkns,
};
}
;