Repository: alexlouden/Terraform.tmLanguage
Branch: master
Commit: e03a17ec8c2a
Files: 39
Total size: 291.9 KB
Directory structure:
gitextract_5ikcg5fg/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── syntax.yaml
├── CHANGELOG.md
├── Comments.tmPreferences
├── Fold.tmPreferences
├── HCL.sublime-settings
├── HCL.sublime-syntax
├── Indentation Rules.tmPreferences
├── JSON (Terraform).sublime-syntax
├── LICENSE
├── README.md
├── Symbols - Indexed.tmPreferences
├── Symbols - Local.tmPreferences
├── Terraform Plan.sublime-syntax
├── Terraform-vars.sublime-settings
├── Terraform-vars.sublime-syntax
├── Terraform.sublime-settings
├── Terraform.sublime-syntax
├── messages/
│ └── 2.0.0.md
├── messages.json
├── preview.tf
├── snippets/
│ ├── data.sublime-snippet
│ ├── module.sublime-snippet
│ ├── module_github.sublime-snippet
│ ├── module_github_private.sublime-snippet
│ ├── module_path.sublime-snippet
│ ├── output.sublime-snippet
│ ├── provider.sublime-snippet
│ ├── provisioner.sublime-snippet
│ ├── resource.sublime-snippet
│ ├── variable_empty.sublime-snippet
│ ├── variable_map.sublime-snippet
│ └── variable_string.sublime-snippet
└── tests/
├── syntax_test_reindent.tf
├── syntax_test_scope.hcl
├── syntax_test_scope.tf
├── syntax_test_scope.tfplan
├── syntax_test_scope.tfvars
└── syntax_test_symbol.tf
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# git
.github/ export-ignore
.gitattributes export-ignore
.gitignore export-ignore
# screenshots
preview.* export-ignore
# development
tests/ export-ignore
================================================
FILE: .github/workflows/syntax.yaml
================================================
name: Syntax Tests
# https://github.com/SublimeText/syntax-test-action
on:
push:
branches:
- master
paths:
- .github/workflows/syntax.yaml
- '**.sublime-syntax'
- '**/syntax_test_*'
- '**.tmPreferences'
pull_request:
paths:
- .github/workflows/syntax.yaml
- '**.sublime-syntax'
- '**/syntax_test_*'
- '**.tmPreferences'
jobs:
syntax_tests:
name: Syntax Tests (${{ matrix.build }})
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
matrix:
include:
- build: latest # Latest dev build
packages: master
- build: 4180 # Oldest version we intent to support
packages: v4180
steps:
- uses: actions/checkout@v3
- uses: SublimeText/syntax-test-action@v2
with:
build: ${{ matrix.build }}
default_packages: ${{ matrix.packages }}
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## v2.0.1 - 2025-12-07
- Fix indexed symbol scope selector leaking into other languages. (@FichteFoll, #99)
- Add support for template literal escape sequence. (@yagizmunger, #97, #98)
---
## v2.0.0 - 2025-05-11
The package has been adopted by the SublimeText GitHub org and now lives at
for the community to maintain.
This is accompanied by many changes
to bring the syntax definition up to current standards.
### Added
- Declare hyphens as sub-word separators. (@FichteFoll, #60)
- Special highlighting for `for_each` and `count` meta arguments (`keyword.control`). (@FichteFoll, #59)
- Highlighting of more special language variables: `each`, `count` and `self`. (@FichteFoll, #58)
- Highlighting for `ephemeral` blocks. (@TerminalFi, #70)
- A separate syntax definition for `terraform plan` output (@michaelblyons, #51, #68)
- Special highlighting for AWS ACL resource references in strings. (@michaelblyons, @deathaxe, #69, #76)
- Support JSON-style objects (requires ST 4180). (@michaelblyons, #54, #71)
- Scope-based folding rules. (@deathaxe, #81)
- Consistent indentation rules. (@deathaxe, #82)
- Highlight unclosed strings and stray closing brackets as illegal. (@FichteFoll, #91)
### Changed
- Switched to syntax version 2.
This breaks compatibility with ST builds before 4000,
but the previous version can still be installed on older builds.
(@FichteFoll, #62)
- Adapted and improved many scope names to standards that have been established
over the past years for the default packages:
* String interpolation meta scopes and punctuation (@FichteFoll, #58)
* Keywords (@FichteFoll, @deathaxe, #58, #78, #86)
* Attribute access punctuation (@FichteFoll, #58)
* Punctuation scopes in `for` expressions (@FichteFoll, #58)
* Blocks, including indexing for "name" labels
(@michaelblyons, @FichteFoll, #69, #87)
* Operators (@michaelblyons, #66)
* Numbers (@deathaxe, #77)
* Brackets (@deathaxe, #80)
* Function calls (@deathaxe, #83)
- Updated the built-in function list for highlighting. (@FichteFoll, #59)
- Renamed many contexts and resolved various anonymous contexts
for better extensibility. (@deathaxe, #75, #79)
### Removed
- Removed various files targeting older ST versions,
notably the old `.tmLanguage` syntax definition.
This breaks compatibility with ST 2,
but the previous version can still be installed on older builds.
(@FichteFoll, #63)
### Fixed
- Improved matching of identifiers by adding a scope and properly recognizing hyphens. (@FichteFoll, #60)
- Support identifiers starting with an underscore character (@FichteFoll, #43, #64).
---
## v1.3.1 - 2024-02-03
### Added
- `.nomad` files are also recognized by the Terraform syntax. (@Quenty, #55)
## v1.3.0 - 2024-01-18
### Changed
- Separate HCL syntax into its own file and report it as `source.hcl` (rather than `source.terraform`). (@rchl, #56)
- Update links to official docs on terraform.io. (@totoroot, #53)
## v1.2.0 - 2021-06-21
### Changed
- Split the tfvars handling into a separate syntax file. (@rchl, #49)
This improves interoperability with terraform-ls, e.g. via LSP.
## v1.1.0 - 2021-05-17
### Fixed
- Removed quotes around variable types in snippets. (@notnmeyer, #42)
## v1.0.0 - 2020-01-20
A huge thanks to @patrickrgaffney for this amazing contribution. (#39)
### Added
- [Syntax tests][tests] have been added.
- `null` constant.
- [Exponents][exponents] in numeric literals.
- [Character escapes][strings] for newline, carriage return, backslash, quote, and unicode points inside string literals.
- [Trim-left and trim-right operators][string-templates] inside string templates.
- [Directives][string-templates] inside string templates.
- Match all valid expressions inside string templates.
- Comparison operators `==`, `!=`, `<`, `>`, `<=`, `>=`.
- Arithmetic operators `+`, `-`, `*`, `/`, `%`.
- Logic operators `&&`, `||`, `!`.
- Conditional operator `p ? e1 : e2`
- Parenthesis matching.
- Tuple list syntax.
- Square-bracket [index notation][indices].
- [Full-splat][splat] operator.
- Comma matching inside function calls, tuples, maps, and for-expressions.
- Attribute-access is matched on named members and the `.` dot operator.
- [Attribute-only splat][splat] operator.
- Allow `-` after first alpha character in identifiers.
- Computed attribute named using parenthesis.
- Allow function-calls outside of string interpolation.
- Match all valid expressions inside function-call parameter lists.
- Match functions unknown to Terraform (for other HCL uses).
- Match [for-expressions][for-exp] inside tuples and maps.
- Map collection syntax.
- Match unknown block names.
- Support for variable number of block labels.
- Nested blocks.
- Inline blocks.
- Terraform [named values][named-values].
- Update list of built-in Terraform functions.
- Built-in block types `locals` and `terraform`.
- Meta-scope `meta.block.terraform` added to all block bodies.
- [Primitive type constants][types].
- Heredocs with the leading-spaces operator `<<-`.
- String interpolation inside heredocs.
- [Import][import] statements.
- JSON highlighting for `*.tfstate` files.
### Changed
- Rename scope `comment.line.number-sign.terraform` to `comment.line.terraform` to better reflect [scope naming standards][scopes].
- Rename scope `constant.numeric.terraform` to `constant.numeric.[integer|float].terraform` to better reflect [scope naming standards][scopes].
- Rename scope `entity.tag.embedded.[begin|end]` to `punctuation.section.interpolation.[begin|end]` to better reflect [scope naming standards][scopes].
- Rename scope `variable.other.assignment.terraform` to `variable.other.readwrite.terraform` to better reflect [scope naming standards][scopes].
- A `meta_scope` of `variable.declaration.terraform` covers the entire attribute definition now.
- Rename scope for `=` in assignments from `keyword.operator` to `keyword.operator.assignment` to better reflect [scope naming standards][scopes].
- Rename scope `keyword.other.function.inline` to `support.function.builtin` to better reflect [scope naming standards][scopes].
- Rename scope for known block types from `storage.type.function.terraform` to `storage.type.terraform` to better reflect [scope naming standards][scopes].
- Rename scope for block labels from `string.value.terraform` to `string.quoted.double.terraform` to better reflect [scope naming standards][scopes].
- Rename meta-scope for block definitions from `meta.block.terraform` to `meta.type.terraform` to better reflect [scope naming standards][scopes].
### Removed
- Invalid constants `yes`, `no`, `on`, and `off`.
- [Unit of measurement suffixes][uom-suffixes].
- [Hexadecimal literals][hex-literals].
- An extra `string.terraform` scope was previously added to all string literals.
- [`atlas` blocks][atlas].
### Fixed
- Remove the `string.*` scope inside string templates.
## v0.19.0 - 2019-08-20
### Added
- Symbol indexing for top-level blocks. (@patrickrgaffney - #38)
## v0.18.0 - 2019-07-01
### Added
- Update list of built-in functions. (@Tenzer - #37)
### Fixed
- Allow hyphens in names of attributes inside string interpolation. (@Tenzer - #37)
## v0.17.0 - 2019-01-25
### Added
- [Sublime syntax][subl-format] format. (@thiagoalmeidasa - #35)
### Fixed
- Better support for parenthesis inside string interpolation. (@NightsPaladin - #33)
## v0.16.0 - 2018-08-08
### Added
- Snippet for `data` blocks. (@mschurenko - #32)
## v0.15.0 - 2018-02-22
### Added
- Terraform constant `local`. (@digitalfiz - #30)
## v0.14.0 - 2017-08-31
### Added
- Update list of built-in functions. (@gburiola - #27)
### Removed
- Built-in function `from`.
## v0.13.1 - 2017-08-10
### Fixed
- Allow nested function calls.
## v0.13.0 - 2017-06-07
### Changed
- Set default tab size to 2. (@kushmansingh - #25)
- Set default indentation to spaces. (@kushmansingh - #25)
## v0.12.2 - 2017-05-08
### Fixed
- Allow whitespace before `<<` when closing heredocs. (@GreatFruitOmsk - #24)
## v0.12.1 - 2017-03-31
### Fixed
- Escape hyphens in block labels
## v0.12.0 - 2017-03-30
### Added
- Code folding markers.
- Built-in Terraform functions.
### Fixed
- Function calls and attribute access inside string templates.
## v0.11.0 - 2017-03-08
### Added
- Heredocs.
## v0.10.0 - 2017-02-14
### Added
- `.hcl` file extensions (@akarnani - #19)
## v0.9.0 - 2017-02-12
### Fixed
- Handle nested string interpolation.
## v0.8.0 - 2017-02-08
### Added
- String interpolation.
- Unquoted block labels.
### Fixed
- De-emphasize variable assignment.
## v0.7.0 - 2017-01-10
### Added
- C-style single line comments `//`. (@kerma - #16)
## v0.6.0 - 2016-09-08
### Added
- Support for `data` blocks. (@Jonnymcc - #14)
## v0.5.0 - 2016-07-05
### Added
- Snippet for `provisioner` blocks. (@ApsOps - #13)
## v0.4.0 - 2016-06-08
### Added
- Match opening/closing brackets. (@alexlouden - #12)
## v0.3.0 - 2016-06-08
### Added
- Snippets for `module` blocks. (@maplebed - #10)
## v0.2.0 - 2016-03-01
### Added
- Blocks comments `/* ... */`. (@bigkraig - #8)
## v0.1.0 - 2015-08-04
Initial release.
[atlas]: https://www.terraform.io/docs/configuration/terraform-enterprise.html
[exponents]: https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#numeric-literals
[hex-literals]: https://github.com/hashicorp/terraform/issues/20933#issuecomment-480050478
[for-exp]: https://www.terraform.io/docs/configuration/expressions.html#for-expressions
[import]: https://www.terraform.io/docs/import/usage.html
[indices]: https://www.terraform.io/docs/configuration/expressions.html#indices-and-attributes
[named-values]: https://www.terraform.io/docs/configuration/expressions.html#references-to-named-values
[old-splat]: https://www.terraform.io/docs/configuration/expressions.html#legacy-attribute-only-splat-expressions
[scopes]: https://www.sublimetext.com/docs/scope_naming.html
[splat]: https://www.terraform.io/docs/configuration/expressions.html#splat-expressions
[string-templates]: https://www.terraform.io/docs/configuration/expressions.html#string-literals
[strings]: https://www.terraform.io/docs/configuration/expressions.html#string-literals
[subl-format]: https://www.sublimetext.com/docs/syntax.html
[tests]: https://www.sublimetext.com/docs/syntax.html#testing
[types]: https://www.terraform.io/docs/configuration/types.html
[uom-suffixes]: https://github.com/hashicorp/terraform/issues/3287#issuecomment-241560576
================================================
FILE: Comments.tmPreferences
================================================
name
Comments
scope
source.terraform, source.terraform-vars, source.hcl
settings
shellVariables
name
TM_COMMENT_START
value
#
name
TM_COMMENT_START_2
value
/*
name
TM_COMMENT_END_2
value
*/
name
TM_COMMENT_START_3
value
//
================================================
FILE: Fold.tmPreferences
================================================
scope
source.hcl, source.terraform, source.terraform-vars
settings
indentationFoldingEnabled
foldScopes
begin
punctuation.section.baces.begin
end
punctuation.section.baces.end
excludeTrailingNewlines
begin
punctuation.section.brackets.begin
end
punctuation.section.brackets.end
excludeTrailingNewlines
begin
punctuation.section.parens.begin
end
punctuation.section.parens.end
excludeTrailingNewlines
begin
punctuation.section.block.begin
end
punctuation.section.block.end
excludeTrailingNewlines
begin
punctuation.section.mapping.begin
end
punctuation.section.mapping.end
excludeTrailingNewlines
begin
punctuation.section.sequence.begin
end
punctuation.section.sequence.end
excludeTrailingNewlines
================================================
FILE: HCL.sublime-settings
================================================
{
"tab_size": 2,
"translate_tabs_to_spaces": true,
// Move '-' to sub-word separators
"word_separators": "./\\()\"':,.;<>~!@#$%^&*|+=[]{}`~?",
"sub_word_separators": "_-",
}
================================================
FILE: HCL.sublime-syntax
================================================
%YAML 1.2
#
# This syntax definition is based on the Terraform guide:
# https://www.terraform.io/docs/configuration/index.html
#
# As well as the HCL Native Syntax Spec:
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md
#
# For documentation on the .subline-syntax format:
# https://www.sublimetext.com/docs/syntax.html
#
# Regex's in this file support the Oniguruma regex engine:
# https://raw.githubusercontent.com/kkos/oniguruma/5.9.6/doc/RE
#
---
name: HCL
scope: source.hcl
version: 2
extends: Terraform.sublime-syntax
# File Extensions:
#
# - ".hcl": non-terraform tools often use this HCL syntax, i.e. Vault
# https://www.vaultproject.io/docs/configuration/
file_extensions:
- hcl
================================================
FILE: Indentation Rules.tmPreferences
================================================
scope
source.hcl, source.terraform, source.terraform-vars
settings
decreaseIndentPattern
^\s*[])}]
increaseIndentPattern
indentParens
indentSquareBrackets
================================================
FILE: JSON (Terraform).sublime-syntax
================================================
%YAML 1.2
---
# http://www.sublimetext.com/docs/syntax.html
name: JSON (Terraform)
scope: source.json.terraform
version: 2
extends: Packages/JSON/JSON.sublime-syntax
file_extensions:
- tfstate
contexts:
double-quoted-string-body:
- meta_prepend: true
- include: Packages/Terraform/Terraform.sublime-syntax#string-interpolation
- include: Packages/Terraform/Terraform.sublime-syntax#aws-acl
strings:
- meta_prepend: true
- include: Packages/Terraform/Terraform.sublime-syntax#ip-address-strings
line-comments:
- meta_append: true
- include: Packages/Terraform/Terraform.sublime-syntax#inline-comments
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2016 Alex Louden
Copyright (c) 2024 FichteFoll
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Terraform
[Terraform][.tf] configuration file syntax definitions and snippets for [Sublime Text][].

## Installation
### Using Package Control
1. Install [Package Control][], if needed.
2. Open the palette by pressing:
- Windows, Linux: Ctrl+Shift+P
- MacOS: Cmd+Shift+P
3. Select _Package Control: Install Package_.
4. Select _Terraform_.
### Manually
1. Open the Sublime Text Packages folder:
- MacOS: `~/Library/Application Support/Sublime Text/Packages/`
- Windows: `%APPDATA%/Sublime Text/Packages/`
- Linux (Ubuntu/Debian): `~/.config/sublime-text/Packages/`
2. Clone this repo.
[sublime text]: https://sublimetext.com/
[.tf]: https://developer.hashicorp.com/terraform/language/syntax/configuration
[package control]: https://packagecontrol.io/installation
================================================
FILE: Symbols - Indexed.tmPreferences
================================================
name
Local Symbol List
scope
entity.name.label.terraform
settings
showInIndexedSymbolList
1
================================================
FILE: Symbols - Local.tmPreferences
================================================
name
Local Symbol List
scope
meta.block.head.terraform
settings
showInSymbolList
1
symbolTransformation
================================================
FILE: Terraform Plan.sublime-syntax
================================================
%YAML 1.2
---
# http://www.sublimetext.com/docs/syntax.html
# https://github.com/hashicorp/terraform/blob/337bf8e11b75dff87509455cabee60b023dd586e/internal/command/jsonformat/plan.go#L201
name: Terraform Plan
scope: source.diff.terraform
version: 2
file_extensions:
- tfplan
- tf.plan
contexts:
prototype:
- include: comments
main:
- include: comments
- include: diffs
- include: summary
comments:
- match: '#'
scope: punctuation.definition.comment.terraform
push:
- meta_scope: comment.line.number-sign.terraform
- include: pop-eol
annotations:
- meta_include_prototype: false
- match: ->
scope: keyword.operator.assignment.terraform
- match: \(known after apply\)
scope: comment.block.terraform
- match: \bnull\b
scope: constant.language.null.terraform
diffs:
- match: ^\+/-
scope: punctuation.definition.changed.diff
push: line-created-then-destroyed
- match: ^-/\+
scope: punctuation.definition.changed.diff
push: line-destroyed-then-created
- match: ^!
scope: punctuation.definition.changed.diff
push: line-changed
- match: ^\+
scope: punctuation.definition.inserted.diff
push: line-inserted
- match: ^-
scope: punctuation.definition.deleted.diff
push: line-deleted
- match: \[$\n?
push: bracket-body
- match: \{$\n?
push: brace-body
line-deleted:
- meta_scope: markup.deleted.diff
- include: line-deleted.hanging-eol-brackets
- include: pop-eol
- include: annotations
line-inserted:
- meta_scope: markup.inserted.diff
- include: line-inserted.hanging-eol-brackets
- include: pop-eol
- include: annotations
line-changed:
- meta_scope: markup.changed.updated-in-place.diff
- include: line-changed.hanging-eol-brackets
- include: pop-eol
- include: annotations
line-created-then-destroyed:
- meta_scope: markup.changed.created-then-destroyed.diff
- include: line-changed.hanging-eol-brackets
- include: pop-eol
- include: annotations
line-destroyed-then-created:
- meta_scope: markup.changed.destroyed-then-created.diff
- include: line-changed.hanging-eol-brackets
- include: pop-eol
- include: annotations
line-ignored:
- meta_scope: comment.line.diff
- include: pop-eol
- include: annotations
bracket-body:
- match: ^(?=\s*\])
pop: 1
- include: diffs
brace-body:
- match: ^\s*\}
pop: 1
- include: diffs
line-deleted.hanging-eol-brackets:
- match: \[$\n?
set: line-deleted.bracket-body
- match: \{$\n?
set: line-deleted.brace-body
line-deleted.bracket-body:
- match: ^(?=\s*\])
set: line-deleted
- include: diffs
line-deleted.brace-body:
- match: ^\s*\}
scope: markup.deleted.diff
pop: 1
- include: diffs
line-inserted.hanging-eol-brackets:
- match: \[$\n?
set: line-inserted.bracket-body
- match: \{$\n?
set: line-inserted.brace-body
line-inserted.bracket-body:
- match: ^(?=\s*\])
set: line-inserted
- include: diffs
line-inserted.brace-body:
- match: ^(?=\s*\})
set: line-inserted
- include: diffs
line-changed.hanging-eol-brackets:
- match: \[$\n?
set: line-changed.bracket-body
- match: \{$\n?
set: line-changed.brace-body
line-changed.bracket-body:
- match: ^\s*\]
scope: markup.changed.diff
pop: 1
- include: diffs
line-changed.brace-body:
- match: ^\s*\}
scope: markup.changed.diff
pop: 1
- include: diffs
summary:
- match: ^(?=Plan:[ ]\d)
push:
- meta_scope: meta.block.summary.terraform
- include: pop-eol
- match: ','
scope: punctuation.separator.sequence.terraform
- match: \.
scope: punctuation.terminator.terraform
- match: (\d+) to add
scope: markup.inserted.terraform
captures:
1: meta.number.integer.decimal.terraform constant.numeric.value.terraform
- match: (\d+) to change
scope: markup.changed.terraform
captures:
1: meta.number.integer.decimal.terraform constant.numeric.value.terraform
- match: (\d+) to destroy
scope: markup.deleted.terraform
captures:
1: meta.number.integer.decimal.terraform constant.numeric.value.terraform
pop-eol:
- match: \n|$
pop: 1
================================================
FILE: Terraform-vars.sublime-settings
================================================
{
"tab_size": 2,
"translate_tabs_to_spaces": true,
// Move '-' to sub-word separators
"word_separators": "./\\()\"':,.;<>~!@#$%^&*|+=[]{}`~?",
"sub_word_separators": "_-",
}
================================================
FILE: Terraform-vars.sublime-syntax
================================================
%YAML 1.2
#
# This syntax definition is based on the Terraform guide:
# https://www.terraform.io/docs/configuration/index.html
#
# As well as the HCL Native Syntax Spec:
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md
#
# For documentation on the .subline-syntax format:
# https://www.sublimetext.com/docs/syntax.html
#
# Regex's in this file support the Oniguruma regex engine:
# https://raw.githubusercontent.com/kkos/oniguruma/5.9.6/doc/RE
#
---
name: Terraform (variables)
scope: source.terraform-vars
version: 2
extends: Terraform.sublime-syntax
# File Extensions:
#
# - ".tfvars": variables definitions file
# https://developer.hashicorp.com/terraform/language/values/variables#variable-definition-files
# - ".tfbackend": backend configuration file
# https://developer.hashicorp.com/terraform/language/backend#file
file_extensions:
- tfvars
- tfbackend
================================================
FILE: Terraform.sublime-settings
================================================
{
"tab_size": 2,
"translate_tabs_to_spaces": true,
// Move '-' to sub-word separators
"word_separators": "./\\()\"':,.;<>~!@#$%^&*|+=[]{}`~?",
"sub_word_separators": "_-",
}
================================================
FILE: Terraform.sublime-syntax
================================================
%YAML 1.2
#
# This syntax definition is based on the Terraform guide:
# https://www.terraform.io/docs/language/index.html
#
# As well as the HCL Native Syntax Spec:
# https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md
# (previously https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md)
#
# For documentation on the .subline-syntax format:
# https://www.sublimetext.com/docs/syntax.html
#
# Regex's in this file support the Oniguruma regex engine:
# https://raw.githubusercontent.com/kkos/oniguruma/5.9.6/doc/RE
#
---
name: Terraform
scope: source.terraform
version: 2
# File Extensions:
#
# - ".tf": the standard file extension
# https://www.terraform.io/docs/language/index.html
file_extensions:
- tf
- nomad
variables:
# Identifiers: ID_Start (ID_Continue | '-')*;
#
# There is an undocumented exception
# that an underscore character is also accepted
# as an id start character.
#
# https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#identifiers
# http://unicode.org/reports/tr31/#Table_Lexical_Classes_for_Identifiers
ID_Start: '[\p{ID_Start}_]'
ID_Continue: '[\p{ID_Continue}-]'
identifier: (?:{{ID_Start}}{{ID_Continue}}*)
# Exponent: "e" or "E" followed by an optional sign
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#numeric-literals
exponent: ([Ee][+-]?)
# Character Escapes:
#
# - \n: newline
# - \r: carriage return
# - \t: tab
# - \": quote
# - \\: backslash
# - \uNNNN: unicode char (NNNN is 4 hex digits)
# - \uNNNNNNNN: unicode char (NNNNNNNN us 8 digits)
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#template-expressions
char_escapes: \\[nrt"\\]|\\u(\h{8}|\h{4})
# String literals (basically static and single-line strings)
# for usage in look-aheads.
#
# https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#template-expressions
string_literal: '"(?:[^"]|{{char_escapes}})*"'
# Template literals
#
# https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#template-literals
template_literal: '(?:\$\$|%%)\{'
# A block label
#
# https://github.com/hashicorp/hcl/blob/main/hclsyntax/spec.md#structural-elements
label: (?:{{identifier}}|{{string_literal}})
# Terraform Named Values
#
# https://www.terraform.io/docs/language/expressions/references.html
named_values: (?:var|local|module|data|path|terraform|each|count|self)
# Block types that are known to Terraform.
#
# data: https://developer.hashicorp.com/terraform/language/data-sources
# ephemeral: https://developer.hashicorp.com/terraform/language/resources/ephemeral
# resource: https://developer.hashicorp.com/terraform/language/resources/syntax
terraform_typed_and_named_blocks: (?:data|ephemeral|resource)
# module: https://developer.hashicorp.com/terraform/language/modules/syntax
# output: https://developer.hashicorp.com/terraform/language/values/outputs
# provider: https://developer.hashicorp.com/terraform/language/providers/configuration
# variable: https://developer.hashicorp.com/terraform/language/values/variables
terraform_named_blocks: (?:module|output|provider|variable)
# locals: https://developer.hashicorp.com/terraform/language/values/locals
# terraform: https://developer.hashicorp.com/terraform/language/terraform#terraform-block-syntax
# (Currently unused because they do not have special behavior implemented.)
terraform_other_blocks: (?:locals|terraform)
# Terraform built-in type keywords
#
# https://www.terraform.io/docs/language/expressions/type-constraints.html#primitive-types
# https://www.terraform.io/docs/language/expressions/type-constraints.html#dynamic-types-the-quot-any-quot-constraint
terraform_type_keywords: (?:any|string|number|bool)
# Built-In Functions
#
# https://developer.hashicorp.com/terraform/language/functions
builtin_functions: |-
(?x:
# numbers
abs | ceil | floor | log | max | min | parseint | pow | signum
# string
| chomp | endswith | format | formatlist | indent | join | lower | regex
| regexall | replace | split | startswith | strcontains | strrev | substr
| templatestring | title | trim | trimprefix | trimsuffix | trimspace | upper
# collection
| alltrue | anytrue | chunklist | coalesce | coalescelist | compact | concat
| contains | distinct | element | flatten | index | keys | length | list
| lookup | map | matchkeys | merge | one | range | reverse | setintersection
| setproduct | setsubtract | setunion | slice | sort | sum | transpose
| values | zipmap
# encoding
| base64decode | base64encode | base64gzip | csvdecode | jsondecode
| jsonencode | textdecodebase64 | textencodebase64 | urlencode | yamldecode
| yamlencode
# filesystem
| abspath | dirname | pathexpand | basename | file | fileexists | fileset
| filebase64 | templatefile
# date and time
| formatdate | plantimestamp | timeadd | timecmp | timestamp
# hash and crypto
| base64sha256 | base64sha512 | bcrypt | filebase64sha256
| filebase64sha512 | filemd5 | filesha1 | filesha256 | filesha512 | md5
| rsadecrypt | sha1 | sha256 | sha512 | uuid | uuidv5
# ip network
| cidrhost | cidrnetmask | cidrsubnet | cidrsubnets
# type conversion
| can | issensitive | nonsensitive | sensitive | tobool | tolist | tomap
| tonumber | toset | tostring | try | type
# terraform-specific
| provider::terraform::(?:encode_tfvars | decode_tfvars | encode_expr)
# deprecated/old
| filemd1
)
# IPs and CIDR
## IPv6 pattern stolen lovingly from https://github.com/tijn/hosts.tmLanguage,
## where Michael Lyons adapted them from David M. Szydek https://stackoverflow.com/a/17871737.
zero_to_32: (?:3[0-2]|[12][0-9]|[0-9])
zero_to_128: (?:12[0-8]|1[01][0-9]|[1-9][0-9]|[0-9])
zero_to_255: (?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|[0-9])
zero_to_65535: (?:6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])
ipv4: (?:(?:{{zero_to_255}}\.){3}{{zero_to_255}})
ipv6: |-
(?xi:
(?:::(?:ffff(?::0{1,4}){0,1}:){0,1}{{ipv4}}) # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
|(?:(?:[0-9a-f]{1,4}:){1,4}:{{ipv4}}) # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
|(?:fe80:(?::[0-9a-f]{1,4}){0,4}%[0-9a-z]{1,}) # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index)
|(?:(?:[0-9a-f]{1,4}:){7,7} [0-9a-f]{1,4}) # 1:2:3:4:5:6:7:8
| (?:[0-9a-f]{1,4}: (?::[0-9a-f]{1,4}){1,6}) # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8
|(?:(?:[0-9a-f]{1,4}:){1,2}(?::[0-9a-f]{1,4}){1,5}) # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8
|(?:(?:[0-9a-f]{1,4}:){1,3}(?::[0-9a-f]{1,4}){1,4}) # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8
|(?:(?:[0-9a-f]{1,4}:){1,4}(?::[0-9a-f]{1,4}){1,3}) # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8
|(?:(?:[0-9a-f]{1,4}:){1,5}(?::[0-9a-f]{1,4}){1,2}) # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8
|(?:(?:[0-9a-f]{1,4}:){1,6} :[0-9a-f]{1,4}) # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8
|(?:(?:[0-9a-f]{1,4}:){1,7} :) # 1:: 1:2:3:4:5:6:7::
|(?::(?:(?::[0-9a-f]{1,4}){1,7}|:)) # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::
)
contexts:
main:
- include: comments
- include: attribute-definition
- include: imports
- include: blocks
- include: expressions
comments:
- include: inline-comments
- include: block-comments
# Expressions:
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#expression-terms
expressions:
- include: literals
- include: operators
- include: brackets
- include: objects
- include: attribute-access
- include: functions
- include: parens
- include: identifiers
- include: illegal-strays
comma:
- match: \,
comment: Commas - used in certain expressions
scope: punctuation.separator.terraform
parens:
- match: \(
scope: punctuation.section.parens.begin.terraform
comment: Parens - matched *after* function syntax
push: paren-body
paren-body:
- meta_scope: meta.parens.terraform
- match: \)
scope: punctuation.section.parens.end.terraform
pop: 1
- include: expressions
# Literal Values: Numbers, Language Constants, and Strings
#
# Strings are _technically_ part of the "expression sub-language",
# but make the most sense to be part of this stack.
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#literal-values
literals:
- include: numeric-literals
- include: language-constants
- include: string-literals
- include: heredoc
- include: type-keywords
- include: named-value-references
named-value-references:
- match: \b{{named_values}}\b
comment: Special variables available only to Terraform.
scope: variable.language.terraform
type-keywords:
- match: \b{{terraform_type_keywords}}\b
comment: Type keywords known to Terraform.
scope: storage.type.terraform
# Inline Comments: begin at the operator, end at the end of the line.
#
# https://www.terraform.io/docs/language/syntax/configuration.html#comments
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#comments-and-whitespace
inline-comments:
- match: '#|//'
comment: Inline Comments
scope: punctuation.definition.comment.terraform
push: inline-comment-body
inline-comment-body:
- meta_scope: comment.line.terraform
- match: $\n?
scope: punctuation.definition.comment.terraform
pop: 1
# Block comments: start and end delimiters for multi-line comments.
#
# https://www.terraform.io/docs/language/syntax/configuration.html#comments
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#comments-and-whitespace
block-comments:
- match: /\*
comment: Block comments
scope: punctuation.definition.comment.terraform
push: block-comments-body
block-comments-body:
- meta_scope: comment.block.terraform
- match: \*/
scope: punctuation.definition.comment.terraform
pop: 1
# Language Constants: booleans and `null`.
#
# https://www.terraform.io/docs/language/expressions/types.html#literal-expressions
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#literal-values
language-constants:
- match: \btrue\b
scope: constant.language.boolean.true.terraform
- match: \bfalse\b
scope: constant.language.boolean.false.terraform
- match: \bnull\b
scope: constant.language.null.terraform
# Numbers: Integers, fractions and exponents
#
# https://www.terraform.io/docs/language/expressions/types.html
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#numeric-literals
numeric-literals:
- match: \b\d+{{exponent}}\d+\b
comment: Integer, no fraction, optional exponent
scope: meta.number.float.decimal.terraform constant.numeric.value.terraform
- match: \b\d+(\.)\d+(?:{{exponent}}\d+)?\b
comment: Integer, fraction, optional exponent
scope: meta.number.float.decimal.terraform constant.numeric.value.terraform
captures:
1: punctuation.separator.decimal.terraform
- match: \b\d+\b
comment: Integers
scope: meta.number.integer.decimal.terraform constant.numeric.value.terraform
# Strings:
#
# https://www.terraform.io/docs/language/expressions/types.html
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#template-expressions
string-literals:
- include: ip-address-strings
- match: \"
comment: Strings
scope: punctuation.definition.string.begin.terraform
push: string-body
string-body:
- meta_scope: meta.string.terraform string.quoted.double.terraform
- match: \"
scope: punctuation.definition.string.end.terraform
pop: 1
- match: \n
scope: invalid.illegal.unclosed-string.terraform
pop: 1
- include: character-escapes
- include: string-interpolation
- include: aws-acl
character-escapes:
- match: '{{char_escapes}}'
comment: Character Escapes
scope: constant.character.escape.terraform
template-literals:
- match: '{{template_literal}}'
comment: Template Literal
scope: constant.character.escape.terraform
aws-acl:
- match: (?=\barn:aws:)
push: aws-acl-body
aws-acl-body:
- clear_scopes: 1 # Clear the string.* scope.
- meta_scope: variable.language.acl.terraform
- match: ([$%]\{)(~)?
captures:
1: punctuation.section.interpolation.begin.terraform
2: keyword.operator.template.trim.left.terraform
push: acl-interpolation-body
- match: :|/
scope: punctuation.separator.sequence.terraform
- match: \*
scope: constant.other.wildcard.asterisk.terraform
- match: (?![\w-])
pop: 1
acl-interpolation-body:
- meta_scope: meta.interpolation.terraform
- meta_content_scope: source.terraform
- include: string-interpolation-body
ip-address-strings:
- match: (")({{ipv6}})(?:(/)({{zero_to_128}}))?(")
scope: meta.string.terraform string.quoted.double.terraform
captures:
1: punctuation.definition.string.begin.terraform
2: meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
3: punctuation.separator.terraform
4: constant.other.range.terraform
5: punctuation.definition.string.end.terraform
- match: (")((\[){{ipv6}}(\]))(?:(/)({{zero_to_128}})|(:)({{zero_to_65535}}))?(")
scope: meta.string.terraform string.quoted.double.terraform
captures:
1: punctuation.definition.string.begin.terraform
2: meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
3: punctuation.definition.constant.begin.terraform
4: punctuation.definition.constant.end.terraform
5: punctuation.separator.terraform
6: constant.other.range.terraform
7: punctuation.separator.terraform
8: constant.other.port.terraform
9: punctuation.definition.string.end.terraform
- match: (")({{ipv4}})(?:(/)({{zero_to_32}})|(:)({{zero_to_65535}}))?(")
scope: meta.string.terraform string.quoted.double.terraform
captures:
1: punctuation.definition.string.begin.terraform
2: meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
3: punctuation.separator.terraform
4: constant.other.range.terraform
5: punctuation.separator.terraform
6: constant.other.port.terraform
7: punctuation.definition.string.end.terraform
# String Interpolation: ("${" | "${~") Expression ("}" | "~}"
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#templates
string-interpolation:
- include: template-literals
- match: ([$%]\{)(~)?
captures:
1: punctuation.section.interpolation.begin.terraform
2: keyword.operator.template.trim.left.terraform
push: string-interpolation-body
string-interpolation-body:
- clear_scopes: 1 # Clear the string.* scope.
- meta_scope: meta.interpolation.terraform
- meta_content_scope: source.terraform
- match: (~)?(\})
captures:
1: keyword.operator.template.trim.right.terraform
2: punctuation.section.interpolation.end.terraform
pop: 1
- match: \bif\b
scope: keyword.control.conditional.if.terraform
- match: \belse\b
scope: keyword.control.conditional.else.terraform
- match: \bendif\b
scope: keyword.control.conditional.end.terraform
- match: \bfor\b
scope: keyword.control.loop.for.terraform
- match: \bendfor\b
scope: keyword.control.loop.end.terraform
- match: \bin\b
scope: keyword.control.loop.in.terraform
- include: expressions
# String Heredocs
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#template-expressions
heredoc:
- match: (\<\<\-?)\s*({{identifier}})\s*$
comment: String Heredoc's
captures:
1: keyword.operator.heredoc.terraform
2: keyword.control.heredoc.terraform
push: heredoc-body
heredoc-body:
- meta_content_scope: meta.string.terraform string.unquoted.heredoc.terraform
- match: ^\s*\2\s*$
comment: The heredoc token identifier (second capture above).
scope: keyword.control.heredoc.terraform
pop: 1
- include: string-interpolation
# Operators:
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#operators-and-delimiters
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#operations
operators:
- match: \>\= # >=
scope: keyword.operator.comparison.terraform
- match: \<\= # <=
scope: keyword.operator.comparison.terraform
- match: \=\= # ==
scope: keyword.operator.comparison.terraform
- match: \!\= # !=
scope: keyword.operator.comparison.terraform
- match: \+ # +
scope: keyword.operator.arithmetic.terraform
- match: \- # -
scope: keyword.operator.arithmetic.terraform
- match: \* # *
scope: keyword.operator.arithmetic.terraform
- match: \/ # /
scope: keyword.operator.arithmetic.terraform
- match: \% # %
scope: keyword.operator.arithmetic.terraform
- match: \&\& # &&
scope: keyword.operator.logical.terraform
- match: \|\| # ||
scope: keyword.operator.logical.terraform
- match: \! # !
scope: keyword.operator.logical.terraform
- match: \> # >
scope: keyword.operator.comparison.terraform
- match: \< # <
scope: keyword.operator.comparison.terraform
- match: \? # ?
scope: keyword.operator.ternary.terraform
- match: \.\.\. # ...
scope: keyword.operator.terraform
- match: ':' # :
scope: keyword.operator.ternary.terraform
# Terraform "import" statements
#
# https://www.terraform.io/docs/cli/import/usage.html
imports:
- match: \b(terraform)\s+(import)\b
comment: Importing resources
captures:
1: support.constant.terraform
2: keyword.control.import.terraform
push: import-body
import-body:
- match: \"
comment: String literal label
scope: punctuation.definition.string.begin.terraform
push: literal-label-body
- match: '{{identifier}}'
comment: Identifier label
scope: entity.name.label.terraform
- include: numeric-literals
- include: attribute-access
- match: $\n?
comment: Pop at newline
pop: 1
literal-label-body:
- meta_scope: meta.string.terraform string.quoted.double.terraform
- match: \"
scope: punctuation.definition.string.end.terraform
pop: 1
# Brackets: matches tuples and subscript notation
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#index-operator
brackets:
- match: \[
scope: punctuation.section.brackets.begin.terraform
push: bracket-body
bracket-body:
- meta_scope: meta.brackets.terraform
- match: (\*)?\]
comment: Full-splat operator
scope: punctuation.section.brackets.end.terraform
captures:
1: keyword.operator.splat.terraform
pop: 1
- include: comma
- include: comments
- include: tuple-for-expression
- include: expressions
# Objects: collection values
#
# Allows keys as identifiers, strings, and computed values wrapped in parens.
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#collection-values
objects:
- match: \{
scope: punctuation.section.braces.begin.terraform
push: object-body
object-body:
- meta_scope: meta.braces.terraform
- match: \}
scope: punctuation.section.braces.end.terraform
pop: 1
- include: object-for-expression
- include: comments
- match: (?=({{identifier}}|\".*?\")\s*=)
push:
- object-value
- assignment-operator
- object-literal-key
- match: \(
comment: Computed object key (any expression between parens)
scope: punctuation.section.parens.begin.terraform
push:
- object-value
- assignment-operator
- object-computed-key
- include: Packages/Terraform/JSON (Terraform).sublime-syntax#object-body
object-computed-key:
- meta_scope: meta.mapping.key.terraform meta.parens.terraform
- include: paren-body
object-literal-key:
- match: '{{identifier}}'
scope: meta.mapping.key.terraform meta.string.terraform string.unquoted.terraform
pop: 1
- match: (\").*?(\")
scope: meta.mapping.key.terraform meta.string.terraform string.quoted.double.terraform
captures:
1: punctuation.definition.string.begin.terraform
2: punctuation.definition.string.end.terraform
pop: 1
- include: else-pop
assignment-operator:
- match: =
scope: keyword.operator.assignment.terraform
pop: 1
- include: else-pop
# Object key values: pop at comma, newline, and closing-bracket
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#collection-values
object-value:
- include: comments
- match: \,
comment: Pop scope on comma.
scope: punctuation.separator.terraform
pop: 1
- match: $\n?
comment: Pop scope on EOL.
pop: 1
- match: (?=\})
comment: Lookahead (don't consume) and pop scope on a bracket.
scope: punctuation.section.braces.end.terraform
pop: 1
- include: expressions
# Attribute Access: "." Identifier
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#attribute-access-operator
attribute-access:
- match: \.
scope: punctuation.accessor.dot.terraform
push: member
member:
- include: comments
- match: '{{identifier}}'
comment: Attribute access
scope: variable.other.member.terraform
pop: 1
- match: \d+
comment: Subscript
scope: meta.number.integer.decimal.terraform constant.numeric.value.terraform
pop: 1
- match: \*
comment: Attribute-only splat
scope: keyword.operator.splat.terraform
pop: 1
- include: else-pop
# Attribute Definition: Identifier "=" Expression Newline
#
# The "=" operator cannot be immediately followed by "="
# ">", as those are other operators, not attr definitions.
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#attribute-definitions
attribute-definition:
- match: (?=(\()?({{identifier}})(\))?\s*(\=(?![\=\>])))
push:
- assignment-operator
- attribute-key
attribute-key:
- match: \((?={{identifier}}\))
scope: punctuation.section.parens.begin.terraform
set:
- attribute-key-end
- attribute-key
# https://developer.hashicorp.com/terraform/language/meta-arguments/for_each
- match: for_each\b
scope: variable.declaration.terraform keyword.control.loop.for.terraform
pop: 1
# https://developer.hashicorp.com/terraform/language/meta-arguments/count
- match: count\b
scope: variable.declaration.terraform keyword.control.conditional.terraform
pop: 1
- match: '{{identifier}}'
scope: variable.declaration.terraform variable.other.readwrite.terraform
pop: 1
attribute-key-end:
- meta_scope: meta.parens.terraform
- match: \)
scope: punctuation.section.parens.end.terraform
pop: 1
# Functions: Terraform builtins and unknown
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#functions-and-function-calls
# https://www.terraform.io/docs/language/expressions/function-calls.html
functions:
- match: (?={{builtin_functions}}\()
push: builtin-function-name
- match: (?=(?:{{identifier}}::)*{{identifier}}\()
push: other-function-name
builtin-function-name:
- meta_content_scope: meta.function-call.identifier.terraform
- include: function-argument-list
- include: namespaces
- match: '{{identifier}}'
scope: support.function.builtin.terraform
other-function-name:
- meta_content_scope: meta.function-call.identifier.terraform
- include: function-argument-list
- include: namespaces
- match: '{{identifier}}'
scope: variable.function.terraform
function-argument-list:
- match: \(
scope: punctuation.section.parens.begin.terraform
set: function-argument-list-body
function-argument-list-body:
- meta_scope: meta.function-call.arguments.terraform meta.parens.terraform
- match: \)
scope: punctuation.section.parens.end.terraform
pop: 1
- include: comments
- include: expressions
- include: comma
# Tuple for-Expression:
#
# "[" "for" Identifier ("," Identifier)? "in" Expression ":" Expression ("if" Expression)? "]";
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#for-expressions
# https://www.terraform.io/docs/language/expressions/for.html
tuple-for-expression:
- match: \bfor\b
comment: for expression (arrays)
scope: keyword.control.loop.for.terraform
set: tuple-for-expression-body
tuple-for-expression-body:
- meta_content_scope: meta.brackets.terraform
- match: \]
scope: meta.brackets.terraform punctuation.section.brackets.end.terraform
pop: 1
- include: for-expression-body
# Object for-Expression:
#
# "{" "for" Identifier ("," Identifier)? "in" Expression ":" Expression "=>" Expression "..."? ("if" Expression)? "}";
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#for-expressions
# https://www.terraform.io/docs/language/expressions/for.html
object-for-expression:
- match: \bfor\b
comment: for expression (arrays)
scope: keyword.control.loop.for.terraform
set: object-for-expression-body
object-for-expression-body:
- meta_content_scope: meta.braces.terraform
- match: \}
scope: meta.braces.terraform punctuation.section.braces.end.terraform
pop: 1
- match: \=\>
scope: punctuation.separator.key-value.terraform
- include: for-expression-body
# Shared body syntax for tuple and object for-expressions.
# They require different `set` blocks because they are
# pop'd with different characters and objects allow `=>`.
for-expression-body:
- match: \bin\b
scope: keyword.operator.iteration.in.terraform
- match: \bif\b
scope: keyword.control.conditional.terraform
- match: '\:'
scope: punctuation.section.block.loop.for.terraform
- include: expressions
- include: comments
- include: comma
namespaces:
- match: ({{identifier}})(::)
captures:
1: variable.namespace.terraform
2: punctuation.accessor.double-colon.terraform
identifiers:
- match: '{{identifier}}'
scope: variable.other.readwrite.terraform
illegal-strays:
- match: '[\])}]'
scope: invalid.illegal.stray.terraform
# Blocks: Identifier (StringLit|Identifier)* "{" Newline Body "}" Newline;
#
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#structural-elements
blocks:
- include: typed-and-named-blocks
- include: named-blocks
- include: generic-blocks
typed-and-named-blocks:
# Special case for two-label resources,
# where the first denotes the type and the second the name.
- match: (?=\b{{terraform_typed_and_named_blocks}}(\s+{{label}}){2}\s*\{)
push:
- body
- block-name-label
- block-type-label
- block-declaration
named-blocks:
# Special case for two-label resources,
# where the first denotes the type and the second the name.
- match: (?=\b{{terraform_named_blocks}}\s+{{label}}\s*\{)
push:
- body
- block-name-label
- block-declaration
generic-blocks:
- match: (?=\b({{identifier}})(\s+{{label}})*\s*\{)
push:
- body
- generic-block-labels
- block-declaration
block-declaration:
- match: '{{identifier}}'
scope: keyword.declaration.terraform
pop: 1
- include: else-pop
block-type-label:
- match: \"
scope: punctuation.definition.string.begin.terraform
set: block-type-label-body
- match: '{{identifier}}'
scope: support.type.terraform
pop: 1
- include: else-pop
block-type-label-body:
- meta_scope: meta.string.terraform
- meta_content_scope: support.type.terraform
- match: \"
scope: punctuation.definition.string.end.terraform
pop: 1
- include: character-escapes
block-name-label:
- match: \"
scope: punctuation.definition.string.begin.terraform
set: block-name-label-body
- match: '{{identifier}}'
scope: entity.name.label.terraform
pop: 1
- include: else-pop
block-name-label-body:
- meta_scope: meta.string.terraform
- meta_content_scope: entity.name.label.terraform
- match: \"
scope: punctuation.definition.string.end.terraform
pop: 1
- include: character-escapes
generic-block-labels:
# Labels probably have a meaning, but we don't know which,
# so we just scope them as (un-)quoted strings.
- match: \"
scope: punctuation.definition.string.begin.terraform
push: generic-block-label-body
- match: '{{identifier}}'
scope: string.unquoted.double.terraform
- include: else-pop
generic-block-label-body:
- meta_scope: meta.string.terraform string.quoted.double.terraform
- match: \"
scope: punctuation.definition.string.end.terraform
pop: 1
- include: character-escapes
body:
- meta_content_scope: meta.block.head.terraform
- match: \{
scope: punctuation.section.block.begin.terraform
set: body-body
- include: else-pop
body-body:
- meta_scope: meta.block.body.terraform
- match: \}
scope: punctuation.section.block.end.terraform
pop: 1
- include: main
else-pop:
- match: (?=\S)
pop: 1
================================================
FILE: messages/2.0.0.md
================================================
v2.0.0 - 2025-05-11
-------------------
The package has been adopted by the SublimeText GitHub org and now lives at
for the community to maintain.
This is accompanied by many changes
to bring the syntax definition up to current standards,
courtesy of @deathaxe, @FichteFoll, and @michaelblyons.
In summary, the syntax has been aligned with current standards
as they have developed over time for the default syntaxes
and various other third-party syntaxes.
For a detailed list of changes,
please refer to the full changelog at
.
Note that this release is only compatible with ST builds 4180 and higher.
The old version is still available for installation on older builds
but is not maintained anymore.
================================================
FILE: messages.json
================================================
{
"2.0.0": "messages/2.0.0.md"
}
================================================
FILE: preview.tf
================================================
#----------------------------------------------------------------------
# Project API
#----------------------------------------------------------------------
resource "aws_instance" "api" {
count = "${var.api_count}"
connection {
user = "ubuntu",
key_file = "${var.key_path}"
}
provider "remote-exec" {
inline = [
# Run inline commands
]
}
}
/*
* This is the API public DNS address
*/
output "api-public" {
value = "${aws_instance.api.public_dns}"
}
variable "name" {
type = string
description = "describe your variable"
}
================================================
FILE: snippets/data.sublime-snippet
================================================
data
source.terraform
data block
================================================
FILE: snippets/module.sublime-snippet
================================================
module
source.terraform
module block
================================================
FILE: snippets/module_github.sublime-snippet
================================================
moduleG
source.terraform
module (github public)
================================================
FILE: snippets/module_github_private.sublime-snippet
================================================
moduleGS
source.terraform
module (github ssh)
================================================
FILE: snippets/module_path.sublime-snippet
================================================
moduleP
source.terraform
module (path)
================================================
FILE: snippets/output.sublime-snippet
================================================
output
source.terraform
output block
================================================
FILE: snippets/provider.sublime-snippet
================================================
provider
source.terraform
provider block
================================================
FILE: snippets/provisioner.sublime-snippet
================================================
provisioner
source.terraform
provisioner block
================================================
FILE: snippets/resource.sublime-snippet
================================================
resource
source.terraform
resource block
================================================
FILE: snippets/variable_empty.sublime-snippet
================================================
variableE
source.terraform
variable (empty)
================================================
FILE: snippets/variable_map.sublime-snippet
================================================
variableM
source.terraform
variable (map)
================================================
FILE: snippets/variable_string.sublime-snippet
================================================
variableS
source.terraform
variable (string)
================================================
FILE: tests/syntax_test_reindent.tf
================================================
# SYNTAX TEST reindent-unchanged "Terraform.sublime-syntax"
provider "name" {
attr1 = {
key1 = {
key11 = {
key111 = 0
key112 = [
"0",
"1"
]
},
key12 = [
0,
1,
],
key13 = (
var.member
+ var.other
)
}
}
attr2 = jsondecode(
{
"key1": {
"key11": [
0,
1
],
"key12": {
"key121": "value",
"key122": 0
}
}
}
)
}
================================================
FILE: tests/syntax_test_scope.hcl
================================================
# SYNTAX TEST "HCL.sublime-syntax"
# Same as normal Terraform syntax, hence nothing special to test here.
# <- source.hcl
================================================
FILE: tests/syntax_test_scope.tf
================================================
# SYNTAX TEST "Terraform.sublime-syntax"
/////////////////////////////////////////////////////////////////////
// INLINE COMMENTS
/////////////////////////////////////////////////////////////////////
/////
// Start of line inline comments with `#`.
/////
# inline comment
# ^ source.terraform comment.line.terraform
/////
// Start of line inline comments with `//`.
/////
// foo
# ^ source.terraform comment.line.terraform
/////
// Matches at random place in line + punctuation for `#`.
/////
# bar
# ^ - comment - punctuation
# ^ punctuation.definition.comment.terraform
# ^^^^^ comment.line.terraform
/////
// Matches at random place in line + punctuation for `//`.
/////
// baz # blah
# ^ - comment - punctuation
# ^^ punctuation.definition.comment.terraform
# ^^^^^^^^^^^^^ comment.line.terraform
/////////////////////////////////////////////////////////////////////
// BLOCK COMMENTS
/////////////////////////////////////////////////////////////////////
/////
// Matches for a single line.
/////
/* foo */
# ^ - comment - punctuation
# ^^ punctuation.definition.comment.terraform
# ^^^^^^^^ comment.block.terraform
# ^^ punctuation.definition.comment.terraform
/////
// Matches over multiple lines.
/////
/*
# ^ - comment - punctuation
# ^^ punctuation.definition.comment.terraform
# ^^^^ comment.block.terraform
foo
# ^^^^ comment.block.terraform
*/
# ^^^^ comment.block.terraform
# ^^ punctuation.definition.comment.terraform
/////
// Matches inline comments after block ends.
/////
/* comment */ // inline
# ^ - comment - punctuation
# ^^ punctuation.definition.comment.terraform
# ^^^^^^^^^^^^ comment.block.terraform
# ^^ punctuation.definition.comment.terraform
# ^^^ - comment - punctuation
# ^^ punctuation.definition.comment.terraform
# ^^^^^^^^ comment.line.terraform
/////////////////////////////////////////////////////////////////////
// LANGUAGE CONSTANTS
/////////////////////////////////////////////////////////////////////
/////
// Matches `true`.
/////
true
# ^ - constant
# ^^^^ constant.language.boolean.true.terraform
# ^ - constant
/////
// Matches `false`.
/////
false
# ^ - constant
# ^^^^^ constant.language.boolean.false.terraform
# ^ - constant
/////
// Matches `null`.
/////
null
# ^ - constant
# ^^^^ constant.language.null.terraform
# ^ - constant
/////////////////////////////////////////////////////////////////////
// INTEGER CONSTANTS
/////////////////////////////////////////////////////////////////////
/////
// Matches integers.
/////
444
# ^ - meta.number - constant
# ^^^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ - meta.number - constant
/////
// Matches zero.
/////
0
# ^ - meta.number - constant
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ - meta.number - constant
/////
// Matches one.
/////
1
# ^ - meta.number - constant
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ - meta.number - constant
/////
// Matches large integers.
/////
26345645634561
# ^ - meta.number - constant
# ^^^^^^^^^^^^^^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ - meta.number - constant
/////
// Ignores integers inside identifiers.
/////
aws_route53_zone.main.zone_id
# ^^^^^^^^^^^^^^^^ - numeric - constant
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^ variable.other.member.terraform
/////////////////////////////////////////////////////////////////////
// FLOATING-POINT CONSTANTS
/////////////////////////////////////////////////////////////////////
/////
// Matches floating-point numbers.
/////
1.2
# ^ - meta.number - constant
# ^^^ meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.decimal.terraform
# ^ - meta.number - constant
/////
// Matches large floating-point numbers.
/////
61.28888888888
# ^ - meta.number - constant
# ^^^^^^^^^^^^^^ meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.decimal.terraform
# ^ - meta.number - constant
/////
// Matches integers with exponents.
/////
1e12
# ^ - meta.number - constant
# ^^^^ meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ - meta.number - constant
/////
// Matches floats with exponents.
/////
1.4E12
# ^ - meta.number - constant
# ^^^^^^ meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.decimal.terraform
# ^ - meta.number - constant
/////
// Matches floats with postive signed exponents.
/////
1.4e+12
# ^ - meta.number - constant
# ^^^^^^^ meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.decimal.terraform
# ^ - meta.number - constant
/////
// Matches floats with negative signed exponents.
/////
1.4E-12
# ^ - meta.number - constant
# ^^^^^^^ meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.decimal.terraform
# ^ - meta.number - constant
/////////////////////////////////////////////////////////////////////
// STRINGS
/////////////////////////////////////////////////////////////////////
/////
// Matches punctuation and assigns meta_scope.
/////
"a string"
# ^ - punctuation - string
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ string.quoted.double.terraform
# ^ punctuation.definition.string.end.terraform
# ^ - punctuation - string
/////
// Matches character escapes.
/////
"a \n b \r c \t d \" e \udead f \udeadbeef"
# ^ - punctuation - string
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.terraform
# ^^ constant.character.escape.terraform
# ^^ constant.character.escape.terraform
# ^^ constant.character.escape.terraform
# ^^ constant.character.escape.terraform
# ^^^^^ constant.character.escape.terraform
# ^^^^^^^^^^ constant.character.escape.terraform
# ^ punctuation.definition.string.end.terraform
/////
// Matches IPs and CIDR
/////
"1.2.3.4"
# ^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
# ^ punctuation.definition.string.end.terraform
"1.2.3.4/32"
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
# ^ punctuation.separator.terraform
# ^^ constant.other.range.terraform
# ^ punctuation.definition.string.end.terraform
"1.2.3.4:8080"
# ^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
# ^ punctuation.separator.terraform
# ^^^^ constant.other.port.terraform
# ^ punctuation.definition.string.end.terraform
"1.2.3.4/33"
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ - constant - punctuation
# ^ punctuation.definition.string.end.terraform
"256.2.3.4"
# ^^^^^^^^^^^ - constant
"::1"
# ^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
# ^ punctuation.definition.string.end.terraform
"deed"
# ^^^^^^ meta.string.terraform string.quoted.double.terraform - constant
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
"deed:10:10"
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform - constant
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
"1:2:3:4:5:6:7:8"
# ^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
# ^ punctuation.definition.string.end.terraform
"1:2:3:4:5:6:7:8:8080"
# ^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^ - constant - punctuation
# ^ punctuation.definition.string.end.terraform
"1:2:3:4:5:6:7:8/128"
# ^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
# ^ punctuation.separator.terraform
# ^^^ constant.other.range.terraform
# ^ punctuation.definition.string.end.terraform
"1:2:3:4:5:6:7:8/129"
# ^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^ - constant - punctuation
# ^ punctuation.definition.string.end.terraform
"[1:2:3:4:5:6:7:8]/128"
# ^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
# ^ punctuation.definition.constant.begin.terraform
# ^ punctuation.definition.constant.end.terraform
# ^ punctuation.separator.terraform
# ^^^ constant.other.range.terraform
# ^ punctuation.definition.string.end.terraform
"[1:2:3:4:5:6:7:8]:8080"
# ^^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
# ^ punctuation.definition.constant.begin.terraform
# ^ punctuation.definition.constant.end.terraform
# ^ punctuation.separator.terraform
# ^^^^ constant.other.port.terraform
# ^ punctuation.definition.string.end.terraform
"[1:2:3:4:5:6:7:8]/129"
# ^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^ - constant - punctuation
/////
// Unclosed strings
/////
"
# ^ meta.string.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ invalid.illegal.unclosed-string.terraform
/////////////////////////////////////////////////////////////////////
// Identifiers
/////////////////////////////////////////////////////////////////////
this_is_an_identifier
# ^^^^^^^^^^^^^^^^^^^^^ variable.other.readwrite.terraform
identifier.member_access
# ^^^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^^^ variable.other.member.terraform
identifier-with-hyphens
# ^^^^^^^^^^^^^^^^^^^^^^^ variable.other.readwrite.terraform
__EOF__
# ^^^^^^^ variable.other.readwrite.terraform
identifier.
// comment
# <- comment
/////////////////////////////////////////////////////////////////////
// STRING INTERPOLATION
/////////////////////////////////////////////////////////////////////
/////
// Correct scopes during interpolation.
/////
"some ${interpolation} string"
# ^ - punctuation - string
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform
# ^^^^^ string.quoted.double.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^ meta.interpolation.terraform
# ^^^^^^^^^^^^ source.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^ string.quoted.double.terraform
# ^ punctuation.definition.string.end.terraform
# ^ - punctuation - string
/////
// Matches left-trim and right-trim.
/////
"%{~ fff ~}"
# ^^^^^^^^^^^^ meta.string.terraform
# ^^^^^^^^^^ meta.interpolation.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ meta.interpolation.terraform keyword.operator.template.trim.left.terraform
# ^^^^^ source.terraform
# ^ keyword.operator.template.trim.right.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Matches operators
/////
"${ something ? true : false }"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^ source.terraform
# ^ keyword.operator.ternary.terraform
# ^^^^ meta.interpolation.terraform constant.language.boolean.true.terraform
# ^ meta.interpolation.terraform keyword.operator.ternary.terraform
# ^^^^^ meta.interpolation.terraform constant.language.boolean.false.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Dot-access attributes in string interpolation
/////
"hello ${aws_instance.ubuntu}"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^ string.quoted.double.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform
# ^ meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.interpolation.terraform variable.other.member.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Handles function calls
/////
"${formatdate("DD MMM YYYY hh:mm ZZZ", "2018-01-02T23:12:01Z")}"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^ meta.interpolation.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Handles nested function calls.
/////
id = "db-final-snapshot-${md5(timestamp())}"
# ^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^ string.quoted.double.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^ meta.interpolation.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Includes objects.
////
"something ${{test = 3}}"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ string.quoted.double.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ meta.interpolation.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^^^^ meta.interpolation.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.interpolation.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.interpolation.terraform source.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.interpolation.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Includes tuples.
////
"something ${[1, 2, 3]}"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ string.quoted.double.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ meta.interpolation.terraform punctuation.section.brackets.begin.terraform
# ^ meta.interpolation.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.interpolation.terraform punctuation.separator.terraform
# ^ meta.interpolation.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.interpolation.terraform punctuation.separator.terraform
# ^ meta.interpolation.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.interpolation.terraform punctuation.section.brackets.end.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Includes named values.
/////
"${var.something}"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^ meta.interpolation.terraform variable.language.terraform
# ^ meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^^^^ meta.interpolation.terraform variable.other.member.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////
// Handles regexes (various punctuation).
/////
records = ["${replace("hostname.domain.com:1234", "/(.*):[0-9]{0,26}/", "$1")}"]
# ^^^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^^ meta.interpolation.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ - meta - string - variable - punctuation
/////
// Handles nested interpolation.
/////
"${file("${path.module}/text_files/ecs_app")}"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.interpolation.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.interpolation.terraform variable.language.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.interpolation.terraform variable.other.member.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.interpolation.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////////////////////////////////////////////////////////////////////
// Template If Directives
/////////////////////////////////////////////////////////////////////
/////
// Matches if/endif directives.
/////
"${ if name == "Mary" }${name}${ endif ~}"
# ^ - string - punctuation
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform
# ^^ meta.interpolation.terraform keyword.control.conditional.if.terraform
# ^^ meta.interpolation.terraform keyword.operator.comparison.terraform
# ^ source.terraform meta.interpolation.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ source.terraform meta.interpolation.terraform string.quoted.double.terraform
# ^ source.terraform meta.interpolation.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^ meta.interpolation.terraform keyword.control.conditional.end.terraform
# ^ meta.interpolation.terraform keyword.operator.template.trim.right.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ - string - punctuation
/////
// Matches if/else/endif directives.
/////
"%{ if name == "Mary" }${name}%{ else }${ "Mary" }%{ endif ~}"
# ^ - string - punctuation
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform
# ^^ meta.interpolation.terraform keyword.control.conditional.if.terraform
# ^^ meta.interpolation.terraform keyword.operator.comparison.terraform
# ^ source.terraform meta.interpolation.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ source.terraform meta.interpolation.terraform string.quoted.double.terraform
# ^ source.terraform meta.interpolation.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.interpolation.terraform keyword.control.conditional.else.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ meta.interpolation.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^ meta.interpolation.terraform string.quoted.double.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^ meta.interpolation.terraform keyword.control.conditional.end.terraform
# ^ meta.interpolation.terraform keyword.operator.template.trim.right.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ - string - punctuation
/////
// Matches for/in/endfor directives.
/////
"%{ for name in var.names ~}${name}%{ endfor ~}"
# ^ - string - punctuation
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.interpolation.terraform
# ^^ keyword.control.loop.in.terraform
# ^^^ meta.interpolation.terraform variable.language.terraform
# ^ meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^ meta.interpolation.terraform variable.other.member.terraform
# ^ keyword.operator.template.trim.right.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^ meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^^^ keyword.control.loop.end.terraform
# ^ meta.interpolation.terraform keyword.operator.template.trim.right.terraform
# ^ meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ - string - punctuation
/////////////////////////////////////////////////////////////////////
// TEMPLATE LITERALS
/////////////////////////////////////////////////////////////////////
/////
// Template literal using `$` character
/////
"some $${interpolation} string"
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^ constant.character.escape.terraform
# ^ punctuation.definition.string.end.terraform
/////
// Template literal using `%` character
/////
"some %%{interpolation} string"
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^ constant.character.escape.terraform
# ^ punctuation.definition.string.end.terraform
/////////////////////////////////////////////////////////////////////
// Operators
/////////////////////////////////////////////////////////////////////
/////
// Comparison
/////
a == b
# ^ - keyword - operator
# ^^ keyword.operator.comparison.terraform
# ^ - keyword - operator
a != b
# ^ - keyword - operator
# ^^ keyword.operator.comparison.terraform
# ^ - keyword - operator
a < b
# ^ - keyword - operator
# ^ keyword.operator.comparison.terraform
# ^ - keyword - operator
a <= b
# ^ - keyword - operator
# ^^ keyword.operator.comparison.terraform
# ^ - keyword - operator
a > b
# ^ - keyword - operator
# ^ keyword.operator.comparison.terraform
# ^ - keyword - operator
a >= b
# ^ - keyword - operator
# ^^ keyword.operator.comparison.terraform
# ^ - keyword - operator
/////
// Arithmetic
/////
a + b
# ^ - keyword - operator
# ^ keyword.operator.arithmetic.terraform
# ^ - keyword - operator
a - b
# ^ - keyword - operator
# ^ keyword.operator.arithmetic.terraform
# ^ - keyword - operator
a * b
# ^ - keyword - operator
# ^ keyword.operator.arithmetic.terraform
# ^ - keyword - operator
a / b
# ^ - keyword - operator
# ^ keyword.operator.arithmetic.terraform
# ^ - keyword - operator
a % b
# ^ - keyword - operator
# ^ keyword.operator.arithmetic.terraform
# ^ - keyword - operator
- a
# ^ - keyword - operator
# ^ keyword.operator.arithmetic.terraform
# ^ - keyword - operator
/////
// Logic
/////
a && b
# ^^ - keyword - operator
# ^^ keyword.operator.logical.terraform
# ^^ - keyword - operator
a || b
# ^^ - keyword - operator
# ^^ keyword.operator.logical.terraform
# ^^ - keyword - operator
!a
# ^^ - keyword - operator
# ^ keyword.operator.logical.terraform
# ^^ - keyword - operator
/////
// Conditional
/////
length(some_list) > 0 ? some_list[0] : default
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ keyword.operator.comparison.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ keyword.operator.ternary.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ keyword.operator.ternary.terraform
/////
// Ellipsis
/////
hhh([55, 2453, 2]...)
# ^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^^^^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^^^ keyword.operator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////////////////////////////////////////////////////////////////////
// Brackets: Index Operations and Arrays
/////////////////////////////////////////////////////////////////////
/////
// Index Operations
/////
thing[1]
# ^ - punctuation
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ - punctuation
/////
// Arrays of literals
/////
["a", "b", "c"]
# ^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^ string.quoted.double.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.separator.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^ string.quoted.double.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.separator.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^ string.quoted.double.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Allows inline comments
/////
[1, /* inline */ 2]
# ^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^^ punctuation.definition.comment.terraform
# ^^^^^^^^^^^^ comment.block.terraform
# ^^ punctuation.definition.comment.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Allows expression over multiple lines
/////
[
# ^ punctuation.section.brackets.begin.terraform
1,
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
2
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
]
# ^ punctuation.section.brackets.end.terraform
/////
// Allows operators
/////
[ 1 + 2 ]
# ^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ keyword.operator.arithmetic.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Splat operator
/////
tuple[*].foo.bar[0]
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.section.brackets.end.terraform keyword.operator.splat.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Handle nested arrays
/////
counts = [
# ^^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ punctuation.section.brackets.begin.terraform
[ 1, 2],
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.separator.terraform
[ 6, 7]
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
]
# ^ punctuation.section.brackets.end.terraform
# ^ - punctuation
/////
// Attribute-access inside arrays
/////
[ aws_instance.ubuntu, aws_instance.freebsd ]
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.separator.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Includes functions.
/////
[ upper("ggh") ]
# ^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Include objects.
/////
[{a = 1}, {g = 2}]
# ^ meta.brackets.terraform - meta.braces
# ^^^^^^^ meta.brackets.terraform meta.braces.terraform
# ^^ meta.brackets.terraform - meta.braces
# ^^^^^^^ meta.brackets.terraform meta.braces.terraform
# ^ meta.brackets.terraform - meta.braces
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.braces.terraform punctuation.section.braces.end.terraform
# ^ punctuation.separator.terraform
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.braces.terraform punctuation.section.braces.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Includes named values
/////
[local.thing1, local.thing2]
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.separator.terraform
# ^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.end.terraform
/////////////////////////////////////////////////////////////////////
// Collections: Objects
/////////////////////////////////////////////////////////////////////
/////
// Key/value pairs separated by newlines.
/////
{
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
name = "John"
# ^^^^ meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^ meta.braces.terraform string.quoted.double.terraform
age = 52
# ^^^ meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform keyword.operator.assignment.terraform
# ^^ meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
}
# ^ meta.braces.terraform punctuation.section.braces.end.terraform
/////
// Key/value pairs separated by commas.
/////
{name = "John", age = 52}
# ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ punctuation.section.braces.end.terraform
/////
// Allows operators in key values.
/////
{ name = 1 + 1 }
# ^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ keyword.operator.arithmetic.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.braces.end.terraform
# ^ - meta
/////
// Allows tuples as key values.
/////
{ list = [ 1, 2, 3 ]}
# ^^^^^^^^^ meta.braces.terraform - meta.brackets
# ^^^^^^^^^^^ meta.braces.terraform meta.brackets.terraform
# ^ meta.braces.terraform - meta.brackets
# ^ punctuation.section.braces.begin.terraform
# ^^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.braces.end.terraform
# ^ - meta
/////
// Allows function calls as values.
/////
{
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
a = upper("l"),
# ^ meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform keyword.operator.assignment.terraform
# ^^^^^ meta.braces.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.braces.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.braces.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.braces.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.braces.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.braces.terraform punctuation.separator.terraform
}
# ^ meta.braces.terraform punctuation.section.braces.end.terraform
/////
// Allows nested collection literals.
/////
{
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
obj1 = {
# ^^^^ meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.braces.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
obj2 = {
# ^^^^ meta.braces.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.braces.terraform meta.braces.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
value = 5
# ^^^^^ meta.braces.terraform meta.braces.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.braces.terraform meta.braces.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.braces.terraform meta.braces.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
}
# ^ meta.braces.terraform meta.braces.terraform meta.braces.terraform punctuation.section.braces.end.terraform
}
# ^ meta.braces.terraform meta.braces.terraform punctuation.section.braces.end.terraform
}
# ^ meta.braces.terraform punctuation.section.braces.end.terraform
# ^ - meta
/////
// Allows attribute-access as rvalue, including named values.
/////
{ lvalue = var.rvalue }
# ^^^^^^^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^^^^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.section.braces.end.terraform
# ^ - meta
/////
// Allows strings as keys.
/////
{"gggg" = "gggg"}
# ^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^ meta.mapping.key.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.mapping.key.terraform string.quoted.double.terraform
# ^ meta.mapping.key.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ keyword.operator.assignment.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ string.quoted.double.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ punctuation.section.braces.end.terraform
/////
// Allows expressions + operators as keys.
/////
{(1 + 2) = "gggg"}
# ^ meta.braces.terraform - meta.parens
# ^^^^^^^ meta.braces.terraform meta.mapping.key.terraform meta.parens.terraform
# ^^^^^^^^^^ meta.braces.terraform - meta.parens
# ^ punctuation.section.braces.begin.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ keyword.operator.arithmetic.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.parens.end.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^ string.quoted.double.terraform
# ^ punctuation.section.braces.end.terraform
/////
// Allows function calls as keys.
/////
{(func()) = 1}
# ^ meta.braces.terraform - meta.parens
# ^^^^^^^^ meta.braces.terraform meta.mapping.key.terraform meta.parens.terraform
# ^^^^^ meta.braces.terraform - meta.parens
# ^ punctuation.section.braces.begin.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ punctuation.section.parens.end.terraform
# ^ keyword.operator.assignment.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.braces.end.terraform
/////
// Allows attribute-access as keys.
////
{(var.path) = 1}
# ^ meta.braces.terraform - meta.parens
# ^^^^^^^^^^ meta.braces.terraform meta.mapping.key.terraform meta.parens.terraform
# ^^^^^ meta.braces.terraform - meta.parens
# ^ punctuation.section.braces.begin.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.parens.end.terraform
# ^ keyword.operator.assignment.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.braces.end.terraform
/////////////////////////////////////////////////////////////////////
// Attribute Access
/////////////////////////////////////////////////////////////////////
/////
// Matches dot-access
/////
aws_instance.ubuntu[*].private_dns
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.section.brackets.end.terraform keyword.operator.splat.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^ variable.other.member.terraform
# ^ - variable - punctuation
/////
// Ignores dot-access in string literals
/////
"aws_instance.ubuntu"
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ - variable
# ^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.terraform
/////
// Matches inside for-expressions
/////
[for l in var.letters: upper(l)]
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Attribute-only splat
/////
tuple.*.foo.bar[0]
# ^ punctuation.accessor.dot.terraform
# ^ keyword.operator.splat.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Matches subscript indexes
/////
aws_route53_zone.project.name_servers.1
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ - constant - punctuation - variable
/////////////////////////////////////////////////////////////////////
// Attribute Definition
/////////////////////////////////////////////////////////////////////
/////
// Basic definition
/////
attribute = "string"
# ^^^^^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
provider = google-beta.impersonated
# ^^^^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^^ variable.other.member.terraform
/////
// Meta-arguments
////
for_each = toset([])
# ^^^^^^^^ keyword.control.loop.for.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.parens.end.terraform
count = length(var.availability_zones)
# ^^^^^ variable.declaration.terraform keyword.control.conditional.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.parens.end.terraform
/////
// Populate an attribute from a variable value
/////
(foo) = "baz"
# ^ punctuation.section.parens.begin.terraform
# ^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ punctuation.section.parens.end.terraform
# ^ keyword.operator.assignment.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^ string.quoted.double.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
/////////////////////////////////////////////////////////////////////
// Function Calls
/////////////////////////////////////////////////////////////////////
/////
// Basic call.
/////
thing(l)
# ^^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Matches parameters, attribute-access, literals, operators, commas.
/////
cidrthingy(aws_vpc.main.cidr_block, 4, count.index+1)
# ^^^^^^^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.separator.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^ variable.other.member.terraform
# ^ keyword.operator.arithmetic.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.parens.end.terraform
# ^ - meta - function-call - variable
/////
// Matches arrays and splat as parameters.
/////
y6y([55, 2453, 2]..., [55555555])
# ^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^^^ meta.function-call.arguments.terraform keyword.operator.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Matches objects as parameters.
/////
some({a = 1, b = "2"})
# ^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Nested function calls.
/////
func(thing(yep(1)))
# ^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
/////
// Parameters spanning multiple lines.
/////
func(
# ^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
1,
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
2
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
)
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Allow object for-expressions.
////
thing({for i, v in ["a"]: v => i...})
# ^^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
# ^^^ meta.braces.terraform keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.separator.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ punctuation.separator.key-value.terraform
# ^ variable.other.readwrite.terraform
# ^^^ keyword.operator.terraform
# ^ punctuation.section.braces.end.terraform
# ^ punctuation.section.parens.end.terraform
/////
// Allow tuple for-expressions.
/////
func([for v in ["a", "b"]: v])
# ^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.parens.end.terraform
/////////////////////////////////////////////////////////////////////
// Built-in Terraform Functions
// TODO: match % placeholders in format()-family first parameters
// TODO: match regexs in regex()-family first parameters
////////////////////////`/////////////////////////////////////////////
/////
// Numeric Functions
/////
abs(23)
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
ceil(5.1)
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^ meta.function-call.arguments.terraform meta.number.float.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
floor(5)
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
log(50, 10)
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
max(12, 54, 3)
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
min(12, 54, 3)
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
pow(3, 2)
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
signum(-13)
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform keyword.operator.arithmetic.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// String Functions
/////
chomp("hello\n")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform constant.character.escape.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
format("Hello, %s!", "Ander")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
formatlist("Hello, %s!", ["Valentina", "Ander"])
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
indent(2, "[\n foo,\n bar,\n]\n")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
join(", ", ["foo", "bar", "baz"])
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
lower("HELLO")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
regex("[a-z]+", "53453453.345345aaabbbccc23454")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
regexall("[a-z]+", "1234abcd5678efgh9")
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
replace("1 + 2 + 3", "+", "-")
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
split(",", "foo")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
strrev("hello")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
substr("🤔🤷", 0, 1)
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
title("hello world")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
trimspace(" hello\n\n")
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
upper("hello")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Collection Functions
/////
chunklist(["a", "b"], 2)
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
coalesce("a", "b")
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
coalescelist([], ["c", "d"])
# ^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
compact(["a", "", "b"])
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
concat(["a"], ["c"])
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
contains(["a"], "a")
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
distinct(["a", "b", "a"])
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
element(["a", "b"], 1)
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
flatten([[["a", "b"]], ["c"]])
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
index(["a"], "b")
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
keys({a=1, c=2})
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
length([])
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
list("a", "b", "c")
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
lookup({a="ay", b="bee"}, "a", "what?")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
map("a", "b")
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
matchkeys(["i-123", "i-abc"], ["us-west", "us-east"], ["us-east"])
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
merge({a="b"}, {e="f"})
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
range(1, 4)
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
reverse([1, 2, 3])
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
setintersection(["a", "b"], ["b", "c"])
# ^^^^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
setproduct(["development"], ["app1", "app2"])
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
setunion(["a"], ["b"], ["d"])
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
slice(["a", "b"], 1, 1)
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
sort(["e", "d"])
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
transpose({a = ["1", "2"], b = ["2", "3"]})
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
values({a=3, c=2, d=1})
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
zipmap(["a", "b"], [1, 2])
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.brackets.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Encoding Functions
/////
base64decode("SGVsbG8gV29ybGQ=")
# ^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
base64encode("Hello World")
# ^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
base64gzip("Hello World")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
csvdecode("a,b,c\n1,2,3\n4,5,6")
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
jsondecode("{\"hello\": \"world\"}")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
jsonencode({hello="world"})
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^^^^^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
urlencode("Hello World")
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
yamldecode("true")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform - constant
# ^^^^ meta.function-call.arguments.terraform meta.string.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.string.terraform string.quoted.double.terraform punctuation.definition.string.end.terraform - constant
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
yamlencode({a = "b", c = "d"})
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Filesystem Functions
/////
abspath(path.root)
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.parens.end.terraform
dirname("foo/bar/baz.txt")
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.section.parens.end.terraform
pathexpand("~/.ssh/id_rsa")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.section.parens.end.terraform
basename("foo/bar/baz.txt")
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.section.parens.end.terraform
file("${path.module}/hello.txt")
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.language.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.other.member.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
fileexists("${path.module}/hello.txt")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.language.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.other.member.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
fileset(path.module, "files/*.txt")
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ string.quoted.double.terraform
# ^ punctuation.section.parens.end.terraform
filebase64("${path.module}/hello.txt")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.language.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.other.member.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
templatefile("${path.module}/backends.tmpl", {
# ^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.language.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.interpolation.terraform variable.other.member.terraform
# ^ meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.begin.terraform
port = 8080,
# ^^^^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^^^^ meta.function-call.arguments.terraform meta.braces.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform
ip_addrs = ["10.0.0.1", "10.0.0.2"]
# ^^^^^^^^ meta.function-call.arguments.terraform meta.braces.terraform meta.mapping.key.terraform string.unquoted.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform keyword.operator.assignment.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.brackets.begin.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.braces.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.brackets.end.terraform
})
# ^ meta.function-call.arguments.terraform meta.braces.terraform punctuation.section.braces.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Date & Time Functions
/////
formatdate("DD MMM YYYY hh:mm ZZZ", "2018-01-02T23:12:01Z")
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
timeadd("2017-11-22T00:00:00Z", "10m")
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
timestamp()
# ^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Hash & Crypto Functions
/////
base64sha256("hello world")
# ^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
base64sha512("hello world")
# ^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
bcrypt("hello world")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
filebase64sha256(file("filename"))
# ^^^^^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
filebase64sha512(file("filename"))
# ^^^^^^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
filemd5(file("filename"))
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
filemd1(file("filename"))
# ^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
filesha256(file("filename"))
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
filesha512(file("filename"))
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
md5("hello world")
# ^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
rsadecrypt(filebase64("${path.module}/ciphertext"), file("privatekey.pem"))
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.begin.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.interpolation.terraform variable.language.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.accessor.dot.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.interpolation.terraform variable.other.member.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform meta.interpolation.terraform punctuation.section.interpolation.end.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^^^ meta.function-call.arguments.terraform meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ - function
sha1("hello world")
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
sha256("hello world")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
sha512("hello world")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
uuid()
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
uuidv5("dns", "www.terraform.io")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// IP Network Functions
/////
cidrhost("10.12.127.0/20", 16)
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
cidrnetmask("172.16.0.0/12")
# ^^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
cidrsubnet("172.16.0.0/12", 4, 2)
# ^^^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^ meta.function-call.arguments.terraform string.quoted.double.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
/////
// Type Conversions Functions
/////
tobool(true)
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^ constant.language.boolean.true.terraform
# ^ punctuation.section.parens.end.terraform
tobool("true")
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# ^ punctuation.section.parens.end.terraform
tolist(["a", "b", "c"])
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.parens.end.terraform
tomap({a = 1, b = 2})
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.parens.terraform - meta.brackets
# ^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform meta.braces.terraform
# ^ meta.function-call.arguments.terraform meta.parens.terraform - meta.brackets
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.section.braces.begin.terraform
# ^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.terraform
# ^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.braces.end.terraform
# ^ punctuation.section.parens.end.terraform
tonumber(1)
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.parens.end.terraform
toset(["a", "b", "c"])
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform meta.parens.terraform - meta.brackets
# ^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform meta.brackets.terraform
# ^ meta.function-call.arguments.terraform meta.parens.terraform - meta.brackets
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.parens.end.terraform
tostring("hello")
# ^^^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.section.parens.end.terraform
provider::terraform::encode_tfvars({
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.identifier.terraform
# ^ meta.function-call.arguments.terraform meta.parens.terraform - meta.braces
# ^ meta.function-call.arguments.terraform meta.parens.terraform meta.braces.terraform
# ^^^^^^^^ variable.namespace.terraform
# ^^ punctuation.accessor.double-colon.terraform
# ^^^^^^^^^ variable.namespace.terraform
# ^^ punctuation.accessor.double-colon.terraform
# ^^^^^^^^^^^^^ support.function.builtin.terraform
# ^ punctuation.section.parens.begin.terraform
# ^ punctuation.section.braces.begin.terraform
example = "Hello!"
})
#^^^^ meta.function-call.arguments.terraform meta.parens.terraform meta.braces.terraform
# ^ meta.function-call.arguments.terraform meta.parens.terraform - meta.braces
# ^ punctuation.section.braces.end.terraform
# ^ punctuation.section.parens.end.terraform
my::namespace::func("args")
# ^^^^^^^^^^^^^^^^^^^ meta.function-call.identifier.terraform
# ^^ variable.namespace.terraform
# ^^ punctuation.accessor.double-colon.terraform
# ^^^^^^^^^ variable.namespace.terraform
# ^^ punctuation.accessor.double-colon.terraform
# ^^^^ variable.function.terraform
# ^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.section.parens.end.terraform
/////////////////////////////////////////////////////////////////////
// TUPLE FOR-EXPRESSIONS
/////////////////////////////////////////////////////////////////////
/////
// Basic expression.
/////
[for s in var.list : upper(s)]
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Object or map source value.
////
[for k, v in var.map : length(k) + length(v)]
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.separator.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ keyword.operator.arithmetic.terraform
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Complex right-side expressions.
////
[for o in var.list : o.interfaces[0].name]
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Legacy splat expression attribute access.
/////
[for o in var.list : o.interfaces][0].name
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
/////
// Multi-line for-expressions.
/////
value = [
# ^ - meta.brackets
# ^^ meta.brackets.terraform
# ^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ punctuation.section.brackets.begin.terraform
for instance in aws_instance.ubuntu:
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^^^ keyword.control.loop.for.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^^^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
instance.private_dns
# ^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^ variable.other.member.terraform
]
#^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ - meta.brackets
/////
// Match conditional on right-side expression.
/////
value = [
# ^ - meta.brackets
# ^^ meta.brackets.terraform
# ^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ punctuation.section.brackets.begin.terraform
for instance in aws_instance.ubuntu:
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^^^ keyword.control.loop.for.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^^^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
(instance.public_ip != "" ? list(instance.private_ip, instance.public_ip) : list(instance.private_ip))
# ^ meta.brackets.terraform - meta.parens
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform meta.parens.terraform
# ^ meta.brackets.terraform - meta.parens
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
# ^^ keyword.operator.comparison.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ keyword.operator.ternary.terraform
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.separator.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.parens.end.terraform
# ^ keyword.operator.ternary.terraform
# ^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^^^^^^^^^^^^^^^^^^^^^ meta.function-call.arguments.terraform meta.parens.terraform
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.parens.end.terraform
# ^ punctuation.section.parens.end.terraform
]
#^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ - meta.brackets
/////
// Match brackets on right-side expression.
/////
value = [
# ^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ punctuation.section.brackets.begin.terraform
for instance in aws_instance.ubuntu:
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform
# ^^^ keyword.control.loop.for.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^^^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
(instance.public_ip != "" ? [instance.private_ip, instance.public_ip] : [instance.private_ip])
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform meta.parens.terraform - meta.parens meta.brackets
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform meta.parens.terraform meta.brackets.terraform
# ^^^ meta.brackets.terraform meta.parens.terraform - meta.parens meta.brackets
# ^^^^^^^^^^^^^^^^^^^^^ meta.brackets.terraform meta.parens.terraform meta.brackets.terraform
# ^ meta.brackets.terraform meta.parens.terraform - meta.parens meta.brackets
# ^ meta.brackets.terraform - meta.parens
# ^ punctuation.section.parens.begin.terraform
# ^^^^^^^^ variable.other.readwrite.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
# ^^ keyword.operator.comparison.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ keyword.operator.ternary.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.separator.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ keyword.operator.ternary.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.parens.end.terraform
]
# <- meta.brackets.terraform
#^^^^ meta.brackets.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ - meta.brackets
/////
// Match if-conditionals on right-side.
/////
[for s in var.list : upper(s) if s != ""]
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^^ keyword.control.conditional.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.comparison.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ punctuation.section.brackets.end.terraform
/////
// Matches bracket-literals as range expression.
/////
[for i, v in ["a", "b", "c"]: v if i < 2]
# ^^^^^^^^^^^^^ meta.brackets.terraform - meta.brackets meta.brackets
# ^^^^^^^^^^^^^^^ meta.brackets.terraform meta.brackets.terraform
# ^^^^^^^^^^^^^ meta.brackets.terraform - meta.brackets meta.brackets
# ^ punctuation.section.brackets.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.separator.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.control.conditional.terraform
# ^ variable.other.readwrite.terraform
# ^ keyword.operator.comparison.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.section.brackets.end.terraform
/////////////////////////////////////////////////////////////////////
// OBJECT FOR-EXPRESSIONS
/////////////////////////////////////////////////////////////////////
/////
// Matches basic syntax.
/////
{for i, v in ["a", "b"]: v => i}
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.separator.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.separator.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ punctuation.separator.key-value.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.section.braces.end.terraform
# ^ - meta
/////
// Matches ellipsis.
/////
{for i, v in ["a"]: v => i...}
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^ punctuation.separator.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^ punctuation.section.brackets.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^ string.quoted.double.terraform
# ^ punctuation.section.brackets.end.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ punctuation.separator.key-value.terraform
# ^ variable.other.readwrite.terraform
# ^^^ keyword.operator.terraform
# ^ punctuation.section.braces.end.terraform
/////
// Matches if-conditional.
/////
{for s in var.list : substr(s, 0, 1) => s... if s != ""}
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^ punctuation.section.braces.begin.terraform
# ^^^ keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.separator.terraform
# ^ meta.function-call.arguments.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
# ^^ punctuation.separator.key-value.terraform
# ^ variable.other.readwrite.terraform
# ^^^ keyword.operator.terraform
# ^^ keyword.control.conditional.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.comparison.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform
# ^ punctuation.section.braces.end.terraform
/////
// Matches over multiple-lines.
/////
value = {
# ^^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^ - meta.braces
# ^ meta.braces.terraform punctuation.section.braces.begin.terraform
for l in var.letters: l =>
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.braces.terraform
# ^^^ meta.braces.terraform keyword.control.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ keyword.operator.iteration.in.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.block.loop.for.terraform
# ^ variable.other.readwrite.terraform
# ^^ punctuation.separator.key-value.terraform
upper(l)
# ^^^^^^^^^^ meta.braces.terraform
# ^^^^^ meta.function-call.identifier.terraform support.function.builtin.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
}
# <- meta.braces.terraform
#^^^^ meta.braces.terraform
# ^ punctuation.section.braces.end.terraform
# ^ - meta.braces
/////////////////////////////////////////////////////////////////////
// BLOCKS
/////////////////////////////////////////////////////////////////////
/////
// Inline block with no labels.
////
thing {}
# ^^^^^^^ meta.block.head.terraform
# ^^^^^ keyword.declaration.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
/////
// Inline block with string labels.
/////
thing "label1" "label2\"" {}
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^ keyword.declaration.terraform
# ^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# ^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^ constant.character.escape.terraform
# ^ punctuation.definition.string.end.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
/////
// Inline block with identifier labels.
/////
thing thing1 thing2 thing3 {}
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^ keyword.declaration.terraform
# ^^^^^^ string.unquoted.double.terraform
# ^^^^^^ string.unquoted.double.terraform
# ^^^^^^ string.unquoted.double.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
//////
// Nested multi-line blocks with expressions.
/////
resource "aws_security_group" "example" {
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^^^ keyword.declaration.terraform
# ^^^^^^^^^^^^^^^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^^^^^^^^^^^^ support.type.terraform
# ^ punctuation.definition.string.end.terraform
# ^^^^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^ entity.name.label.terraform
# ^ punctuation.definition.string.end.terraform
# ^ meta.block.body.terraform punctuation.section.block.begin.terraform
name = "example"
# ^^^^^^^^^^^^^^^^ meta.block.body.terraform
# ^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
dynamic "ingress" {
#^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform - meta.block meta.block meta.block
# ^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.block.head.terraform
# ^^^^^^^ keyword.declaration.terraform
# ^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# ^ meta.block.body.terraform meta.block.body.terraform punctuation.section.block.begin.terraform
for_each = var.service_ports
# ^^^^^^^^ variable.declaration.terraform keyword.control.loop.for.terraform
# ^ keyword.operator.assignment.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^^^ variable.other.member.terraform
content {
# ^^^^^^^ meta.block.body.terraform meta.block.body.terraform meta.block.head.terraform
# ^ meta.block.body.terraform meta.block.body.terraform - meta.type
# ^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform - meta.type
# ^^^^^^^ keyword.declaration.terraform
# ^ punctuation.section.block.begin.terraform
from_port = ingress.value
# ^^^^^^^^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform variable.declaration.terraform variable.other.readwrite.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform keyword.operator.assignment.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform punctuation.accessor.dot.terraform
# ^^^^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform variable.other.member.terraform
to_port = ingress.value
# ^^^^^^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform variable.declaration.terraform variable.other.readwrite.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform keyword.operator.assignment.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform punctuation.accessor.dot.terraform
protocol = "tcp" + "IP"
# ^^^^^^^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform variable.declaration.terraform variable.other.readwrite.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform keyword.operator.assignment.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform string.quoted.double.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform keyword.operator.arithmetic.terraform
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform string.quoted.double.terraform punctuation.definition.string.begin.terraform
# ^^^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform string.quoted.double.terraform
}
# ^ meta.block.body.terraform meta.block.body.terraform meta.block.body.terraform punctuation.section.block.end.terraform
}
# ^ meta.block.body.terraform meta.block.body.terraform punctuation.section.block.end.terraform
}
# ^ meta.block.body.terraform punctuation.section.block.end.terraform
# ^ - meta
/////
// Matches blocks with functions, objects, tuples.
/////
thing label1 {
# ^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^ keyword.declaration.terraform
# ^^^^^^ string.unquoted.double.terraform
# ^ meta.block.body.terraform punctuation.section.block.begin.terraform
func = function(param1)
# ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform
# ^^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^^^ meta.function-call.identifier.terraform variable.function.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.begin.terraform
# ^^^^^^ meta.function-call.arguments.terraform
# ^ meta.function-call.arguments.terraform punctuation.section.parens.end.terraform
obj = {
# ^^^^^^^ meta.block.body.terraform - meta.braces
# ^^ meta.block.body.terraform meta.braces.terraform
# ^^^ variable.declaration.terraform variable.other.readwrite.terraform
# ^ keyword.operator.assignment.terraform
key = "value"
# ^^^^^^^^^^^^^^^ meta.block.body.terraform meta.braces.terraform
# ^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^^ meta.string.terraform string.quoted.double.terraform
}
# ^ meta.block.body.terraform meta.braces.terraform punctuation.section.braces.end.terraform
tuple = [1, 2]
# ^^^^^ meta.block.body.terraform variable.declaration.terraform variable.other.readwrite.terraform
# ^ meta.block.body.terraform keyword.operator.assignment.terraform
# ^ meta.block.body.terraform punctuation.section.brackets.begin.terraform
# ^ meta.block.body.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.block.body.terraform punctuation.separator.terraform
# ^ meta.block.body.terraform meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ meta.block.body.terraform punctuation.section.brackets.end.terraform
}
# ^ meta.block.body.terraform punctuation.section.block.end.terraform
# ^ - meta - block
/////////////////////////////////////////////////////////////////////
// TERRAFORM NAMED VALUES
/////////////////////////////////////////////////////////////////////
var.something
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
local.something
# ^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
module.name.output_name
# ^^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^ variable.other.member.terraform
data.data_type.name
# ^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
path.module
# ^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^ variable.other.member.terraform
terraform.workspace
# ^^^^^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^ variable.other.member.terraform
count.index
# ^^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^ variable.other.member.terraform
each.key
# ^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^ variable.other.member.terraform
self.private_ip
# ^^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^ variable.other.member.terraform
/////////////////////////////////////////////////////////////////////
// TERRAFORM TOP-LEVEL BLOCK TYPES
/////////////////////////////////////////////////////////////////////
resource "type" "name" {}
# ^^^^^^^^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^^^ keyword.declaration.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ support.type.terraform
# ^ punctuation.definition.string.end.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ entity.name.label.terraform
# ^ punctuation.definition.string.end.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
ephemeral "type" "name" {}
# ^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^^^^ keyword.declaration.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ support.type.terraform
# ^ punctuation.definition.string.end.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ entity.name.label.terraform
# ^ punctuation.definition.string.end.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
data "type" name {}
# ^^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^ keyword.declaration.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ support.type.terraform
# ^ punctuation.definition.string.end.terraform
# ^^^^ entity.name.label.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
provider "name" {}
# ^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^^^ keyword.declaration.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ entity.name.label.terraform
# ^ punctuation.definition.string.end.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
module name {}
# ^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^ keyword.declaration.terraform
# ^^^^ entity.name.label.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
variable "name" {}
# ^^^^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^^^ keyword.declaration.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ entity.name.label.terraform
# ^ punctuation.definition.string.end.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
output "name"{}
# ^^^^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^ keyword.declaration.terraform
# ^^^^^^ meta.string.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^ entity.name.label.terraform
# ^ punctuation.definition.string.end.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
locals {}
# ^^^^^^^ meta.block.head.terraform
# ^^^^^^ keyword.declaration.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
terraform {}
# ^^^^^^^^^^ meta.block.head.terraform
# ^^^^^^^^^ keyword.declaration.terraform
# ^^ meta.block.body.terraform
# ^ punctuation.section.block.begin.terraform
# ^ punctuation.section.block.end.terraform
/////////////////////////////////////////////////////////////////////
// TERRAFORM TYPE KEYWORDS
/////////////////////////////////////////////////////////////////////
string
# ^^^^^^ storage.type.terraform
any
# ^^^ storage.type.terraform
number
# ^^^^^^ storage.type.terraform
bool
# ^^^^ storage.type.terraform
/////////////////////////////////////////////////////////////////////
// HEREDOCS
/////////////////////////////////////////////////////////////////////
/////
// Basic example.
/////
<< EOF
# ^^ keyword.operator.heredoc.terraform
# ^^^ keyword.control.heredoc.terraform
sdfdfsd
# ^^^^^^^^ string.unquoted.heredoc.terraform
EOF
# ^^^^ keyword.control.heredoc.terraform
/////
// With leading-spaces-operator.
/////
<<- END
# ^^^ keyword.operator.heredoc.terraform
# ^^^ keyword.control.heredoc.terraform
heredoc
# ^^^^^^^^ string.unquoted.heredoc.terraform
EOF
# ^^^^ string.unquoted.heredoc.terraform
END
# ^^^^ keyword.control.heredoc.terraform
/////
// Includes string interpolation.
/////
<<- END
# ^^^ keyword.operator.heredoc.terraform
# ^^^ keyword.control.heredoc.terraform
Hello, %{var.name}
#^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform
#^^^^^^^^^^ string.unquoted.heredoc.terraform
# ^^^^^^^^^^^ meta.interpolation.terraform
# ^^ punctuation.section.interpolation.begin.terraform
# ^^^^^^^^ source.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^ variable.other.member.terraform
# ^ punctuation.section.interpolation.end.terraform
END
# ^^^^ keyword.control.heredoc.terraform
<<__EOF__
# ^^ keyword.operator.heredoc.terraform
# ^^^^^^^ keyword.control.heredoc.terraform
aaa
__EOF__
# ^^^^^^^^ keyword.control.heredoc.terraform
/////////////////////////////////////////////////////////////////////
// IMPORTS
/////////////////////////////////////////////////////////////////////
/////
// Import with attribute access.
/////
terraform import aws_instance.example i-abcd1234
# ^^^^^^^^^ support.constant.terraform
# ^^^^^^ keyword.control.import.terraform
# ^^^^^^^^^^^^ entity.name.label.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^ variable.other.member.terraform
# ^^^^^^^^^^ entity.name.label.terraform
/////
// Import with numeric literals.
/////
terraform import digitalocean_ssh_key.mykey 263654
# ^^^^^^^^^ support.constant.terraform
# ^^^^^^ keyword.control.import.terraform
# ^^^^^^^^^^^^^^^^^^^^ entity.name.label.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^ variable.other.member.terraform
# ^^^^^^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
resource "aws_iam_role_policy" "attach-inline-policy-1" {
name = "xxx"
role = aws_iam_role.execution-role.name
res_arn = "arn:aws:lambda:*:*:function:${var.environment}-xxx"
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.string.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.begin.terraform - variable
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ variable.language.acl.terraform
# ^^ punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^^ source.terraform source.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.terraform punctuation.definition.string.end.terraform - variable
policy = jsonencode({
Version = "2012-10-17"
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.function-call.arguments.terraform meta.braces.terraform
# ^^^^^^^ meta.mapping.key.terraform string.unquoted.terraform
# ^ keyword.operator.assignment.terraform
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^ punctuation.definition.string.end.terraform
# comment
# ^^^^^^^^^^ comment.line.terraform
"Statement": [
#^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.function-call.arguments.terraform
#^^^^^^^ meta.braces.terraform
# ^^^^^^^^^^^ meta.mapping.key.json string.quoted.double.json
# ^ punctuation.definition.string.begin.json
# ^ punctuation.definition.string.end.json
# ^^ meta.braces.terraform
# ^ punctuation.separator.key-value.json
# ^ meta.mapping.value.json meta.sequence.json punctuation.section.sequence.begin.json
# comment
# ^^^^^^^^^^ comment.line.terraform
{
"Action": [
"lambda:InvokeFunction",
"lambda:InvokeAsync"
],
"Resource": "arn:aws:lambda:*:*:function:${var.environment}-xxx",
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.function-call.arguments.terraform meta.mapping.value.json meta.sequence.json
#^^^^^^^^^^^^^^^ meta.mapping.json
# ^^^^^^^^^^ meta.mapping.key.json string.quoted.double.json
# ^^ meta.mapping.json
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.mapping.value.json meta.string.json - meta.interpolation
# ^^^^^^^^^^^^^^^^^^ meta.mapping.value.json meta.string.json meta.interpolation.terraform - string
# ^^^^^ meta.mapping.value.json meta.string.json - meta.interpolation
# ^ meta.mapping.json
# ^ punctuation.definition.string.begin.json
# ^ punctuation.definition.string.end.json
# ^ punctuation.separator.key-value.json
# ^ string.quoted.double.json punctuation.definition.string.begin.json - variable
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ variable.language.acl.terraform
# ^^ punctuation.section.interpolation.begin.terraform
# ^^^^^^^^^^^^^^^ source.terraform source.terraform
# ^^^ variable.language.terraform
# ^ punctuation.accessor.dot.terraform
# ^^^^^^^^^^^ variable.other.member.terraform
# ^ punctuation.section.interpolation.end.terraform
# ^ string.quoted.double.json punctuation.definition.string.end.json - variable
# ^ punctuation.separator.sequence.json
"IP": "1.2.3.4",
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.function-call.arguments.terraform meta.parens.terraform meta.mapping.value.json meta.sequence.json
#^^^^^^^^^^^^^^^ meta.mapping.json
# ^^^^ meta.mapping.key.json string.quoted.double.json
# ^ punctuation.definition.string.begin.json
# ^ punctuation.definition.string.end.json
# ^^ meta.mapping.json
# ^ punctuation.separator.key-value.json
# ^^^^^^^^^ meta.mapping.value.json meta.string.terraform string.quoted.double.terraform
# ^ punctuation.definition.string.begin.terraform
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
# ^ punctuation.definition.string.end.terraform
# ^ meta.mapping.json punctuation.separator.sequence.json
"Effect": "Allow"
}
]
})
}
]
# <- invalid.illegal.stray.terraform
}
# <- invalid.illegal.stray.terraform
)
# <- invalid.illegal.stray.terraform
================================================
FILE: tests/syntax_test_scope.tfplan
================================================
# SYNTAX TEST "Terraform Plan.sublime-syntax"
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
! update-in-place
- destroy
-/+ destroy and then create replacement
Terraform will perform the following actions:
# aws_route53_record_cname_autodiscover_example_com must be replaced
-/+ resource "aws_route53_record" "cname_autodiscover_example_com" {
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.changed.destroyed-then-created.diff
#^^ punctuation.definition.changed.diff
+ allow_overwrite = (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.inserted.diff - markup markup
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
! fqdn = "autodiscover.example.com" -> (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.changed.updated-in-place.diff
# ^^ keyword.operator.assignment.terraform
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
! id = "ABCDEABCDEABCDEA_autodiscover_CNAME" -> (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.changed.updated-in-place.diff
# ^^ keyword.operator.assignment.terraform
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
! name = "autodiscover.example.com" -> (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.changed.updated-in-place.diff
# ^^ keyword.operator.assignment.terraform
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
# (4 unchanged attributes hidden)
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - markup
}
#^^^^ markup.changed.diff
# aws_route53_record_cname_lyncdiscover_example_com will be destroyed
- resource "aws_route53_record" "cname_lyncdiscover_example_com_old" {
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.deleted.diff
- fqdn = "lyncdiscover.example.com" -> null
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.deleted.diff - markup markup
# ^^ keyword.operator.assignment.terraform
# ^^^^ constant.language.null.terraform
- id = "ABCDEABCDEABCDEA_lyncdiscover_CNAME" -> null
- name = "lyncdiscover" -> null
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.deleted.diff
# ^^ keyword.operator.assignment.terraform
# ^^^^ constant.language.null.terraform
- records = [
- "webdir.online.lync.com.",
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.deleted.diff
] -> null
#^^^^^^^^^^^^^^^^ markup.deleted.diff - markup markup
# ^^ keyword.operator.assignment.terraform
# ^^^^ constant.language.null.terraform
- ttl = 7200 -> null
- type = "CNAME" -> null
- zone_id = "ABCDEABCDEABCDEA" -> null
}
#^^^^ markup.deleted.diff - markup markup
# aws_route53_record_cname_lyncdiscover_example_com will be created
+ resource "aws_route53_record" "cname_lyncdiscover_example_com_new" {
+ fqdn = (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.inserted.diff - markup markup
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
+ id = (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.inserted.diff
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
+ name = (known after apply)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.inserted.diff
# ^^^^^^^^^^^^^^^^^^^ comment.block.terraform
+ records = [
+ "webdir.online.lync.com.",
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.inserted.diff - markup markup
]
+ ttl = 7200
+ type = "CNAME"
+ zone_id = "ABCDEABCDEABCDEA"
}
#^^^^ markup.inserted.diff - markup markup
# aws_route53_record_zone_example_com will be updated in-place
! resource "aws_route53_record" "cname_autodiscover_example_com" {
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.changed.updated-in-place.diff
! comment = "Records for the example.com domain" -> "Records for the example.com domains"
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.changed.updated-in-place.diff
# ^^ keyword.operator.assignment.terraform
id = "ABCDEABCDEABCDEA"
name = "example.com"
tags = {
#^^^^^^^^^^^^^^^^^^^^^^^^ - markup
"Provisioner" = "Terraform"
"System" = "example"
"Workspace" = "production"
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - markup
}
#^^^^^^^^ - markup
# (3 unchanged attributes hidden)
}
#^^^^ markup.changed.diff - markup markup
Plan: 2 to add, 1 to change, 2 to destroy.
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.summary.terraform
# ^^^^^^^^ markup.inserted.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.sequence.terraform
# ^^^^^^^^^^^ markup.changed.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.separator.sequence.terraform
# ^^^^^^^^^^^^ markup.deleted.terraform
# ^ meta.number.integer.decimal.terraform constant.numeric.value.terraform
# ^ punctuation.terminator.terraform
================================================
FILE: tests/syntax_test_scope.tfvars
================================================
# SYNTAX TEST "Terraform-vars.sublime-syntax"
# Same as normal Terraform syntax, hence nothing special to test here.
# <- source.terraform-vars
================================================
FILE: tests/syntax_test_symbol.tf
================================================
# SYNTAX TEST "Terraform.sublime-syntax"
terraform {
#@@@@@@@@@ local-definition
backend "gcs" {
# @@@@@@@@@@@@@ local-definition
prefix = "minecraft/state"
bucket = "terraform-larkworthy"
}
}
# You need to fill these locals out with the project, region and zone
# Then to boot it up, run:-
# gcloud auth application-default login
# terraform init
# terraform apply
locals {
#@@@@@@ local-definition
# The Google Cloud Project ID that will host and pay for your Minecraft server
project = "larkworthy-tester"
region = "europe-west1"
zone = "europe-west1-b"
# Allow members of an external Google group to turn on the server
# through the Cloud Console mobile app or https://console.cloud.google.com
# Create a group at https://groups.google.com/forum/#!creategroup
# and invite members by their email address.
enable_switch_access_group = 1
minecraft_switch_access_group = "minecraft-switchers-lark@googlegroups.com"
}
provider "google" {
#@@@@@@@@@@@@@@@@@ local-definition
# @@@@@@ global-definition
project = local.project
region = local.region
}
# Create service account to run service with no permissions
resource "google_service_account" "minecraft" {
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ local-definition
# @@@@@@@@@ global-definition
account_id = "minecraft"
display_name = <