UNPKG

@wooorm/starry-night

Version:
753 lines (750 loc) 25.2 kB
// This is a TextMate grammar distributed by `starry-night`. // This grammar is developed at // <https://github.com/nickswalker/overpassql-tmlanguage> // and licensed `mpl-2.0`. // See <https://github.com/wooorm/starry-night> for more info. /** * @import {Grammar} from '@wooorm/starry-night' */ /** @type {Grammar} */ const grammar = { extensions: ['.overpassql'], names: ['overpassql'], patterns: [{include: '#TOP'}], repository: { TOP: { patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#start-statement-context'} ] }, 'assign-variable': { captures: { 1: {name: 'keyword.operator.assignment.overpassql'}, 2: {name: 'punctuation.definition.variable.overpassql'}, 3: {name: 'variable.other.overpassql'} }, match: '(->)\\s*+(\\.)\\s*+([_a-zA-Z][_a-zA-Z0-9]*+)(?=\\s*+(?:;|$))', name: 'meta.overpassql.output-set' }, bareword: { match: '[a-zA-Z][a-zA-Z0-9]*+', name: 'meta.overpassql.bareword' }, 'block-comment': { begin: '\\/\\*', beginCaptures: { 0: {name: 'punctuation.definition.comment.begin.overpassql'} }, end: '\\*\\/', endCaptures: {0: {name: 'punctuation.definition.comment.end.overpassql'}}, name: 'comment.block.overpassql' }, 'block-construct': { begin: 'if|else|foreach|for|complete|retro|compare', beginCaptures: {0: {name: 'keyword.control.overpassql'}}, end: '(?<=[;)}])', name: 'meta.overpassql.statement.block', patterns: [ {include: '#whitespace'}, {include: '#comment'}, {include: '#parens-evaluator'}, {include: '#block-group'} ] }, 'block-group': { begin: '\\{', beginCaptures: { 0: { name: 'punctuation.section.block.begin.overpassql punctuation.section.braces.begin' } }, end: '\\}', endCaptures: { 0: { name: 'punctuation.section.block.end.overpassql punctuation.section.end.begin' } }, name: 'meta.block.overpassql', patterns: [ {include: '#whitespace'}, {include: '#comment'}, {include: '#start-statement-context'} ] }, 'builtin-evaluator-function-name': { captures: { 1: {name: 'punctuation.accessor.overpassql'}, 2: {name: 'support.function.overpassql'} }, match: '(\\.)?+(id|type|is_tag|keys|version|timestamp|changeset|uid|user|count_tags|count_members|count_distinct_members|count_by_role|count_distinct_by_role|per_member|per_vertex|pos|mtype|ref|role|angle|is_closed|geom|length|lat|lon|lstr|poly|u|set|min|max|sum|count|gcat|number|is_number|suffix|abs|date|is_date|center|tracehull|lrs_in|lrs_isect|lrs_union|lrs_min|lrs_max)(?=\\()', name: 'meta.overpassql.evaluator.function-name' }, comments: { patterns: [{include: '#block-comment'}, {include: '#line-comment'}] }, evaluator: { patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#extended-overpass-turbo-queries'}, {include: '#evaluator-operator'}, {include: '#string-literal'}, {include: '#number-literal'}, {include: '#evaluator-variable'}, {include: '#evaluator-tag-value'}, {include: '#evaluator-field-access'}, {include: '#builtin-evaluator-function-name'}, {include: '#evaluator-function-name'}, {include: '#evaluator-function-params'} ] }, 'evaluator-field-access': { captures: { 1: {name: 'punctuation.accessor.overpassql'}, 2: {name: 'variable.other.member.overpassql'} }, match: '(\\.)([a-zA-Z][a-zA-Z0-9]*+)(?!\\()', name: 'meta.overpassql.evaluator.field-access' }, 'evaluator-function-name': { captures: { 1: {name: 'punctuation.accessor.overpassql'}, 2: {name: 'variable.function.overpassql'} }, match: '(\\.)?+([a-zA-Z][a-zA-Z0-9]*+)(?=\\()', name: 'meta.overpassql.evaluator.function-name' }, 'evaluator-function-params': { begin: '\\(', beginCaptures: { 0: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.group.overpassql meta.parens.overpassql meta.overpassql.function.params', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#parameter-separator'}, {include: '#evaluator'} ] }, 'evaluator-operator': { captures: { 1: {name: 'keyword.other.overpassql'}, 2: {name: 'keyword.operator.logical.overpassql'}, 3: {name: 'keyword.operator.arithmetic.overpassql'}, 4: {name: 'keyword.operator.other.overpassql'} }, match: '(::)|(!|\\|\\||&&|==|!=|<=|>=|<|>)|(\\+|-|\\*|/)|(\\?|:)' }, 'evaluator-tag-value': { begin: '\\[', beginCaptures: { 0: {name: 'punctuation.section.brackets.begin.overpassql'} }, end: '\\]', endCaptures: {0: {name: 'punctuation.section.brackets.end.overpassql'}}, name: 'meta.overpassql.evaluator.tag-value', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#string-literal'}, {include: '#bareword'}, {include: '#evaluator'} ] }, 'evaluator-variable': { match: '([a-zA-Z][a-zA-Z0-9]*+)(?=\\.)', name: 'variable.other.overpassql' }, expression: { patterns: [ {include: '#extended-overpass-turbo-queries'}, {include: '#pair-expression'}, {include: '#number-literal'}, {include: '#string-literal'}, {include: '#setting-special-fields'}, {include: '#tag-expression'}, {include: '#query-type'}, {include: '#parens-expression'} ] }, 'extended-overpass-turbo-queries': { begin: '{{', beginCaptures: {0: {name: 'keyword.other.overpassql.turbo.begin'}}, end: '}}', endCaptures: {0: {name: 'keyword.other.overpassql.turbo.end'}}, name: 'meta.overpassql.turbo.query', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#number-literal'}, {include: '#string-literal'}, {include: '#overpass-turbo-query-name'}, {include: '#overpass-turbo-query-separator'}, {include: '#overpass-turbo-query-definition'}, {include: '#overpass-turbo-custom-query-name'} ] }, fallback: { begin: '(?=.)', end: '(?<=[;\\{|\\}])', name: 'meta.overpassql.unknown', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#number-literal'}, {include: '#string-literal'}, {include: '#query-type'}, {include: '#assign-variable'}, {include: '#input-set'} ] }, 'function-call': { begin: '(is_in|timeline)(\\()', beginCaptures: { 1: {name: 'support.function.overpassql'}, 2: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.function-call.overpassql', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#expression'}, {include: '#parameter-separator'} ] }, 'function-call-names': { match: 'is_in|timeline', name: 'support.function.overpassql' }, 'function-call-statement-function-name': { begin: '(?=(?:\\.\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+[a-zA-Z][a-zA-Z0-9]*+\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+)?+(?:is_in|timeline))', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.function-call', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#input-set'}, {include: '#function-call'}, {include: '#assign-variable'} ] }, 'function-word-statement-word-function-name': { begin: '(?=(?:\\.\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+[a-zA-Z][a-zA-Z0-9]*+\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+)?+(?:local|convert|make))', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.word-function', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#input-set'}, {include: '#word-function-names'}, {include: '#word-function-param'}, {include: '#assign-variable'} ] }, 'generic-function-call': { begin: '(\\w++)(\\()', beginCaptures: { 1: {name: 'variable.function.overpassql'}, 2: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.function-call.overpassql.generic', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#expression'}, {include: '#parameter-separator'} ] }, 'generic-function-statement-generic-name': { begin: '(?=(?:\\.\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+[a-zA-Z][a-zA-Z0-9]*+\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+)?+\\w)', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.generic-function', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#input-set'}, {include: '#generic-function-call'}, {include: '#assign-variable'} ] }, 'input-set': { captures: { 1: {name: 'punctuation.definition.variable.overpassql'}, 2: {name: 'variable.other.overpassql'} }, match: '(\\.)\\s*+([_a-zA-Z][_a-zA-Z0-9]*+)' }, 'item-statement-dot-semicolon': { begin: '(?=\\.\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+[a-zA-Z][a-zA-Z0-9]*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+;)', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.item', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#input-set'} ] }, 'line-comment': { captures: {1: {name: 'punctuation.definition.comment.begin.overpassql'}}, match: '(//).*+$', name: 'comment.double-slash.overpassql' }, 'number-literal': { captures: { 1: {name: 'keyword.operator.arithmetic.overpassql'}, 2: {name: 'constant.numeric.overpassql'} }, match: '(?<!\\w)(-)?+((?:[1-9][0-9]*+|0)(?:\\.[0-9]++)?+)(?!\\w)' }, 'operator-names': { match: '<<|>>|<|>', name: 'keyword.operator.other.overpassql' }, 'operator-statement-operator-symbol': { begin: '(?=(?:\\.\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+[a-zA-Z][a-zA-Z0-9]*+\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+)?+(?:<<|>>|<|>))', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.operator', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#input-set'}, {include: '#operator-names'}, {include: '#assign-variable'} ] }, 'out-keyword': {match: 'out\\b', name: 'keyword.other.overpassql'}, 'out-parameter': { patterns: [ {include: '#out-parameter-keyword'}, {include: '#positive-integer'}, {include: '#parens-expression'} ] }, 'out-parameter-keyword': { captures: {0: {name: 'support.constant.overpassql.out'}}, match: 'count|ids|skel|body|tags|meta|noids|geom|center|bb|asc|qt' }, 'out-statement-keyword': { begin: '(?=(?:\\.\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+[a-zA-Z][a-zA-Z0-9]*+\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+)?+out)', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.out', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#input-set'}, {include: '#out-keyword'}, {include: '#out-parameter'} ] }, 'overpass-turbo-custom-query-name': { match: '\\b[a-zA-Z][a-zA-Z0-9]*+(?=\\w*[:}=])', name: 'variable.other.overpassql.turbo' }, 'overpass-turbo-query-definition': { match: '=', name: 'keyword.operator.assignment.overpassql.turbo' }, 'overpass-turbo-query-name': { match: '\\b(bbox|center|date|geocodeId|geocodeArea|geocodeBbox|geocodeCoords|style|data)\\b', name: 'support.constant.overpassql.turbo' }, 'overpass-turbo-query-separator': { match: ':', name: 'punctuation.separator.delimiter.colon.overpassql.turbo' }, 'pair-expression': { begin: '([a-zA-Z][a-zA-Z0-9]*+)(\\()', beginCaptures: { 1: {name: 'entity.other.overpassql'}, 2: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.overpassql.pair', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#parameter-separator'}, {include: '#expression'}, {include: '#skip-term'} ] }, 'parameter-separator': { match: ',', name: 'punctuation.separator.delimiter.comma.overpassql' }, 'parens-evaluator': { begin: '\\(', beginCaptures: { 0: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.overpassql.evaluator-group', patterns: [ {include: '#whitespace'}, {include: '#comment'}, {include: '#evaluator'} ] }, 'parens-expression': { begin: '\\(', beginCaptures: { 0: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#expression'}, {include: '#parameter-separator'} ] }, 'positive-integer': { captures: {0: {name: 'constant.numeric.overpassql'}}, match: '(?<!\\w)([1-9][0-9]*+|0)(?!\\w)' }, 'q-string': { begin: "'", beginCaptures: { 0: {name: 'punctuation.definition.string.begin.overpassql'} }, end: "'", endCaptures: {0: {name: 'punctuation.definition.string.end.overpassql'}}, name: 'string.quoted.single.overpassql meta.string.overpassql', patterns: [{include: '#string-escape'}] }, 'qq-string': { begin: '"', beginCaptures: { 0: {name: 'punctuation.definition.string.begin.overpassql'} }, end: '"', endCaptures: {0: {name: 'punctuation.definition.string.end.overpassql'}}, name: 'string.quoted.double.overpassql meta.string.overpassql', patterns: [{include: '#string-escape'}] }, 'query-filter': { patterns: [ {include: '#query-filter-haskv'}, {include: '#query-filter-intersect'}, {include: '#query-filter-paren'} ] }, 'query-filter-haskv': { begin: '\\[', beginCaptures: { 0: {name: 'punctuation.definition.brackets.begin.overpassql'} }, end: '\\]', endCaptures: { 0: {name: 'punctuation.definition.brackets.end.overpassql'} }, name: 'meta.overpassql.query.filter.kv', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#query-filter-haskv-operators'}, {include: '#query-filter-haskv-insensitive'}, {include: '#string-literal'}, {include: '#bareword'} ] }, 'query-filter-haskv-insensitive': { captures: { 1: {name: 'punctuation.separator.delimiter.comma.overpassql'}, 2: {name: 'support.constant.overpassql.i'} }, match: '(,)\\s*+(i)\\s*+(?=\\])', name: 'keyword.operator.logical.overpassql' }, 'query-filter-haskv-operators': { match: '=|!=|~|!~|!', name: 'keyword.operator.logical.overpassql' }, 'query-filter-intersect': { captures: { 1: {name: 'keyword.operator.arithmetic.overpassql.intersect'}, 2: {name: 'variable.other.overpassql'} }, match: '(\\.)\\s*+([_a-zA-Z][_a-zA-Z0-9]*+)', name: 'meta.overpassql.query.filter.intersect' }, 'query-filter-keywords': { match: '\\b(n|w|r|bn|bw|br|id|around|poly|newer|changed|user|uid|area|pivot|if)\\b', name: 'keyword.other.overpassql meta.overpassql.query.filter.parens.keyword' }, 'query-filter-paren': { begin: '\\(', beginCaptures: { 0: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.group.overpassql meta.parens.overpassql meta.overpassql.query.filter.parens', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#query-filter-keywords'}, {include: '#evaluator'}, {include: '#query-filter-separator'}, {include: '#parameter-separator'}, {include: '#expression'} ] }, 'query-filter-separator': { match: ':', name: 'punctuation.separator.delimiter.colon.overpassql' }, 'query-statement-query-type': { begin: '(?=(?:node|way|relation|rel|derived|area|nwr)\\b)', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.query', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#query-type'}, {include: '#query-filter'}, {include: '#assign-variable'} ] }, 'query-type': { match: '\\b(node|way|relation|rel|derived|area|nwr)\\b', name: 'keyword.other.query.overpassql' }, 'set-difference-operator': { match: '-', name: 'keyword.operator.logical.overpassql' }, 'setting-bracket-colon': { begin: '(\\[)(?=\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+\\w++\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+:)', beginCaptures: { 0: {name: 'punctuation.definition.brackets.begin.overpassql'} }, end: '\\]', endCaptures: { 0: {name: 'punctuation.definition.brackets.end.overpassql'} }, name: 'meta.overpassql.setting', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#setting-name'}, {include: '#setting-param'}, {include: '#setting-separator'}, {include: '#parameter-separator'} ] }, 'setting-name': { match: '\\b(timeout|maxsize|out|bbox|date|diff|adiff)\\b', name: 'keyword.other.setting' }, 'setting-param': { patterns: [ {include: '#setting-special-fields'}, {include: '#parameter-separator'}, {include: '#expression'} ] }, 'setting-separator': { match: ':', name: 'punctuation.separator.delimiter.colon.overpassql' }, 'setting-special-fields': { captures: { 1: {name: 'punctuation.accessor.overpassql'}, 2: {name: 'support.constant.overpassql'}, 3: {name: 'punctuation.accessor.overpassql'}, 4: {name: 'support.constant.overpassql'}, 5: {name: 'punctuation.accessor.overpassql'}, 6: {name: 'support.constant.overpassql'} }, match: '(::)(id|type|otype|lat|lon|version|timestamp|changeset|uid|user)\\b|(::)(count)(?:(:)(nodes|ways|relations|areas))?+\\b', name: 'meta.overpassql.setting.special-field' }, 'settings-statement-bracket-colon': { begin: '(?=\\[\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+\\w++\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+:)', end: ';', endCaptures: {0: {name: 'punctuation.terminator.statement.overpassql'}}, name: 'meta.overpassql.statement.settings-declaration', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#setting-bracket-colon'} ] }, 'skip-term': {match: '[a-zA-Z][a-zA-Z0-9]*+', name: 'meta.overpassql.term'}, 'start-statement-context': { begin: '(?=.)', end: '(?<=;)', name: 'meta.context.overpassql.statement', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#extended-overpass-turbo-queries'}, {include: '#settings-statement-bracket-colon'}, {include: '#query-statement-query-type'}, {include: '#out-statement-keyword'}, {include: '#item-statement-dot-semicolon'}, {include: '#operator-statement-operator-symbol'}, {include: '#function-call-statement-function-name'}, {include: '#function-word-statement-word-function-name'}, {include: '#statement-grouping'}, {include: '#block-construct'}, {include: '#generic-function-statement-generic-name'}, {include: '#block-group'}, {include: '#fallback'} ] }, 'statement-grouping': { begin: '\\(', beginCaptures: { 0: { name: 'punctuation.section.group.begin.overpassql punctuation.section.parens.begin.overpassql' } }, end: '\\)', endCaptures: { 0: { name: 'punctuation.section.group.end.overpassql punctuation.section.parens.end.overpassql' } }, name: 'meta.overpassql.group', patterns: [ {include: '#whitespace'}, {include: '#comment'}, {include: '#set-difference-operator'}, {include: '#start-statement-context'} ] }, 'string-escape': { match: '\\\\[nt"\'\\\\]|\\\\u[0-9a-fA-F]{4}', name: 'constant.character.escape.overpassql' }, 'string-literal': { patterns: [{include: '#qq-string'}, {include: '#q-string'}] }, 'tag-correspondance': { match: '=', name: 'keyword.operator.assignment.overpassql' }, 'tag-expression': { begin: '(::)(?=\\s*+(?:/\\*(?:[^*]|\\*[^/])*+\\*/\\s*+)*+["\'a-zA-Z])', beginCaptures: {0: {name: 'punctuation.accessor.overpassql'}}, end: '(?=[,)])', name: 'meta.overpassql.tag-access', patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#string-literal'}, {include: '#bareword'} ] }, 'tag-keywords': { captures: { 1: {name: 'keyword.other.overpassql.key'}, 2: {name: 'keyword.other.overpassql.id'} }, match: '(::)(id)?+', name: 'meta.overpassql.tag-match.keyword' }, 'tag-match': { patterns: [ {include: '#whitespace'}, {include: '#comments'}, {include: '#tag-operators'}, {include: '#tag-correspondance'}, {include: '#tag-keywords'}, {include: '#evaluator'}, {include: '#string-literal'}, {include: '#bareword'} ] }, 'tag-operators': {match: '!', name: 'keyword.operator.overpassql'}, whitespace: {match: '[ \\t]++', name: 'meta.overpassql.whitespace'}, 'word-function-names': { match: 'local|convert|make', name: 'support.function.overpassql' }, 'word-function-param': { patterns: [ {include: '#query-type'}, {include: '#tag-match'}, {include: '#parameter-separator'} ] } }, scopeName: 'source.overpassql' } export default grammar