Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6f6286e

Browse files
authored
fix(lsp): small bugs in snippet-parser#18998
This fixes the following bugs:`${1:else_text}` -> format with if_text: "else_text"`${1:-else_text}` -> format with if_text: "else_text"`${1:}` in `format` (eg. empty else_text) -> error.`${1:}` (eg. empty placeholder) -> error.Thanks hrsh7th :)
1 parent1eb9624 commit6f6286e

File tree

2 files changed

+154
-37
lines changed

2 files changed

+154
-37
lines changed

‎runtime/lua/vim/lsp/_snippet.lua‎

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ P.seq = function(...)
156156
returnfunction(input,pos)
157157
localvalues= {}
158158
localnew_pos=pos
159-
for_,parserinipairs(parsers)do
159+
fori,parserinipairs(parsers)do
160160
localresult=parser(input,new_pos)
161161
ifresult.parsedthen
162-
table.insert(values,result.value)
162+
values[i]=result.value
163163
new_pos=result.pos
164164
else
165165
returnP.unmatch(pos)
@@ -272,22 +272,48 @@ S.format = P.any(
272272
S.open,
273273
S.int,
274274
S.colon,
275-
P.any(
276-
P.seq(S.question,P.take_until({':'}, {'\\'}),S.colon,P.take_until({'}'}, {'\\'})),
277-
P.seq(S.plus,P.take_until({'}'}, {'\\'})),
278-
P.seq(S.minus,P.take_until({'}'}, {'\\'}))
279-
),
275+
P.seq(S.question,P.opt(P.take_until({':'}, {'\\'})),S.colon,P.opt(P.take_until({'}'}, {'\\'}))),
280276
S.close
281277
),
282278
function(values)
283279
returnsetmetatable({
284280
type=Node.Type.FORMAT,
285281
capture_index=values[3],
286-
if_text=values[5][2].esc,
287-
else_text=(values[5][4]or {}).esc,
282+
if_text=values[5][2]andvalues[5][2].escor'',
283+
else_text=values[5][4]andvalues[5][4].escor'',
288284
},Node)
289285
end
290-
)
286+
),
287+
P.map(
288+
P.seq(S.dollar,S.open,S.int,S.colon,P.seq(S.plus,P.opt(P.take_until({'}'}, {'\\'}))),S.close),
289+
function(values)
290+
returnsetmetatable({
291+
type=Node.Type.FORMAT,
292+
capture_index=values[3],
293+
if_text=values[5][2]andvalues[5][2].escor'',
294+
else_text='',
295+
},Node)
296+
end
297+
),
298+
P.map(
299+
P.seq(S.dollar,S.open,S.int,S.colon,S.minus,P.opt(P.take_until({'}'}, {'\\'})),S.close),
300+
function(values)
301+
returnsetmetatable({
302+
type=Node.Type.FORMAT,
303+
capture_index=values[3],
304+
if_text='',
305+
else_text=values[6]andvalues[6].escor'',
306+
},Node)
307+
end
308+
),
309+
P.map(P.seq(S.dollar,S.open,S.int,S.colon,P.opt(P.take_until({'}'}, {'\\'})),S.close),function(values)
310+
returnsetmetatable({
311+
type=Node.Type.FORMAT,
312+
capture_index=values[3],
313+
if_text='',
314+
else_text=values[5]andvalues[5].escor'',
315+
},Node)
316+
end)
291317
)
292318

293319
S.transform=P.map(
@@ -333,12 +359,19 @@ S.tabstop = P.any(
333359

334360
S.placeholder=P.any(
335361
P.map(
336-
P.seq(S.dollar,S.open,S.int,S.colon,P.many(P.any(S.toplevel,S.text({'$','}'}, {'\\'}))),S.close),
362+
P.seq(S.dollar,S.open,S.int,S.colon,P.opt(P.many(P.any(S.toplevel,S.text({'$','}'}, {'\\'})))),S.close),
337363
function(values)
338364
returnsetmetatable({
339365
type=Node.Type.PLACEHOLDER,
340366
tabstop=values[3],
341-
children=values[5],
367+
-- insert empty text if opt did not match.
368+
children=values[5]or {
369+
setmetatable({
370+
type=Node.Type.TEXT,
371+
raw='',
372+
esc='',
373+
},Node),
374+
},
342375
},Node)
343376
end
344377
)

‎test/functional/plugin/lsp/snippet_spec.lua‎

Lines changed: 109 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ describe('vim.lsp._snippet', function()
1919
{
2020
type=snippet.NodeType.TEXT,
2121
raw='TE\\$\\}XT',
22-
esc='TE$}XT'
23-
}
24-
}
22+
esc='TE$}XT',
23+
},
24+
},
2525
},parse('TE\\$\\}XT'))
2626
end)
2727

@@ -36,8 +36,8 @@ describe('vim.lsp._snippet', function()
3636
{
3737
type=snippet.NodeType.TABSTOP,
3838
tabstop=2,
39-
}
40-
}
39+
},
40+
},
4141
},parse('$1${2}'))
4242
end)
4343

@@ -56,7 +56,7 @@ describe('vim.lsp._snippet', function()
5656
{
5757
type=snippet.NodeType.TEXT,
5858
raw='TE\\$\\}XT',
59-
esc='TE$}XT'
59+
esc='TE$}XT',
6060
},
6161
{
6262
type=snippet.NodeType.TABSTOP,
@@ -73,21 +73,21 @@ describe('vim.lsp._snippet', function()
7373
{
7474
type=snippet.NodeType.FORMAT,
7575
capture_index=1,
76-
modifier='upcase'
77-
}
78-
}
76+
modifier='upcase',
77+
},
78+
},
7979
},
8080
},
8181
{
8282
type=snippet.NodeType.TEXT,
8383
raw='TE\\$\\}XT',
84-
esc='TE$}XT'
84+
esc='TE$}XT',
8585
},
86-
}
87-
}
88-
}
86+
},
87+
},
88+
},
8989
},
90-
}
90+
},
9191
},parse('${1:${2:TE\\$\\}XT$3${1/regex/${1:/upcase}/i}TE\\$\\}XT}}'))
9292
end)
9393

@@ -110,8 +110,8 @@ describe('vim.lsp._snippet', function()
110110
{
111111
type=snippet.NodeType.TABSTOP,
112112
tabstop=1,
113-
}
114-
}
113+
},
114+
},
115115
},
116116
{
117117
type=snippet.NodeType.VARIABLE,
@@ -124,11 +124,11 @@ describe('vim.lsp._snippet', function()
124124
type=snippet.NodeType.FORMAT,
125125
capture_index=1,
126126
modifier='upcase',
127-
}
128-
}
129-
}
127+
},
128+
},
129+
},
130130
},
131-
}
131+
},
132132
},parse('$VAR${VAR}${VAR:$1}${VAR/regex/${1:/upcase}/}'))
133133
end)
134134

@@ -141,12 +141,96 @@ describe('vim.lsp._snippet', function()
141141
tabstop=1,
142142
items= {
143143
',',
144-
'|'
145-
}
146-
}
147-
}
144+
'|',
145+
},
146+
},
147+
},
148148
},parse('${1|\\,,\\||}'))
149149
end)
150150

151-
end)
151+
it('should parse format',function()
152+
eq({
153+
type=snippet.NodeType.SNIPPET,
154+
children= {
155+
{
156+
type=snippet.NodeType.VARIABLE,
157+
name='VAR',
158+
transform= {
159+
type=snippet.NodeType.TRANSFORM,
160+
pattern='regex',
161+
format= {
162+
{
163+
type=snippet.NodeType.FORMAT,
164+
capture_index=1,
165+
modifier='upcase',
166+
},
167+
{
168+
type=snippet.NodeType.FORMAT,
169+
capture_index=1,
170+
if_text='if_text',
171+
else_text='',
172+
},
173+
{
174+
type=snippet.NodeType.FORMAT,
175+
capture_index=1,
176+
if_text='',
177+
else_text='else_text',
178+
},
179+
{
180+
type=snippet.NodeType.FORMAT,
181+
capture_index=1,
182+
else_text='else_text',
183+
if_text='if_text',
184+
},
185+
{
186+
type=snippet.NodeType.FORMAT,
187+
capture_index=1,
188+
if_text='',
189+
else_text='else_text',
190+
},
191+
},
192+
},
193+
},
194+
},
195+
},parse('${VAR/regex/${1:/upcase}${1:+if_text}${1:-else_text}${1:?if_text:else_text}${1:else_text}/}'))
196+
end)
152197

198+
it('should parse empty strings',function()
199+
eq({
200+
children= {
201+
{
202+
children= { {
203+
esc='',
204+
raw='',
205+
type=7,
206+
} },
207+
tabstop=1,
208+
type=2,
209+
},
210+
{
211+
esc='',
212+
raw='',
213+
type=7,
214+
},
215+
{
216+
name='VAR',
217+
transform= {
218+
format= {
219+
{
220+
capture_index=1,
221+
else_text='',
222+
if_text='',
223+
type=6,
224+
},
225+
},
226+
option='g',
227+
pattern='erg',
228+
type=5,
229+
},
230+
type=3,
231+
},
232+
},
233+
type=0,
234+
},parse('${1:} ${VAR/erg/${1:?:}/g}'))
235+
end)
236+
end)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp