Skip to content

Commit 80df3a0

Browse files
committed
Improve string interpolation support for functions and variables/modules
1 parent 85c3f54 commit 80df3a0

File tree

2 files changed

+141
-51
lines changed

2 files changed

+141
-51
lines changed

Terraform.YAML-tmLanguage

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,7 @@ patterns:
7171
'1': {name: entity.name.section.terraform}
7272
'2': {name: punctuation.definition.tag.terraform}
7373

74-
- comment: Strings
75-
name: string.quoted.double.terraform
76-
begin: \"
77-
beginCaptures:
78-
'0': {name: string.terraform punctuation.definition.string.begin.terraform}
79-
end: \"
80-
endCaptures:
81-
'0': {name: string.terraform punctuation.definition.string.end.terraform}
82-
patterns:
83-
- include: '#string_interpolation'
74+
- include: '#strings'
8475

8576
- name: string.unquoted.heredoc.terraform
8677
begin: (?>\s*<<(\w+))
@@ -89,21 +80,59 @@ patterns:
8980
'1': {name: keyword.operator.heredoc.terraform}
9081
end: ^\1$
9182
endCaptures:
92-
'0': {name: punctuation.definition.string.end.terraform}
93-
'0': {name: keyword.operator.heredoc.terraform}
83+
'0': {name: punctuation.definition.string.end.terraform keyword.operator.heredoc.terraform}
84+
9485

9586
repository:
87+
88+
strings:
89+
comment: Strings
90+
begin: \"
91+
beginCaptures:
92+
'0': {name: string.terraform punctuation.definition.string.begin.terraform}
93+
end: \"
94+
endCaptures:
95+
'0': {name: string.terraform punctuation.definition.string.end.terraform}
96+
patterns:
97+
- include: '#string_interpolation'
98+
- match: ([\w-\/\._\\%]+)
99+
name: "string.quoted.double.terraform"
100+
96101
string_interpolation:
97102
patterns:
98103
- name: source.terraform.embedded.source
99104
begin: \$\{
100105
beginCaptures:
101-
'0': {name: punctuation.section.embedded.end.terraform}
106+
'0': {name: entity.tag.embedded.start.terraform}
102107
end: \}
103108
endCaptures:
104-
'0': {name: punctuation.section.embedded.end.terraform}
109+
'0': {name: entity.tag.embedded.end.terraform}
105110
patterns:
111+
- include: '$self'
112+
106113
- match: (\.)
107114
captures:
108115
'0': {name: keyword.control.period.terraform}
109-
- include: '#string_interpolation'
116+
117+
- begin: (replace|base64decode|base64encode|base64sha256|ceil|cidrnetmask|compact|distinct|file|floor|keys|length|lower|md5|pathexpand|replace|sha1|sha256|signum|sort|timestamp|title|trimspace|upper|uuid|values)(\()
118+
comment: Builtin functions
119+
beginCaptures:
120+
'1': {name: keyword.other.function.inline.terraform}
121+
'2': {name: keyword.other.section.begin.terraform}
122+
end: (\))
123+
endCaptures:
124+
'1': {name: keyword.other.section.end.terraform}
125+
patterns:
126+
- include: '#string_interpolation'
127+
128+
# TODO handle functions with multiple arguments
129+
130+
- include: '#strings'
131+
132+
- match: (terraform|var|self|count|module|path|data)(\.[\w\*]+)+
133+
captures:
134+
'0': {name: entity.other.attribute-name.terraform}
135+
136+
137+
# TODO terraform configuration blocks
138+
# https://www.terraform.io/docs/configuration/terraform.html

Terraform.tmLanguage

Lines changed: 97 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -221,37 +221,8 @@
221221
<string>([\w\-_]+)\s+({)</string>
222222
</dict>
223223
<dict>
224-
<key>begin</key>
225-
<string>\"</string>
226-
<key>beginCaptures</key>
227-
<dict>
228-
<key>0</key>
229-
<dict>
230-
<key>name</key>
231-
<string>string.terraform punctuation.definition.string.begin.terraform</string>
232-
</dict>
233-
</dict>
234-
<key>comment</key>
235-
<string>Strings</string>
236-
<key>end</key>
237-
<string>\"</string>
238-
<key>endCaptures</key>
239-
<dict>
240-
<key>0</key>
241-
<dict>
242-
<key>name</key>
243-
<string>string.terraform punctuation.definition.string.end.terraform</string>
244-
</dict>
245-
</dict>
246-
<key>name</key>
247-
<string>string.quoted.double.terraform</string>
248-
<key>patterns</key>
249-
<array>
250-
<dict>
251-
<key>include</key>
252-
<string>#string_interpolation</string>
253-
</dict>
254-
</array>
224+
<key>include</key>
225+
<string>#strings</string>
255226
</dict>
256227
<dict>
257228
<key>begin</key>
@@ -276,7 +247,7 @@
276247
<key>0</key>
277248
<dict>
278249
<key>name</key>
279-
<string>keyword.operator.heredoc.terraform</string>
250+
<string>punctuation.definition.string.end.terraform keyword.operator.heredoc.terraform</string>
280251
</dict>
281252
</dict>
282253
<key>name</key>
@@ -297,7 +268,7 @@
297268
<key>0</key>
298269
<dict>
299270
<key>name</key>
300-
<string>punctuation.section.embedded.end.terraform</string>
271+
<string>entity.tag.embedded.start.terraform</string>
301272
</dict>
302273
</dict>
303274
<key>end</key>
@@ -307,13 +278,17 @@
307278
<key>0</key>
308279
<dict>
309280
<key>name</key>
310-
<string>punctuation.section.embedded.end.terraform</string>
281+
<string>entity.tag.embedded.end.terraform</string>
311282
</dict>
312283
</dict>
313284
<key>name</key>
314285
<string>source.terraform.embedded.source</string>
315286
<key>patterns</key>
316287
<array>
288+
<dict>
289+
<key>include</key>
290+
<string>$self</string>
291+
</dict>
317292
<dict>
318293
<key>captures</key>
319294
<dict>
@@ -327,13 +302,99 @@
327302
<string>(\.)</string>
328303
</dict>
329304
<dict>
330-
<key>include</key>
331-
<string>#string_interpolation</string>
305+
<key>begin</key>
306+
<string>(replace|base64decode|base64encode|base64sha256|ceil|cidrnetmask|compact|distinct|file|floor|keys|length|lower|md5|pathexpand|replace|sha1|sha256|signum|sort|timestamp|title|trimspace|upper|uuid|values)(\()</string>
307+
<key>beginCaptures</key>
308+
<dict>
309+
<key>1</key>
310+
<dict>
311+
<key>name</key>
312+
<string>keyword.other.function.inline.terraform</string>
313+
</dict>
314+
<key>2</key>
315+
<dict>
316+
<key>name</key>
317+
<string>keyword.other.section.begin.terraform</string>
318+
</dict>
319+
</dict>
320+
<key>comment</key>
321+
<string>Builtin functions</string>
322+
<key>end</key>
323+
<string>(\))</string>
324+
<key>endCaptures</key>
325+
<dict>
326+
<key>1</key>
327+
<dict>
328+
<key>name</key>
329+
<string>keyword.other.section.end.terraform</string>
330+
</dict>
331+
</dict>
332+
<key>patterns</key>
333+
<array>
334+
<dict>
335+
<key>include</key>
336+
<string>#string_interpolation</string>
337+
</dict>
338+
<dict>
339+
<key>include</key>
340+
<string>#strings</string>
341+
</dict>
342+
</array>
343+
</dict>
344+
<dict>
345+
<key>captures</key>
346+
<dict>
347+
<key>0</key>
348+
<dict>
349+
<key>name</key>
350+
<string>entity.other.attribute-name.terraform</string>
351+
</dict>
352+
</dict>
353+
<key>match</key>
354+
<string>(terraform|var|self|count|module|path|data)(\.[\w\*]+)+</string>
332355
</dict>
333356
</array>
334357
</dict>
335358
</array>
336359
</dict>
360+
<key>strings</key>
361+
<dict>
362+
<key>begin</key>
363+
<string>\"</string>
364+
<key>beginCaptures</key>
365+
<dict>
366+
<key>0</key>
367+
<dict>
368+
<key>name</key>
369+
<string>string.terraform punctuation.definition.string.begin.terraform</string>
370+
</dict>
371+
</dict>
372+
<key>comment</key>
373+
<string>Strings</string>
374+
<key>end</key>
375+
<string>\"</string>
376+
<key>endCaptures</key>
377+
<dict>
378+
<key>0</key>
379+
<dict>
380+
<key>name</key>
381+
<string>string.terraform punctuation.definition.string.end.terraform</string>
382+
</dict>
383+
</dict>
384+
<key>patterns</key>
385+
<array>
386+
<dict>
387+
<key>include</key>
388+
<string>#string_interpolation</string>
389+
</dict>
390+
<dict>
391+
<key>match</key>
392+
<string>([\w-\/\._\\%]+)</string>
393+
<key>name</key>
394+
<string>string.quoted.double.terraform</string>
395+
</dict>
396+
</array>
397+
</dict>
337398
</dict>
338399
<key>scopeName</key>
339400
<string>source.terraform</string>

0 commit comments

Comments
 (0)