abl-tmlanguage 1.3.12 → 1.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,17 +11,19 @@
11
11
  // abl-functions.txt can be created by copying the 'Related Links' from https://docs.progress.com/bundle/abl-reference/page/ABL-Syntax-Reference.html
12
12
  //
13
13
 
14
- const fs = require('fs');
14
+ import * as fs from 'node:fs';
15
+ import * as readline from 'node:readline';
16
+ import {optimize} from 'oniguruma-parser/optimizer';
15
17
 
16
- let lineReaderMethods = require('readline').createInterface({
18
+ let lineReaderMethods = readline.createInterface({
17
19
  input: fs.createReadStream('abl-methods.txt')
18
20
  });
19
21
 
20
- let lineReaderFunctions = require('readline').createInterface({
22
+ let lineReaderFunctions = readline.createInterface({
21
23
  input: fs.createReadStream('abl-functions.txt')
22
24
  });
23
25
 
24
- let lineReaderKeywords = require('readline').createInterface({
26
+ let lineReaderKeywords = readline.createInterface({
25
27
  input: fs.createReadStream('abl-keywords.txt')
26
28
  });
27
29
 
@@ -43,19 +45,23 @@ alsoStatements.push('auto-go');
43
45
  alsoStatements.push('available');
44
46
  alsoStatements.push('bgcolor');
45
47
  alsoStatements.push('centered');
46
- alsoStatements.push('context-help-id');
47
48
  alsoStatements.push('column-label');
49
+ alsoStatements.push('context-help-id');
48
50
  alsoStatements.push('dcolor');
51
+ alsoStatements.push('default-button');
49
52
  alsoStatements.push('default');
50
53
  alsoStatements.push('delete');
51
54
  alsoStatements.push('delimiter');
52
55
  alsoStatements.push('drop-target');
56
+ alsoStatements.push('edge-pixels');
53
57
  alsoStatements.push('fgcolor');
54
58
  alsoStatements.push('first');
55
59
  alsoStatements.push('flat-button');
56
60
  alsoStatements.push('font');
57
61
  alsoStatements.push('foreign-key-hidden');
58
62
  alsoStatements.push('format');
63
+ alsoStatements.push('graphic-edge');
64
+ alsoStatements.push('help');
59
65
  alsoStatements.push('hidden');
60
66
  alsoStatements.push('image-down');
61
67
  alsoStatements.push('image-insensitive');
@@ -71,24 +77,31 @@ alsoStatements.push('namespace-prefix');
71
77
  alsoStatements.push('namespace-uri');
72
78
  alsoStatements.push('nested');
73
79
  alsoStatements.push('no-focus');
80
+ alsoStatements.push('page-bottom');
74
81
  alsoStatements.push('pfcolor');
75
82
  alsoStatements.push('recursive');
76
83
  alsoStatements.push('resize');
77
84
  alsoStatements.push('return-value');
78
85
  alsoStatements.push('row');
79
86
  alsoStatements.push('scroll-bars');
87
+ alsoStatements.push('scrollable');
80
88
  alsoStatements.push('sensitive');
81
89
  alsoStatements.push('separators');
82
90
  alsoStatements.push('serialize-hidden');
83
91
  alsoStatements.push('serialize-name');
92
+ alsoStatements.push('show-in-taskbar');
93
+ alsoStatements.push('side-labels');
84
94
  alsoStatements.push('single-run');
85
95
  alsoStatements.push('status-area');
86
96
  alsoStatements.push('three-d');
87
97
  alsoStatements.push('title');
88
98
  alsoStatements.push('tooltip');
89
99
  alsoStatements.push('transaction');
100
+ alsoStatements.push('value');
90
101
  alsoStatements.push('view-as');
91
102
  alsoStatements.push('warning');
103
+ alsoStatements.push('widget-id');
104
+ alsoStatements.push('write');
92
105
  alsoStatements.push('xml-data-type');
93
106
  alsoStatements.push('xml-node-name');
94
107
  alsoStatements.push('xml-node-type');
@@ -102,6 +115,7 @@ alsoFunctions.push('os-dir');
102
115
  alsoFunctions.push('relation-fields');
103
116
  alsoFunctions.push('return');
104
117
  alsoFunctions.push('skip');
118
+ alsoFunctions.push('space');
105
119
  alsoFunctions.push('substitute');
106
120
  alsoFunctions.push('this-object');
107
121
  alsoFunctions.push('value');
@@ -109,26 +123,21 @@ alsoFunctions.push('value');
109
123
  let alsoKeywords = [];
110
124
  alsoKeywords.push('get-collation'); //plural version as key
111
125
 
112
- // This may holds the keyword names and their regex entries
113
- let keywordEntries = new Map();
114
- let minKeywords = new Map();
115
-
116
126
  // The documentation does not reflect all abbreviations
127
+ let minKeywords = new Map();
117
128
  minKeywords.set('log', 'logical');
118
- keywordEntries.set('logical', '(log(?:ical|ica|ic|i)?)|lo|l|(longch(?:ar|a)?)');
119
-
120
129
  minKeywords.set('&glob', '&global-define');
121
- keywordEntries.set('&global-define', '(?:&glob(?:al-define|al-defin|al-defi|al-def|al-de|al-d|al-|al|a)?)');
122
-
123
130
  minKeywords.set('&scop', '&scoped-define');
124
- keywordEntries.set('&scoped-define', '(?:&scop(?:ed-define|ed-defin|ed-defi|ed-def|ed-de|ed-d|ed-|ed|e)?)');
125
-
126
131
  minKeywords.set('glob', 'global');
127
- keywordEntries.set('global', '(?:glob(?:al|a)?)');
128
-
129
132
  minKeywords.set('var', 'variable');
130
- keywordEntries.set('variable', '(var(?:iable|iabl|iab|ia|i)?)');
131
133
 
134
+ // This may holds the keyword names and their regex entries
135
+ let keywordEntries = new Map();
136
+ keywordEntries.set('logical', 'logical|logica|logic|logi|log|lo');
137
+ keywordEntries.set('&global-define', '&global-define|&global-defin|&global-defi|&global-def|&global-de|&global-d|&global-|&global|&globa|&glob)');
138
+ keywordEntries.set('&scoped-define', '&scoped-define|&scoped-defin|&scoped-defi|&scoped-def|&scoped-de|&scoped-d|&scoped-|&scoped|&scope|&scop');
139
+ keywordEntries.set('global', 'global|globa|glob');
140
+ keywordEntries.set('variable', 'variable|variabl|variab|varia|vari|var');
132
141
 
133
142
  lineReaderMethods.on('line', line => {
134
143
  let results;
@@ -217,18 +226,11 @@ lineReaderKeywords.on('line', line => {
217
226
  if (kw.indexOf('(') !== -1) {
218
227
  let kwParts = kw.split('(');
219
228
  let fullKw = kwParts[0] + kwParts[1];
220
-
221
- // Add shortest version first, then the remainder in length order, eg
222
- // (char(?:haracter|haracte|haract|harac|hara)?)?
223
- // CHARACTER differs in the keywords from the actual behaviour
224
- let kwRegex = '(' + kwParts[0] + '(?:';
229
+ let kwRegex = '';
225
230
  for (let i = kwParts[1].length; i > 0; i--) {
226
- kwRegex += kwParts[1].substring(0, i);
227
- if (i > 1) {
228
- kwRegex += '|';
229
- }
231
+ kwRegex += kwParts[0] + kwParts[1].substring(0, i) + '|';
230
232
  }
231
- kwRegex += ')?)';
233
+ kwRegex += kwParts[0];
232
234
  addToBlock(charIdx, fullKw, kwParts[0], kwRegex);
233
235
  } else {
234
236
  addToBlock(charIdx, kw, kw, kw);
@@ -253,7 +255,7 @@ function getKwRegex(fullKw) {
253
255
  }
254
256
  }
255
257
 
256
- // Adds the kewword regex to the relevant block
258
+ // Adds the keyword regex to the relevant block
257
259
  function addToBlock(charIdx, fullKw, minKw, kwRegex) {
258
260
  // We will use these to resolve the full keywords later
259
261
  if (!minKeywords.has(minKw)) {
@@ -280,10 +282,15 @@ function addToBlock(charIdx, fullKw, minKw, kwRegex) {
280
282
  function replaceKeywordsWithRegex (kwArray) {
281
283
  let regexBlocks = [];
282
284
 
283
- for (idx in kwArray) {
285
+ for (var idx in kwArray) {
284
286
  regexBlocks[idx] = getKwRegex(kwArray[idx]);
285
287
  }
286
- return regexBlocks;
288
+
289
+ let cleanBlocks = regexBlocks.sort().filter(val => val).join('|');
290
+
291
+ // remove any empty entries before joining
292
+ // approach from https://stackoverflow.com/a/19903533/18177
293
+ return optimize(cleanBlocks).pattern;
287
294
  }
288
295
 
289
296
  lineReaderFunctions.on('close', () => {
@@ -301,7 +308,7 @@ lineReaderFunctions.on('close', () => {
301
308
  result['keywords-' + String.fromCharCode(97 + zz).toUpperCase()] =
302
309
  {
303
310
  comment: "The keyword must not have a trailing variable character (one of #$-_%&)",
304
- match: "(?i)\\b(" + replaceKeywordsWithRegex(keywordBlocks[zz]).sort().join('|') + ")\\b(?![#$\\-_%&])",
311
+ match: "(?i)\\b(" + replaceKeywordsWithRegex(keywordBlocks[zz]) + ")\\b(?![#$\\-_%&])",
305
312
  captures: {
306
313
  1: {
307
314
  name: "keyword.other.abl"
@@ -320,7 +327,7 @@ lineReaderFunctions.on('close', () => {
320
327
 
321
328
  result['handle-attributes-' + String.fromCharCode(97 + zz).toUpperCase()] =
322
329
  {
323
- match: "(?i)(:)(" + replaceKeywordsWithRegex(attributeBlocks[zz]).sort().join('|') + ")\\b(?![#$\\-_%&])",
330
+ match: "(?i)(:)(" + replaceKeywordsWithRegex(attributeBlocks[zz]) + ")\\b(?![#$\\-_%&])",
324
331
  captures: {
325
332
  1: {
326
333
  name: "punctuation.separator.colon.abl"
@@ -341,7 +348,7 @@ lineReaderFunctions.on('close', () => {
341
348
 
342
349
  result['handle-methods-' + String.fromCharCode(97 + zz).toUpperCase()] =
343
350
  {
344
- begin: "(?i)(:)(" + replaceKeywordsWithRegex(methodBlocks[zz]).sort().join('|') + ")\\s*(?=\\()",
351
+ begin: "(?i)(:)(" + replaceKeywordsWithRegex(methodBlocks[zz]) + ")\\s*(?=\\()",
345
352
  beginCaptures: {
346
353
  1: {
347
354
  name: "punctuation.separator.colon.abl"
@@ -374,7 +381,7 @@ lineReaderFunctions.on('close', () => {
374
381
  result['abl-functions-' + String.fromCharCode(97 + zz).toUpperCase()] =
375
382
  {
376
383
  name: "meta.function-call.abl",
377
- begin: "(?i)\\s*(" + replaceKeywordsWithRegex(functionBlocks[zz]).sort().join('|') + ")\\s*(?=\\()",
384
+ begin: "(?i)\\s*(" + replaceKeywordsWithRegex(functionBlocks[zz]) + ")\\s*(?=\\()",
378
385
  beginCaptures: {
379
386
  1: {
380
387
  name: "support.function.abl"
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "abl-tmlanguage",
3
- "version": "1.3.12",
3
+ "version": "1.3.14",
4
4
  "description": "TextMate grammar for Progress OpenEdge ABL Language",
5
5
  "main": "",
6
+ "type": "commonjs",
6
7
  "repository": {
7
8
  "type": "git",
8
9
  "url": "git@github.com:chriscamicas/abl-tmlanguage.git"
@@ -14,7 +15,7 @@
14
15
  },
15
16
  "homepage": "https://github.com/chriscamicas/abl-tmlanguage",
16
17
  "scripts": {
17
- "build": "node index.js",
18
+ "build": "node index.mjs",
18
19
  "test": "mocha spec/*/*.spec.js",
19
20
  "test:single": "mocha",
20
21
  "test:debug": "mocha 'spec/*/*.spec.js' -- --inspect-brk=5858"
@@ -25,5 +26,8 @@
25
26
  "mocha": "^10.2.0",
26
27
  "vscode-oniguruma": "^1.6.2",
27
28
  "vscode-textmate": "^7.0.4"
29
+ },
30
+ "dependencies": {
31
+ "oniguruma-parser": "^0.12.0"
28
32
  }
29
- }
33
+ }
@@ -175,4 +175,27 @@ end.`;
175
175
  ]
176
176
  ]
177
177
  shared.itShouldMatchExpectedScopes(statement, expectedTokens);
178
+ })
179
+
180
+ describe('', () => {
181
+ // The Next in NextOrderprocessError should not be a flow statement
182
+ let statement = `ASSIGN NextOrderprocessError = UIMessage:canFindFirstUIMessage("SH0057A").`;
183
+ let expectedTokens = [
184
+ { "startIndex": 0, "endIndex": 6, "scopes": ["source.abl", "keyword.other.abl"] }, // 'ASSIGN'
185
+ { "startIndex": 6, "endIndex": 7, "scopes": ["source.abl"] }, // ' '
186
+ { "startIndex": 7, "endIndex": 28, "scopes": ["source.abl", "variable.other.abl"] }, // 'NextOrderprocessError'
187
+ { "startIndex": 28, "endIndex": 29, "scopes": ["source.abl"] }, // ' '
188
+ { "startIndex": 29, "endIndex": 30, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
189
+ { "startIndex": 30, "endIndex": 31, "scopes": ["source.abl"] }, // ' '
190
+ { "startIndex": 31, "endIndex": 40, "scopes": ["source.abl", "variable.other.abl"] }, // 'UIMessage'
191
+ { "startIndex": 40, "endIndex": 41, "scopes": ["source.abl", "punctuation.separator.colon.abl"] }, // ':'
192
+ { "startIndex": 41, "endIndex": 62, "scopes": ["source.abl", "entity.name.function.abl"] }, // 'canFindFirstUIMessage'
193
+ { "startIndex": 62, "endIndex": 63, "scopes": ["source.abl", "meta.function.arguments.abl", "meta.brace.round.js"] }, // '('
194
+ { "startIndex": 63, "endIndex": 64, "scopes": ["source.abl", "meta.function.arguments.abl", "string.double.complex.abl", "punctuation.definition.string.begin.abl"] }, // '"'
195
+ { "startIndex": 64, "endIndex": 71, "scopes": ["source.abl", "meta.function.arguments.abl", "string.double.complex.abl"] }, // 'SH0057A'
196
+ { "startIndex": 71, "endIndex": 72, "scopes": ["source.abl", "meta.function.arguments.abl", "string.double.complex.abl", "punctuation.definition.string.end.abl"] }, // '"'
197
+ { "startIndex": 72, "endIndex": 73, "scopes": ["source.abl", "meta.brace.round.js"] }, // ')'
198
+ { "startIndex": 73, "endIndex": 74, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
199
+ ]
200
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
178
201
  })
@@ -0,0 +1,239 @@
1
+ const { assert, expect } = require('chai');
2
+ const shared = require('../shared.js');
3
+
4
+ describe('', () => {
5
+ let statement = `buffer-copy custname using address-1 address-2 city state zip country phone fax
6
+ to ar-remit-from
7
+ assign ar-remit-from.remit-from-name = custname.cust-name
8
+ ar-remit-from.state = CAPS(custname.state).`;
9
+ let expectedTokens = [
10
+ [
11
+ { "startIndex": 0, "endIndex": 11, "scopes": ["source.abl", "keyword.other.abl"] }, // 'buffer-copy'
12
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
13
+ { "startIndex": 12, "endIndex": 20, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'custname'
14
+ { "startIndex": 20, "endIndex": 21, "scopes": ["source.abl"] }, // ' '
15
+ { "startIndex": 21, "endIndex": 26, "scopes": ["source.abl", "keyword.other.abl"] }, // 'using'
16
+ { "startIndex": 26, "endIndex": 27, "scopes": ["source.abl"] }, // ' '
17
+ { "startIndex": 27, "endIndex": 36, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'address-1'
18
+ { "startIndex": 36, "endIndex": 37, "scopes": ["source.abl"] }, // ' '
19
+ { "startIndex": 37, "endIndex": 46, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'address-2'
20
+ { "startIndex": 46, "endIndex": 47, "scopes": ["source.abl"] }, // ' '
21
+ { "startIndex": 47, "endIndex": 51, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'city'
22
+ { "startIndex": 51, "endIndex": 52, "scopes": ["source.abl"] }, // ' '
23
+ { "startIndex": 52, "endIndex": 57, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'state'
24
+ { "startIndex": 57, "endIndex": 58, "scopes": ["source.abl"] }, // ' '
25
+ { "startIndex": 58, "endIndex": 61, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'zip'
26
+ { "startIndex": 61, "endIndex": 62, "scopes": ["source.abl"] }, // ' '
27
+ { "startIndex": 62, "endIndex": 69, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'country'
28
+ { "startIndex": 69, "endIndex": 70, "scopes": ["source.abl"] }, // ' '
29
+ { "startIndex": 70, "endIndex": 75, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'phone'
30
+ { "startIndex": 75, "endIndex": 76, "scopes": ["source.abl"] }, // ' '
31
+ { "startIndex": 76, "endIndex": 79, "scopes": ["source.abl", "storage.data.table.abl"] } // 'fax'
32
+ ],
33
+ [
34
+ { "startIndex": 0, "endIndex": 9, "scopes": ["source.abl"] }, // ' '
35
+ { "startIndex": 9, "endIndex": 11, "scopes": ["source.abl", "keyword.other.abl"] }, // 'to'
36
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
37
+ { "startIndex": 12, "endIndex": 25, "scopes": ["source.abl", "storage.data.table.abl"] } // 'ar-remit-from'
38
+ ],
39
+ [
40
+ { "startIndex": 0, "endIndex": 16, "scopes": ["source.abl"] }, // ' '
41
+ { "startIndex": 16, "endIndex": 22, "scopes": ["source.abl", "keyword.other.abl"] }, // 'assign'
42
+ { "startIndex": 22, "endIndex": 23, "scopes": ["source.abl"] }, // ' '
43
+ { "startIndex": 23, "endIndex": 52, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'ar-remit-from.remit-from-name'
44
+ { "startIndex": 52, "endIndex": 53, "scopes": ["source.abl"] }, // ' '
45
+ { "startIndex": 53, "endIndex": 54, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
46
+ { "startIndex": 54, "endIndex": 55, "scopes": ["source.abl"] }, // ' '
47
+ { "startIndex": 55, "endIndex": 73, "scopes": ["source.abl", "storage.data.table.abl"] } // 'custname.cust-name'
48
+ ],
49
+ [
50
+ { "startIndex": 0, "endIndex": 23, "scopes": ["source.abl"] }, // ' '
51
+ { "startIndex": 23, "endIndex": 42, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'ar-remit-from.state'
52
+ { "startIndex": 42, "endIndex": 53, "scopes": ["source.abl"] }, // ' '
53
+ { "startIndex": 53, "endIndex": 54, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
54
+ { "startIndex": 54, "endIndex": 55, "scopes": ["source.abl", "meta.function-call.abl"] }, // ' '
55
+ { "startIndex": 55, "endIndex": 59, "scopes": ["source.abl", "meta.function-call.abl", "support.function.abl"] }, // 'CAPS'
56
+ { "startIndex": 59, "endIndex": 60, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "meta.brace.round.js"] }, // '('
57
+ { "startIndex": 60, "endIndex": 74, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "storage.data.table.abl"] }, // 'custname.state'
58
+ { "startIndex": 74, "endIndex": 75, "scopes": ["source.abl", "meta.function-call.abl", "meta.brace.round.js"] }, // ')'
59
+ { "startIndex": 75, "endIndex": 76, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
60
+ ]
61
+ ];
62
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
63
+ })
64
+
65
+ describe('', () => {
66
+ let statement = `BUFFER-COPY source
67
+ EXCEPT f1 f4 af
68
+ uSING field
69
+ TO target ASSIGN target.f23 = caps("abf")
70
+ NO-LOBS NO-ERROR`;
71
+ let expectedTokens = [
72
+ [
73
+ { "startIndex": 0, "endIndex": 11, "scopes": ["source.abl", "keyword.other.abl"] }, // 'BUFFER-COPY'
74
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
75
+ { "startIndex": 12, "endIndex": 18, "scopes": ["source.abl", "storage.data.table.abl"] } // 'source'
76
+ ],
77
+ [
78
+ { "startIndex": 0, "endIndex": 6, "scopes": ["source.abl", "keyword.other.abl"] }, // 'EXCEPT'
79
+ { "startIndex": 6, "endIndex": 7, "scopes": ["source.abl"] }, // ' '
80
+ { "startIndex": 7, "endIndex": 9, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'f1'
81
+ { "startIndex": 9, "endIndex": 10, "scopes": ["source.abl"] }, // ' '
82
+ { "startIndex": 10, "endIndex": 12, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'f4'
83
+ { "startIndex": 12, "endIndex": 13, "scopes": ["source.abl"] }, // ' '
84
+ { "startIndex": 13, "endIndex": 15, "scopes": ["source.abl", "storage.data.table.abl"] } // 'af'
85
+ ],
86
+ [
87
+ { "startIndex": 0, "endIndex": 2, "scopes": ["source.abl"] }, // ' '
88
+ { "startIndex": 2, "endIndex": 7, "scopes": ["source.abl", "keyword.other.abl"] }, // 'uSING'
89
+ { "startIndex": 7, "endIndex": 8, "scopes": ["source.abl"] }, // ' '
90
+ { "startIndex": 8, "endIndex": 13, "scopes": ["source.abl", "storage.data.table.abl"] } // 'field'
91
+ ],
92
+ [
93
+ { "startIndex": 0, "endIndex": 2, "scopes": ["source.abl"] }, // ' '
94
+ { "startIndex": 2, "endIndex": 4, "scopes": ["source.abl", "keyword.other.abl"] }, // 'TO'
95
+ { "startIndex": 4, "endIndex": 5, "scopes": ["source.abl"] }, // ' '
96
+ { "startIndex": 5, "endIndex": 11, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'target'
97
+ { "startIndex": 11, "endIndex": 13, "scopes": ["source.abl"] }, // ' '
98
+ { "startIndex": 13, "endIndex": 19, "scopes": ["source.abl", "keyword.other.abl"] }, // 'ASSIGN'
99
+ { "startIndex": 19, "endIndex": 20, "scopes": ["source.abl"] }, // ' '
100
+ { "startIndex": 20, "endIndex": 30, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'target.f23'
101
+ { "startIndex": 30, "endIndex": 31, "scopes": ["source.abl"] }, // ' '
102
+ { "startIndex": 31, "endIndex": 32, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
103
+ { "startIndex": 32, "endIndex": 33, "scopes": ["source.abl", "meta.function-call.abl"] }, // ' '
104
+ { "startIndex": 33, "endIndex": 37, "scopes": ["source.abl", "meta.function-call.abl", "support.function.abl"] }, // 'caps'
105
+ { "startIndex": 37, "endIndex": 38, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "meta.brace.round.js"] }, // '('
106
+ { "startIndex": 38, "endIndex": 39, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "string.double.complex.abl", "punctuation.definition.string.begin.abl"] }, // '"'
107
+ { "startIndex": 39, "endIndex": 42, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "string.double.complex.abl"] }, // 'abf'
108
+ { "startIndex": 42, "endIndex": 43, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "string.double.complex.abl", "punctuation.definition.string.end.abl"] }, // '"'
109
+ { "startIndex": 43, "endIndex": 44, "scopes": ["source.abl", "meta.function-call.abl", "meta.brace.round.js"] } // ')'
110
+ ],
111
+ [
112
+ { "startIndex": 0, "endIndex": 3, "scopes": ["source.abl"] }, // ' '
113
+ { "startIndex": 3, "endIndex": 10, "scopes": ["source.abl", "keyword.other.abl"] }, // 'NO-LOBS'
114
+ { "startIndex": 10, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
115
+ { "startIndex": 12, "endIndex": 20, "scopes": ["source.abl", "keyword.other.abl"] } // 'NO-ERROR'
116
+ ]
117
+ ];
118
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
119
+ })
120
+
121
+ describe('', () => {
122
+ let statement = `buffer-COPY s2k.customer to customer-archive .`;
123
+ let expectedTokens = [
124
+ { "startIndex": 0, "endIndex": 11, "scopes": ["source.abl", "keyword.other.abl"] }, // 'buffer-COPY'
125
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
126
+ { "startIndex": 12, "endIndex": 24, "scopes": ["source.abl", "storage.data.table.abl"] }, // 's2k.customer'
127
+ { "startIndex": 24, "endIndex": 29, "scopes": ["source.abl"] }, // ' '
128
+ { "startIndex": 29, "endIndex": 31, "scopes": ["source.abl", "keyword.other.abl"] }, // 'to'
129
+ { "startIndex": 31, "endIndex": 32, "scopes": ["source.abl"] }, // ' '
130
+ { "startIndex": 32, "endIndex": 48, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'customer-archive'
131
+ { "startIndex": 48, "endIndex": 51, "scopes": ["source.abl"] }, // ' '
132
+ { "startIndex": 51, "endIndex": 52, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
133
+ ];
134
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
135
+ })
136
+
137
+ describe('', () => {
138
+ let statement = `buffer-COPY {&file} to {&file}-archive .`;
139
+ let expectedTokens = [
140
+ { "startIndex": 0, "endIndex": 11, "scopes": ["source.abl", "keyword.other.abl"] }, // 'buffer-COPY'
141
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
142
+ { "startIndex": 12, "endIndex": 19, "scopes": ["source.abl", "storage.type.function.abl"] }, // '{&file}'
143
+ { "startIndex": 19, "endIndex": 24, "scopes": ["source.abl"] }, // ' '
144
+ { "startIndex": 24, "endIndex": 26, "scopes": ["source.abl", "keyword.other.abl"] }, // 'to'
145
+ { "startIndex": 26, "endIndex": 27, "scopes": ["source.abl"] }, // ' '
146
+ { "startIndex": 27, "endIndex": 34, "scopes": ["source.abl", "storage.type.function.abl"] }, // '{&file}'
147
+ { "startIndex": 34, "endIndex": 35, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '-'
148
+ { "startIndex": 35, "endIndex": 45, "scopes": ["source.abl"] }, // 'archive '
149
+ { "startIndex": 45, "endIndex": 46, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
150
+ ];
151
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
152
+ })
153
+
154
+ describe('', () => {
155
+ let statement = `BUFFER-COPY ttPerms EXCEPT Can-SubSeq Can-SubExpr TO ttPerms0
156
+ ASSIGN ttPerms0.Can-SubSeq = 0
157
+ ttPerms0.Can-SubExpr = ?.`;
158
+ let expectedTokens = [
159
+ [
160
+ { "startIndex": 0, "endIndex": 11, "scopes": ["source.abl", "keyword.other.abl"] }, // 'BUFFER-COPY'
161
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl"] }, // ' '
162
+ { "startIndex": 12, "endIndex": 19, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'ttPerms'
163
+ { "startIndex": 19, "endIndex": 20, "scopes": ["source.abl"] }, // ' '
164
+ { "startIndex": 20, "endIndex": 26, "scopes": ["source.abl", "keyword.other.abl"] }, // 'EXCEPT'
165
+ { "startIndex": 26, "endIndex": 27, "scopes": ["source.abl"] }, // ' '
166
+ { "startIndex": 27, "endIndex": 37, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'Can-SubSeq'
167
+ { "startIndex": 37, "endIndex": 38, "scopes": ["source.abl"] }, // ' '
168
+ { "startIndex": 38, "endIndex": 49, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'Can-SubExpr'
169
+ { "startIndex": 49, "endIndex": 50, "scopes": ["source.abl"] }, // ' '
170
+ { "startIndex": 50, "endIndex": 52, "scopes": ["source.abl", "keyword.other.abl"] }, // 'TO'
171
+ { "startIndex": 52, "endIndex": 53, "scopes": ["source.abl"] }, // ' '
172
+ { "startIndex": 53, "endIndex": 61, "scopes": ["source.abl", "storage.data.table.abl"] } // 'ttPerms0'
173
+ ],
174
+ [
175
+ { "startIndex": 0, "endIndex": 28, "scopes": ["source.abl"] }, // ' '
176
+ { "startIndex": 28, "endIndex": 34, "scopes": ["source.abl", "keyword.other.abl"] }, // 'ASSIGN'
177
+ { "startIndex": 34, "endIndex": 35, "scopes": ["source.abl"] }, // ' '
178
+ { "startIndex": 35, "endIndex": 54, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'ttPerms0.Can-SubSeq'
179
+ { "startIndex": 54, "endIndex": 55, "scopes": ["source.abl"] }, // ' '
180
+ { "startIndex": 55, "endIndex": 56, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
181
+ { "startIndex": 56, "endIndex": 57, "scopes": ["source.abl"] }, // ' '
182
+ { "startIndex": 57, "endIndex": 58, "scopes": ["source.abl", "constant.numeric.source.abl"] } // '0'
183
+ ],
184
+ [
185
+ { "startIndex": 0, "endIndex": 35, "scopes": ["source.abl"] }, // ' '
186
+ { "startIndex": 35, "endIndex": 55, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'ttPerms0.Can-SubExpr'
187
+ { "startIndex": 55, "endIndex": 56, "scopes": ["source.abl"] }, // ' '
188
+ { "startIndex": 56, "endIndex": 57, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
189
+ { "startIndex": 57, "endIndex": 58, "scopes": ["source.abl"] }, // ' '
190
+ { "startIndex": 58, "endIndex": 59, "scopes": ["source.abl", "constant.language.abl"] }, // '?'
191
+ { "startIndex": 59, "endIndex": 60, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
192
+ ]
193
+ ];
194
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
195
+ })
196
+
197
+ describe('', () => {
198
+ let statement = ` BUFFER-COPY template_TRG TO _TRG
199
+ ASSIGN _TRG._pRECID = RECID(_P)
200
+ _TRG._wRECID = RECID(_U).`;
201
+ let expectedTokens = [
202
+ [
203
+ { "startIndex": 0, "endIndex": 7, "scopes": ["source.abl"] }, // ' '
204
+ { "startIndex": 7, "endIndex": 18, "scopes": ["source.abl", "keyword.other.abl"] }, // 'BUFFER-COPY'
205
+ { "startIndex": 18, "endIndex": 19, "scopes": ["source.abl"] }, // ' '
206
+ { "startIndex": 19, "endIndex": 31, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'template_TRG'
207
+ { "startIndex": 31, "endIndex": 32, "scopes": ["source.abl"] }, // ' '
208
+ { "startIndex": 32, "endIndex": 34, "scopes": ["source.abl", "keyword.other.abl"] }, // 'TO'
209
+ { "startIndex": 34, "endIndex": 35, "scopes": ["source.abl"] }, // ' '
210
+ { "startIndex": 35, "endIndex": 39, "scopes": ["source.abl", "storage.data.table.abl"] } // '_TRG'
211
+ ],
212
+ [
213
+ { "startIndex": 0, "endIndex": 9, "scopes": ["source.abl"] }, // ' '
214
+ { "startIndex": 9, "endIndex": 15, "scopes": ["source.abl", "keyword.other.abl"] }, // 'ASSIGN'
215
+ { "startIndex": 15, "endIndex": 16, "scopes": ["source.abl"] }, // ' '
216
+ { "startIndex": 16, "endIndex": 28, "scopes": ["source.abl", "storage.data.table.abl"] }, // '_TRG._pRECID'
217
+ { "startIndex": 28, "endIndex": 29, "scopes": ["source.abl"] }, // ' '
218
+ { "startIndex": 29, "endIndex": 30, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
219
+ { "startIndex": 30, "endIndex": 31, "scopes": ["source.abl", "meta.function-call.abl"] }, // ' '
220
+ { "startIndex": 31, "endIndex": 36, "scopes": ["source.abl", "meta.function-call.abl", "support.function.abl"] }, // 'RECID'
221
+ { "startIndex": 36, "endIndex": 37, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "meta.brace.round.js"] }, // '('
222
+ { "startIndex": 37, "endIndex": 39, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "variable.other.abl"] }, // '_P'
223
+ { "startIndex": 39, "endIndex": 40, "scopes": ["source.abl", "meta.function-call.abl", "meta.brace.round.js"] } // ')'
224
+ ],
225
+ [
226
+ { "startIndex": 0, "endIndex": 16, "scopes": ["source.abl"] }, // ' '
227
+ { "startIndex": 16, "endIndex": 28, "scopes": ["source.abl", "storage.data.table.abl"] }, // '_TRG._wRECID'
228
+ { "startIndex": 28, "endIndex": 29, "scopes": ["source.abl"] }, // ' '
229
+ { "startIndex": 29, "endIndex": 30, "scopes": ["source.abl", "keyword.operator.source.abl"] }, // '='
230
+ { "startIndex": 30, "endIndex": 31, "scopes": ["source.abl", "meta.function-call.abl"] }, // ' '
231
+ { "startIndex": 31, "endIndex": 36, "scopes": ["source.abl", "meta.function-call.abl", "support.function.abl"] }, // 'RECID'
232
+ { "startIndex": 36, "endIndex": 37, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "meta.brace.round.js"] }, // '('
233
+ { "startIndex": 37, "endIndex": 39, "scopes": ["source.abl", "meta.function-call.abl", "meta.function.arguments.abl", "variable.other.abl"] }, // '_U'
234
+ { "startIndex": 39, "endIndex": 40, "scopes": ["source.abl", "meta.function-call.abl", "meta.brace.round.js"] }, // ')'
235
+ { "startIndex": 40, "endIndex": 41, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
236
+ ]
237
+ ];
238
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
239
+ })
@@ -41,3 +41,35 @@ describe('', () => {
41
41
  shared.itShouldMatchExpectedScopes(statement, expectedTokens);
42
42
  })
43
43
 
44
+ describe('', () => {
45
+ let statement = `create customer-buf1.`;
46
+ let expectedTokens = [
47
+ { "startIndex": 0, "endIndex": 6, "scopes": ["source.abl", "keyword.other.abl"] }, // 'create'
48
+ { "startIndex": 6, "endIndex": 7, "scopes": ["source.abl"] }, // ' '
49
+ { "startIndex": 7, "endIndex": 20, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'customer-buf1'
50
+ { "startIndex": 20, "endIndex": 21, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
51
+ ];
52
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
53
+ })
54
+
55
+ describe('', () => {
56
+ let statement = `create buf1.`;
57
+ let expectedTokens = [
58
+ { "startIndex": 0, "endIndex": 6, "scopes": ["source.abl", "keyword.other.abl"] }, // 'create'
59
+ { "startIndex": 6, "endIndex": 7, "scopes": ["source.abl"] }, // ' '
60
+ { "startIndex": 7, "endIndex": 11, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'buf1'
61
+ { "startIndex": 11, "endIndex": 12, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
62
+ ];
63
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
64
+ })
65
+
66
+ describe('', () => {
67
+ let statement = `create buf-1.`;
68
+ let expectedTokens = [
69
+ { "startIndex": 0, "endIndex": 6, "scopes": ["source.abl", "keyword.other.abl"] }, // 'create'
70
+ { "startIndex": 6, "endIndex": 7, "scopes": ["source.abl"] }, // ' '
71
+ { "startIndex": 7, "endIndex": 12, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'buf-1'
72
+ { "startIndex": 12, "endIndex": 13, "scopes": ["source.abl", "punctuation.terminator.abl"] } // '.'
73
+ ];
74
+ shared.itShouldMatchExpectedScopes(statement, expectedTokens);
75
+ })
@@ -32,7 +32,7 @@ describe('', () => {
32
32
  { "startIndex": 4, "endIndex": 5, "scopes": ["source.abl"] }, // ' '
33
33
  { "startIndex": 5, "endIndex": 14, "scopes": ["source.abl", "support.function.abl"] }, // 'AVAILABLE'
34
34
  { "startIndex": 14, "endIndex": 15, "scopes": ["source.abl"] }, // ' '
35
- { "startIndex": 15, "endIndex": 31, "scopes": ["source.abl", "support.data.table.abl"] }, // 'z_anchor.z_print'
35
+ { "startIndex": 15, "endIndex": 31, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'z_anchor.z_print'
36
36
  { "startIndex": 31, "endIndex": 32, "scopes": ["source.abl"] }, // ' '
37
37
  { "startIndex": 32, "endIndex": 36, "scopes": ["source.abl", "keyword.other.abl"] }, // 'THEN'
38
38
  { "startIndex": 36, "endIndex": 37, "scopes": ["source.abl", "meta.block.abl"] }, // ' '
@@ -75,7 +75,7 @@ describe('', () => {
75
75
  { "startIndex": 4, "endIndex": 5, "scopes": ["source.abl"] }, // ' '
76
76
  { "startIndex": 5, "endIndex": 14, "scopes": ["source.abl", "support.function.abl"] }, // 'AVAILABLE'
77
77
  { "startIndex": 14, "endIndex": 15, "scopes": ["source.abl"] }, // ' '
78
- { "startIndex": 15, "endIndex": 22, "scopes": ["source.abl", "support.data.table.abl"] }, // 'z_print'
78
+ { "startIndex": 15, "endIndex": 22, "scopes": ["source.abl", "storage.data.table.abl"] }, // 'z_print'
79
79
  { "startIndex": 22, "endIndex": 23, "scopes": ["source.abl"] }, // ' '
80
80
  { "startIndex": 23, "endIndex": 27, "scopes": ["source.abl", "keyword.other.abl"] }, // 'THEN'
81
81
  { "startIndex": 27, "endIndex": 28, "scopes": ["source.abl", "meta.block.abl"] }, // ' '