@wooorm/starry-night
Version:
Syntax highlighting, like GitHub
1,368 lines (1,367 loc) • 134 kB
JavaScript
// This is a TextMate grammar distributed by `starry-night`.
// This grammar is developed at
// <https://github.com/chriscamicas/abl-tmlanguage>
// and licensed `mit`.
// See <https://github.com/wooorm/starry-night> for more info.
/**
* @import {Grammar} from '@wooorm/starry-night'
*/
/** @type {Grammar} */
const grammar = {
extensions: ['.w'],
names: ['openedge-abl', 'progress', 'openedge', 'abl'],
patterns: [{include: '#statements'}],
repository: {
'abl-function-variable-arg': {
begin: '(?i)\\s*(set-size)\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [
{include: '#parens'},
{include: '#type-member-call'},
{include: '#variable-name'}
]
},
'abl-functions': {
patterns: [
{include: '#abl-functions-A'},
{include: '#abl-functions-B'},
{include: '#abl-functions-C'},
{include: '#abl-functions-D'},
{include: '#abl-functions-E'},
{include: '#abl-functions-F'},
{include: '#abl-functions-G'},
{include: '#abl-functions-H'},
{include: '#abl-functions-I'},
{include: '#abl-functions-K'},
{include: '#abl-functions-L'},
{include: '#abl-functions-M'},
{include: '#abl-functions-N'},
{include: '#abl-functions-O'},
{include: '#abl-functions-P'},
{include: '#abl-functions-Q'},
{include: '#abl-functions-R'},
{include: '#abl-functions-S'},
{include: '#abl-functions-T'},
{include: '#abl-functions-U'},
{include: '#abl-functions-V'},
{include: '#abl-functions-W'},
{include: '#abl-functions-Y'}
]
},
'abl-functions-A': {
begin:
'(?i)\\s*(a(?:bsolute?|bsolu?|bso?|ccumulate?|ccumula?|ccumu?|dd-interval|lias|mbiguous?|mbiguo?|mbig|scending?|scendi?|scen?|sc|udit-enabled|vailable?|vailab?|vail))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-B': {
begin:
'(?i)\\s*(b(?:ase64-decode|ase64-encode|ox|uffer-group-id|uffer-group-name|uffer-partition-id|uffer-tenant-id|uffer-tenant-name))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-C': {
begin:
'(?i)\\s*(c(?:an-do|an-find|an-query|an-set|aps|ast|hr|odepage-convert|ompares?|onnected|ount-of|urrent-changed|urrent-language?|urrent-langua?|urrent-lang|urrent-result-row|urrent-value))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-D': {
begin:
'(?i)\\s*(d(?:ata-source-modified|ataservers|ate|atetime|atetime-tz|ay|b-remote-host|bcodepage|bcollation|bname|bparam|brestrictions?|brestrictio?|brestrict?|brestri?|brest|btaskid|btype|bversion?|bversi?|ecimal?|ecim?|ec|ecrypt|efined|ynamic-cast|ynamic-current-value|ynamic-enum|ynamic-function?|ynamic-functi?|ynamic-func|ynamic-invoke|ynamic-next-value|ynamic-property))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-E': {
begin:
'(?i)\\s*(e(?:ncode|ncrypt|ntered|ntry|rror|time|xp|xtent))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-F': {
begin:
'(?i)\\s*(f(?:ill|irst|irst-of|rame-col|rame-db|rame-down|rame-field|rame-file|rame-index?|rame-line|rame-name|rame-row|rame-value?|rame-val))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-G': {
begin:
'(?i)\\s*(g(?:ateways?|enerate-pbe-key|enerate-pbe-salt|enerate-random-key|enerate-uuid|et-bits|et-byte|et-byte-order|et-bytes|et-class|et-codepages?|et-codepages?|et-collations??|et-collation?|et-collati?|et-colla?|et-db-client|et-double|et-effective-tenant-id|et-effective-tenant-name|et-float|et-int64|et-long|et-pointer-value|et-short|et-size|et-string|et-unsigned-long|et-unsigned-short|o-pending?|o-pendi?|uid))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-H': {
begin: '(?i)\\s*(h(?:andle|ash-code|ex-decode|ex-encode))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-I': {
begin:
'(?i)\\s*(i(?:ndex|nput|nt64|nteger?|nteg?|nt|nterval|s-attr-space?|s-attr-spa?|s-attr-s?|s-attr|s-codepage-fixed|s-column-codepage|s-db-multi-tenant|s-lead-byte|so-date))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-K': {
begin:
'(?i)\\s*(k(?:blabel|eycode|eyfunction?|eyfuncti?|eyfunc|eylabel|eyword|eyword-all))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-L': {
begin:
'(?i)\\s*(l(?:ast|ast-of|astkey|c|dbname|eft-trim|ength|ibrary|ine-counter?|ine-count|ist-events|ist-query-attrs|ist-set-attrs|ist-widgets|ocked|og|ogical?|ogic?|og?|ookup|ower))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-M': {
begin:
'(?i)\\s*(m(?:aximum|d5-digest|ember|essage-digest|essage-lines|inimum?|inim?|in|onth|time))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-N': {
begin:
'(?i)\\s*(n(?:ew|ext-value|ormalize|ot|ow|um-aliases?|um-alias?|um-ali|um-dbs|um-entries|um-results))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-O': {
begin: '(?i)\\s*(o(?:psys|s-dir|s-drives?|s-error|s-getenv))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-P': {
begin:
'(?i)\\s*(p(?:age-number?|age-numb?|age-size|dbname|roc-handle?|roc-hand?|roc-ha|roc-status?|roc-stat?|roc-st|rocess-architecture|rogram-name|rogress|romsgs|ropath|roversion?|roversi?))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-Q': {
begin: '(?i)\\s*(qu(?:ery-off-end|oter))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-R': {
begin:
'(?i)\\s*(r(?:-index|andom|aw|ecid|ecord-length?|ecord-leng?|ejected|elation-fields?|elation-fiel?|elation-fi|eplace|etry|eturn|eturn-value?|eturn-val|gb-value?|gb-val?|gb-v|ight-trim|ound|ow-state|owid))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-S': {
begin:
'(?i)\\s*(s(?:creen-lines|dbname|earch|eek|et-db-client|et-effective-tenant|et-size|etuserid?|etuser|ha1-digest|kip|pace|qrt|sl-server-name|tring|ubstitute?|ubstitu?|ubsti?|ubstring?|ubstri?|uper))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-T': {
begin:
'(?i)\\s*(t(?:enant-id|enant-name|enant-name-to-id|erminal|his-object|ime|imezone|o-rowid|oday|ransaction?|ransacti?|rim|runcate?|runca?|ype-of))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-U': {
begin: '(?i)\\s*(u(?:nbox|serid))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-V': {
begin: '(?i)\\s*(val(?:id-event|id-handle|id-object|ue))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-W': {
begin:
'(?i)\\s*(w(?:eekday|idget-handle?|idget-hand?|idget-ha?))\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-functions-Y': {
begin: '(?i)\\s*(year)\\s*(?=\\()',
beginCaptures: {1: {name: 'support.function.abl'}},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
name: 'meta.function-call.abl',
patterns: [{include: '#function-arguments'}]
},
'abl-system-handles': {
captures: {
1: {name: 'variable.language.abl'},
2: {name: 'punctuation.separator.colon.abl'}
},
match:
'(?i)\\b(active-window|audit-control|audit-policy|clipboard|codebase-locator|color-table|compiler|current-window|debugger|default-window|dslog-manager|(error-stat(?:us|u)?)|(file-info(?:rmation|rmatio|rmati|rmat|rma|rm|r)?)|font-table|(last-even(?:t)?)|log-manager|profiler|(rcode-info(?:rmation|rmatio|rmati|rmat|rma|rm|r)?)|security-policy|self|session|source-procedure|super|target-procedure|this-object|this-procedure|web-context)\\b(?![#$\\-_%&])'
},
'access-modifier': {
captures: {1: {name: 'keyword.other.abl'}},
match:
'(?i)\\s*(package-private|private|package-protected|protected|public|static|override|abstract|final)\\s+'
},
'analyze-suspend-resume': {
begin: '(?i)(&analyze-suspend|&analyze-resume)\\s*',
end: '(?=(?://|/\\*))|$',
name: 'comment.preprocessor.analyze-suspend.abl'
},
annotation: {
patterns: [
{include: '#annotation-simple'},
{include: '#annotation-attributes'}
]
},
'annotation-attributes': {
begin: '(^|\\s+)(\\@[a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*(?=\\()',
beginCaptures: {2: {name: 'entity.name.tag.abl'}},
end: '(?=\\.)',
name: 'meta.declaration.annotation.abl',
patterns: [
{include: '#parens'},
{
captures: {1: {name: 'entity.other.attribute-name.abl'}},
match: '\\s*([a-zA-Z_][a-zA-Z0-9_#$\\-%&]+)(?=[\\=\\s$])'
},
{include: '#string'},
{include: '#operator-no-space'},
{include: '#punctuation-comma'}
]
},
'annotation-simple': {
captures: {2: {name: 'entity.name.tag.abl'}},
match: '(^|\\s*)(\\@[a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*(?=\\.)',
name: 'meta.declaration.annotation.abl'
},
'argument-reference': {
captures: {
1: {name: 'meta.argument.abl'},
2: {name: 'punctuation.section.abl'},
3: {name: 'support.other.argument.abl'},
4: {name: 'punctuation.section.abl'}
},
match: '\\s*(({)([0-9]+|\\*\\s*)(}))\\s*'
},
'array-literal': {
begin: '\\[',
beginCaptures: {
0: {name: 'punctuation.definition.bracket.square.begin.abl'}
},
end: '\\]',
endCaptures: {0: {name: 'punctuation.definition.bracket.square.end.abl'}},
name: 'meta.array.literal.abl',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\s+(for)\\s+'
},
{include: '#expression'},
{include: '#preprocessors'},
{include: '#comment'},
{include: '#punctuation-comma'}
]
},
'array-use': {
begin: '\\[',
beginCaptures: {
0: {name: 'punctuation.definition.bracket.square.begin.abl'}
},
end: '\\]',
endCaptures: {0: {name: 'punctuation.definition.bracket.square.end.abl'}},
name: 'meta.array.literal.abl',
patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
},
'as-type': {
begin: '\\s*([Aa][Ss])\\s*([Cc][Ll][Aa][Ss]{2})?',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
end: '\\s*(\\.|\\,|\\s*)',
patterns: [{include: '#primitive-type'}, {include: '#type-names'}]
},
'assign-statment': {
patterns: [
{include: '#abl-functions'},
{include: '#language-functions'},
{include: '#string'},
{include: '#expression'},
{include: '#argument-reference'},
{include: '#preprocessors'},
{include: '#attribute-access'},
{include: '#buffer-name'},
{include: '#can-find'},
{include: '#abl-system-handles'},
{include: '#db-dot-table-dot-field'},
{include: '#extent'},
{include: '#function-arguments'},
{include: '#get-class'},
{include: '#handle-attributes'},
{include: '#handle-methods'},
{include: '#if-then'},
{include: '#operator'},
{include: '#type-member-call'},
{include: '#include-file'},
{include: '#new-record'},
{include: '#new-class'},
{include: '#record-buffer-functions'},
{include: '#rowid-function'},
{include: '#type-names'}
]
},
'attribute-access': {begin: ':', end: '(?=:)|(?=\\s*)'},
'block-label': {
captures: {
2: {name: 'entity.name.label.abl'},
3: {name: 'punctuation.terminator.abl'}
},
match:
'(?i)^\\s*(?!((?:transact(?:ion|io|i)?)|no-lock|(?:exclusive-l(?:ock|oc|o)?)|(?:share(?:-lock|-loc|-lo|-l|-)?)):)([a-zA-Z][a-zA-Z0-9_\\-#$%\\-$#]*)(:)\\s'
},
'block-statement': {
begin: '(?i)(?<!end)\\s*(do|repeat|finally)\\b',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '\\s*(?=:)|(?<=:)|(?=\\.)|(?<=\\.)\\s*',
name: 'meta.block.abl',
patterns: [
{
match: '(?i)\\b((transact(?:ion|io|i)?)|stop-after|and|or)\\b',
name: 'keyword.other.abl'
},
{include: '#logical-expression'},
{include: '#while-expression'},
{include: '#for-record'},
{
match: '(?i)\\b((transact(?:ion|io|i)?)|stop-after)\\b',
name: 'keyword.other.abl'
},
{include: '#numeric'},
{include: '#type-member-call'},
{include: '#language-functions'},
{include: '#abl-functions'},
{include: '#punctuation-comma'},
{include: '#punctuation-colon'},
{include: '#branch-options'}
]
},
'block-undo-leave-next-retry': {
captures: {
1: {name: 'keyword.other.abl'},
3: {name: 'entity.name.label.abl'}
},
match:
'(?i)\\s*(?<!,)\\s*(leave|next|retry|undo)\\b(?!on)(\\s+([a-zA-Z0-9_\\-#$%\\-$]*))?\\s*'
},
'branch-leave-next-retry-throw': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'entity.name.label.abl'}
},
match:
'(?i)\\s*(?<=,)\\s*(leave|next|retry|throw)\\s*(?!on)([a-zA-Z0-9_\\-#$%\\-$]*)?\\s*'
},
'branch-options': {
patterns: [
{include: '#on-error-endkey-stop'},
{include: '#branch-leave-next-retry-throw'},
{include: '#branch-return-value-double'},
{include: '#branch-return-value-single'},
{include: '#branch-return-no-apply'},
{include: '#branch-return-error-expression'},
{include: '#punctuation-comma'}
]
},
'branch-return-error-expression': {
begin: '(?i)\\s*(return)\\s+(error)\\s*',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
end: '(?=:|$)',
patterns: [
{include: '#new-class'},
{include: '#function-arguments'},
{include: '#parens'},
{include: '#property-call'},
{include: '#preprocessors'},
{include: '#expression'}
]
},
'branch-return-no-apply': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
match: '(?i)\\s*(return)\\s+(no-apply)\\s*'
},
'branch-return-value-double': {
begin: '(?i)\\s*(return)(\\s+(error))?\\s+(")',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'},
3: {name: 'punctuation.definition.string.begin.abl'}
},
end: '(")',
endCaptures: {1: {name: 'punctuation.definition.string.end.abl'}},
patterns: [{include: '#escape-char'}]
},
'branch-return-value-single': {
begin: "(?i)\\s*(return)(\\s+(error))?\\s+(')",
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'},
3: {name: 'punctuation.definition.string.begin.abl'}
},
end: "(')",
endCaptures: {1: {name: 'punctuation.definition.string.end.abl'}},
name: 'string.quoted.single.abl',
patterns: [{include: '#escape-char'}]
},
'break-by': {
captures: {
2: {name: 'keyword.other.abl'},
3: {name: 'keyword.other.abl'},
4: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\s*((break)\\s+)?(by)\\s+(([a-zA-Z][a-zA-Z_\\-#$%]*\\.)?([a-zA-Z][a-zA-Z_\\-#$%]*\\.)([a-zA-Z][a-zA-Z_\\-#$%]*)(\\[\\d+\\])?)\\b'
},
'break-group': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'meta.brace.round.js'},
3: {name: 'storage.data.table.abl'},
4: {name: 'meta.brace.round.js'}
},
match:
'(?i)\\s*(first-of|first|last-of|last)\\s*(\\()\\s*([a-zA-Z][a-zA-Z#$\\-_%&]*\\.[a-zA-Z_][a-zA-Z#$\\-_%&]*(\\.[a-zA-Z_][a-zA-Z#$\\-_%&]*)?)\\s*(\\))\\s*'
},
'buffer-copy': {
begin:
'(?i)\\b(buffer-copy)\\s+([a-zA-Z_][a-zA-Z0-9_\\-#$%]+(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?)',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
end: '(?=\\.)',
patterns: [
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
match:
'\\b([Tt][Oo])\\s+([a-zA-Z_][a-zA-Z0-9_\\-#$%]+(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?)'
},
{include: '#using-except'},
{include: '#comment'},
{include: '#preprocessors'},
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\b(assign|no-lobs|no-error)\\b'
},
{include: '#db-dot-table-dot-field'},
{include: '#assign-statment'},
{include: '#keywords'},
{include: '#expression'}
]
},
'buffer-for-table': {
captures: {
1: {name: 'storage.data.table.abl'},
2: {name: 'keyword.other.abl'},
4: {name: 'keyword.other.abl'},
5: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\s*(?!do|repeat|for)([a-zA-Z][a-zA-Z_0-9\\-#$%]*)\\s+(for)\\s+((temp-table)\\s+)?([a-zA-Z][a-zA-Z0-9_\\-#$%]*)\\s*'
},
'buffer-name': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\b(buffer)\\s+([a-zA-Z][a-zA-Z0-9_\\-#$%]*(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?)'
},
'cache-value': {
captures: {
1: {name: 'keyword.other.abl'},
3: {name: 'constant.numeric.source.abl'}
},
match:
'\\b([Cc][Aa][Cc][Hh][Ee])\\s+(0[xX][[:xdigit:]]+)?|(\\-?[0-9]+(\\.[0-9]+)?)\\b'
},
'can-find': {
begin: '(?i)\\s*(can-find)\\s*(\\()',
beginCaptures: {
1: {name: 'support.function.abl'},
2: {name: 'meta.brace.round.js'}
},
end: '(?i)\\b(?=\\)|where|no-lock|(share(?:-lock|-loc|-lo|-l|-)?)|using|(no-prefe(?:tch|tc|t)?)|no-wait)\\s*',
patterns: [
{include: '#parens'},
{include: '#comment'},
{include: '#string'},
{include: '#numeric'},
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\b(first|last)\\b'
},
{include: '#use-index'},
{include: '#of-phrase'},
{include: '#db-dot-table'},
{include: '#db-dot-table-dot-field'}
]
},
'code-block': {
patterns: [
{include: '#create-statement'},
{include: '#record-buffer-functions'},
{include: '#can-find'},
{include: '#comment'},
{include: '#break-group'},
{include: '#block-undo-leave-next-retry'},
{include: '#operator'},
{include: '#string'},
{include: '#language-functions'},
{include: '#numeric'},
{include: '#constant'},
{include: '#operator'},
{include: '#include-file'},
{include: '#run-statement'},
{include: '#define'},
{include: '#block-statement'},
{include: '#end-block'},
{include: '#property-call'},
{include: '#new-record'},
{include: '#type-reference'},
{include: '#abl-functions'},
{include: '#abl-system-handles'},
{include: '#handle-methods'},
{include: '#handle-attributes'},
{include: '#keywords'},
{include: '#variable-name'},
{include: '#static-object-property-call'},
{include: '#punctuation-period'},
{include: '#punctuation-colon'}
]
},
comment: {
patterns: [
{include: '#singlelinecomment'},
{include: '#multilinecomment'}
]
},
constant: {
match:
'(?i)(?<=^|\\b|\\s|\\()(true|false|yes|no|\\?)(?![a-zA-Z0-9_\\-#$%])',
name: 'constant.language.abl'
},
'copy-lob': {
begin: '(?i)\\b(copy-lob)\\b',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(?=\\.)',
patterns: [{include: '#code-block'}]
},
'create-alias': {
begin: '(?i)\\s*(create)\\s+(alias)\\s*',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
end: '(?=\\.)',
patterns: [
{include: '#abl-functions'},
{include: '#keywords'},
{
captures: {1: {name: 'storage.data.database.abl'}},
match: '\\b([a-zA-Z0-9][a-zA-Z0-9_\\-]*)\\b'
},
{include: '#expression'}
]
},
'create-buffer': {
begin: '(?i)(create)\\s+(buffer)\\b',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
end: '(?i)(\\b((buffer-n(?:ame|am|a)?)|in)\\b)|(?=\\.)',
endCaptures: {1: {name: 'keyword.other.abl'}},
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\s*(for|table)\\s*'
},
{include: '#define-table'},
{include: '#buffer-name'},
{include: '#temp-table-name'},
{include: '#expression'},
{include: '#keywords'},
{include: '#string'},
{include: '#comment'},
{include: '#handle-attributes'},
{include: '#variable-name'}
]
},
'create-record': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'},
5: {name: 'keyword.other.abl'},
6: {name: 'keyword.other.abl'}
},
match:
'(?i)\\s*(create)\\s+([a-zA-Z][a-zA-Z0-9_\\-#$%]*(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?)\\s*((for)\\s+(tenant))?\\s*'
},
'create-statement': {
patterns: [
{include: '#create-buffer'},
{include: '#create-alias'},
{include: '#create-widget'},
{include: '#create-with-expression'},
{include: '#create-record'}
]
},
'create-widget': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'},
3: {name: 'variable.other.abl'}
},
match:
'(?i)\\s*(create)\\s+(button|combo-box|(?:control-fram(?:e)?)|dialog-box|editor|fill-in|(?:fram(?:e)?)|image|menu|menu-item|radio-set|(?:rect(?:angle|angl|ang|an|a)?)|selection-list|slider|sub-menu|text|toggle-box|window)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\b'
},
'create-with-expression': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
match:
'(?i)\\s*(create)\\s+(browse|call|client-principal|database|dataset|data-source|query|sax-attributes|sax-reader|sax-writer|server|server-socket|soap-header|soap-header-entryref|socket|temp-table|widget-pool|x-document|x-noderef)\\s*'
},
'dataset-name': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.dataset.abl'}
},
match: '(?i)\\s*(dataset)\\s+([a-zA-Z][a-zA-Z0-9_\\-]*)'
},
'db-dot-table': {
captures: {1: {name: 'storage.data.table.abl'}},
match:
'(?i)\\b([a-zA-Z_][a-zA-Z0-9#$\\-_%&]*(\\.[a-zA-Z_][a-zA-Z0-9#$\\-_%&]*)?)(?=[^a-zA-Z0-9#$\\-_%&])'
},
'db-dot-table-dot-field': {
captures: {1: {name: 'storage.data.table.abl'}},
match:
'(?i)(?<=^|\\s|\\(|,)(([a-zA-Z][a-zA-Z0-9#$\\-_%&]*\\.)?([a-zA-Z_][a-zA-Z0-9#$\\-_%&]*\\.)([a-zA-Z_][a-zA-Z0-9#$\\-_%&]*)(\\[\\d+\\])?)'
},
decimals: {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'constant.numeric.source.abl'}
},
match: '(?i)\\s*(decimals)\\s((0x)?[[:xdigit:]]+)?'
},
declarations: {patterns: [{include: '#define'}]},
define: {
begin: '(?i)\\s*(def(?:ine|in|i)?)\\b',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(\\.)(?!\\w)',
endCaptures: {1: {name: 'punctuation.terminator.abl'}},
name: 'meta.define.abl',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\s*(new|(glob(?:al|a|)?)|shared)\\s*'
},
{include: '#serializable'},
{include: '#access-modifier'},
{include: '#define-enum-member'},
{include: '#define-variable'},
{include: '#define-parameter'},
{include: '#define-button'},
{include: '#define-dataset'},
{include: '#define-query'},
{include: '#define-browse'},
{include: '#fields-except-list'},
{include: '#define-event'},
{include: '#define-property'},
{include: '#property-accessor'},
{include: '#array-literal'},
{include: '#define-field'},
{include: '#parameter-as'},
{include: '#define-stream'},
{include: '#define-buffer'},
{include: '#define-frame'},
{include: '#for-table'},
{include: '#buffer-for-table'},
{include: '#define-table'},
{include: '#define-index'},
{include: '#define-like'},
{include: '#field-as-object'},
{include: '#preprocessors'},
{include: '#extent'},
{include: '#decimals'},
{include: '#format-constant'},
{include: '#timestamp-constant'},
{include: '#constant'},
{include: '#numeric'},
{include: '#string'},
{include: '#primitive-type'},
{include: '#dll-type'},
{include: '#abl-system-handles'},
{include: '#property-call'},
{include: '#handle-attributes'},
{include: '#handle-methods'},
{include: '#abl-functions'},
{include: '#function-parameter-definition'},
{include: '#keywords'},
{include: '#comment'},
{include: '#label-variable'},
{include: '#type-names'}
]
},
'define-browse': {
begin: '(?i)\\b(browse)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
end: '(?i)\\b(?=\\.)',
patterns: [
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
match:
'\\b([Qq][Uu][Ee][Rr][Yy])\\s+([a-zA-Z][a-zA-Z0-9\\-_#$%\\&]+)\\b'
},
{
captures: {1: {name: 'keyword.other.abl'}},
match:
'(?i)\\b((share(?:-lock|-loc|-lo|-l|-)?)|(exclusive-l(?:ock|oc|o)?)|no-lock|no-wait|(disp(?:lay|la|l)?))\\b'
},
{include: '#comment'},
{include: '#db-dot-table-dot-field'},
{include: '#keywords'},
{include: '#expression'}
]
},
'define-buffer': {
begin: '(?i)\\s*(buffer)\\b(?![#$\\-_%&])',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(?=\\.)',
patterns: [
{include: '#for-table'},
{include: '#buffer-for-table'},
{include: '#keywords'},
{include: '#comment'},
{include: '#string'}
]
},
'define-button': {
begin: '(?i)\\s*(button)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
end: '(?=\\.)',
patterns: [
{include: '#comment'},
{include: '#string'},
{include: '#from-x-and-y'},
{include: '#numeric'},
{include: '#keywords'},
{include: '#expression'}
]
},
'define-class': {
begin: '\\b(?<![#$\\-_%&])([Cc][Ll][Aa][Ss]{2})\\b(?![#$\\-_%&])',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '\\s*(:)\\s*',
endCaptures: {1: {name: 'punctuation.terminator.abl'}},
name: 'meta.define.class.abl',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match:
'(?i)\\s*(serializable|abstract|final|use-widget-pool|inherits|implements)\\s*'
},
{include: '#type-names'},
{include: '#punctuation-comma'},
{include: '#comment'}
]
},
'define-dataset': {
begin: '(?i)\\b(dataset)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\b',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.dataset.abl'}
},
end: '(?=\\.)',
patterns: [
{include: '#parens'},
{include: '#punctuation-comma'},
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.dataset.abl'}
},
match:
'(?i)\\b((?:data-rel(?:ation|atio|ati|at|a)?)|parent-id-relation)\\s*([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)'
},
{
captures: {1: {name: 'support.function.abl'}},
match: '(?i)\\b(relation-fi(?:elds|eld|el|e)?)\\b'
},
{include: '#keywords'},
{include: '#preprocessors'},
{include: '#db-dot-table'},
{include: '#comment'},
{include: '#string'}
]
},
'define-enum-member': {
begin: '(?i)\\b(enum)\\b',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(?=\\.)',
patterns: [
{include: '#comment'},
{include: '#operator'},
{include: '#numeric'},
{
captures: {1: {name: 'entity.name.function.abl'}},
match: '\\b([a-zA-Z][a-zA-Z0-9_#$%]*)\\b'
}
]
},
'define-enum-type': {
patterns: [
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'entity.name.type.abl'},
3: {name: 'keyword.other.abl'},
4: {name: 'punctuation.terminator.abl'}
},
match: '(?i)\\b(enum)\\s+([\\w#$%\\.]+)\\s*(flags)?\\s*(:)',
name: 'meta.define.enum.abl'
}
]
},
'define-event': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'entity.name.function.abl'}
},
match: '(?i)\\b(event)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\b'
},
'define-field': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
match: '(?i)\\s*(field)\\s+([a-zA-Z][a-zA-Z0-9_\\-#$%]*)\\s*'
},
'define-frame': {
begin: '(?i)\\s*((?:fram(?:e)?))\\s*([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
end: '(?=[Ww][Ii][Tt][Hh]|\\.(?!\\w))',
patterns: [
{include: '#comment'},
{include: '#string'},
{include: '#numeric'},
{include: '#preprocessors'},
{include: '#abl-functions'},
{include: '#keywords'},
{include: '#db-dot-table-dot-field'},
{include: '#constant'},
{include: '#variable-name'}
]
},
'define-index': {
begin: '(?i)\\s*(index)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
end: '(?i)(?=\\bindex\\b|\\.)',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match:
'(?i)\\b(AS|IS|UNIQUE|PRIMARY|WORD-INDEX|(asc(?:ending|endin|endi|end|en|e)?)|(desc(?:ending|endin|endi|end|en|e)?))\\b'
},
{
captures: {1: {name: 'storage.data.table.abl'}},
match: '\\b([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\b'
},
{include: '#comment'}
]
},
'define-interface': {
begin:
'(?i)\\b(interface)\\s+([\\w#$%]+[\\w#$%\\.]*(\\s*<\\s*[\\w#$%\\.]+\\s*\\>)?)',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'entity.name.type.abl'}
},
end: '\\s*(:)',
endCaptures: {1: {name: 'punctuation.terminator.abl'}},
name: 'meta.define.interface.abl',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\s*(inherits|implements)\\s*'
},
{include: '#type-names'},
{include: '#punctuation-comma'}
]
},
'define-like': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\s*(like|like-sequential)\\s+(([a-zA-Z][a-zA-Z_\\-#$%]*\\.)?([a-zA-Z][a-zA-Z0-9_\\-#$%]*\\.)?([a-zA-Z][a-zA-Z0-9_\\-#$%]*))'
},
'define-parameter': {
begin: '(?i)\\b(param(?:eter|ete|et|e)?)\\b',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(?i)(?=\\.)|\\b(?=(bgc(?:olor|olo|ol|o)?)|(column-lab(?:el|e)?)|context-help-id|dcolor|decimals|drop-target|extent|font|(fgc(?:olor|olo|ol|o)?)|(form(?:at|a)?)|initial|label|(mouse-p(?:ointer|ointe|oint|oin|oi|o)?)|no-undo|not|(case-sen(?:sitive|sitiv|siti|sit|si|s)?)|(pfc(?:olor|olo|ol|o)?)|view-as|triggers)\\b',
patterns: [
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'},
3: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\b(table)\\s+(for)\\s+([a-zA-Z][a-zA-Z_\\-#$%]*(\\.[a-zA-Z][a-zA-Z_\\-#$%]*)?)\\b'
},
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
match:
'(?i)\\b(table-handle|dataset-handle)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\b'
},
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'},
3: {name: 'storage.data.dataset.abl'}
},
match:
'(?i)\\b(dataset)\\s+(for)\\s+([a-zA-Z_\\-#$%]+(\\.[a-zA-Z_\\-#$%]+)?)\\b'
},
{include: '#parameter-as'},
{include: '#keywords'},
{include: '#expression'}
]
},
'define-property': {
begin: '(?i)\\b(property)\\b',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '\\s*(?=[Gg][Ee][Tt]|[Ss][Ee][Tt])',
patterns: [
{include: '#property-as'},
{include: '#comment'},
{include: '#primitive-type'},
{include: '#extent'},
{include: '#decimals'},
{include: '#array-literal'},
{include: '#timestamp-constant'},
{include: '#numeric'},
{include: '#keywords'},
{include: '#string'},
{include: '#type-names'}
]
},
'define-query': {
begin: '(?i)\\b(query)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
end: '(?i)(?=\\.\\s*)',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match:
'(?i)\\b(for|scrolling|(rcode-info(?:rmation|rmatio|rmati|rmat|rma|rm|r)?))\\b'
},
{include: '#cache-value'},
{include: '#db-dot-table'},
{include: '#fields-except-list'},
{include: '#punctuation-comma'},
{include: '#expression'},
{include: '#keywords'}
]
},
'define-stream': {
captures: {
1: {name: 'keyword.other.abl'},
2: {patterns: [{include: '#variable-name'}]}
},
match: '(?i)\\s*(stream)\\s*([a-zA-Z][a-zA-Z0-9_\\-#$%\\-]*)',
name: 'meta.define.stream.abl'
},
'define-table': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
match:
'(?i)(?<=\\b)(temp-table|before-table)\\s*([a-zA-Z_][a-zA-Z0-9_\\-#$%]*)\\s*'
},
'define-type': {
patterns: [
{include: '#define-class'},
{include: '#define-interface'},
{include: '#define-enum-type'}
]
},
'define-variable': {
begin: '(?i)\\s*(var(?:iable|iabl|iab|ia|i)?)\\s*',
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(?i)(?=\\.)|\\b(?=(bgc(?:olor|olo|ol|o)?)|(column-lab(?:el|e)?)|context-help-id|dcolor|decimals|drop-target|extent|font|(fgc(?:olor|olo|ol|o)?)|(form(?:at|a)?)|(init(?:ial|ia|i)?)|label|(mouse-p(?:ointer|ointe|oint|oin|oi|o)?)|no-undo|not|(case-sen(?:sitive|sitiv|siti|sit|si|s)?)|(pfc(?:olor|olo|ol|o)?)|view-as|triggers)\\b',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '\\b([Cc][Ll][Aa][Ss][Ss])\\b'
},
{include: '#variable-as'},
{include: '#variable-like'},
{include: '#primitive-type'},
{include: '#define-like'},
{include: '#type-names'},
{include: '#string'}
]
},
'define-variable-name': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'variable.other.abl'}
},
match:
'(?i)(var(?:iable|iabl|iab|ia|i)?)\\s+([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*'
},
'dll-type': {
captures: {1: {name: 'storage.type.abl'}},
match:
'(?i)\\b(byte|unsigned-short|short|unsigned-long|long|int64|float)\\b'
},
'double-colon-field-name': {
captures: {1: {name: 'storage.data.table.abl'}},
match: '\\s*::([a-zA-Z_\\-#$%]+)\\s*'
},
doublequotedstring: {
begin: '(")',
beginCaptures: {1: {name: 'punctuation.definition.string.begin.abl'}},
end: '(?i)(")(:[LlRrTtCcUu]\\d*\\b)?',
endCaptures: {
1: {name: 'punctuation.definition.string.end.abl'},
2: {name: 'support.other.abl'}
},
name: 'string.quoted.double.abl',
patterns: [{include: '#escape-char'}]
},
'end-block': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
match:
'(?i)\\s*(end)\\s+(CASE|CATCH|CLASS|CONSTRUCTOR|DESTRUCTOR|ENUM|FINALLY|FUNCTION|GET|INTERFACE|METHOD|PROCEDURE|SET|TRIGGERS)\\s*'
},
'end-function-procedure-method-block': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'}
},
match: '(?i)\\s*(end)\\s*(method|procedure|function)?\\s*(?=\\.)\\s*'
},
'escape-char': {match: '~.', name: 'constant.character.escape.abl'},
'escape-endline': {
captures: {1: {name: 'punctuation.separator.continuation'}},
match: '(~)\\s*$'
},
'event-un-subscribe': {
begin: '(?i)(:)(unsubscribe|subscribe)\\s*(\\()',
beginCaptures: {
1: {name: 'punctuation.separator.colon.abl'},
2: {name: 'entity.name.function.abl'},
3: {name: 'meta.brace.round.js'}
},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
patterns: [
{
captures: {
1: {name: 'entity.name.type.abl'},
3: {name: 'punctuation.separator.colon.abl'}
},
match: '\\s*([\\w#$%\\-]+(\\.[\\w#$%\\-]+)+)\\s*(:)'
},
{
captures: {
1: {name: 'variable.other.abl'},
3: {name: 'punctuation.separator.comma.abl'},
4: {name: 'punctuation.separator.colon.abl'}
},
match: '\\s*([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*((,)|(:))\\s*'
},
{
captures: {1: {name: 'entity.name.function.abl'}},
match: '\\s*([a-zA-Z_][a-zA-Z0-9_#$\\-%&]*)\\s*'
},
{include: '#string'}
]
},
expression: {
patterns: [
{include: '#string'},
{include: '#timestamp-constant'},
{include: '#constant'},
{include: '#numeric'},
{include: '#variable-name'},
{include: '#double-colon-field-name'}
]
},
extent: {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'constant.numeric.source.abl'}
},
match: '(?i)\\s*(extent)\\s*((0x)?[[:xdigit:]]+\\b)?'
},
'field-as-object': {
captures: {1: {name: 'entity.name.type.abl'}},
match: '(?i)\\s*((progress\\.lang\\.)?object)\\s*'
},
'field-name': {
patterns: [
{
captures: {1: {name: 'storage.data.table.abl'}},
match:
'\\s*([a-zA-Z][a-zA-Z0-9_\\-#$%]*(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?\\s*(\\[\\d+\\]))\\s*'
},
{
captures: {1: {name: 'storage.data.table.abl'}},
match:
'\\s*([a-zA-Z][a-zA-Z0-9_\\-#$%]*(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?)\\s*'
}
]
},
'fields-except-list': {
begin: '(?i)\\s*(fields|except)\\s*(\\()',
beginCaptures: {
1: {name: 'keyword.other.abl'},
2: {name: 'meta.brace.round.js'}
},
end: '(\\))',
endCaptures: {1: {name: 'meta.brace.round.js'}},
patterns: [
{include: '#db-dot-table-dot-field'},
{include: '#field-name'},
{include: '#punctuation-comma'}
]
},
'find-record': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'keyword.other.abl'},
3: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\s*(find)\\s+(first|last|next|prev|current)?\\s*([a-zA-Z_][a-zA-Z0-9#$\\-_%&]+(\\.[a-zA-Z_][a-zA-Z0-9#$\\-_%&]*)?)\\s*'
},
'for-each-join': {
begin: '(?i)\\b(each|first|last)\\b(?<!\\()',
beginCaptures: {
1: {name: 'keyword.other.abl'},
3: {name: 'storage.data.table.abl'}
},
end: '(?i)\\s*(?=where|no-lock|(exclusive-l(?:ock|oc|o)?)|(share(?:-lock|-loc|-lo|-l|-)?)|tenant-where|use-index|table-scan|using|(no-prefe(?:tch|tc|t)?)|left|outer-join|break|by|(transact(?:ion|io|i)?)|,|:)\\s*',
patterns: [
{include: '#fields-except-list'},
{include: '#of-phrase'},
{
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'storage.data.table.abl'}
},
match:
'(?i)\\s*(of)\\s+([a-zA-Z][a-zA-Z_\\-#$%]*(\\.[a-zA-Z][a-zA-Z_\\-#$%]*)?)\\s*'
},
{
captures: {1: {name: 'storage.data.table.abl'}},
match:
'\\s*([a-zA-Z][a-zA-Z0-9_\\-#$%]*(\\.[a-zA-Z][a-zA-Z0-9_\\-#$%]*)?)\\s*'
}
]
},
'for-each-table': {
beginCaptures: {1: {name: 'keyword.other.abl'}},
end: '(?i)\\s*(?=where|no-lock|(exclusive-l(?:ock|oc|o)?)|(share(?:-lock|-loc|-lo|-l|-)?)|tenant-where|use-index|table-scan|using|(no-prefe(?:tch|tc|t)?)|left|outer-join|break|by|(transact(?:ion|io|i)?)|,|:|on)\\s*',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\s*(each|first|last|of)\\s*'
},
{include: '#fields-except-list'},
{include: '#of-phrase'},
{include: '#field-name'},
{include: '#db-dot-table'},
{include: '#db-dot-table-dot-field'},
{include: '#while-expression'},
{include: '#comment'}
]
},
'for-join': {
captures: {1: {name: 'storage.data.table.abl'}},
match:
'(?i)(?<=,|^)\\s*([a-zA-Z][a-zA-Z0-9_\\-#$%]*(\\.[a-zA-Z_][a-zA-Z0-9_\\-#$%]*)?)\\s+(?=where|no-lock|(exclusive-l(?:ock|oc|o)?)|(share(?:-lock|-loc|-lo|-l|-)?)|tenant-where|use-index|table-scan|using|(no-prefe(?:tch|tc|t)?)|left|outer-join|break|by|(transact(?:ion|io|i)?))\\s*'
},
'for-record': {
captures: {
1: {name: 'keyword.other.abl'},
10: {name: 'storage.data.table.abl'},
11: {name: 'punctuation.separator.comma.abl'},
12: {name: 'storage.data.table.abl'},
2: {name: 'storage.data.table.abl'},
3: {name: 'punctuation.separator.comma.abl'},
4: {name: 'storage.data.table.abl'},
5: {name: 'punctuation.separator.comma.abl'},
6: {name: 'storage.data.table.abl'},
7: {name: 'punctuation.separator.comma.abl'},
8: {name: 'storage.data.table.abl'},
9: {name: 'punctuation.separator.comma.abl'}
},
match:
'(?i)\\s*(for)\\s+([a-zA-Z_\\-#$%]*)\\s*(,)?\\s*([a-zA-Z_\\-#$%]*)?\\s*(,)?\\s*([a-zA-Z_\\-#$%]*)?\\s*(,)?\\s*([a-zA-Z_\\-#$%]*)?\\s*(,)?\\s*([a-zA-Z_\\-#$%]*)?\\s*(,)?\\s*([a-zA-Z_\\-#$%]*)?'
},
'for-table': {
captures: {
1: {name: 'keyword.other.abl'},
3: {name: 'keyword.other.abl'},
4: {name: 'storage.data.table.abl'}
},
match: '(?i)\\s*(for)\\s+((temp-table)\\s+)?([a-zA-Z_\\-#$%]+)\\s*'
},
'format-constant': {
captures: {
1: {name: 'keyword.other.abl'},
2: {name: 'constant.language.source.abl'}
},
match: '(?i)\\b((?:form(?:at|a)?))\\s+(9+/9+/9+)\\b'
},
'from-to-by': {
begin: '\\s*([a-zA-Z0-9_\\-#$%$\\-_%&]+)\\s+(=)\\s*',
beginCaptures: {
1: {name: 'variable.other.abl'},
2: {name: 'keyword.operator.source.abl'}
},
end: '(?i)(?=(transact(?:ion|io|i)?)|on|:|with|while)',
patterns: [
{
captures: {1: {name: 'keyword.other.abl'}},
match: '(?i)\\s+(to|by)\\s*'
},
{include: '#numeric'},
{include: '#branch-options'},
{include: '#abl-functions'},
{include: '#db-dot-table-dot-field'},
{include: '#expression'}
]
},
'from-x-and-y': {
captures: {
1: {name: 'keyword.other.abl'},
12: {name: 'constant.numeric.source.abl'},
2: {name: 'keyword.other.abl'},
6: {name: 'constant.numeric.source.abl'},
8: {name: 'keyword.other.abl'}
},
match:
'(?i)\\b(from)\\s+(X)\\s+((0(x)[[[:xdigit:]]]+)|(\\-?[[0-9]]+(\\.[[0-9]]+)?))\\s+(y)\\s+((0(x)[[[:xdigit:]]]+)|(\\-?[[0-9]]+(\\.[[0-9]]+)?))\\s+ '
},
'function-arguments': {
begin: '(?=\\()',
beginCaptures: {1: {name: 'meta.brace.round.js'}},
end: '(?=\\))',
endCaptures: {1: {name: 'met