Skip to content

Commit 78dc465

Browse files
committed
Fix 'end val' and 'end var'
1 parent c63623d commit 78dc465

File tree

4 files changed

+326
-0
lines changed

4 files changed

+326
-0
lines changed

src/typescript/Scala.tmLanguage.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,14 @@ export const scalaTmLanguage: TmLanguage = {
583583
match: `^\\s*(end)\\s+(if|while|for|match)${endOfLineMaybeWithComment}`,
584584
name: 'keyword.control.flow.end.scala'
585585
},
586+
{
587+
match: `^\\s*(end)\\s+(val)${endOfLineMaybeWithComment}`,
588+
name: 'keyword.declaration.stable.end.scala'
589+
},
590+
{
591+
match: `^\\s*(end)\\s+(var)${endOfLineMaybeWithComment}`,
592+
name: 'keyword.declaration.volatile.end.scala'
593+
},
586594
{
587595
match: `^\\s*(end)\\s+(?:(new|extension)|(${idUpper}))${endOfLineMaybeWithComment}`,
588596
captures: {

tests/snap/end.test.scala

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/// SYNTAX TEST "source.scala"
2+
// From: https://dotty.epfl.ch/docs/reference/other-new-features/indentation.html
3+
4+
package p1.p2:
5+
6+
abstract class C() with
7+
8+
def this(x: Int) =
9+
this()
10+
if x > 0 then
11+
val a :: b =
12+
x :: Nil
13+
end val
14+
var y =
15+
x
16+
end y
17+
while y > 0 do
18+
println(y)
19+
y -= 1
20+
end while
21+
try
22+
x match
23+
case 0 => println("0")
24+
case _ =>
25+
end match
26+
finally
27+
println("done")
28+
end try
29+
end if
30+
end this
31+
32+
def f: String
33+
end C
34+
35+
object C with
36+
given C =
37+
new C:
38+
def f = "!"
39+
end f
40+
end new
41+
end given
42+
end C
43+
44+
extension (x: C)
45+
def ff: String = x.f ++ x.f
46+
end extension
47+
48+
end p2

tests/snap/end.test.scala.snap

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
>/// SYNTAX TEST "source.scala"
2+
#^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala
3+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala
4+
>// From: https://dotty.epfl.ch/docs/reference/other-new-features/indentation.html
5+
#^^ source.scala comment.line.double-slash.scala punctuation.definition.comment.scala
6+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.scala comment.line.double-slash.scala
7+
>
8+
>package p1.p2:
9+
#^^^^^^^ source.scala meta.package.scala keyword.other.import.scala
10+
# ^ source.scala meta.package.scala
11+
# ^^ source.scala meta.package.scala entity.name.package.scala
12+
# ^ source.scala meta.package.scala punctuation.definition.package
13+
# ^^ source.scala meta.package.scala entity.name.package.scala
14+
# ^ source.scala meta.package.scala entity.name.package.scala
15+
>
16+
> abstract class C() with
17+
#^^^ source.scala
18+
# ^^^^^^^^ source.scala storage.modifier.other
19+
# ^ source.scala
20+
# ^^^^^ source.scala keyword.declaration.scala
21+
# ^ source.scala
22+
# ^ source.scala entity.name.class.declaration
23+
# ^^ source.scala meta.parentheses.scala meta.bracket.scala
24+
# ^ source.scala
25+
# ^^^^ source.scala keyword.declaration.scala
26+
>
27+
> def this(x: Int) =
28+
#^^^^^^ source.scala
29+
# ^^^ source.scala keyword.declaration.scala
30+
# ^ source.scala
31+
# ^^^^ source.scala entity.name.function.declaration
32+
# ^ source.scala meta.bracket.scala
33+
# ^ source.scala variable.parameter.scala
34+
# ^ source.scala meta.colon.scala
35+
# ^ source.scala
36+
# ^^^ source.scala entity.name.class
37+
# ^ source.scala meta.bracket.scala
38+
# ^ source.scala
39+
# ^ source.scala keyword.operator.comparison.scala
40+
> this()
41+
#^^^^^^^^^ source.scala
42+
# ^^^^ source.scala variable.language.scala
43+
# ^^ source.scala meta.parentheses.scala meta.bracket.scala
44+
> if x > 0 then
45+
#^^^^^^^^^ source.scala
46+
# ^^ source.scala keyword.control.flow.scala
47+
# ^^^ source.scala
48+
# ^ source.scala keyword.operator.comparison.scala
49+
# ^ source.scala
50+
# ^ source.scala constant.numeric.scala
51+
# ^ source.scala
52+
# ^^^^ source.scala keyword.control.flow.scala
53+
> val a :: b =
54+
#^^^^^^^^^^^^ source.scala
55+
# ^^^ source.scala keyword.declaration.stable.scala
56+
# ^ source.scala
57+
# ^ source.scala variable.other.declaration.scala
58+
# ^ source.scala
59+
# ^^ source.scala keyword.operator.scala
60+
# ^^^ source.scala
61+
# ^ source.scala keyword.operator.comparison.scala
62+
> x :: Nil
63+
#^^^^^^^^^^^^^^^^^ source.scala
64+
# ^^ source.scala keyword.operator.scala
65+
# ^ source.scala
66+
# ^^^ source.scala entity.name.class
67+
> end val
68+
#^^^^^^^^^^^^^^^^^^^ source.scala keyword.declaration.stable.end.scala
69+
> var y =
70+
#^^^^^^^^^^^^ source.scala
71+
# ^^^ source.scala keyword.declaration.volatile.scala
72+
# ^ source.scala
73+
# ^ source.scala variable.other.declaration.scala
74+
# ^ source.scala
75+
# ^ source.scala keyword.operator.comparison.scala
76+
> x
77+
#^^^^^^^^^^^^^^^^^ source.scala
78+
> end y
79+
#^^^^^^^^^^^^ source.scala
80+
# ^^^ source.scala keyword.declaration.end.scala
81+
# ^ source.scala
82+
# ^ source.scala entity.name.declaration
83+
> while y > 0 do
84+
#^^^^^^^^^^^^ source.scala
85+
# ^^^^^ source.scala keyword.control.flow.scala
86+
# ^^^ source.scala
87+
# ^ source.scala keyword.operator.comparison.scala
88+
# ^ source.scala
89+
# ^ source.scala constant.numeric.scala
90+
# ^ source.scala
91+
# ^^ source.scala keyword.control.flow.scala
92+
> println(y)
93+
#^^^^^^^^^^^^^^^^^^^^^^ source.scala
94+
# ^ source.scala meta.bracket.scala
95+
# ^ source.scala
96+
# ^ source.scala meta.bracket.scala
97+
> y -= 1
98+
#^^^^^^^^^^^^^^^^^ source.scala
99+
# ^ source.scala keyword.operator.arithmetic.scala
100+
# ^ source.scala keyword.operator.comparison.scala
101+
# ^ source.scala
102+
# ^ source.scala constant.numeric.scala
103+
> end while
104+
#^^^^^^^^^^^^^^^^^^^^^ source.scala keyword.control.flow.end.scala
105+
> try
106+
#^^^^^^^^^^^^ source.scala
107+
# ^^^ source.scala keyword.control.exception.scala
108+
> x match
109+
#^^^^^^^^^^^^^^^^^ source.scala
110+
# ^^^^^ source.scala keyword.control.flow.scala
111+
> case 0 => println("0")
112+
#^^^^^^^^^^^^^^^^^^ source.scala
113+
# ^^^^ source.scala keyword.control.flow.scala
114+
# ^ source.scala
115+
# ^ source.scala constant.numeric.scala
116+
# ^ source.scala
117+
# ^ source.scala keyword.operator.comparison.scala
118+
# ^ source.scala keyword.operator.comparison.scala
119+
# ^^^^^^^^ source.scala
120+
# ^ source.scala meta.bracket.scala
121+
# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala
122+
# ^ source.scala string.quoted.double.scala
123+
# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala
124+
# ^ source.scala meta.bracket.scala
125+
> case _ =>
126+
#^^^^^^^^^^^^^^^^^^ source.scala
127+
# ^^^^ source.scala keyword.control.flow.scala
128+
# ^^^ source.scala
129+
# ^ source.scala keyword.operator.comparison.scala
130+
# ^ source.scala keyword.operator.comparison.scala
131+
> end match
132+
#^^^^^^^^^^^^^^^^^^^^^^^^ source.scala keyword.control.flow.end.scala
133+
> finally
134+
#^^^^^^^^^^^^ source.scala
135+
# ^^^^^^^ source.scala keyword.control.exception.scala
136+
> println("done")
137+
#^^^^^^^^^^^^^^^^^^^^^^ source.scala
138+
# ^ source.scala meta.bracket.scala
139+
# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala
140+
# ^^^^ source.scala string.quoted.double.scala
141+
# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala
142+
# ^ source.scala meta.bracket.scala
143+
> end try
144+
#^^^^^^^^^^^^ source.scala
145+
# ^^^ source.scala keyword.declaration.end.scala
146+
# ^ source.scala
147+
# ^^^ source.scala entity.name.declaration
148+
> end if
149+
#^^^^^^^^^^^^^^^ source.scala keyword.control.flow.end.scala
150+
> end this
151+
#^^^^^^ source.scala
152+
# ^^^ source.scala keyword.declaration.end.scala
153+
# ^ source.scala
154+
# ^^^^ source.scala entity.name.declaration
155+
>
156+
> def f: String
157+
#^^^^^^ source.scala
158+
# ^^^ source.scala keyword.declaration.scala
159+
# ^ source.scala
160+
# ^ source.scala entity.name.function.declaration
161+
# ^ source.scala keyword.operator.scala
162+
# ^ source.scala
163+
# ^^^^^^ source.scala entity.name.class
164+
> end C
165+
#^^^ source.scala
166+
# ^^^ source.scala keyword.declaration.end.scala
167+
# ^ source.scala
168+
# ^ source.scala entity.name.type.declaration
169+
>
170+
> object C with
171+
#^^^ source.scala
172+
# ^^^^^^ source.scala keyword.declaration.scala
173+
# ^ source.scala
174+
# ^ source.scala entity.name.class.declaration
175+
# ^ source.scala
176+
# ^^^^ source.scala keyword.declaration.scala
177+
> given C =
178+
#^^^^^^ source.scala
179+
# ^^^^^ source.scala keyword.declaration.scala
180+
# ^ source.scala
181+
# ^ source.scala entity.name.class
182+
# ^ source.scala
183+
# ^ source.scala keyword.operator.comparison.scala
184+
> new C:
185+
#^^^^^^^^^ source.scala
186+
# ^^^ source.scala keyword.declaration.scala
187+
# ^ source.scala
188+
# ^ source.scala entity.name.class
189+
# ^ source.scala keyword.operator.scala
190+
> def f = "!"
191+
#^^^^^^^^^^^^ source.scala
192+
# ^^^ source.scala keyword.declaration.scala
193+
# ^ source.scala
194+
# ^ source.scala entity.name.function.declaration
195+
# ^ source.scala
196+
# ^ source.scala keyword.operator.comparison.scala
197+
# ^ source.scala
198+
# ^ source.scala string.quoted.double.scala punctuation.definition.string.begin.scala
199+
# ^ source.scala string.quoted.double.scala
200+
# ^ source.scala string.quoted.double.scala punctuation.definition.string.end.scala
201+
> end f
202+
#^^^^^^^^^^^^ source.scala
203+
# ^^^ source.scala keyword.declaration.end.scala
204+
# ^ source.scala
205+
# ^ source.scala entity.name.declaration
206+
> end new
207+
#^^^^^^^^^ source.scala
208+
# ^^^ source.scala keyword.declaration.end.scala
209+
# ^ source.scala
210+
# ^^^ source.scala keyword.declaration.end.scala
211+
> end given
212+
#^^^^^^ source.scala
213+
# ^^^ source.scala keyword.declaration.end.scala
214+
# ^ source.scala
215+
# ^^^^^ source.scala entity.name.declaration
216+
> end C
217+
#^^^ source.scala
218+
# ^^^ source.scala keyword.declaration.end.scala
219+
# ^ source.scala
220+
# ^ source.scala entity.name.type.declaration
221+
>
222+
> extension (x: C)
223+
#^^^ source.scala
224+
# ^^^^^^^^^ source.scala keyword.declaration.scala
225+
# ^ source.scala
226+
# ^ source.scala meta.bracket.scala
227+
# ^ source.scala variable.parameter.scala
228+
# ^ source.scala meta.colon.scala
229+
# ^ source.scala
230+
# ^ source.scala entity.name.class
231+
# ^ source.scala meta.bracket.scala
232+
> def ff: String = x.f ++ x.f
233+
#^^^^^^ source.scala
234+
# ^^^ source.scala keyword.declaration.scala
235+
# ^ source.scala
236+
# ^^ source.scala entity.name.function.declaration
237+
# ^ source.scala keyword.operator.scala
238+
# ^ source.scala
239+
# ^^^^^^ source.scala entity.name.class
240+
# ^ source.scala
241+
# ^ source.scala keyword.operator.comparison.scala
242+
# ^^^^^ source.scala
243+
# ^ source.scala keyword.operator.arithmetic.scala
244+
# ^ source.scala keyword.operator.arithmetic.scala
245+
# ^^^^^ source.scala
246+
> end extension
247+
#^^^ source.scala
248+
# ^^^ source.scala keyword.declaration.end.scala
249+
# ^ source.scala
250+
# ^^^^^^^^^ source.scala keyword.declaration.end.scala
251+
>
252+
>end p2
253+
#^^^ source.scala keyword.declaration.end.scala
254+
# ^ source.scala
255+
# ^^ source.scala entity.name.declaration
256+
>

tests/unit/#192.test.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// SYNTAX TEST "source.scala"
2+
3+
4+
val a :: b =
5+
x :: Nil
6+
end val
7+
// ^^^ source.scala keyword.declaration.stable.end.scala
8+
// ^^^ source.scala keyword.declaration.stable.end.scala
9+
10+
var a :: b =
11+
x :: Nil
12+
end var
13+
// ^^^ source.scala keyword.declaration.volatile.end.scala
14+
// ^^^ source.scala keyword.declaration.volatile.end.scala

0 commit comments

Comments
 (0)