master e03a17ec8c2a cached
39 files
291.9 KB
60.1k tokens
1 requests
Download .txt
Showing preview only (306K chars total). Download the full file or copy to clipboard to get everything.
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
<https://github.com/SublimeText/Terraform/> 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) <br>
  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
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>name</key>
	<string>Comments</string>
	<key>scope</key>
	<string>source.terraform, source.terraform-vars, source.hcl</string>
	<key>settings</key>
	<dict>
		<key>shellVariables</key>
		<array>
			<dict>
				<key>name</key>
				<string>TM_COMMENT_START</string>
				<key>value</key>
				<string># </string>
			</dict>
			 <dict>
					<key>name</key>
					<string>TM_COMMENT_START_2</string>
					<key>value</key>
					<string>/*</string>
			 </dict>
			 <dict>
					<key>name</key>
					<string>TM_COMMENT_END_2</string>
					<key>value</key>
					<string>*/</string>
			 </dict>
			<dict>
				<key>name</key>
				<string>TM_COMMENT_START_3</string>
				<key>value</key>
				<string>// </string>
			</dict>
		</array>
	</dict>
</dict>
</plist>


================================================
FILE: Fold.tmPreferences
================================================
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>scope</key>
    <string>source.hcl, source.terraform, source.terraform-vars</string>
    <key>settings</key>
    <dict>
        <key>indentationFoldingEnabled</key>
        <false/>
        <key>foldScopes</key>
        <array>
            <!-- Basic Brackets -->
            <dict>
                <key>begin</key>
                <string>punctuation.section.baces.begin</string>
                <key>end</key>
                <string>punctuation.section.baces.end</string>
                <key>excludeTrailingNewlines</key>
                <false/>
            </dict>
            <dict>
                <key>begin</key>
                <string>punctuation.section.brackets.begin</string>
                <key>end</key>
                <string>punctuation.section.brackets.end</string>
                <key>excludeTrailingNewlines</key>
                <false/>
            </dict>
            <dict>
                <key>begin</key>
                <string>punctuation.section.parens.begin</string>
                <key>end</key>
                <string>punctuation.section.parens.end</string>
                <key>excludeTrailingNewlines</key>
                <false/>
            </dict>

            <!-- Blocks -->
            <dict>
                <key>begin</key>
                <string>punctuation.section.block.begin</string>
                <key>end</key>
                <string>punctuation.section.block.end</string>
                <key>excludeTrailingNewlines</key>
                <false/>
            </dict>

            <!-- Embedded JSON -->
            <dict>
                <key>begin</key>
                <string>punctuation.section.mapping.begin</string>
                <key>end</key>
                <string>punctuation.section.mapping.end</string>
                <key>excludeTrailingNewlines</key>
                <false/>
            </dict>
            <dict>
                <key>begin</key>
                <string>punctuation.section.sequence.begin</string>
                <key>end</key>
                <string>punctuation.section.sequence.end</string>
                <key>excludeTrailingNewlines</key>
                <false/>
            </dict>
        </array>
    </dict>
</dict>
</plist>


================================================
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
================================================
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
	<key>scope</key>
	<string>source.hcl, source.terraform, source.terraform-vars</string>
	<key>settings</key>
	<dict>
		<key>decreaseIndentPattern</key>
		<string>^\s*[])}]</string>
		<key>increaseIndentPattern</key>
		<string><![CDATA[(?x)
			^.*            # anything on the line followed by:
			(
			  \[[^]"']*    # an open square bracket not followed by a closing square bracket or string punctuation
			| \([^)"']*    # an open bracket not followed by a closing bracket or string punctuation
			| \{[^}"']*    # an open curly brace not followed by a closing brace or string punctuation
			)$
		]]></string>
		<key>indentParens</key>
		<false/>
		<key>indentSquareBrackets</key>
		<false/>
	</dict>
</dict>
</plist>


================================================
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 <fichtefoll2@googlemail.com>

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][].

![preview](preview.png)


## Installation

### Using Package Control

1. Install [Package Control][], if needed.
2. Open the palette by pressing:
    - Windows, Linux: <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>
    - MacOS: <kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>
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
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>name</key>
   <string>Local Symbol List</string>
   <key>scope</key>
   <string>
      entity.name.label.terraform
   </string>
   <key>settings</key>
   <dict>
      <key>showInIndexedSymbolList</key>
      <integer>1</integer>
   </dict>
</dict>
</plist>


================================================
FILE: Symbols - Local.tmPreferences
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>name</key>
   <string>Local Symbol List</string>
   <key>scope</key>
   <string>
      meta.block.head.terraform
   </string>
   <key>settings</key>
   <dict>
      <key>showInSymbolList</key>
      <integer>1</integer>
      <key>symbolTransformation</key>
      <string>
         <!-- Removes trailing whitespace from symbol. -->
         <![CDATA[/\s*$//]]>
      </string>
   </dict>
</dict>
</plist>


================================================
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
<https://github.com/SublimeText/Terraform/> 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
<https://github.com/SublimeText/Terraform/blob/master/CHANGELOG.md>.

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
================================================
<snippet>
	<content><![CDATA[
data "${1:type}" "${2:name}" {
	${3}
}
]]></content>
	<tabTrigger>data</tabTrigger>
	<scope>source.terraform</scope>
	<description>data block</description>
</snippet>


================================================
FILE: snippets/module.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
module "${1:name}" {
	source = "${2}"
	${3}
}
]]></content>
	<tabTrigger>module</tabTrigger>
	<scope>source.terraform</scope>
	<description>module block</description>
</snippet>


================================================
FILE: snippets/module_github.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
module "${1:name}" {
	source = "github.com/${2:owner}/${3:repo}?${4:ref=}"
	${5}
}
]]></content>
	<tabTrigger>moduleG</tabTrigger>
	<scope>source.terraform</scope>
	<description>module (github public)</description>
</snippet>


================================================
FILE: snippets/module_github_private.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
module "${1:name}" {
	source = "git::ssh://git@github.com/${2:owner}/${3:repo}.git${4:?ref=}"
	${5}
}
]]></content>
	<tabTrigger>moduleGS</tabTrigger>
	<scope>source.terraform</scope>
	<description>module (github ssh)</description>
</snippet>


================================================
FILE: snippets/module_path.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
module "${1:name}" {
	source = "${2:./modules/}"
	${3}
}
]]></content>
	<tabTrigger>moduleP</tabTrigger>
	<scope>source.terraform</scope>
	<description>module (path)</description>
</snippet>


================================================
FILE: snippets/output.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
output "${1:name}" {
	value = "\${${2}}"
}
]]></content>
	<tabTrigger>output</tabTrigger>
	<scope>source.terraform</scope>
	<description>output block</description>
</snippet>


================================================
FILE: snippets/provider.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
provider "${1:name}" {
	${2}
}
]]></content>
	<tabTrigger>provider</tabTrigger>
	<scope>source.terraform</scope>
	<description>provider block</description>
</snippet>


================================================
FILE: snippets/provisioner.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
provisioner "${1:name}" {
	${2}
}
]]></content>
    <tabTrigger>provisioner</tabTrigger>
	<scope>source.terraform</scope>
	<description>provisioner block</description>
</snippet>


================================================
FILE: snippets/resource.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
resource "${1:type}" "${2:name}" {
	${3}
}
]]></content>
	<tabTrigger>resource</tabTrigger>
	<scope>source.terraform</scope>
	<description>resource block</description>
</snippet>


================================================
FILE: snippets/variable_empty.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
variable "${1:name}" {
	type = string
	${2:description = "${3:describe your variable}"}
}
]]></content>
	<tabTrigger>variableE</tabTrigger>
	<scope>source.terraform</scope>
	<description>variable (empty)</description>
</snippet>


================================================
FILE: snippets/variable_map.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
variable "${1:name}" {
	type = map
	${2:description = "${3:describe your variable}"}
	default = {
		${4:key1} = "${5:val1}"
		${6:key2} = "${7:val2}"
	}
}
]]></content>
	<tabTrigger>variableM</tabTrigger>
	<scope>source.terraform</scope>
	<description>variable (map)</description>
</snippet>


================================================
FILE: snippets/variable_string.sublime-snippet
================================================
<snippet>
	<content><![CDATA[
variable "${1:name}" {
	type = string
	${2:description = "${3:describe your variable}"}
	default = "${4:default_value}"
}
]]></content>
	<tabTrigger>variableS</tabTrigger>
	<scope>source.terraform</scope>
	<description>variable (string)</description>
</snippet>


================================================
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
#           
Download .txt
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
Condensed preview — 39 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (308K chars).
[
  {
    "path": ".gitattributes",
    "chars": 157,
    "preview": "# git\n.github/ export-ignore\n.gitattributes export-ignore\n.gitignore export-ignore\n\n# screenshots\npreview.* export-ignor"
  },
  {
    "path": ".github/workflows/syntax.yaml",
    "chars": 916,
    "preview": "name: Syntax Tests\n# https://github.com/SublimeText/syntax-test-action\n\non:\n  push:\n    branches:\n      - master\n    pat"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 10783,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "Comments.tmPreferences",
    "chars": 929,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
  },
  {
    "path": "Fold.tmPreferences",
    "chars": 2312,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n    <key>scope</key>\n    <string>source.hcl, source."
  },
  {
    "path": "HCL.sublime-settings",
    "chars": 179,
    "preview": "{\n\t\"tab_size\": 2,\n\t\"translate_tabs_to_spaces\": true,\n\t// Move '-' to sub-word separators\n\t\"word_separators\": \"./\\\\()\\\"':"
  },
  {
    "path": "HCL.sublime-syntax",
    "chars": 714,
    "preview": "%YAML 1.2\n#\n# This syntax definition is based on the Terraform guide:\n# https://www.terraform.io/docs/configuration/inde"
  },
  {
    "path": "Indentation Rules.tmPreferences",
    "chars": 788,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n\t<key>scope</key>\n\t<string>source.hcl, source.terraf"
  },
  {
    "path": "JSON (Terraform).sublime-syntax",
    "chars": 641,
    "preview": "%YAML 1.2\n---\n# http://www.sublimetext.com/docs/syntax.html\nname: JSON (Terraform)\nscope: source.json.terraform\nversion:"
  },
  {
    "path": "LICENSE",
    "chars": 1127,
    "preview": "MIT License\n\nCopyright (c) 2016 Alex Louden\nCopyright (c) 2024 FichteFoll <fichtefoll2@googlemail.com>\n\nPermission is he"
  },
  {
    "path": "README.md",
    "chars": 883,
    "preview": "# Terraform\n\n[Terraform][.tf] configuration file syntax definitions and snippets for [Sublime Text][].\n\n![preview](previ"
  },
  {
    "path": "Symbols - Indexed.tmPreferences",
    "chars": 445,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
  },
  {
    "path": "Symbols - Local.tmPreferences",
    "chars": 593,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
  },
  {
    "path": "Terraform Plan.sublime-syntax",
    "chars": 4518,
    "preview": "%YAML 1.2\n---\n# http://www.sublimetext.com/docs/syntax.html\n# https://github.com/hashicorp/terraform/blob/337bf8e11b75df"
  },
  {
    "path": "Terraform-vars.sublime-settings",
    "chars": 179,
    "preview": "{\n\t\"tab_size\": 2,\n\t\"translate_tabs_to_spaces\": true,\n\t// Move '-' to sub-word separators\n\t\"word_separators\": \"./\\\\()\\\"':"
  },
  {
    "path": "Terraform-vars.sublime-syntax",
    "chars": 891,
    "preview": "%YAML 1.2\n#\n# This syntax definition is based on the Terraform guide:\n# https://www.terraform.io/docs/configuration/inde"
  },
  {
    "path": "Terraform.sublime-settings",
    "chars": 179,
    "preview": "{\n\t\"tab_size\": 2,\n\t\"translate_tabs_to_spaces\": true,\n\t// Move '-' to sub-word separators\n\t\"word_separators\": \"./\\\\()\\\"':"
  },
  {
    "path": "Terraform.sublime-syntax",
    "chars": 30671,
    "preview": "%YAML 1.2\n#\n# This syntax definition is based on the Terraform guide:\n# https://www.terraform.io/docs/language/index.htm"
  },
  {
    "path": "messages/2.0.0.md",
    "chars": 815,
    "preview": "v2.0.0 - 2025-05-11\n-------------------\n\nThe package has been adopted by the SublimeText GitHub org and now lives at\n<ht"
  },
  {
    "path": "messages.json",
    "chars": 37,
    "preview": "{\n    \"2.0.0\": \"messages/2.0.0.md\"\n}\n"
  },
  {
    "path": "preview.tf",
    "chars": 571,
    "preview": "#----------------------------------------------------------------------\n# Project API\n#---------------------------------"
  },
  {
    "path": "snippets/data.sublime-snippet",
    "chars": 197,
    "preview": "<snippet>\n\t<content><![CDATA[\ndata \"${1:type}\" \"${2:name}\" {\n\t${3}\n}\n]]></content>\n\t<tabTrigger>data</tabTrigger>\n\t<scop"
  },
  {
    "path": "snippets/module.sublime-snippet",
    "chars": 208,
    "preview": "<snippet>\n\t<content><![CDATA[\nmodule \"${1:name}\" {\n\tsource = \"${2}\"\n\t${3}\n}\n]]></content>\n\t<tabTrigger>module</tabTrigge"
  },
  {
    "path": "snippets/module_github.sublime-snippet",
    "chars": 256,
    "preview": "<snippet>\n\t<content><![CDATA[\nmodule \"${1:name}\" {\n\tsource = \"github.com/${2:owner}/${3:repo}?${4:ref=}\"\n\t${5}\n}\n]]></co"
  },
  {
    "path": "snippets/module_github_private.sublime-snippet",
    "chars": 273,
    "preview": "<snippet>\n\t<content><![CDATA[\nmodule \"${1:name}\" {\n\tsource = \"git::ssh://git@github.com/${2:owner}/${3:repo}.git${4:?ref"
  },
  {
    "path": "snippets/module_path.sublime-snippet",
    "chars": 221,
    "preview": "<snippet>\n\t<content><![CDATA[\nmodule \"${1:name}\" {\n\tsource = \"${2:./modules/}\"\n\t${3}\n}\n]]></content>\n\t<tabTrigger>module"
  },
  {
    "path": "snippets/output.sublime-snippet",
    "chars": 205,
    "preview": "<snippet>\n\t<content><![CDATA[\noutput \"${1:name}\" {\n\tvalue = \"\\${${2}}\"\n}\n]]></content>\n\t<tabTrigger>output</tabTrigger>\n"
  },
  {
    "path": "snippets/provider.sublime-snippet",
    "chars": 197,
    "preview": "<snippet>\n\t<content><![CDATA[\nprovider \"${1:name}\" {\n\t${2}\n}\n]]></content>\n\t<tabTrigger>provider</tabTrigger>\n\t<scope>so"
  },
  {
    "path": "snippets/provisioner.sublime-snippet",
    "chars": 209,
    "preview": "<snippet>\n\t<content><![CDATA[\nprovisioner \"${1:name}\" {\n\t${2}\n}\n]]></content>\n    <tabTrigger>provisioner</tabTrigger>\n\t"
  },
  {
    "path": "snippets/resource.sublime-snippet",
    "chars": 209,
    "preview": "<snippet>\n\t<content><![CDATA[\nresource \"${1:type}\" \"${2:name}\" {\n\t${3}\n}\n]]></content>\n\t<tabTrigger>resource</tabTrigger"
  },
  {
    "path": "snippets/variable_empty.sublime-snippet",
    "chars": 259,
    "preview": "<snippet>\n\t<content><![CDATA[\nvariable \"${1:name}\" {\n\ttype = string\n\t${2:description = \"${3:describe your variable}\"}\n}\n"
  },
  {
    "path": "snippets/variable_map.sublime-snippet",
    "chars": 322,
    "preview": "<snippet>\n\t<content><![CDATA[\nvariable \"${1:name}\" {\n\ttype = map\n\t${2:description = \"${3:describe your variable}\"}\n\tdefa"
  },
  {
    "path": "snippets/variable_string.sublime-snippet",
    "chars": 292,
    "preview": "<snippet>\n\t<content><![CDATA[\nvariable \"${1:name}\" {\n\ttype = string\n\t${2:description = \"${3:describe your variable}\"}\n\td"
  },
  {
    "path": "tests/syntax_test_reindent.tf",
    "chars": 525,
    "preview": "# SYNTAX TEST reindent-unchanged \"Terraform.sublime-syntax\"\n\nprovider \"name\" {\n  attr1 = {\n    key1 = {\n      key11 = {\n"
  },
  {
    "path": "tests/syntax_test_scope.hcl",
    "chars": 123,
    "preview": "# SYNTAX TEST \"HCL.sublime-syntax\"\n\n# Same as normal Terraform syntax, hence nothing special to test here.\n# <- source.h"
  },
  {
    "path": "tests/syntax_test_scope.tf",
    "chars": 229108,
    "preview": "# SYNTAX TEST \"Terraform.sublime-syntax\"\n\n/////////////////////////////////////////////////////////////////////\n// INLIN"
  },
  {
    "path": "tests/syntax_test_scope.tfplan",
    "chars": 6126,
    "preview": "# SYNTAX TEST \"Terraform Plan.sublime-syntax\"\n\nTerraform used the selected providers to generate the following execution"
  },
  {
    "path": "tests/syntax_test_scope.tfvars",
    "chars": 145,
    "preview": "# SYNTAX TEST \"Terraform-vars.sublime-syntax\"\n\n# Same as normal Terraform syntax, hence nothing special to test here.\n# "
  },
  {
    "path": "tests/syntax_test_symbol.tf",
    "chars": 1689,
    "preview": "# SYNTAX TEST \"Terraform.sublime-syntax\"\n\n terraform {\n#@@@@@@@@@ local-definition\n  backend \"gcs\" {\n# @@@@@@@@@@@@@ loc"
  }
]

About this extraction

This page contains the full source code of the alexlouden/Terraform.tmLanguage GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 39 files (291.9 KB), approximately 60.1k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!