{
  "comments": {
    "lineComment": {
      "comment": "//",
      "noIndent": false
    },
    "blockComment": ["@*", "*@"]
  },
  "brackets": [
    ["{", "}"],
    ["[", "]"],
    ["(", ")"]
  ],
  "autoClosingPairs": [
    { "open": "{", "close": "}" },
    { "open": "[", "close": "]" },
    { "open": "(", "close": ")" },
    { "open": "'", "close": "'", "notIn": ["string"] },
    { "open": "\"", "close": "\"" },
    { "open": "`", "close": "`" },
    { "open": "@*", "close": "*@", "notIn": ["string", "comment"] },
    { "open": "/**", "close": " */", "notIn": ["string", "comment"] }
  ],
  "autoCloseBefore": ";:.,=}])><` \n\t",
  "surroundingPairs": [
    ["{", "}"],
    ["[", "]"],
    ["(", ")"],
    ["'", "'"],
    ["\"", "\""],
    ["`", "`"]
  ],
  "folding": {
    "markers": {
      "start": "^[^\\S\r\n]*@\\*[^\\S\r\n]*[^\\S\r\n]*.*$",
      "end": "^[\\s]*\\*@[^\\S\\r\\n]*$"
    }
  },
  "wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)",
  "indentationRules": {
    "increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
    "decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$"
  },
  "onEnterRules": [
    /* Used to help provide support for block comments */
    {
      // if the previous line is a comment AND ends with "*@" (indicating the end of a block comment)
      "previousLineText": "^[\\s]*\\*[^*@]*$",
      "beforeText": "^[\\s]*\\*[^*@]*$",
      "afterText": "^.*\\*\\@$",
      "action": {
        "indent": "none"
        // then do not append " * " to indicate another comment line
      }
    },
    {
      "beforeText": "^@\\*(?!.*\\*@)[^@\\*]*", // match the start of a Twirl block comment
      "action": {
        "indent": "none",
        "appendText": " * " // then add another comment to the next line
      }
    },
    {
      "previousLineText": "^@\\*[^]*$", // matches the start of a Twirl block comment with anything following it
      "beforeText": "^.*$", // matches " * comment" but not " * comment *@"
      "action": {
        "indent": "none",
        "appendText": "* " // then append another comment
      }
    },
    // This rule was meant to auto-add additional * lines for when a user is inside a
    // like this:
    // @**
    //   * comments
    //   * the "* " was added
    //  *@
    // twirl comment block, but adding this would cause for every other line to be matched as a comment
    {
      "beforeText": "^ *\\*[^\\n\\r\\*@]*$",
      "action": {
        "appendText": "* ",
        "indent": "none"
      }
    }
  ],
  "colorizedBracketPairs": [
    ["(", ")"],
    ["[", "]"],
    ["{", "}"],
    ["<", ">"]
  ]
}
