Skip to content

Commit b74f719

Browse files
authored
Merge pull request #123 from sqls-server/line-break
format with semicolon and comments
2 parents 973c119 + bff56e1 commit b74f719

File tree

8 files changed

+90
-44
lines changed

8 files changed

+90
-44
lines changed

ast/ast.go

+18
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,12 @@ func (t *SQLToken) String() string {
517517
case *token.SQLWord:
518518
return v.String()
519519
case string:
520+
if t.Kind == token.Comment {
521+
return "--" + v
522+
}
523+
if t.Kind == token.MultilineComment {
524+
return "/*" + v + "*/"
525+
}
520526
return v
521527
default:
522528
return " "
@@ -528,6 +534,12 @@ func (t *SQLToken) NoQuoteString() string {
528534
case *token.SQLWord:
529535
return v.NoQuoteString()
530536
case string:
537+
if t.Kind == token.Comment {
538+
return "--" + v
539+
}
540+
if t.Kind == token.MultilineComment {
541+
return "/*" + v + "*/"
542+
}
531543
return v
532544
default:
533545
return " "
@@ -539,6 +551,12 @@ func (t *SQLToken) Render(opts *RenderOptions) string {
539551
case *token.SQLWord:
540552
return renderSQLWord(v, opts)
541553
case string:
554+
if t.Kind == token.Comment {
555+
return "--" + v
556+
}
557+
if t.Kind == token.MultilineComment {
558+
return "/*" + v + "*/"
559+
}
542560
return v
543561
default:
544562
return " "

internal/formatter/formatter.go

+18
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,24 @@ func formatItem(node ast.Node, env *formatEnvironment) ast.Node {
235235
results = append(results, linebreakNode)
236236
results = append(results, env.genIndent()...)
237237
}
238+
commentAfterMatcher := astutil.NodeMatcher{
239+
ExpectTokens: []token.Kind{
240+
token.Comment,
241+
},
242+
}
243+
if commentAfterMatcher.IsMatch(node) {
244+
results = append(results, linebreakNode)
245+
}
246+
247+
breakStatementAfterMatcher := astutil.NodeMatcher{
248+
ExpectTokens: []token.Kind{
249+
token.Semicolon,
250+
},
251+
}
252+
if breakStatementAfterMatcher.IsMatch(node) {
253+
results = append(results, linebreakNode)
254+
env.indentLevelDown()
255+
}
238256

239257
return &ast.ItemWith{Toks: results}
240258
}

parser/parser.go

+10-4
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ func NewParser(src io.Reader, d dialect.Dialect) (*Parser, error) {
7979

8080
parsed := []ast.Node{}
8181
for _, tok := range tokens {
82-
if tok.Kind == token.Comment {
83-
continue
84-
}
8582
parsed = append(parsed, ast.NewItem(tok))
8683
}
8784

@@ -529,6 +526,12 @@ func parseAliased(reader *astutil.NodeReader) ast.Node {
529526
}
530527
}
531528

529+
var commentInfixMatcher = astutil.NodeMatcher{
530+
ExpectTokens: []token.Kind{
531+
token.Comment,
532+
token.MultilineComment,
533+
},
534+
}
532535
var identifierListInfixMatcher = astutil.NodeMatcher{
533536
ExpectTokens: []token.Kind{
534537
token.Comma,
@@ -570,7 +573,7 @@ func parseIdentifierList(reader *astutil.NodeReader) ast.Node {
570573
peekNode ast.Node
571574
)
572575
for {
573-
if !tmpReader.PeekNodeIs(true, identifierListTargetMatcher) {
576+
if !tmpReader.PeekNodeIs(true, identifierListTargetMatcher) && !tmpReader.PeekNodeIs(true, commentInfixMatcher) {
574577
// Include white space after the comma
575578
peekIndex, peekNode := tmpReader.PeekNode(true)
576579
if peekNode != nil {
@@ -584,6 +587,9 @@ func parseIdentifierList(reader *astutil.NodeReader) ast.Node {
584587
}
585588
break
586589
}
590+
for tmpReader.PeekNodeIs(true, commentInfixMatcher) {
591+
tmpReader.NextNode(true)
592+
}
587593

588594
peekIndex, peekNode = tmpReader.PeekNode(true)
589595
idents = append(idents, peekNode)

parser/parser_test.go

+11-10
Original file line numberDiff line numberDiff line change
@@ -84,42 +84,43 @@ func TestParseComments(t *testing.T) {
8484
name: "line comment with identiger",
8585
input: "-- foo\nbar",
8686
checkFn: func(t *testing.T, stmts []*ast.Statement, input string) {
87-
testStatement(t, stmts[0], 2, "\nbar")
87+
testStatement(t, stmts[0], 3, "-- foo\nbar")
8888

8989
list := stmts[0].GetTokens()
90-
testItem(t, list[0], "\n")
91-
testIdentifier(t, list[1], "bar")
90+
testItem(t, list[0], "-- foo")
91+
testIdentifier(t, list[2], "bar")
9292
},
9393
},
9494
{
9595
name: "range comment with identiger",
9696
input: "/* foo */bar",
9797
checkFn: func(t *testing.T, stmts []*ast.Statement, input string) {
98-
testStatement(t, stmts[0], 1, "bar")
98+
testStatement(t, stmts[0], 2, "/* foo */bar")
9999

100100
list := stmts[0].GetTokens()
101-
testIdentifier(t, list[0], "bar")
101+
testIdentifier(t, list[1], "bar")
102102
},
103103
},
104104
{
105105
name: "range comment with identiger list",
106106
input: "foo, /* foo */bar",
107107
checkFn: func(t *testing.T, stmts []*ast.Statement, input string) {
108-
testStatement(t, stmts[0], 1, "foo, bar")
108+
testStatement(t, stmts[0], 1, "foo, /* foo */bar")
109109

110110
list := stmts[0].GetTokens()
111-
testIdentifierList(t, list[0], "foo, bar")
111+
testIdentifierList(t, list[0], "foo, /* foo */bar")
112112
},
113113
},
114114
{
115115
name: "multi line range comment with identiger",
116116
input: "/*\n * foo\n */\nbar",
117117
checkFn: func(t *testing.T, stmts []*ast.Statement, input string) {
118-
testStatement(t, stmts[0], 2, "\nbar")
118+
testStatement(t, stmts[0], 3, "/*\n foo\n */\nbar")
119119

120120
list := stmts[0].GetTokens()
121-
testItem(t, list[0], "\n")
122-
testIdentifier(t, list[1], "bar")
121+
testItem(t, list[0], "/*\n foo\n */")
122+
testItem(t, list[1], "\n")
123+
testIdentifier(t, list[2], "bar")
123124
},
124125
},
125126
}

token/kind.go

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ const (
2020
Whitespace
2121
// comment node
2222
Comment
23+
// multiline comment node
24+
MultilineComment
2325
// = operator
2426
Eq
2527
// != or <> operator

token/kind_string.go

+29-28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

token/lexer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ func (t *Tokenizer) next() (Kind, interface{}, error) {
274274
if err != nil {
275275
return ILLEGAL, str, err
276276
}
277-
return Comment, str, nil
277+
return MultilineComment, str, nil
278278
}
279279
t.Col++
280280
return Div, "/", nil

token/lexer_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ multiline
462462
comment */`,
463463
out: []*Token{
464464
{
465-
Kind: Comment,
465+
Kind: MultilineComment,
466466
Value: " test\nmultiline\ncomment ",
467467
From: Pos{Line: 0, Col: 0},
468468
To: Pos{Line: 2, Col: 10},

0 commit comments

Comments
 (0)