scanner: emit T_STRING when enum not in enum declaration context
This commit is contained in:
parent
87718f9993
commit
deeda4f6a7
@ -67,6 +67,24 @@ func (lex *Lexer) setTokenPosition(token *token.Token) {
|
||||
token.Position = pos
|
||||
}
|
||||
|
||||
func (lex *Lexer) setTokenPrefixPosition(token *token.Token, n int) {
|
||||
pos := lex.positionPool.Get()
|
||||
|
||||
endPos := lex.ts + n
|
||||
|
||||
sl, slb := lex.newLines.GetLine(lex.ts)
|
||||
el, elb := lex.newLines.GetLine(endPos)
|
||||
|
||||
pos.StartLine = sl
|
||||
pos.EndLine = el
|
||||
pos.StartPos = lex.ts
|
||||
pos.EndPos = endPos
|
||||
pos.StartCol = lex.ts - slb
|
||||
pos.EndCol = endPos - elb
|
||||
|
||||
token.Position = pos
|
||||
}
|
||||
|
||||
func (lex *Lexer) addFreeFloatingToken(t *token.Token, id token.ID, ps, pe int) {
|
||||
skippedTkn := lex.tokenPool.Get()
|
||||
skippedTkn.ID = id
|
||||
@ -198,6 +216,11 @@ func (lex *Lexer) ungetStr(s string) {
|
||||
}
|
||||
}
|
||||
|
||||
func (lex *Lexer) ungetFromStart(n int) {
|
||||
tokenLength := lex.te - lex.ts
|
||||
lex.ungetCnt(tokenLength - n)
|
||||
}
|
||||
|
||||
func (lex *Lexer) ungetCnt(n int) {
|
||||
lex.p = lex.p - n
|
||||
lex.te = lex.te - n
|
||||
|
@ -4,8 +4,8 @@ package php8
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/VKCOM/php-parser/pkg/ast"
|
||||
"github.com/VKCOM/php-parser/pkg/token"
|
||||
"github.com/laytan/php-parser/pkg/ast"
|
||||
"github.com/laytan/php-parser/pkg/token"
|
||||
)
|
||||
|
||||
%}
|
||||
|
46118
internal/php8/scanner.go
46118
internal/php8/scanner.go
File diff suppressed because it is too large
Load Diff
@ -6,7 +6,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/VKCOM/php-parser/pkg/token"
|
||||
"github.com/laytan/php-parser/pkg/token"
|
||||
)
|
||||
|
||||
%%{
|
||||
@ -240,7 +240,8 @@ func (lex *Lexer) Lex() *token.Token {
|
||||
'endif'i => {lex.setTokenPosition(tkn); tok = token.T_ENDIF; fbreak;};
|
||||
'endswitch'i => {lex.setTokenPosition(tkn); tok = token.T_ENDSWITCH; fbreak;};
|
||||
'endwhile'i => {lex.setTokenPosition(tkn); tok = token.T_ENDWHILE; fbreak;};
|
||||
'enum'i => {lex.setTokenPosition(tkn); tok = token.T_ENUM; fbreak;};
|
||||
'enum'i whitespace+ varname_first => {lex.setTokenPrefixPosition(tkn, 4); tok = token.T_ENUM; lex.ungetFromStart(4); fbreak;};
|
||||
'enum'i whitespace+ ('extends'i | 'implements'i) => {lex.setTokenPrefixPosition(tkn, 4); tok = token.T_STRING; lex.ungetFromStart(4); fbreak;};
|
||||
'eval'i => {lex.setTokenPosition(tkn); tok = token.T_EVAL; fbreak;};
|
||||
'exit'i | 'die'i => {lex.setTokenPosition(tkn); tok = token.T_EXIT; fbreak;};
|
||||
'extends'i => {lex.setTokenPosition(tkn); tok = token.T_EXTENDS; fbreak;};
|
||||
|
@ -181,6 +181,31 @@ func TestEnumTokens(t *testing.T) {
|
||||
suite.Run()
|
||||
}
|
||||
|
||||
func TestClassNameEnum(t *testing.T) {
|
||||
suite := tester.NewLexerTokenStructTestSuite(t)
|
||||
suite.UsePHP8()
|
||||
suite.Code = "<?php class Enum {}"
|
||||
suite.Expected = []*token.Token{
|
||||
{
|
||||
ID: token.T_CLASS,
|
||||
Value: []byte("class"),
|
||||
},
|
||||
{
|
||||
ID: token.T_STRING,
|
||||
Value: []byte("Enum"),
|
||||
},
|
||||
{
|
||||
ID: '{',
|
||||
Value: []byte("{"),
|
||||
},
|
||||
{
|
||||
ID: '}',
|
||||
Value: []byte("}"),
|
||||
},
|
||||
}
|
||||
suite.Run()
|
||||
}
|
||||
|
||||
func TestAmpersandFollowedByEllipsisTokens(t *testing.T) {
|
||||
suite := tester.NewLexerTokenStructTestSuite(t)
|
||||
suite.UsePHP8()
|
||||
|
Loading…
Reference in New Issue
Block a user