Skip to content

Commit 6b3c1a6

Browse files
authored
Merge pull request #4384 from onflow/bastian/improve-pretty-printing
Improve pretty printing
2 parents c698d6a + cea26bb commit 6b3c1a6

File tree

4 files changed

+138
-4
lines changed

4 files changed

+138
-4
lines changed

ast/expression.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,25 @@ func (e *StringTemplateExpression) Doc() prettier.Doc {
276276
return prettier.Text(QuoteString(e.Values[0]))
277277
}
278278

279-
// TODO: must reproduce expressions as literals
280-
panic("not implemented")
279+
concat := make(prettier.Concat, 0, 2+len(e.Values)+(3*len(e.Expressions)))
280+
concat = append(concat, prettier.Text(`"`))
281+
for i, value := range e.Values {
282+
var sb strings.Builder
283+
QuoteStringInner(value, &sb)
284+
concat = append(concat, prettier.Text(sb.String()))
285+
286+
if i < len(e.Expressions) {
287+
e := e.Expressions[i]
288+
concat = append(
289+
concat,
290+
prettier.Text(`\(`),
291+
e.Doc(),
292+
prettier.Text(`)`),
293+
)
294+
}
295+
}
296+
concat = append(concat, prettier.Text(`"`))
297+
return concat
281298
}
282299

283300
func (e *StringTemplateExpression) MarshalJSON() ([]byte, error) {

ast/expression_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5709,3 +5709,112 @@ func TestFunctionExpression_String(t *testing.T) {
57095709
)
57105710
})
57115711
}
5712+
5713+
func TestStringTemplateExpression_MarshalJSON(t *testing.T) {
5714+
5715+
t.Parallel()
5716+
5717+
expr := &StringTemplateExpression{
5718+
Values: []string{"Hello, ", "!"},
5719+
Expressions: []Expression{
5720+
&IdentifierExpression{
5721+
Identifier: Identifier{
5722+
Identifier: "name",
5723+
Pos: Position{Offset: 1, Line: 2, Column: 3},
5724+
},
5725+
},
5726+
},
5727+
Range: Range{
5728+
StartPos: Position{Offset: 4, Line: 5, Column: 6},
5729+
EndPos: Position{Offset: 7, Line: 8, Column: 9},
5730+
},
5731+
}
5732+
5733+
actual, err := json.Marshal(expr)
5734+
require.NoError(t, err)
5735+
5736+
assert.JSONEq(t,
5737+
// language=json
5738+
`
5739+
{
5740+
"Type": "StringTemplateExpression",
5741+
"Values": ["Hello, ", "!"],
5742+
"Expressions": [
5743+
{
5744+
"Type": "IdentifierExpression",
5745+
"Identifier": {
5746+
"Identifier": "name",
5747+
"StartPos": {"Offset": 1, "Line": 2, "Column": 3},
5748+
"EndPos": {"Offset": 4, "Line": 2, "Column": 6}
5749+
},
5750+
"StartPos": {"Offset": 1, "Line": 2, "Column": 3},
5751+
"EndPos": {"Offset": 4, "Line": 2, "Column": 6}
5752+
}
5753+
],
5754+
"StartPos": {"Offset": 4, "Line": 5, "Column": 6},
5755+
"EndPos": {"Offset": 7, "Line": 8, "Column": 9}
5756+
}
5757+
`,
5758+
string(actual),
5759+
)
5760+
}
5761+
5762+
func TestStringExpressionTemplate_Doc(t *testing.T) {
5763+
5764+
t.Parallel()
5765+
5766+
expr := &StringTemplateExpression{
5767+
Values: []string{"Hello, ", "!"},
5768+
Expressions: []Expression{
5769+
&IdentifierExpression{
5770+
Identifier: Identifier{
5771+
Identifier: "name",
5772+
Pos: Position{Offset: 1, Line: 2, Column: 3},
5773+
},
5774+
},
5775+
},
5776+
Range: Range{
5777+
StartPos: Position{Offset: 4, Line: 5, Column: 6},
5778+
EndPos: Position{Offset: 7, Line: 8, Column: 9},
5779+
},
5780+
}
5781+
5782+
assert.Equal(t,
5783+
prettier.Concat{
5784+
prettier.Text(`"`),
5785+
prettier.Text(`Hello, `),
5786+
prettier.Text(`\(`),
5787+
prettier.Text(`name`),
5788+
prettier.Text(`)`),
5789+
prettier.Text(`!`),
5790+
prettier.Text(`"`),
5791+
},
5792+
expr.Doc(),
5793+
)
5794+
}
5795+
5796+
func TestStringExpressionTemplate_String(t *testing.T) {
5797+
5798+
t.Parallel()
5799+
5800+
expr := &StringTemplateExpression{
5801+
Values: []string{"Hello, ", "!"},
5802+
Expressions: []Expression{
5803+
&IdentifierExpression{
5804+
Identifier: Identifier{
5805+
Identifier: "name",
5806+
Pos: Position{Offset: 1, Line: 2, Column: 3},
5807+
},
5808+
},
5809+
},
5810+
Range: Range{
5811+
StartPos: Position{Offset: 4, Line: 5, Column: 6},
5812+
EndPos: Position{Offset: 7, Line: 8, Column: 9},
5813+
},
5814+
}
5815+
5816+
assert.Equal(t,
5817+
`"Hello, \(name)!"`,
5818+
expr.String(),
5819+
)
5820+
}

ast/string.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ import (
2727
func QuoteString(s string) string {
2828
var b strings.Builder
2929
b.WriteByte('"')
30+
QuoteStringInner(s, &b)
31+
b.WriteByte('"')
32+
return b.String()
33+
}
34+
35+
func QuoteStringInner(s string, b *strings.Builder) {
3036
for _, r := range s {
3137
switch r {
3238
case 0:
@@ -56,6 +62,4 @@ func QuoteString(s string) string {
5662
}
5763
}
5864
}
59-
b.WriteByte('"')
60-
return b.String()
6165
}

ast/transfer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func (f Transfer) MarshalJSON() ([]byte, error) {
6767
var copyTransferDoc prettier.Doc = prettier.Text("=")
6868
var moveTransferDoc prettier.Doc = prettier.Text("<-")
6969
var forceMoveTransferDoc prettier.Doc = prettier.Text("<-!")
70+
var noTransferDoc prettier.Doc = prettier.Text("$noTransfer")
7071

7172
func (f Transfer) Doc() prettier.Doc {
7273
switch f.Operation {
@@ -76,6 +77,9 @@ func (f Transfer) Doc() prettier.Doc {
7677
return moveTransferDoc
7778
case TransferOperationMoveForced:
7879
return forceMoveTransferDoc
80+
case TransferOperationInternalNoTransfer:
81+
return noTransferDoc
82+
// no transfer operation, e.g. in a variable declaration
7983
case TransferOperationUnknown:
8084
return prettier.Text("")
8185
}

0 commit comments

Comments
 (0)