From 84137dfcf07126dca1dfafcfde3168f634b236be Mon Sep 17 00:00:00 2001 From: Aofei Sheng Date: Tue, 11 Mar 2025 08:50:19 +0800 Subject: [PATCH] fix(parser): parse lambda exprs with invalid identifiers as `ast.BadExpr` Fixes goplus/builder#1398 Updates goplus/builder#1402 Closes goplus/tools#330 Signed-off-by: Aofei Sheng --- parser/parser.go | 12 ++++++++++-- parser/parser_test.go | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 3a27a4df4..156abf674 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -2608,14 +2608,22 @@ func (p *parser) parseLambdaExpr(allowTuple, allowCmd, allowRangeExpr bool) (x a case *tupleExpr: items := make([]*ast.Ident, len(v.items)) for i, item := range v.items { - items[i] = p.toIdent(item) + ident := p.toIdent(item) + if ident == nil { + return &ast.BadExpr{From: item.Pos(), To: p.safePos(item.End())}, false + } + items[i] = ident } lhs, lhsHasParen = items, true case *ast.ParenExpr: e, lhsHasParen = v.X, true goto retry default: - lhs = []*ast.Ident{p.toIdent(v)} + ident := p.toIdent(v) + if ident == nil { + return &ast.BadExpr{From: v.Pos(), To: p.safePos(v.End())}, false + } + lhs = []*ast.Ident{ident} } } if debugParseOutput { diff --git a/parser/parser_test.go b/parser/parser_test.go index ccfa69889..3a67a4571 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -164,6 +164,10 @@ test "hello", (x, "y") => { println "lambda",x,y } `, `/foo/bar.gop:3:19: expected 'IDENT', found "y"`, ``) + testErrCode(t, `onTouchStart "someone" => { + say "touched by someone" +} +`, `/foo/bar.gop:1:14: expected 'IDENT', found "someone"`, ``) } func TestErrTooManyParseExpr(t *testing.T) {