// This is a TextMate grammar distributed by `starry-night`. // This grammar is developed at // // and licensed `apache-2.0`. // See for more info. /** * @import {Grammar} from '@wooorm/starry-night' */ /** @type {Grammar} */ const grammar = { extensions: ['.cdc'], names: ['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: '(?)(?!\\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: '(?&|\\^~.])(:)(?![/=\\-+!*%<>&|\\^~.])\\s*', beginCaptures: {1: {name: 'keyword.operator.function-result.cadence'}}, end: '(?', name: 'punctuation.separator.mapping.cadence'} ] }, { captures: { 1: {name: 'keyword.declaration.entitlement.cadence'}, 2: {name: 'entity.name.type.entitlement.cadence'} }, match: '(?', name: 'keyword.operator.swap.cadence'}, {match: '\\?\\.', name: 'keyword.operator.optional.chain.cadence'}, { begin: '\\b(as\\?|as!|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: '(?}\\]]|$)', 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: '(?)', 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: '(?