diff --git a/tools/goctl/pkg/parser/api/parser/parser.go b/tools/goctl/pkg/parser/api/parser/parser.go index c96d18fbe..005c04673 100644 --- a/tools/goctl/pkg/parser/api/parser/parser.go +++ b/tools/goctl/pkg/parser/api/parser/parser.go @@ -1172,12 +1172,12 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { slashTok := p.curTok var pathText = slashTok.Text - if !p.advanceIfPeekTokenIs(token.IDENT) { + if !p.advanceIfPeekTokenIs(token.IDENT, token.SUB) { return nil } pathText += p.curTok.Text - if p.peekTokenIs(token.SUB) { // parse abc-efg format + if p.peekTokenIs(token.SUB) && p.curTokenIs(token.IDENT) { // parse abc-efg format if !p.nextToken() { return nil } @@ -1303,12 +1303,21 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { slashTok := p.curTok var pathText = valueTok.Text pathText += slashTok.Text - if !p.advanceIfPeekTokenIs(token.IDENT) { + // Allow a trailing slash at the end of an @server path value. + if p.peekTok.Line() > p.curTok.Line() || p.peekTokenIs(token.RPAREN) { + valueTok = token.Token{ + Text: pathText, + Position: valueTok.Position, + } + leadingCommentGroup = p.curTokenNode().LeadingCommentGroup + break + } + if !p.advanceIfPeekTokenIs(token.IDENT, token.SUB) { return nil } pathText += p.curTok.Text - if p.peekTokenIs(token.SUB) { // parse abc-efg format + if p.peekTokenIs(token.SUB) && p.curTokenIs(token.IDENT) { // parse abc-efg format if !p.nextToken() { return nil } diff --git a/tools/goctl/pkg/parser/api/parser/parser_test.go b/tools/goctl/pkg/parser/api/parser/parser_test.go index 8497af3d9..9e6c4820e 100644 --- a/tools/goctl/pkg/parser/api/parser/parser_test.go +++ b/tools/goctl/pkg/parser/api/parser/parser_test.go @@ -306,6 +306,10 @@ func TestParser_Parse_atServerStmt(t *testing.T) { "prefix2": "v1/v2_test/v2-beta", "prefix3": "v1/v2_", "prefix4": "a-b-c", + "prefix5": "/-", + "prefix6": "/-/", + "prefix7": "/abc/", + "prefix8": "/comment/", "summary": `"test"`, "key": `"bar"`, } @@ -359,6 +363,8 @@ func TestParser_Parse_atServerStmt(t *testing.T) { `@server(foo: m1,`, `@server(foo: m1,)`, `@server(foo: v1/v2-)`, + `@server(prefix:/--)`, + `@server(prefix:/-abc)`, `@server(foo:"test")`, } for _, v := range testData { diff --git a/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api b/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api index d1d67f06f..692247137 100644 --- a/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api +++ b/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api @@ -18,6 +18,10 @@ prefix2: v1/v2_test/v2-beta prefix3: v1/v2_ prefix4: a-b-c + prefix5: /- + prefix6: /-/ + prefix7: /abc/ + prefix8: /comment/ // trailing slash before a comment and the next key summary:"test" key:"bar" )