{
  "displayName": "Cadence",
  "name": "cadence",
  "patterns": [
    {
      "include": "#comments"
    },
    {
      "include": "#declarations"
    },
    {
      "include": "#keywords"
    },
    {
      "include": "#code-block"
    },
    {
      "include": "#expressions"
    },
    {
      "include": "#composite"
    },
    {
      "include": "#event"
    }
  ],
  "repository": {
    "code-block": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.section.scope.begin.cadence"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.section.scope.end.cadence"
        }
      },
      "patterns": [
        {
          "include": "$self"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.comment.cadence"
            }
          },
          "match": "\\A^(#!).*$\\n?",
          "name": "comment.line.number-sign.cadence"
        },
        {
          "begin": "/\\*\\*(?!/)",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.begin.cadence"
            }
          },
          "end": "\\*/",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.end.cadence"
            }
          },
          "name": "comment.block.documentation.cadence",
          "patterns": [
            {
              "include": "#nested"
            }
          ]
        },
        {
          "begin": "/\\*:",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.begin.cadence"
            }
          },
          "end": "\\*/",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.end.cadence"
            }
          },
          "name": "comment.block.documentation.playground.cadence",
          "patterns": [
            {
              "include": "#nested"
            }
          ]
        },
        {
          "begin": "/\\*",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.begin.cadence"
            }
          },
          "end": "\\*/",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.end.cadence"
            }
          },
          "name": "comment.block.cadence",
          "patterns": [
            {
              "include": "#nested"
            }
          ]
        },
        {
          "match": "\\*/",
          "name": "invalid.illegal.unexpected-end-of-block-comment.cadence"
        },
        {
          "begin": "(^[\\t ]+)?(?=//)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.cadence"
            }
          },
          "end": "(?!\\G)",
          "patterns": [
            {
              "begin": "///",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.comment.cadence"
                }
              },
              "end": "$",
              "name": "comment.line.triple-slash.documentation.cadence"
            },
            {
              "begin": "//:",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.comment.cadence"
                }
              },
              "end": "$",
              "name": "comment.line.double-slash.documentation.cadence"
            },
            {
              "begin": "//",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.comment.cadence"
                }
              },
              "end": "$",
              "name": "comment.line.double-slash.cadence"
            }
          ]
        }
      ],
      "repository": {
        "nested": {
          "begin": "/\\*",
          "end": "\\*/",
          "patterns": [
            {
              "include": "#nested"
            }
          ]
        }
      }
    },
    "composite": {
      "begin": "\\b((?:struct|resource|contract|attachment)(?:\\s+interface)?|enum)\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)",
      "beginCaptures": {
        "1": {
          "name": "storage.type.$1.cadence"
        },
        "2": {
          "name": "entity.name.type.$1.cadence"
        }
      },
      "end": "(?<=})|(?=\\s*\\Z)",
      "name": "meta.definition.type.composite.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#conformance-clause"
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.type.begin.cadence"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.type.end.cadence"
            }
          },
          "name": "meta.definition.type.body.cadence",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "conformance-clause": {
      "begin": "(:)(?=\\s*\\{)|(:)\\s*",
      "beginCaptures": {
        "1": {
          "name": "invalid.illegal.empty-conformance-clause.cadence"
        },
        "2": {
          "name": "punctuation.separator.conformance-clause.cadence"
        }
      },
      "end": "(?!\\G)$|(?=[={}])",
      "name": "meta.conformance-clause.cadence",
      "patterns": [
        {
          "begin": "\\G",
          "end": "(?!\\G)$|(?=[={}])",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#type"
            }
          ]
        }
      ]
    },
    "declarations": {
      "patterns": [
        {
          "include": "#var-let-declaration"
        },
        {
          "include": "#function"
        },
        {
          "include": "#initializer"
        },
        {
          "include": "#prepare-execute"
        },
        {
          "include": "#execute-phase"
        },
        {
          "include": "#pre-post"
        },
        {
          "include": "#transaction"
        }
      ]
    },
    "event": {
      "begin": "\\b(event)\\b\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*",
      "beginCaptures": {
        "1": {
          "name": "storage.type.event.cadence"
        },
        "2": {
          "name": "entity.name.type.event.cadence"
        }
      },
      "end": "(?<=\\))",
      "name": "meta.definition.type.event.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-clause"
        }
      ]
    },
    "execute-phase": {
      "begin": "(?<!\\.)\\b(execute)\\b\\s*(?=\\{)",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.phase.cadence"
        }
      },
      "end": "(?<=})",
      "name": "meta.definition.transaction.phase.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.phase.begin.cadence"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.phase.end.cadence"
            }
          },
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "expression-element-list": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "begin": "([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*(:)",
          "beginCaptures": {
            "1": {
              "name": "variable.parameter.function-call.cadence"
            },
            "2": {
              "name": "punctuation.separator.argument-label.cadence"
            }
          },
          "end": "(?=[]),])",
          "patterns": [
            {
              "include": "#expressions"
            }
          ]
        },
        {
          "begin": "(?![]),])(?=\\S)",
          "end": "(?=[]),])",
          "patterns": [
            {
              "include": "#expressions"
            }
          ]
        }
      ]
    },
    "expressions": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#language-variables"
        },
        {
          "include": "#function-expression"
        },
        {
          "include": "#path-literals"
        },
        {
          "begin": "(?!\\b(?:if|while|for|return|create|destroy|emit|as)\\b)([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*(<)(?=[\\&(@\\[_{\\p{Lu}]|auth\\b|\\s*$)",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.cadence"
            },
            "2": {
              "name": "punctuation.definition.type-arguments.begin.cadence"
            }
          },
          "end": "(>)(?!\\s*[<=>])",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.type-arguments.end.cadence"
            }
          },
          "name": "meta.type.arguments.cadence",
          "patterns": [
            {
              "include": "#type"
            },
            {
              "match": ",",
              "name": "punctuation.separator.type-argument.cadence"
            }
          ]
        },
        {
          "begin": "(\\()",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.arguments.begin.cadence"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.arguments.end.cadence"
            }
          },
          "name": "meta.group.cadence",
          "patterns": [
            {
              "include": "#expression-element-list"
            }
          ]
        },
        {
          "begin": "(?<=\\.)([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.cadence"
            },
            "2": {
              "name": "punctuation.definition.arguments.begin.cadence"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.arguments.end.cadence"
            }
          },
          "name": "meta.function-call.method.cadence",
          "patterns": [
            {
              "include": "#expression-element-list"
            }
          ]
        },
        {
          "match": "(?<=\\.)[_\\p{L}][_\\p{L}\\p{N}\\p{M}]*",
          "name": "variable.other.member.cadence"
        },
        {
          "include": "#function-call-expression"
        },
        {
          "match": "(?<!\\.)\\b(?!(?:contract|struct|resource|event|enum|attachment|entitlement|import|fun|let|var|if|else|switch|case|default|while|for|in|break|continue|return|emit|as|create|destroy|attach|to|remove|from|pub|priv|access|all|self|view|auth|transaction|prepare|execute|pre|post|init|true|false|nil|Type|Int|UInt|Int8|Int16|Int32|Int64|Int128|Int256|UInt8|UInt16|UInt32|UInt64|UInt128|UInt256|Word8|Word16|Word32|Word64|Fix64|Fix128|UFix64|UFix128|String|Character|Bool|Address|Void|AnyStruct|AnyResource|Any|Never|mapping|include)\\b)[_\\p{L}][_\\p{L}\\p{N}\\p{M}]*\\b",
          "name": "variable.other.readwrite.cadence"
        },
        {
          "include": "#literals"
        },
        {
          "include": "#operators"
        }
      ]
    },
    "function": {
      "begin": "\\b(fun)\\b\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*",
      "beginCaptures": {
        "1": {
          "name": "storage.type.function.cadence"
        },
        "2": {
          "name": "entity.name.function.cadence"
        }
      },
      "end": "(?<=})|;|(?=}\\s*$)|$",
      "name": "meta.definition.function.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-clause"
        },
        {
          "include": "#function-result"
        },
        {
          "begin": "(\\{)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.section.function.begin.cadence"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.section.function.end.cadence"
            }
          },
          "name": "meta.definition.function.body.cadence",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "function-call-expression": {
      "patterns": [
        {
          "begin": "(?<!\\.)\\b(?!set|init|transaction|prepare|execute|access|auth)([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.cadence"
            },
            "2": {
              "name": "punctuation.definition.arguments.begin.cadence"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.arguments.end.cadence"
            }
          },
          "name": "meta.function-call.cadence",
          "patterns": [
            {
              "include": "#expression-element-list"
            }
          ]
        }
      ]
    },
    "function-expression": {
      "begin": "(?<!\\.)\\b(?:(view)\\s+)?(fun)\\b(?=\\s*\\()",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.view.cadence"
        },
        "2": {
          "name": "storage.type.function.cadence"
        }
      },
      "end": "(?<=})|$",
      "name": "meta.function.expression.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-clause"
        },
        {
          "include": "#function-result"
        },
        {
          "begin": "(\\{)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.section.function.begin.cadence"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.section.function.end.cadence"
            }
          },
          "name": "meta.definition.function.body.cadence",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "function-result": {
      "begin": "(?<![-!%\\&*+./<=>^|~])(:)(?![-!%\\&*+./<=>^|~])\\s*",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.function-result.cadence"
        }
      },
      "end": "(?<![\\&<@\\[])(?!\\G)(?=\\s*\\{)|(?=;|(?<!\\{)})|$",
      "name": "meta.function-result.cadence",
      "patterns": [
        {
          "include": "#type"
        }
      ]
    },
    "initializer": {
      "begin": "(?<!\\.)\\b(init)\\s*(?=[(<])",
      "beginCaptures": {
        "1": {
          "name": "storage.type.function.cadence"
        }
      },
      "end": "(?<=})|$",
      "name": "meta.definition.function.initializer.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-clause"
        },
        {
          "begin": "(\\{)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.section.function.begin.cadence"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.section.function.end.cadence"
            }
          },
          "name": "meta.definition.function.body.cadence",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "match": "(?<!\\.)\\bvar\\b",
          "name": "storage.type.var.cadence"
        },
        {
          "match": "(?<!\\.)\\blet\\b",
          "name": "storage.type.let.cadence"
        },
        {
          "begin": "(?<!\\.)\\b(entitlement)\\s+(mapping)\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*(\\{)",
          "beginCaptures": {
            "1": {
              "name": "keyword.declaration.entitlement.cadence"
            },
            "2": {
              "name": "keyword.other.mapping.cadence"
            },
            "3": {
              "name": "entity.name.type.entitlement-mapping.cadence"
            },
            "4": {
              "name": "punctuation.definition.type.begin.cadence"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.type.end.cadence"
            }
          },
          "name": "meta.definition.entitlement-mapping.cadence",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "\\binclude\\b",
              "name": "keyword.other.mapping.include.cadence"
            },
            {
              "captures": {
                "1": {
                  "name": "entity.name.type.entitlement-mapping.cadence"
                }
              },
              "match": "(?<=\\binclude)\\s+([_\\p{L}][._\\p{L}\\p{N}\\p{M}]*)"
            },
            {
              "match": "[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*",
              "name": "entity.name.type.entitlement.cadence"
            },
            {
              "match": "->",
              "name": "punctuation.separator.mapping.cadence"
            }
          ]
        },
        {
          "captures": {
            "1": {
              "name": "keyword.declaration.entitlement.cadence"
            },
            "2": {
              "name": "entity.name.type.entitlement.cadence"
            }
          },
          "match": "(?<!\\.)\\b(entitlement)\\b\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)"
        },
        {
          "begin": "(?<!\\.)\\b(access)\\b\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "storage.modifier.access.cadence"
            },
            "2": {
              "name": "punctuation.section.group.begin.cadence"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.section.group.end.cadence"
            }
          },
          "name": "meta.access.modifier.cadence",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "\\bmapping\\b",
              "name": "keyword.other.mapping.cadence"
            },
            {
              "captures": {
                "1": {
                  "name": "entity.name.type.entitlement-mapping.cadence"
                }
              },
              "match": "(?<=\\bmapping)\\s+([_\\p{L}][._\\p{L}\\p{N}\\p{M}]*)"
            },
            {
              "match": "\\b(?:all|self|contract|account)\\b",
              "name": "constant.language.access.audience.cadence"
            },
            {
              "match": ",",
              "name": "punctuation.separator.entitlement.cadence"
            },
            {
              "match": "\\|",
              "name": "punctuation.separator.entitlement.cadence"
            },
            {
              "match": "[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*",
              "name": "entity.name.type.entitlement.cadence"
            }
          ]
        },
        {
          "match": "(?<!\\.)\\b(?:if|else|switch|case|default)\\b",
          "name": "keyword.control.branch.cadence"
        },
        {
          "match": "(?<!\\.)\\b(?:return|continue|break)\\b",
          "name": "keyword.control.transfer.cadence"
        },
        {
          "match": "(?<!\\.)\\b(?:while|for|in)\\b",
          "name": "keyword.control.loop.cadence"
        },
        {
          "match": "(?<!\\.)\\b(?:create|destroy|emit|attach|to|remove|from)\\b",
          "name": "keyword.other.cadence"
        },
        {
          "match": "(?<!\\.)\\b(p(?:ub|riv))\\b",
          "name": "invalid.deprecated.keyword.cadence"
        },
        {
          "match": "(?<!\\.)\\bview\\b",
          "name": "storage.modifier.view.cadence"
        },
        {
          "match": "(?<!\\.)\\b(auth)\\b",
          "name": "keyword.other.auth.cadence"
        },
        {
          "begin": "(?<!\\.)\\b(import)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.import.cadence"
            }
          },
          "end": "(?=$|//|/\\*|;)",
          "name": "meta.import.cadence",
          "patterns": [
            {
              "match": "\\bfrom\\b",
              "name": "keyword.control.import.cadence"
            },
            {
              "include": "#literals"
            },
            {
              "match": "\\b[_\\p{L}][_\\p{L}\\p{N}\\p{M}]*\\b",
              "name": "variable.other.readwrite.cadence"
            }
          ]
        }
      ]
    },
    "language-variables": {
      "patterns": [
        {
          "match": "\\b(self)\\b",
          "name": "variable.language.cadence"
        }
      ]
    },
    "literals": {
      "patterns": [
        {
          "include": "#boolean"
        },
        {
          "include": "#numeric"
        },
        {
          "include": "#string"
        },
        {
          "match": "\\bnil\\b",
          "name": "constant.language.nil.cadence"
        }
      ],
      "repository": {
        "boolean": {
          "match": "\\b(true|false)\\b",
          "name": "constant.language.boolean.cadence"
        },
        "numeric": {
          "patterns": [
            {
              "include": "#binary"
            },
            {
              "include": "#octal"
            },
            {
              "include": "#hexadecimal"
            },
            {
              "include": "#fixed-point"
            },
            {
              "include": "#decimal"
            }
          ],
          "repository": {
            "binary": {
              "match": "(\\B-|\\b)0b[01]([01_]*[01])?\\b",
              "name": "constant.numeric.integer.binary.cadence"
            },
            "decimal": {
              "match": "(\\B-|\\b)[0-9]([0-9_]*[0-9])?\\b",
              "name": "constant.numeric.integer.decimal.cadence"
            },
            "fixed-point": {
              "match": "(\\B-|\\b)[0-9]([0-9_]*[0-9])?\\.[0-9]([0-9_]*[0-9])?\\b",
              "name": "constant.numeric.float.cadence"
            },
            "hexadecimal": {
              "match": "(\\B-|\\b)0x\\h([_\\h]*\\h)?\\b",
              "name": "constant.numeric.integer.hexadecimal.cadence"
            },
            "octal": {
              "match": "(\\B-|\\b)0o[0-7]([0-7_]*[0-7])?\\b",
              "name": "constant.numeric.integer.octal.cadence"
            }
          }
        },
        "string": {
          "patterns": [
            {
              "begin": "\"",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.string.begin.cadence"
                }
              },
              "end": "\"",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.string.end.cadence"
                }
              },
              "name": "string.quoted.double.single-line.cadence",
              "patterns": [
                {
                  "match": "[\\n\\r]",
                  "name": "invalid.illegal.returns-not-allowed.cadence"
                },
                {
                  "begin": "\\\\\\(",
                  "beginCaptures": {
                    "0": {
                      "name": "punctuation.section.embedded.begin.cadence meta.embedded.cadence"
                    }
                  },
                  "contentName": "meta.embedded.line.cadence",
                  "end": "\\)",
                  "endCaptures": {
                    "0": {
                      "name": "punctuation.section.embedded.end.cadence meta.embedded.cadence"
                    }
                  },
                  "name": "meta.interpolation.cadence",
                  "patterns": [
                    {
                      "begin": "\\(",
                      "beginCaptures": {
                        "0": {
                          "name": "punctuation.section.group.begin.cadence"
                        }
                      },
                      "end": "\\)",
                      "endCaptures": {
                        "0": {
                          "name": "punctuation.section.group.end.cadence"
                        }
                      },
                      "patterns": [
                        {
                          "include": "#expressions"
                        }
                      ]
                    },
                    {
                      "include": "#expressions"
                    }
                  ]
                },
                {
                  "include": "#string-guts"
                }
              ]
            }
          ],
          "repository": {
            "string-guts": {
              "patterns": [
                {
                  "match": "\\\\[\"'0\\\\nrt]",
                  "name": "constant.character.escape.cadence"
                },
                {
                  "match": "\\\\u\\{\\h{1,8}}",
                  "name": "constant.character.escape.unicode.cadence"
                }
              ]
            }
          }
        }
      }
    },
    "operators": {
      "patterns": [
        {
          "match": "<->",
          "name": "keyword.operator.swap.cadence"
        },
        {
          "match": "\\?\\.",
          "name": "keyword.operator.optional.chain.cadence"
        },
        {
          "begin": "\\b(as(?:\\?|!?))\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.operator.type.cast.cadence"
            }
          },
          "end": "(?=$|;|//|/\\\\*|\")|(?=[),}])|(?<=>)(?=\\s*\\{(?!\\s*[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*\\s*:))|(?<=[])>?}\\p{L}\\p{N}])(?=\\s*\\{(?!\\s*[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*\\s*:))|(?=\\?\\?)",
          "name": "meta.type.cast-target.cadence",
          "patterns": [
            {
              "begin": "\\{(?=\\s*[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*\\s*:)",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.type.dictionary.begin.cadence"
                }
              },
              "end": "(})",
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.type.dictionary.end.cadence"
                }
              },
              "name": "meta.type.dictionary.cadence",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#type"
                },
                {
                  "match": ":",
                  "name": "punctuation.separator.type.dictionary.cadence"
                },
                {
                  "match": ",",
                  "name": "punctuation.separator.type.dictionary.cadence"
                }
              ]
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "match": "-",
          "name": "keyword.operator.arithmetic.unary.cadence"
        },
        {
          "match": "(?<=\\))!",
          "name": "keyword.operator.force-unwrap.cadence"
        },
        {
          "match": "!",
          "name": "keyword.operator.logical.not.cadence"
        },
        {
          "match": "=",
          "name": "keyword.operator.assignment.cadence"
        },
        {
          "match": "<-",
          "name": "keyword.operator.move.cadence"
        },
        {
          "match": "<-!",
          "name": "keyword.operator.force-move.cadence"
        },
        {
          "match": "[-*+/]",
          "name": "keyword.operator.arithmetic.cadence"
        },
        {
          "match": "%",
          "name": "keyword.operator.arithmetic.remainder.cadence"
        },
        {
          "match": ">>",
          "name": "keyword.operator.bitwise.shift.cadence"
        },
        {
          "match": "<<",
          "name": "keyword.operator.bitwise.shift.cadence"
        },
        {
          "match": "==|!=|[<>]|>=|<=",
          "name": "keyword.operator.comparison.cadence"
        },
        {
          "match": "\\?\\?",
          "name": "keyword.operator.coalescing.cadence"
        },
        {
          "match": "&&|\\|\\|",
          "name": "keyword.operator.logical.cadence"
        },
        {
          "match": "[!?]",
          "name": "keyword.operator.type.optional.cadence"
        }
      ]
    },
    "parameter-clause": {
      "begin": "(\\()",
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.parameters.begin.cadence"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.parameters.end.cadence"
        }
      },
      "name": "meta.parameter-clause.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-list"
        }
      ]
    },
    "parameter-list": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.unnamed-parameter.cadence"
            },
            "2": {
              "name": "variable.parameter.cadence"
            }
          },
          "match": "(_)\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)(?=\\s*:)"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.label.cadence"
            },
            "2": {
              "name": "variable.parameter.cadence"
            }
          },
          "match": "([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)(?=\\s*:)"
        },
        {
          "captures": {
            "1": {
              "name": "variable.parameter.cadence"
            }
          },
          "match": "([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)(?=\\s*:)"
        },
        {
          "begin": ":\\s*(?!\\s)",
          "end": "(?=[),])",
          "patterns": [
            {
              "include": "#type"
            },
            {
              "match": ":",
              "name": "invalid.illegal.extra-colon-in-parameter-list.cadence"
            }
          ]
        }
      ]
    },
    "path-literals": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "punctuation.separator.path.cadence"
            },
            "2": {
              "name": "constant.other.path.cadence"
            }
          },
          "match": "(/)((storage|public)(/[_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)?)"
        }
      ]
    },
    "pre-post": {
      "begin": "(?<!\\.)\\b(p(?:re|ost))\\b\\s*(?=\\{)",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.phase.cadence"
        }
      },
      "end": "(?<=})",
      "name": "meta.definition.transaction.phase.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.phase.begin.cadence"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.phase.end.cadence"
            }
          },
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "prepare-execute": {
      "begin": "(?<!\\.)\\b(prepare)\\b\\s*(?=\\()",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.phase.cadence"
        }
      },
      "end": "(?<=})",
      "name": "meta.definition.transaction.phase.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-clause"
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.phase.begin.cadence"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.phase.end.cadence"
            }
          },
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "transaction": {
      "begin": "\\b(transaction)\\b",
      "beginCaptures": {
        "1": {
          "name": "storage.type.transaction.cadence"
        }
      },
      "end": "(?<=\\))|(?<=})",
      "name": "meta.definition.transaction.cadence",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#parameter-clause"
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.transaction.begin.cadence"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.transaction.end.cadence"
            }
          },
          "name": "meta.definition.transaction.body.cadence",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "type": {
      "patterns": [
        {
          "begin": "(?<!\\.)\\b(?:(view)\\s+)?(fun)\\b\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "storage.modifier.view.cadence"
            },
            "2": {
              "name": "storage.type.function.cadence"
            },
            "3": {
              "name": "punctuation.definition.parameters.begin.cadence"
            }
          },
          "end": "(?=[]),>}]|$)",
          "name": "meta.type.function.cadence",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "begin": "\\G",
              "end": "(\\))",
              "endCaptures": {
                "1": {
                  "name": "punctuation.definition.parameters.end.cadence"
                }
              },
              "patterns": [
                {
                  "include": "#type"
                },
                {
                  "match": ",",
                  "name": "punctuation.separator.parameter.cadence"
                }
              ]
            },
            {
              "begin": "(:)",
              "beginCaptures": {
                "1": {
                  "name": "keyword.operator.function-result.cadence"
                }
              },
              "end": "(?=[]),>}]|$)",
              "name": "meta.function-result.cadence",
              "patterns": [
                {
                  "include": "#type"
                }
              ]
            }
          ]
        },
        {
          "include": "#comments"
        },
        {
          "begin": "(?<!\\.)([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)\\s*(<)",
          "beginCaptures": {
            "1": {
              "name": "entity.name.type.cadence"
            },
            "2": {
              "name": "punctuation.definition.type-arguments.begin.cadence"
            }
          },
          "end": "(>)",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.type-arguments.end.cadence"
            }
          },
          "name": "meta.type.arguments.cadence",
          "patterns": [
            {
              "include": "#type"
            },
            {
              "match": ",",
              "name": "punctuation.separator.type-argument.cadence"
            }
          ]
        },
        {
          "begin": "(?<!\\.)\\b(auth)\\b\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.auth.cadence"
            },
            "2": {
              "name": "punctuation.section.group.begin.cadence"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.section.group.end.cadence"
            }
          },
          "name": "meta.auth.entitlements.cadence",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "\\bmapping\\b",
              "name": "keyword.other.mapping.cadence"
            },
            {
              "captures": {
                "1": {
                  "name": "entity.name.type.entitlement-mapping.cadence"
                }
              },
              "match": "(?<=\\bmapping)\\s+([_\\p{L}][._\\p{L}\\p{N}\\p{M}]*)"
            },
            {
              "match": ",",
              "name": "punctuation.separator.entitlement.cadence"
            },
            {
              "match": "\\|",
              "name": "punctuation.separator.entitlement.cadence"
            },
            {
              "match": "[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*",
              "name": "entity.name.type.entitlement.cadence"
            }
          ]
        },
        {
          "begin": "\\{(?![^}]*:)(?!.*}\\s*\\()",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.type.intersection.begin.cadence"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.type.intersection.end.cadence"
            }
          },
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#type"
            },
            {
              "match": ",",
              "name": "punctuation.separator.type.intersection.cadence"
            }
          ]
        },
        {
          "begin": "\\{(?=\\s*[_\\p{L}][._\\p{L}\\p{N}\\p{M}]*\\s*:)(?!.*}\\s*\\()",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.type.dictionary.begin.cadence"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.type.dictionary.end.cadence"
            }
          },
          "name": "meta.type.dictionary.cadence",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#type"
            },
            {
              "match": ":",
              "name": "punctuation.separator.type.dictionary.cadence"
            },
            {
              "match": ",",
              "name": "punctuation.separator.type.dictionary.cadence"
            }
          ]
        },
        {
          "begin": "\\[",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.type.array.begin.cadence"
            }
          },
          "end": "(])",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.type.array.end.cadence"
            }
          },
          "name": "meta.type.array.cadence",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#type"
            }
          ]
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.type.reference.cadence"
            }
          },
          "match": "([\\&@])(?=\\s*\\{)"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.type.reference.cadence"
            },
            "2": {
              "name": "entity.name.type.cadence"
            }
          },
          "match": "([\\&@])\\s*([_\\p{L}][._\\p{L}\\p{N}\\p{M}]*)"
        },
        {
          "match": "([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)",
          "name": "entity.name.type.cadence"
        },
        {
          "match": "[!?]",
          "name": "keyword.operator.type.optional.cadence"
        }
      ]
    },
    "var-let-declaration": {
      "begin": "\\b(var|let)\\b\\s+([_\\p{L}][_\\p{L}\\p{N}\\p{M}]*)",
      "beginCaptures": {
        "1": {
          "name": "storage.type.$1.cadence"
        },
        "2": {
          "name": "variable.other.declaration.cadence"
        }
      },
      "end": "=|<-!??|;|(?=//)|$",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "begin": ":\\s*(?!\\s)",
          "beginCaptures": {
            "0": {
              "name": "keyword.operator.type.annotation.cadence"
            }
          },
          "end": "(?=//|=|<-!??|;|$)",
          "patterns": [
            {
              "include": "#type"
            },
            {
              "include": "#comments"
            }
          ]
        }
      ]
    }
  },
  "scopeName": "source.cadence"
}
