#63: print valid code even without meta
This commit is contained in:
@@ -2,6 +2,7 @@ package php7
|
||||
|
||||
import (
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/z7zmey/php-parser/position"
|
||||
|
||||
@@ -155,6 +156,73 @@ func (l *Parser) prependMetaToken(n node.Node, t *scanner.Token, tn meta.TokenNa
|
||||
n.GetMeta().Unshift(m)
|
||||
}
|
||||
|
||||
func (l *Parser) splitSemicolonTokenAndPhpCloseTag(htmlNode node.Node, prevNode node.Node) {
|
||||
SemiColonTokenMeta := prevNode.GetMeta().Cut(meta.AndFilter(
|
||||
meta.TokenNameFilter(meta.SemiColonToken),
|
||||
meta.TypeFilter(meta.TokenType),
|
||||
))
|
||||
|
||||
if len(*SemiColonTokenMeta) < 1 {
|
||||
return
|
||||
}
|
||||
|
||||
metaTokenValue := (*SemiColonTokenMeta)[0].Value
|
||||
|
||||
i := strings.Index(metaTokenValue, "?>")
|
||||
|
||||
if i < 0 {
|
||||
SemiColonTokenMeta.AppendTo(prevNode.GetMeta())
|
||||
} else {
|
||||
if metaTokenValue[0] == ';' {
|
||||
prevNode.GetMeta().Push(&meta.Data{
|
||||
Value: metaTokenValue[0:1],
|
||||
Type: meta.TokenType,
|
||||
Position: nil,
|
||||
TokenName: meta.SemiColonToken,
|
||||
})
|
||||
|
||||
htmlNode.GetMeta().Push(&meta.Data{
|
||||
Value: metaTokenValue[1:i],
|
||||
Type: meta.WhiteSpaceType,
|
||||
Position: nil,
|
||||
TokenName: meta.NodeStart,
|
||||
})
|
||||
|
||||
htmlNode.GetMeta().Push(&meta.Data{
|
||||
Value: metaTokenValue[i : i+2],
|
||||
Type: meta.TokenType,
|
||||
Position: nil,
|
||||
TokenName: meta.NodeStart,
|
||||
})
|
||||
|
||||
if len(metaTokenValue) > i+2 {
|
||||
htmlNode.GetMeta().Push(&meta.Data{
|
||||
Value: metaTokenValue[i+2:],
|
||||
Type: meta.WhiteSpaceType,
|
||||
Position: nil,
|
||||
TokenName: meta.NodeStart,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
htmlNode.GetMeta().Push(&meta.Data{
|
||||
Value: metaTokenValue[:2],
|
||||
Type: meta.TokenType,
|
||||
Position: nil,
|
||||
TokenName: meta.NodeStart,
|
||||
})
|
||||
|
||||
if len(metaTokenValue) > 2 {
|
||||
htmlNode.GetMeta().Push(&meta.Data{
|
||||
Value: metaTokenValue[2:],
|
||||
Type: meta.WhiteSpaceType,
|
||||
Position: nil,
|
||||
TokenName: meta.NodeStart,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Parser) returnTokenToPool(yyDollar []yySymType, yyVAL *yySymType) {
|
||||
for i := 1; i < len(yyDollar); i++ {
|
||||
if yyDollar[i].token != nil {
|
||||
|
||||
856
php7/php7.go
856
php7/php7.go
File diff suppressed because it is too large
Load Diff
10
php7/php7.y
10
php7/php7.y
@@ -343,6 +343,11 @@ identifier:
|
||||
top_statement_list:
|
||||
top_statement_list top_statement
|
||||
{
|
||||
if inlineHtmlNode, ok := $2.(*stmt.InlineHtml); ok && len($1) > 0 {
|
||||
prevNode := lastNode($1)
|
||||
yylex.(*Parser).splitSemicolonTokenAndPhpCloseTag(inlineHtmlNode, prevNode)
|
||||
}
|
||||
|
||||
if $2 != nil {
|
||||
$$ = append($1, $2)
|
||||
}
|
||||
@@ -888,6 +893,11 @@ const_list:
|
||||
inner_statement_list:
|
||||
inner_statement_list inner_statement
|
||||
{
|
||||
if inlineHtmlNode, ok := $2.(*stmt.InlineHtml); ok && len($1) > 0 {
|
||||
prevNode := lastNode($1)
|
||||
yylex.(*Parser).splitSemicolonTokenAndPhpCloseTag(inlineHtmlNode, prevNode)
|
||||
}
|
||||
|
||||
if $2 != nil {
|
||||
$$ = append($1, $2)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user