@shikijs/core 1.16.0 → 1.16.1
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.
- package/dist/chunk-engines.d.mts +2 -196
- package/dist/index.d.mts +7 -23
- package/dist/index.mjs +5 -3111
- package/dist/types.d.mts +5 -3
- package/dist/wasm-inlined.d.mts +1 -0
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { FontStyle } from './types.mjs';
|
|
2
|
+
import { INITIAL, EncodedTokenMetadata, Registry as Registry$1, Theme } from '@shikijs/vscode-textmate';
|
|
3
|
+
export { EncodedTokenMetadata as StackElementMetadata } from '@shikijs/vscode-textmate';
|
|
2
4
|
|
|
3
5
|
function toArray(x) {
|
|
4
6
|
return Array.isArray(x) ? x : [x];
|
|
@@ -387,3010 +389,6 @@ function getTransformers(options) {
|
|
|
387
389
|
];
|
|
388
390
|
}
|
|
389
391
|
|
|
390
|
-
// src/utils.ts
|
|
391
|
-
function clone(something) {
|
|
392
|
-
return doClone(something);
|
|
393
|
-
}
|
|
394
|
-
function doClone(something) {
|
|
395
|
-
if (Array.isArray(something)) {
|
|
396
|
-
return cloneArray(something);
|
|
397
|
-
}
|
|
398
|
-
if (typeof something === "object") {
|
|
399
|
-
return cloneObj(something);
|
|
400
|
-
}
|
|
401
|
-
return something;
|
|
402
|
-
}
|
|
403
|
-
function cloneArray(arr) {
|
|
404
|
-
let r = [];
|
|
405
|
-
for (let i = 0, len = arr.length; i < len; i++) {
|
|
406
|
-
r[i] = doClone(arr[i]);
|
|
407
|
-
}
|
|
408
|
-
return r;
|
|
409
|
-
}
|
|
410
|
-
function cloneObj(obj) {
|
|
411
|
-
let r = {};
|
|
412
|
-
for (let key in obj) {
|
|
413
|
-
r[key] = doClone(obj[key]);
|
|
414
|
-
}
|
|
415
|
-
return r;
|
|
416
|
-
}
|
|
417
|
-
function mergeObjects(target, ...sources) {
|
|
418
|
-
sources.forEach((source) => {
|
|
419
|
-
for (let key in source) {
|
|
420
|
-
target[key] = source[key];
|
|
421
|
-
}
|
|
422
|
-
});
|
|
423
|
-
return target;
|
|
424
|
-
}
|
|
425
|
-
function basename(path) {
|
|
426
|
-
const idx = ~path.lastIndexOf("/") || ~path.lastIndexOf("\\");
|
|
427
|
-
if (idx === 0) {
|
|
428
|
-
return path;
|
|
429
|
-
} else if (~idx === path.length - 1) {
|
|
430
|
-
return basename(path.substring(0, path.length - 1));
|
|
431
|
-
} else {
|
|
432
|
-
return path.substr(~idx + 1);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
var CAPTURING_REGEX_SOURCE = /\$(\d+)|\${(\d+):\/(downcase|upcase)}/g;
|
|
436
|
-
var RegexSource = class {
|
|
437
|
-
static hasCaptures(regexSource) {
|
|
438
|
-
if (regexSource === null) {
|
|
439
|
-
return false;
|
|
440
|
-
}
|
|
441
|
-
CAPTURING_REGEX_SOURCE.lastIndex = 0;
|
|
442
|
-
return CAPTURING_REGEX_SOURCE.test(regexSource);
|
|
443
|
-
}
|
|
444
|
-
static replaceCaptures(regexSource, captureSource, captureIndices) {
|
|
445
|
-
return regexSource.replace(CAPTURING_REGEX_SOURCE, (match, index, commandIndex, command) => {
|
|
446
|
-
let capture = captureIndices[parseInt(index || commandIndex, 10)];
|
|
447
|
-
if (capture) {
|
|
448
|
-
let result = captureSource.substring(capture.start, capture.end);
|
|
449
|
-
while (result[0] === ".") {
|
|
450
|
-
result = result.substring(1);
|
|
451
|
-
}
|
|
452
|
-
switch (command) {
|
|
453
|
-
case "downcase":
|
|
454
|
-
return result.toLowerCase();
|
|
455
|
-
case "upcase":
|
|
456
|
-
return result.toUpperCase();
|
|
457
|
-
default:
|
|
458
|
-
return result;
|
|
459
|
-
}
|
|
460
|
-
} else {
|
|
461
|
-
return match;
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
};
|
|
466
|
-
function strcmp(a, b) {
|
|
467
|
-
if (a < b) {
|
|
468
|
-
return -1;
|
|
469
|
-
}
|
|
470
|
-
if (a > b) {
|
|
471
|
-
return 1;
|
|
472
|
-
}
|
|
473
|
-
return 0;
|
|
474
|
-
}
|
|
475
|
-
function strArrCmp(a, b) {
|
|
476
|
-
if (a === null && b === null) {
|
|
477
|
-
return 0;
|
|
478
|
-
}
|
|
479
|
-
if (!a) {
|
|
480
|
-
return -1;
|
|
481
|
-
}
|
|
482
|
-
if (!b) {
|
|
483
|
-
return 1;
|
|
484
|
-
}
|
|
485
|
-
let len1 = a.length;
|
|
486
|
-
let len2 = b.length;
|
|
487
|
-
if (len1 === len2) {
|
|
488
|
-
for (let i = 0; i < len1; i++) {
|
|
489
|
-
let res = strcmp(a[i], b[i]);
|
|
490
|
-
if (res !== 0) {
|
|
491
|
-
return res;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
return 0;
|
|
495
|
-
}
|
|
496
|
-
return len1 - len2;
|
|
497
|
-
}
|
|
498
|
-
function isValidHexColor(hex) {
|
|
499
|
-
if (/^#[0-9a-f]{6}$/i.test(hex)) {
|
|
500
|
-
return true;
|
|
501
|
-
}
|
|
502
|
-
if (/^#[0-9a-f]{8}$/i.test(hex)) {
|
|
503
|
-
return true;
|
|
504
|
-
}
|
|
505
|
-
if (/^#[0-9a-f]{3}$/i.test(hex)) {
|
|
506
|
-
return true;
|
|
507
|
-
}
|
|
508
|
-
if (/^#[0-9a-f]{4}$/i.test(hex)) {
|
|
509
|
-
return true;
|
|
510
|
-
}
|
|
511
|
-
return false;
|
|
512
|
-
}
|
|
513
|
-
function escapeRegExpCharacters(value) {
|
|
514
|
-
return value.replace(/[\-\\\{\}\*\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, "\\$&");
|
|
515
|
-
}
|
|
516
|
-
var CachedFn = class {
|
|
517
|
-
constructor(fn) {
|
|
518
|
-
this.fn = fn;
|
|
519
|
-
this.cache = /* @__PURE__ */ new Map();
|
|
520
|
-
}
|
|
521
|
-
get(key) {
|
|
522
|
-
if (this.cache.has(key)) {
|
|
523
|
-
return this.cache.get(key);
|
|
524
|
-
}
|
|
525
|
-
const value = this.fn(key);
|
|
526
|
-
this.cache.set(key, value);
|
|
527
|
-
return value;
|
|
528
|
-
}
|
|
529
|
-
};
|
|
530
|
-
|
|
531
|
-
// src/theme.ts
|
|
532
|
-
var Theme = class {
|
|
533
|
-
constructor(_colorMap, _defaults, _root) {
|
|
534
|
-
this._colorMap = _colorMap;
|
|
535
|
-
this._defaults = _defaults;
|
|
536
|
-
this._root = _root;
|
|
537
|
-
this._cachedMatchRoot = new CachedFn(
|
|
538
|
-
(scopeName) => this._root.match(scopeName)
|
|
539
|
-
);
|
|
540
|
-
}
|
|
541
|
-
static createFromRawTheme(source, colorMap) {
|
|
542
|
-
return this.createFromParsedTheme(parseTheme(source), colorMap);
|
|
543
|
-
}
|
|
544
|
-
static createFromParsedTheme(source, colorMap) {
|
|
545
|
-
return resolveParsedThemeRules(source, colorMap);
|
|
546
|
-
}
|
|
547
|
-
getColorMap() {
|
|
548
|
-
return this._colorMap.getColorMap();
|
|
549
|
-
}
|
|
550
|
-
getDefaults() {
|
|
551
|
-
return this._defaults;
|
|
552
|
-
}
|
|
553
|
-
match(scopePath) {
|
|
554
|
-
if (scopePath === null) {
|
|
555
|
-
return this._defaults;
|
|
556
|
-
}
|
|
557
|
-
const scopeName = scopePath.scopeName;
|
|
558
|
-
const matchingTrieElements = this._cachedMatchRoot.get(scopeName);
|
|
559
|
-
const effectiveRule = matchingTrieElements.find(
|
|
560
|
-
(v) => _scopePathMatchesParentScopes(scopePath.parent, v.parentScopes)
|
|
561
|
-
);
|
|
562
|
-
if (!effectiveRule) {
|
|
563
|
-
return null;
|
|
564
|
-
}
|
|
565
|
-
return new StyleAttributes(
|
|
566
|
-
effectiveRule.fontStyle,
|
|
567
|
-
effectiveRule.foreground,
|
|
568
|
-
effectiveRule.background
|
|
569
|
-
);
|
|
570
|
-
}
|
|
571
|
-
};
|
|
572
|
-
var ScopeStack = class _ScopeStack {
|
|
573
|
-
constructor(parent, scopeName) {
|
|
574
|
-
this.parent = parent;
|
|
575
|
-
this.scopeName = scopeName;
|
|
576
|
-
}
|
|
577
|
-
static push(path, scopeNames) {
|
|
578
|
-
for (const name of scopeNames) {
|
|
579
|
-
path = new _ScopeStack(path, name);
|
|
580
|
-
}
|
|
581
|
-
return path;
|
|
582
|
-
}
|
|
583
|
-
static from(...segments) {
|
|
584
|
-
let result = null;
|
|
585
|
-
for (let i = 0; i < segments.length; i++) {
|
|
586
|
-
result = new _ScopeStack(result, segments[i]);
|
|
587
|
-
}
|
|
588
|
-
return result;
|
|
589
|
-
}
|
|
590
|
-
push(scopeName) {
|
|
591
|
-
return new _ScopeStack(this, scopeName);
|
|
592
|
-
}
|
|
593
|
-
getSegments() {
|
|
594
|
-
let item = this;
|
|
595
|
-
const result = [];
|
|
596
|
-
while (item) {
|
|
597
|
-
result.push(item.scopeName);
|
|
598
|
-
item = item.parent;
|
|
599
|
-
}
|
|
600
|
-
result.reverse();
|
|
601
|
-
return result;
|
|
602
|
-
}
|
|
603
|
-
toString() {
|
|
604
|
-
return this.getSegments().join(" ");
|
|
605
|
-
}
|
|
606
|
-
extends(other) {
|
|
607
|
-
if (this === other) {
|
|
608
|
-
return true;
|
|
609
|
-
}
|
|
610
|
-
if (this.parent === null) {
|
|
611
|
-
return false;
|
|
612
|
-
}
|
|
613
|
-
return this.parent.extends(other);
|
|
614
|
-
}
|
|
615
|
-
getExtensionIfDefined(base) {
|
|
616
|
-
const result = [];
|
|
617
|
-
let item = this;
|
|
618
|
-
while (item && item !== base) {
|
|
619
|
-
result.push(item.scopeName);
|
|
620
|
-
item = item.parent;
|
|
621
|
-
}
|
|
622
|
-
return item === base ? result.reverse() : void 0;
|
|
623
|
-
}
|
|
624
|
-
};
|
|
625
|
-
function _scopePathMatchesParentScopes(scopePath, parentScopes) {
|
|
626
|
-
if (parentScopes.length === 0) {
|
|
627
|
-
return true;
|
|
628
|
-
}
|
|
629
|
-
for (let index = 0; index < parentScopes.length; index++) {
|
|
630
|
-
let scopePattern = parentScopes[index];
|
|
631
|
-
let scopeMustMatch = false;
|
|
632
|
-
if (scopePattern === ">") {
|
|
633
|
-
if (index === parentScopes.length - 1) {
|
|
634
|
-
return false;
|
|
635
|
-
}
|
|
636
|
-
scopePattern = parentScopes[++index];
|
|
637
|
-
scopeMustMatch = true;
|
|
638
|
-
}
|
|
639
|
-
while (scopePath) {
|
|
640
|
-
if (_matchesScope(scopePath.scopeName, scopePattern)) {
|
|
641
|
-
break;
|
|
642
|
-
}
|
|
643
|
-
if (scopeMustMatch) {
|
|
644
|
-
return false;
|
|
645
|
-
}
|
|
646
|
-
scopePath = scopePath.parent;
|
|
647
|
-
}
|
|
648
|
-
if (!scopePath) {
|
|
649
|
-
return false;
|
|
650
|
-
}
|
|
651
|
-
scopePath = scopePath.parent;
|
|
652
|
-
}
|
|
653
|
-
return true;
|
|
654
|
-
}
|
|
655
|
-
function _matchesScope(scopeName, scopePattern) {
|
|
656
|
-
return scopePattern === scopeName || scopeName.startsWith(scopePattern) && scopeName[scopePattern.length] === ".";
|
|
657
|
-
}
|
|
658
|
-
var StyleAttributes = class {
|
|
659
|
-
constructor(fontStyle, foregroundId, backgroundId) {
|
|
660
|
-
this.fontStyle = fontStyle;
|
|
661
|
-
this.foregroundId = foregroundId;
|
|
662
|
-
this.backgroundId = backgroundId;
|
|
663
|
-
}
|
|
664
|
-
};
|
|
665
|
-
function parseTheme(source) {
|
|
666
|
-
if (!source) {
|
|
667
|
-
return [];
|
|
668
|
-
}
|
|
669
|
-
if (!source.settings || !Array.isArray(source.settings)) {
|
|
670
|
-
return [];
|
|
671
|
-
}
|
|
672
|
-
let settings = source.settings;
|
|
673
|
-
let result = [], resultLen = 0;
|
|
674
|
-
for (let i = 0, len = settings.length; i < len; i++) {
|
|
675
|
-
let entry = settings[i];
|
|
676
|
-
if (!entry.settings) {
|
|
677
|
-
continue;
|
|
678
|
-
}
|
|
679
|
-
let scopes;
|
|
680
|
-
if (typeof entry.scope === "string") {
|
|
681
|
-
let _scope = entry.scope;
|
|
682
|
-
_scope = _scope.replace(/^[,]+/, "");
|
|
683
|
-
_scope = _scope.replace(/[,]+$/, "");
|
|
684
|
-
scopes = _scope.split(",");
|
|
685
|
-
} else if (Array.isArray(entry.scope)) {
|
|
686
|
-
scopes = entry.scope;
|
|
687
|
-
} else {
|
|
688
|
-
scopes = [""];
|
|
689
|
-
}
|
|
690
|
-
let fontStyle = -1 /* NotSet */;
|
|
691
|
-
if (typeof entry.settings.fontStyle === "string") {
|
|
692
|
-
fontStyle = 0 /* None */;
|
|
693
|
-
let segments = entry.settings.fontStyle.split(" ");
|
|
694
|
-
for (let j = 0, lenJ = segments.length; j < lenJ; j++) {
|
|
695
|
-
let segment = segments[j];
|
|
696
|
-
switch (segment) {
|
|
697
|
-
case "italic":
|
|
698
|
-
fontStyle = fontStyle | 1 /* Italic */;
|
|
699
|
-
break;
|
|
700
|
-
case "bold":
|
|
701
|
-
fontStyle = fontStyle | 2 /* Bold */;
|
|
702
|
-
break;
|
|
703
|
-
case "underline":
|
|
704
|
-
fontStyle = fontStyle | 4 /* Underline */;
|
|
705
|
-
break;
|
|
706
|
-
case "strikethrough":
|
|
707
|
-
fontStyle = fontStyle | 8 /* Strikethrough */;
|
|
708
|
-
break;
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
let foreground = null;
|
|
713
|
-
if (typeof entry.settings.foreground === "string" && isValidHexColor(entry.settings.foreground)) {
|
|
714
|
-
foreground = entry.settings.foreground;
|
|
715
|
-
}
|
|
716
|
-
let background = null;
|
|
717
|
-
if (typeof entry.settings.background === "string" && isValidHexColor(entry.settings.background)) {
|
|
718
|
-
background = entry.settings.background;
|
|
719
|
-
}
|
|
720
|
-
for (let j = 0, lenJ = scopes.length; j < lenJ; j++) {
|
|
721
|
-
let _scope = scopes[j].trim();
|
|
722
|
-
let segments = _scope.split(" ");
|
|
723
|
-
let scope = segments[segments.length - 1];
|
|
724
|
-
let parentScopes = null;
|
|
725
|
-
if (segments.length > 1) {
|
|
726
|
-
parentScopes = segments.slice(0, segments.length - 1);
|
|
727
|
-
parentScopes.reverse();
|
|
728
|
-
}
|
|
729
|
-
result[resultLen++] = new ParsedThemeRule(
|
|
730
|
-
scope,
|
|
731
|
-
parentScopes,
|
|
732
|
-
i,
|
|
733
|
-
fontStyle,
|
|
734
|
-
foreground,
|
|
735
|
-
background
|
|
736
|
-
);
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
return result;
|
|
740
|
-
}
|
|
741
|
-
var ParsedThemeRule = class {
|
|
742
|
-
constructor(scope, parentScopes, index, fontStyle, foreground, background) {
|
|
743
|
-
this.scope = scope;
|
|
744
|
-
this.parentScopes = parentScopes;
|
|
745
|
-
this.index = index;
|
|
746
|
-
this.fontStyle = fontStyle;
|
|
747
|
-
this.foreground = foreground;
|
|
748
|
-
this.background = background;
|
|
749
|
-
}
|
|
750
|
-
};
|
|
751
|
-
function resolveParsedThemeRules(parsedThemeRules, _colorMap) {
|
|
752
|
-
parsedThemeRules.sort((a, b) => {
|
|
753
|
-
let r = strcmp(a.scope, b.scope);
|
|
754
|
-
if (r !== 0) {
|
|
755
|
-
return r;
|
|
756
|
-
}
|
|
757
|
-
r = strArrCmp(a.parentScopes, b.parentScopes);
|
|
758
|
-
if (r !== 0) {
|
|
759
|
-
return r;
|
|
760
|
-
}
|
|
761
|
-
return a.index - b.index;
|
|
762
|
-
});
|
|
763
|
-
let defaultFontStyle = 0 /* None */;
|
|
764
|
-
let defaultForeground = "#000000";
|
|
765
|
-
let defaultBackground = "#ffffff";
|
|
766
|
-
while (parsedThemeRules.length >= 1 && parsedThemeRules[0].scope === "") {
|
|
767
|
-
let incomingDefaults = parsedThemeRules.shift();
|
|
768
|
-
if (incomingDefaults.fontStyle !== -1 /* NotSet */) {
|
|
769
|
-
defaultFontStyle = incomingDefaults.fontStyle;
|
|
770
|
-
}
|
|
771
|
-
if (incomingDefaults.foreground !== null) {
|
|
772
|
-
defaultForeground = incomingDefaults.foreground;
|
|
773
|
-
}
|
|
774
|
-
if (incomingDefaults.background !== null) {
|
|
775
|
-
defaultBackground = incomingDefaults.background;
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
let colorMap = new ColorMap(_colorMap);
|
|
779
|
-
let defaults = new StyleAttributes(defaultFontStyle, colorMap.getId(defaultForeground), colorMap.getId(defaultBackground));
|
|
780
|
-
let root = new ThemeTrieElement(new ThemeTrieElementRule(0, null, -1 /* NotSet */, 0, 0), []);
|
|
781
|
-
for (let i = 0, len = parsedThemeRules.length; i < len; i++) {
|
|
782
|
-
let rule = parsedThemeRules[i];
|
|
783
|
-
root.insert(0, rule.scope, rule.parentScopes, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background));
|
|
784
|
-
}
|
|
785
|
-
return new Theme(colorMap, defaults, root);
|
|
786
|
-
}
|
|
787
|
-
var ColorMap = class {
|
|
788
|
-
constructor(_colorMap) {
|
|
789
|
-
this._lastColorId = 0;
|
|
790
|
-
this._id2color = [];
|
|
791
|
-
this._color2id = /* @__PURE__ */ Object.create(null);
|
|
792
|
-
if (Array.isArray(_colorMap)) {
|
|
793
|
-
this._isFrozen = true;
|
|
794
|
-
for (let i = 0, len = _colorMap.length; i < len; i++) {
|
|
795
|
-
this._color2id[_colorMap[i]] = i;
|
|
796
|
-
this._id2color[i] = _colorMap[i];
|
|
797
|
-
}
|
|
798
|
-
} else {
|
|
799
|
-
this._isFrozen = false;
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
getId(color) {
|
|
803
|
-
if (color === null) {
|
|
804
|
-
return 0;
|
|
805
|
-
}
|
|
806
|
-
color = color.toUpperCase();
|
|
807
|
-
let value = this._color2id[color];
|
|
808
|
-
if (value) {
|
|
809
|
-
return value;
|
|
810
|
-
}
|
|
811
|
-
if (this._isFrozen) {
|
|
812
|
-
throw new Error(`Missing color in color map - ${color}`);
|
|
813
|
-
}
|
|
814
|
-
value = ++this._lastColorId;
|
|
815
|
-
this._color2id[color] = value;
|
|
816
|
-
this._id2color[value] = color;
|
|
817
|
-
return value;
|
|
818
|
-
}
|
|
819
|
-
getColorMap() {
|
|
820
|
-
return this._id2color.slice(0);
|
|
821
|
-
}
|
|
822
|
-
};
|
|
823
|
-
var emptyParentScopes = Object.freeze([]);
|
|
824
|
-
var ThemeTrieElementRule = class _ThemeTrieElementRule {
|
|
825
|
-
constructor(scopeDepth, parentScopes, fontStyle, foreground, background) {
|
|
826
|
-
this.scopeDepth = scopeDepth;
|
|
827
|
-
this.parentScopes = parentScopes || emptyParentScopes;
|
|
828
|
-
this.fontStyle = fontStyle;
|
|
829
|
-
this.foreground = foreground;
|
|
830
|
-
this.background = background;
|
|
831
|
-
}
|
|
832
|
-
clone() {
|
|
833
|
-
return new _ThemeTrieElementRule(this.scopeDepth, this.parentScopes, this.fontStyle, this.foreground, this.background);
|
|
834
|
-
}
|
|
835
|
-
static cloneArr(arr) {
|
|
836
|
-
let r = [];
|
|
837
|
-
for (let i = 0, len = arr.length; i < len; i++) {
|
|
838
|
-
r[i] = arr[i].clone();
|
|
839
|
-
}
|
|
840
|
-
return r;
|
|
841
|
-
}
|
|
842
|
-
acceptOverwrite(scopeDepth, fontStyle, foreground, background) {
|
|
843
|
-
if (this.scopeDepth > scopeDepth) {
|
|
844
|
-
console.log("how did this happen?");
|
|
845
|
-
} else {
|
|
846
|
-
this.scopeDepth = scopeDepth;
|
|
847
|
-
}
|
|
848
|
-
if (fontStyle !== -1 /* NotSet */) {
|
|
849
|
-
this.fontStyle = fontStyle;
|
|
850
|
-
}
|
|
851
|
-
if (foreground !== 0) {
|
|
852
|
-
this.foreground = foreground;
|
|
853
|
-
}
|
|
854
|
-
if (background !== 0) {
|
|
855
|
-
this.background = background;
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
};
|
|
859
|
-
var ThemeTrieElement = class _ThemeTrieElement {
|
|
860
|
-
constructor(_mainRule, rulesWithParentScopes = [], _children = {}) {
|
|
861
|
-
this._mainRule = _mainRule;
|
|
862
|
-
this._children = _children;
|
|
863
|
-
this._rulesWithParentScopes = rulesWithParentScopes;
|
|
864
|
-
}
|
|
865
|
-
static _cmpBySpecificity(a, b) {
|
|
866
|
-
if (a.scopeDepth !== b.scopeDepth) {
|
|
867
|
-
return b.scopeDepth - a.scopeDepth;
|
|
868
|
-
}
|
|
869
|
-
let aParentIndex = 0;
|
|
870
|
-
let bParentIndex = 0;
|
|
871
|
-
while (true) {
|
|
872
|
-
if (a.parentScopes[aParentIndex] === ">") {
|
|
873
|
-
aParentIndex++;
|
|
874
|
-
}
|
|
875
|
-
if (b.parentScopes[bParentIndex] === ">") {
|
|
876
|
-
bParentIndex++;
|
|
877
|
-
}
|
|
878
|
-
if (aParentIndex >= a.parentScopes.length || bParentIndex >= b.parentScopes.length) {
|
|
879
|
-
break;
|
|
880
|
-
}
|
|
881
|
-
const parentScopeLengthDiff = b.parentScopes[bParentIndex].length - a.parentScopes[aParentIndex].length;
|
|
882
|
-
if (parentScopeLengthDiff !== 0) {
|
|
883
|
-
return parentScopeLengthDiff;
|
|
884
|
-
}
|
|
885
|
-
aParentIndex++;
|
|
886
|
-
bParentIndex++;
|
|
887
|
-
}
|
|
888
|
-
return b.parentScopes.length - a.parentScopes.length;
|
|
889
|
-
}
|
|
890
|
-
match(scope) {
|
|
891
|
-
if (scope !== "") {
|
|
892
|
-
let dotIndex = scope.indexOf(".");
|
|
893
|
-
let head;
|
|
894
|
-
let tail;
|
|
895
|
-
if (dotIndex === -1) {
|
|
896
|
-
head = scope;
|
|
897
|
-
tail = "";
|
|
898
|
-
} else {
|
|
899
|
-
head = scope.substring(0, dotIndex);
|
|
900
|
-
tail = scope.substring(dotIndex + 1);
|
|
901
|
-
}
|
|
902
|
-
if (this._children.hasOwnProperty(head)) {
|
|
903
|
-
return this._children[head].match(tail);
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
const rules = this._rulesWithParentScopes.concat(this._mainRule);
|
|
907
|
-
rules.sort(_ThemeTrieElement._cmpBySpecificity);
|
|
908
|
-
return rules;
|
|
909
|
-
}
|
|
910
|
-
insert(scopeDepth, scope, parentScopes, fontStyle, foreground, background) {
|
|
911
|
-
if (scope === "") {
|
|
912
|
-
this._doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background);
|
|
913
|
-
return;
|
|
914
|
-
}
|
|
915
|
-
let dotIndex = scope.indexOf(".");
|
|
916
|
-
let head;
|
|
917
|
-
let tail;
|
|
918
|
-
if (dotIndex === -1) {
|
|
919
|
-
head = scope;
|
|
920
|
-
tail = "";
|
|
921
|
-
} else {
|
|
922
|
-
head = scope.substring(0, dotIndex);
|
|
923
|
-
tail = scope.substring(dotIndex + 1);
|
|
924
|
-
}
|
|
925
|
-
let child;
|
|
926
|
-
if (this._children.hasOwnProperty(head)) {
|
|
927
|
-
child = this._children[head];
|
|
928
|
-
} else {
|
|
929
|
-
child = new _ThemeTrieElement(this._mainRule.clone(), ThemeTrieElementRule.cloneArr(this._rulesWithParentScopes));
|
|
930
|
-
this._children[head] = child;
|
|
931
|
-
}
|
|
932
|
-
child.insert(scopeDepth + 1, tail, parentScopes, fontStyle, foreground, background);
|
|
933
|
-
}
|
|
934
|
-
_doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background) {
|
|
935
|
-
if (parentScopes === null) {
|
|
936
|
-
this._mainRule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);
|
|
937
|
-
return;
|
|
938
|
-
}
|
|
939
|
-
for (let i = 0, len = this._rulesWithParentScopes.length; i < len; i++) {
|
|
940
|
-
let rule = this._rulesWithParentScopes[i];
|
|
941
|
-
if (strArrCmp(rule.parentScopes, parentScopes) === 0) {
|
|
942
|
-
rule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);
|
|
943
|
-
return;
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
if (fontStyle === -1 /* NotSet */) {
|
|
947
|
-
fontStyle = this._mainRule.fontStyle;
|
|
948
|
-
}
|
|
949
|
-
if (foreground === 0) {
|
|
950
|
-
foreground = this._mainRule.foreground;
|
|
951
|
-
}
|
|
952
|
-
if (background === 0) {
|
|
953
|
-
background = this._mainRule.background;
|
|
954
|
-
}
|
|
955
|
-
this._rulesWithParentScopes.push(new ThemeTrieElementRule(scopeDepth, parentScopes, fontStyle, foreground, background));
|
|
956
|
-
}
|
|
957
|
-
};
|
|
958
|
-
|
|
959
|
-
// src/encodedTokenAttributes.ts
|
|
960
|
-
var EncodedTokenAttributes;
|
|
961
|
-
((EncodedTokenAttributes2) => {
|
|
962
|
-
function toBinaryStr(encodedTokenAttributes) {
|
|
963
|
-
return encodedTokenAttributes.toString(2).padStart(32, "0");
|
|
964
|
-
}
|
|
965
|
-
EncodedTokenAttributes2.toBinaryStr = toBinaryStr;
|
|
966
|
-
function print(encodedTokenAttributes) {
|
|
967
|
-
const languageId = EncodedTokenAttributes2.getLanguageId(encodedTokenAttributes);
|
|
968
|
-
const tokenType = EncodedTokenAttributes2.getTokenType(encodedTokenAttributes);
|
|
969
|
-
const fontStyle = EncodedTokenAttributes2.getFontStyle(encodedTokenAttributes);
|
|
970
|
-
const foreground = EncodedTokenAttributes2.getForeground(encodedTokenAttributes);
|
|
971
|
-
const background = EncodedTokenAttributes2.getBackground(encodedTokenAttributes);
|
|
972
|
-
console.log({
|
|
973
|
-
languageId,
|
|
974
|
-
tokenType,
|
|
975
|
-
fontStyle,
|
|
976
|
-
foreground,
|
|
977
|
-
background
|
|
978
|
-
});
|
|
979
|
-
}
|
|
980
|
-
EncodedTokenAttributes2.print = print;
|
|
981
|
-
function getLanguageId(encodedTokenAttributes) {
|
|
982
|
-
return (encodedTokenAttributes & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */;
|
|
983
|
-
}
|
|
984
|
-
EncodedTokenAttributes2.getLanguageId = getLanguageId;
|
|
985
|
-
function getTokenType(encodedTokenAttributes) {
|
|
986
|
-
return (encodedTokenAttributes & 768 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */;
|
|
987
|
-
}
|
|
988
|
-
EncodedTokenAttributes2.getTokenType = getTokenType;
|
|
989
|
-
function containsBalancedBrackets(encodedTokenAttributes) {
|
|
990
|
-
return (encodedTokenAttributes & 1024 /* BALANCED_BRACKETS_MASK */) !== 0;
|
|
991
|
-
}
|
|
992
|
-
EncodedTokenAttributes2.containsBalancedBrackets = containsBalancedBrackets;
|
|
993
|
-
function getFontStyle(encodedTokenAttributes) {
|
|
994
|
-
return (encodedTokenAttributes & 30720 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */;
|
|
995
|
-
}
|
|
996
|
-
EncodedTokenAttributes2.getFontStyle = getFontStyle;
|
|
997
|
-
function getForeground(encodedTokenAttributes) {
|
|
998
|
-
return (encodedTokenAttributes & 16744448 /* FOREGROUND_MASK */) >>> 15 /* FOREGROUND_OFFSET */;
|
|
999
|
-
}
|
|
1000
|
-
EncodedTokenAttributes2.getForeground = getForeground;
|
|
1001
|
-
function getBackground(encodedTokenAttributes) {
|
|
1002
|
-
return (encodedTokenAttributes & 4278190080 /* BACKGROUND_MASK */) >>> 24 /* BACKGROUND_OFFSET */;
|
|
1003
|
-
}
|
|
1004
|
-
EncodedTokenAttributes2.getBackground = getBackground;
|
|
1005
|
-
function set(encodedTokenAttributes, languageId, tokenType, containsBalancedBrackets2, fontStyle, foreground, background) {
|
|
1006
|
-
let _languageId = EncodedTokenAttributes2.getLanguageId(encodedTokenAttributes);
|
|
1007
|
-
let _tokenType = EncodedTokenAttributes2.getTokenType(encodedTokenAttributes);
|
|
1008
|
-
let _containsBalancedBracketsBit = EncodedTokenAttributes2.containsBalancedBrackets(encodedTokenAttributes) ? 1 : 0;
|
|
1009
|
-
let _fontStyle = EncodedTokenAttributes2.getFontStyle(encodedTokenAttributes);
|
|
1010
|
-
let _foreground = EncodedTokenAttributes2.getForeground(encodedTokenAttributes);
|
|
1011
|
-
let _background = EncodedTokenAttributes2.getBackground(encodedTokenAttributes);
|
|
1012
|
-
if (languageId !== 0) {
|
|
1013
|
-
_languageId = languageId;
|
|
1014
|
-
}
|
|
1015
|
-
if (tokenType !== 8 /* NotSet */) {
|
|
1016
|
-
_tokenType = fromOptionalTokenType(tokenType);
|
|
1017
|
-
}
|
|
1018
|
-
if (containsBalancedBrackets2 !== null) {
|
|
1019
|
-
_containsBalancedBracketsBit = containsBalancedBrackets2 ? 1 : 0;
|
|
1020
|
-
}
|
|
1021
|
-
if (fontStyle !== -1 /* NotSet */) {
|
|
1022
|
-
_fontStyle = fontStyle;
|
|
1023
|
-
}
|
|
1024
|
-
if (foreground !== 0) {
|
|
1025
|
-
_foreground = foreground;
|
|
1026
|
-
}
|
|
1027
|
-
if (background !== 0) {
|
|
1028
|
-
_background = background;
|
|
1029
|
-
}
|
|
1030
|
-
return (_languageId << 0 /* LANGUAGEID_OFFSET */ | _tokenType << 8 /* TOKEN_TYPE_OFFSET */ | _containsBalancedBracketsBit << 10 /* BALANCED_BRACKETS_OFFSET */ | _fontStyle << 11 /* FONT_STYLE_OFFSET */ | _foreground << 15 /* FOREGROUND_OFFSET */ | _background << 24 /* BACKGROUND_OFFSET */) >>> 0;
|
|
1031
|
-
}
|
|
1032
|
-
EncodedTokenAttributes2.set = set;
|
|
1033
|
-
})(EncodedTokenAttributes || (EncodedTokenAttributes = {}));
|
|
1034
|
-
function toOptionalTokenType(standardType) {
|
|
1035
|
-
return standardType;
|
|
1036
|
-
}
|
|
1037
|
-
function fromOptionalTokenType(standardType) {
|
|
1038
|
-
return standardType;
|
|
1039
|
-
}
|
|
1040
|
-
|
|
1041
|
-
// src/matcher.ts
|
|
1042
|
-
function createMatchers(selector, matchesName) {
|
|
1043
|
-
const results = [];
|
|
1044
|
-
const tokenizer = newTokenizer(selector);
|
|
1045
|
-
let token = tokenizer.next();
|
|
1046
|
-
while (token !== null) {
|
|
1047
|
-
let priority = 0;
|
|
1048
|
-
if (token.length === 2 && token.charAt(1) === ":") {
|
|
1049
|
-
switch (token.charAt(0)) {
|
|
1050
|
-
case "R":
|
|
1051
|
-
priority = 1;
|
|
1052
|
-
break;
|
|
1053
|
-
case "L":
|
|
1054
|
-
priority = -1;
|
|
1055
|
-
break;
|
|
1056
|
-
default:
|
|
1057
|
-
console.log(`Unknown priority ${token} in scope selector`);
|
|
1058
|
-
}
|
|
1059
|
-
token = tokenizer.next();
|
|
1060
|
-
}
|
|
1061
|
-
let matcher = parseConjunction();
|
|
1062
|
-
results.push({ matcher, priority });
|
|
1063
|
-
if (token !== ",") {
|
|
1064
|
-
break;
|
|
1065
|
-
}
|
|
1066
|
-
token = tokenizer.next();
|
|
1067
|
-
}
|
|
1068
|
-
return results;
|
|
1069
|
-
function parseOperand() {
|
|
1070
|
-
if (token === "-") {
|
|
1071
|
-
token = tokenizer.next();
|
|
1072
|
-
const expressionToNegate = parseOperand();
|
|
1073
|
-
return (matcherInput) => !!expressionToNegate && !expressionToNegate(matcherInput);
|
|
1074
|
-
}
|
|
1075
|
-
if (token === "(") {
|
|
1076
|
-
token = tokenizer.next();
|
|
1077
|
-
const expressionInParents = parseInnerExpression();
|
|
1078
|
-
if (token === ")") {
|
|
1079
|
-
token = tokenizer.next();
|
|
1080
|
-
}
|
|
1081
|
-
return expressionInParents;
|
|
1082
|
-
}
|
|
1083
|
-
if (isIdentifier(token)) {
|
|
1084
|
-
const identifiers = [];
|
|
1085
|
-
do {
|
|
1086
|
-
identifiers.push(token);
|
|
1087
|
-
token = tokenizer.next();
|
|
1088
|
-
} while (isIdentifier(token));
|
|
1089
|
-
return (matcherInput) => matchesName(identifiers, matcherInput);
|
|
1090
|
-
}
|
|
1091
|
-
return null;
|
|
1092
|
-
}
|
|
1093
|
-
function parseConjunction() {
|
|
1094
|
-
const matchers = [];
|
|
1095
|
-
let matcher = parseOperand();
|
|
1096
|
-
while (matcher) {
|
|
1097
|
-
matchers.push(matcher);
|
|
1098
|
-
matcher = parseOperand();
|
|
1099
|
-
}
|
|
1100
|
-
return (matcherInput) => matchers.every((matcher2) => matcher2(matcherInput));
|
|
1101
|
-
}
|
|
1102
|
-
function parseInnerExpression() {
|
|
1103
|
-
const matchers = [];
|
|
1104
|
-
let matcher = parseConjunction();
|
|
1105
|
-
while (matcher) {
|
|
1106
|
-
matchers.push(matcher);
|
|
1107
|
-
if (token === "|" || token === ",") {
|
|
1108
|
-
do {
|
|
1109
|
-
token = tokenizer.next();
|
|
1110
|
-
} while (token === "|" || token === ",");
|
|
1111
|
-
} else {
|
|
1112
|
-
break;
|
|
1113
|
-
}
|
|
1114
|
-
matcher = parseConjunction();
|
|
1115
|
-
}
|
|
1116
|
-
return (matcherInput) => matchers.some((matcher2) => matcher2(matcherInput));
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
function isIdentifier(token) {
|
|
1120
|
-
return !!token && !!token.match(/[\w\.:]+/);
|
|
1121
|
-
}
|
|
1122
|
-
function newTokenizer(input) {
|
|
1123
|
-
let regex = /([LR]:|[\w\.:][\w\.:\-]*|[\,\|\-\(\)])/g;
|
|
1124
|
-
let match = regex.exec(input);
|
|
1125
|
-
return {
|
|
1126
|
-
next: () => {
|
|
1127
|
-
if (!match) {
|
|
1128
|
-
return null;
|
|
1129
|
-
}
|
|
1130
|
-
const res = match[0];
|
|
1131
|
-
match = regex.exec(input);
|
|
1132
|
-
return res;
|
|
1133
|
-
}
|
|
1134
|
-
};
|
|
1135
|
-
}
|
|
1136
|
-
function disposeOnigString(str) {
|
|
1137
|
-
if (typeof str.dispose === "function") {
|
|
1138
|
-
str.dispose();
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
// src/grammar/grammarDependencies.ts
|
|
1143
|
-
var TopLevelRuleReference = class {
|
|
1144
|
-
constructor(scopeName) {
|
|
1145
|
-
this.scopeName = scopeName;
|
|
1146
|
-
}
|
|
1147
|
-
toKey() {
|
|
1148
|
-
return this.scopeName;
|
|
1149
|
-
}
|
|
1150
|
-
};
|
|
1151
|
-
var TopLevelRepositoryRuleReference = class {
|
|
1152
|
-
constructor(scopeName, ruleName) {
|
|
1153
|
-
this.scopeName = scopeName;
|
|
1154
|
-
this.ruleName = ruleName;
|
|
1155
|
-
}
|
|
1156
|
-
toKey() {
|
|
1157
|
-
return `${this.scopeName}#${this.ruleName}`;
|
|
1158
|
-
}
|
|
1159
|
-
};
|
|
1160
|
-
var ExternalReferenceCollector = class {
|
|
1161
|
-
constructor() {
|
|
1162
|
-
this._references = [];
|
|
1163
|
-
this._seenReferenceKeys = /* @__PURE__ */ new Set();
|
|
1164
|
-
this.visitedRule = /* @__PURE__ */ new Set();
|
|
1165
|
-
}
|
|
1166
|
-
get references() {
|
|
1167
|
-
return this._references;
|
|
1168
|
-
}
|
|
1169
|
-
add(reference) {
|
|
1170
|
-
const key = reference.toKey();
|
|
1171
|
-
if (this._seenReferenceKeys.has(key)) {
|
|
1172
|
-
return;
|
|
1173
|
-
}
|
|
1174
|
-
this._seenReferenceKeys.add(key);
|
|
1175
|
-
this._references.push(reference);
|
|
1176
|
-
}
|
|
1177
|
-
};
|
|
1178
|
-
var ScopeDependencyProcessor = class {
|
|
1179
|
-
constructor(repo, initialScopeName) {
|
|
1180
|
-
this.repo = repo;
|
|
1181
|
-
this.initialScopeName = initialScopeName;
|
|
1182
|
-
this.seenFullScopeRequests = /* @__PURE__ */ new Set();
|
|
1183
|
-
this.seenPartialScopeRequests = /* @__PURE__ */ new Set();
|
|
1184
|
-
this.seenFullScopeRequests.add(this.initialScopeName);
|
|
1185
|
-
this.Q = [new TopLevelRuleReference(this.initialScopeName)];
|
|
1186
|
-
}
|
|
1187
|
-
processQueue() {
|
|
1188
|
-
const q = this.Q;
|
|
1189
|
-
this.Q = [];
|
|
1190
|
-
const deps = new ExternalReferenceCollector();
|
|
1191
|
-
for (const dep of q) {
|
|
1192
|
-
collectReferencesOfReference(dep, this.initialScopeName, this.repo, deps);
|
|
1193
|
-
}
|
|
1194
|
-
for (const dep of deps.references) {
|
|
1195
|
-
if (dep instanceof TopLevelRuleReference) {
|
|
1196
|
-
if (this.seenFullScopeRequests.has(dep.scopeName)) {
|
|
1197
|
-
continue;
|
|
1198
|
-
}
|
|
1199
|
-
this.seenFullScopeRequests.add(dep.scopeName);
|
|
1200
|
-
this.Q.push(dep);
|
|
1201
|
-
} else {
|
|
1202
|
-
if (this.seenFullScopeRequests.has(dep.scopeName)) {
|
|
1203
|
-
continue;
|
|
1204
|
-
}
|
|
1205
|
-
if (this.seenPartialScopeRequests.has(dep.toKey())) {
|
|
1206
|
-
continue;
|
|
1207
|
-
}
|
|
1208
|
-
this.seenPartialScopeRequests.add(dep.toKey());
|
|
1209
|
-
this.Q.push(dep);
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
};
|
|
1214
|
-
function collectReferencesOfReference(reference, baseGrammarScopeName, repo, result) {
|
|
1215
|
-
const selfGrammar = repo.lookup(reference.scopeName);
|
|
1216
|
-
if (!selfGrammar) {
|
|
1217
|
-
if (reference.scopeName === baseGrammarScopeName) {
|
|
1218
|
-
throw new Error(`No grammar provided for <${baseGrammarScopeName}>`);
|
|
1219
|
-
}
|
|
1220
|
-
return;
|
|
1221
|
-
}
|
|
1222
|
-
const baseGrammar = repo.lookup(baseGrammarScopeName);
|
|
1223
|
-
if (reference instanceof TopLevelRuleReference) {
|
|
1224
|
-
collectExternalReferencesInTopLevelRule({ baseGrammar, selfGrammar }, result);
|
|
1225
|
-
} else {
|
|
1226
|
-
collectExternalReferencesInTopLevelRepositoryRule(
|
|
1227
|
-
reference.ruleName,
|
|
1228
|
-
{ baseGrammar, selfGrammar, repository: selfGrammar.repository },
|
|
1229
|
-
result
|
|
1230
|
-
);
|
|
1231
|
-
}
|
|
1232
|
-
const injections = repo.injections(reference.scopeName);
|
|
1233
|
-
if (injections) {
|
|
1234
|
-
for (const injection of injections) {
|
|
1235
|
-
result.add(new TopLevelRuleReference(injection));
|
|
1236
|
-
}
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
function collectExternalReferencesInTopLevelRepositoryRule(ruleName, context, result) {
|
|
1240
|
-
if (context.repository && context.repository[ruleName]) {
|
|
1241
|
-
const rule = context.repository[ruleName];
|
|
1242
|
-
collectExternalReferencesInRules([rule], context, result);
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
function collectExternalReferencesInTopLevelRule(context, result) {
|
|
1246
|
-
if (context.selfGrammar.patterns && Array.isArray(context.selfGrammar.patterns)) {
|
|
1247
|
-
collectExternalReferencesInRules(
|
|
1248
|
-
context.selfGrammar.patterns,
|
|
1249
|
-
{ ...context, repository: context.selfGrammar.repository },
|
|
1250
|
-
result
|
|
1251
|
-
);
|
|
1252
|
-
}
|
|
1253
|
-
if (context.selfGrammar.injections) {
|
|
1254
|
-
collectExternalReferencesInRules(
|
|
1255
|
-
Object.values(context.selfGrammar.injections),
|
|
1256
|
-
{ ...context, repository: context.selfGrammar.repository },
|
|
1257
|
-
result
|
|
1258
|
-
);
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1261
|
-
function collectExternalReferencesInRules(rules, context, result) {
|
|
1262
|
-
for (const rule of rules) {
|
|
1263
|
-
if (result.visitedRule.has(rule)) {
|
|
1264
|
-
continue;
|
|
1265
|
-
}
|
|
1266
|
-
result.visitedRule.add(rule);
|
|
1267
|
-
const patternRepository = rule.repository ? mergeObjects({}, context.repository, rule.repository) : context.repository;
|
|
1268
|
-
if (Array.isArray(rule.patterns)) {
|
|
1269
|
-
collectExternalReferencesInRules(rule.patterns, { ...context, repository: patternRepository }, result);
|
|
1270
|
-
}
|
|
1271
|
-
const include = rule.include;
|
|
1272
|
-
if (!include) {
|
|
1273
|
-
continue;
|
|
1274
|
-
}
|
|
1275
|
-
const reference = parseInclude(include);
|
|
1276
|
-
switch (reference.kind) {
|
|
1277
|
-
case 0 /* Base */:
|
|
1278
|
-
collectExternalReferencesInTopLevelRule({ ...context, selfGrammar: context.baseGrammar }, result);
|
|
1279
|
-
break;
|
|
1280
|
-
case 1 /* Self */:
|
|
1281
|
-
collectExternalReferencesInTopLevelRule(context, result);
|
|
1282
|
-
break;
|
|
1283
|
-
case 2 /* RelativeReference */:
|
|
1284
|
-
collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, { ...context, repository: patternRepository }, result);
|
|
1285
|
-
break;
|
|
1286
|
-
case 3 /* TopLevelReference */:
|
|
1287
|
-
case 4 /* TopLevelRepositoryReference */:
|
|
1288
|
-
const selfGrammar = reference.scopeName === context.selfGrammar.scopeName ? context.selfGrammar : reference.scopeName === context.baseGrammar.scopeName ? context.baseGrammar : void 0;
|
|
1289
|
-
if (selfGrammar) {
|
|
1290
|
-
const newContext = { baseGrammar: context.baseGrammar, selfGrammar, repository: patternRepository };
|
|
1291
|
-
if (reference.kind === 4 /* TopLevelRepositoryReference */) {
|
|
1292
|
-
collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, newContext, result);
|
|
1293
|
-
} else {
|
|
1294
|
-
collectExternalReferencesInTopLevelRule(newContext, result);
|
|
1295
|
-
}
|
|
1296
|
-
} else {
|
|
1297
|
-
if (reference.kind === 4 /* TopLevelRepositoryReference */) {
|
|
1298
|
-
result.add(new TopLevelRepositoryRuleReference(reference.scopeName, reference.ruleName));
|
|
1299
|
-
} else {
|
|
1300
|
-
result.add(new TopLevelRuleReference(reference.scopeName));
|
|
1301
|
-
}
|
|
1302
|
-
}
|
|
1303
|
-
break;
|
|
1304
|
-
}
|
|
1305
|
-
}
|
|
1306
|
-
}
|
|
1307
|
-
var BaseReference = class {
|
|
1308
|
-
constructor() {
|
|
1309
|
-
this.kind = 0 /* Base */;
|
|
1310
|
-
}
|
|
1311
|
-
};
|
|
1312
|
-
var SelfReference = class {
|
|
1313
|
-
constructor() {
|
|
1314
|
-
this.kind = 1 /* Self */;
|
|
1315
|
-
}
|
|
1316
|
-
};
|
|
1317
|
-
var RelativeReference = class {
|
|
1318
|
-
constructor(ruleName) {
|
|
1319
|
-
this.ruleName = ruleName;
|
|
1320
|
-
this.kind = 2 /* RelativeReference */;
|
|
1321
|
-
}
|
|
1322
|
-
};
|
|
1323
|
-
var TopLevelReference = class {
|
|
1324
|
-
constructor(scopeName) {
|
|
1325
|
-
this.scopeName = scopeName;
|
|
1326
|
-
this.kind = 3 /* TopLevelReference */;
|
|
1327
|
-
}
|
|
1328
|
-
};
|
|
1329
|
-
var TopLevelRepositoryReference = class {
|
|
1330
|
-
constructor(scopeName, ruleName) {
|
|
1331
|
-
this.scopeName = scopeName;
|
|
1332
|
-
this.ruleName = ruleName;
|
|
1333
|
-
this.kind = 4 /* TopLevelRepositoryReference */;
|
|
1334
|
-
}
|
|
1335
|
-
};
|
|
1336
|
-
function parseInclude(include) {
|
|
1337
|
-
if (include === "$base") {
|
|
1338
|
-
return new BaseReference();
|
|
1339
|
-
} else if (include === "$self") {
|
|
1340
|
-
return new SelfReference();
|
|
1341
|
-
}
|
|
1342
|
-
const indexOfSharp = include.indexOf("#");
|
|
1343
|
-
if (indexOfSharp === -1) {
|
|
1344
|
-
return new TopLevelReference(include);
|
|
1345
|
-
} else if (indexOfSharp === 0) {
|
|
1346
|
-
return new RelativeReference(include.substring(1));
|
|
1347
|
-
} else {
|
|
1348
|
-
const scopeName = include.substring(0, indexOfSharp);
|
|
1349
|
-
const ruleName = include.substring(indexOfSharp + 1);
|
|
1350
|
-
return new TopLevelRepositoryReference(scopeName, ruleName);
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
|
-
|
|
1354
|
-
// src/rule.ts
|
|
1355
|
-
var HAS_BACK_REFERENCES = /\\(\d+)/;
|
|
1356
|
-
var BACK_REFERENCING_END = /\\(\d+)/g;
|
|
1357
|
-
var endRuleId = -1;
|
|
1358
|
-
var whileRuleId = -2;
|
|
1359
|
-
function ruleIdFromNumber(id) {
|
|
1360
|
-
return id;
|
|
1361
|
-
}
|
|
1362
|
-
function ruleIdToNumber(id) {
|
|
1363
|
-
return id;
|
|
1364
|
-
}
|
|
1365
|
-
var Rule = class {
|
|
1366
|
-
constructor($location, id, name, contentName) {
|
|
1367
|
-
this.$location = $location;
|
|
1368
|
-
this.id = id;
|
|
1369
|
-
this._name = name || null;
|
|
1370
|
-
this._nameIsCapturing = RegexSource.hasCaptures(this._name);
|
|
1371
|
-
this._contentName = contentName || null;
|
|
1372
|
-
this._contentNameIsCapturing = RegexSource.hasCaptures(this._contentName);
|
|
1373
|
-
}
|
|
1374
|
-
get debugName() {
|
|
1375
|
-
const location = this.$location ? `${basename(this.$location.filename)}:${this.$location.line}` : "unknown";
|
|
1376
|
-
return `${this.constructor.name}#${this.id} @ ${location}`;
|
|
1377
|
-
}
|
|
1378
|
-
getName(lineText, captureIndices) {
|
|
1379
|
-
if (!this._nameIsCapturing || this._name === null || lineText === null || captureIndices === null) {
|
|
1380
|
-
return this._name;
|
|
1381
|
-
}
|
|
1382
|
-
return RegexSource.replaceCaptures(this._name, lineText, captureIndices);
|
|
1383
|
-
}
|
|
1384
|
-
getContentName(lineText, captureIndices) {
|
|
1385
|
-
if (!this._contentNameIsCapturing || this._contentName === null) {
|
|
1386
|
-
return this._contentName;
|
|
1387
|
-
}
|
|
1388
|
-
return RegexSource.replaceCaptures(this._contentName, lineText, captureIndices);
|
|
1389
|
-
}
|
|
1390
|
-
};
|
|
1391
|
-
var CaptureRule = class extends Rule {
|
|
1392
|
-
constructor($location, id, name, contentName, retokenizeCapturedWithRuleId) {
|
|
1393
|
-
super($location, id, name, contentName);
|
|
1394
|
-
this.retokenizeCapturedWithRuleId = retokenizeCapturedWithRuleId;
|
|
1395
|
-
}
|
|
1396
|
-
dispose() {
|
|
1397
|
-
}
|
|
1398
|
-
collectPatterns(grammar, out) {
|
|
1399
|
-
throw new Error("Not supported!");
|
|
1400
|
-
}
|
|
1401
|
-
compile(grammar, endRegexSource) {
|
|
1402
|
-
throw new Error("Not supported!");
|
|
1403
|
-
}
|
|
1404
|
-
compileAG(grammar, endRegexSource, allowA, allowG) {
|
|
1405
|
-
throw new Error("Not supported!");
|
|
1406
|
-
}
|
|
1407
|
-
};
|
|
1408
|
-
var MatchRule = class extends Rule {
|
|
1409
|
-
constructor($location, id, name, match, captures) {
|
|
1410
|
-
super($location, id, name, null);
|
|
1411
|
-
this._match = new RegExpSource(match, this.id);
|
|
1412
|
-
this.captures = captures;
|
|
1413
|
-
this._cachedCompiledPatterns = null;
|
|
1414
|
-
}
|
|
1415
|
-
dispose() {
|
|
1416
|
-
if (this._cachedCompiledPatterns) {
|
|
1417
|
-
this._cachedCompiledPatterns.dispose();
|
|
1418
|
-
this._cachedCompiledPatterns = null;
|
|
1419
|
-
}
|
|
1420
|
-
}
|
|
1421
|
-
get debugMatchRegExp() {
|
|
1422
|
-
return `${this._match.source}`;
|
|
1423
|
-
}
|
|
1424
|
-
collectPatterns(grammar, out) {
|
|
1425
|
-
out.push(this._match);
|
|
1426
|
-
}
|
|
1427
|
-
compile(grammar, endRegexSource) {
|
|
1428
|
-
return this._getCachedCompiledPatterns(grammar).compile(grammar);
|
|
1429
|
-
}
|
|
1430
|
-
compileAG(grammar, endRegexSource, allowA, allowG) {
|
|
1431
|
-
return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);
|
|
1432
|
-
}
|
|
1433
|
-
_getCachedCompiledPatterns(grammar) {
|
|
1434
|
-
if (!this._cachedCompiledPatterns) {
|
|
1435
|
-
this._cachedCompiledPatterns = new RegExpSourceList();
|
|
1436
|
-
this.collectPatterns(grammar, this._cachedCompiledPatterns);
|
|
1437
|
-
}
|
|
1438
|
-
return this._cachedCompiledPatterns;
|
|
1439
|
-
}
|
|
1440
|
-
};
|
|
1441
|
-
var IncludeOnlyRule = class extends Rule {
|
|
1442
|
-
constructor($location, id, name, contentName, patterns) {
|
|
1443
|
-
super($location, id, name, contentName);
|
|
1444
|
-
this.patterns = patterns.patterns;
|
|
1445
|
-
this.hasMissingPatterns = patterns.hasMissingPatterns;
|
|
1446
|
-
this._cachedCompiledPatterns = null;
|
|
1447
|
-
}
|
|
1448
|
-
dispose() {
|
|
1449
|
-
if (this._cachedCompiledPatterns) {
|
|
1450
|
-
this._cachedCompiledPatterns.dispose();
|
|
1451
|
-
this._cachedCompiledPatterns = null;
|
|
1452
|
-
}
|
|
1453
|
-
}
|
|
1454
|
-
collectPatterns(grammar, out) {
|
|
1455
|
-
for (const pattern of this.patterns) {
|
|
1456
|
-
const rule = grammar.getRule(pattern);
|
|
1457
|
-
rule.collectPatterns(grammar, out);
|
|
1458
|
-
}
|
|
1459
|
-
}
|
|
1460
|
-
compile(grammar, endRegexSource) {
|
|
1461
|
-
return this._getCachedCompiledPatterns(grammar).compile(grammar);
|
|
1462
|
-
}
|
|
1463
|
-
compileAG(grammar, endRegexSource, allowA, allowG) {
|
|
1464
|
-
return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);
|
|
1465
|
-
}
|
|
1466
|
-
_getCachedCompiledPatterns(grammar) {
|
|
1467
|
-
if (!this._cachedCompiledPatterns) {
|
|
1468
|
-
this._cachedCompiledPatterns = new RegExpSourceList();
|
|
1469
|
-
this.collectPatterns(grammar, this._cachedCompiledPatterns);
|
|
1470
|
-
}
|
|
1471
|
-
return this._cachedCompiledPatterns;
|
|
1472
|
-
}
|
|
1473
|
-
};
|
|
1474
|
-
var BeginEndRule = class extends Rule {
|
|
1475
|
-
constructor($location, id, name, contentName, begin, beginCaptures, end, endCaptures, applyEndPatternLast, patterns) {
|
|
1476
|
-
super($location, id, name, contentName);
|
|
1477
|
-
this._begin = new RegExpSource(begin, this.id);
|
|
1478
|
-
this.beginCaptures = beginCaptures;
|
|
1479
|
-
this._end = new RegExpSource(end ? end : "\uFFFF", -1);
|
|
1480
|
-
this.endHasBackReferences = this._end.hasBackReferences;
|
|
1481
|
-
this.endCaptures = endCaptures;
|
|
1482
|
-
this.applyEndPatternLast = applyEndPatternLast || false;
|
|
1483
|
-
this.patterns = patterns.patterns;
|
|
1484
|
-
this.hasMissingPatterns = patterns.hasMissingPatterns;
|
|
1485
|
-
this._cachedCompiledPatterns = null;
|
|
1486
|
-
}
|
|
1487
|
-
dispose() {
|
|
1488
|
-
if (this._cachedCompiledPatterns) {
|
|
1489
|
-
this._cachedCompiledPatterns.dispose();
|
|
1490
|
-
this._cachedCompiledPatterns = null;
|
|
1491
|
-
}
|
|
1492
|
-
}
|
|
1493
|
-
get debugBeginRegExp() {
|
|
1494
|
-
return `${this._begin.source}`;
|
|
1495
|
-
}
|
|
1496
|
-
get debugEndRegExp() {
|
|
1497
|
-
return `${this._end.source}`;
|
|
1498
|
-
}
|
|
1499
|
-
getEndWithResolvedBackReferences(lineText, captureIndices) {
|
|
1500
|
-
return this._end.resolveBackReferences(lineText, captureIndices);
|
|
1501
|
-
}
|
|
1502
|
-
collectPatterns(grammar, out) {
|
|
1503
|
-
out.push(this._begin);
|
|
1504
|
-
}
|
|
1505
|
-
compile(grammar, endRegexSource) {
|
|
1506
|
-
return this._getCachedCompiledPatterns(grammar, endRegexSource).compile(grammar);
|
|
1507
|
-
}
|
|
1508
|
-
compileAG(grammar, endRegexSource, allowA, allowG) {
|
|
1509
|
-
return this._getCachedCompiledPatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);
|
|
1510
|
-
}
|
|
1511
|
-
_getCachedCompiledPatterns(grammar, endRegexSource) {
|
|
1512
|
-
if (!this._cachedCompiledPatterns) {
|
|
1513
|
-
this._cachedCompiledPatterns = new RegExpSourceList();
|
|
1514
|
-
for (const pattern of this.patterns) {
|
|
1515
|
-
const rule = grammar.getRule(pattern);
|
|
1516
|
-
rule.collectPatterns(grammar, this._cachedCompiledPatterns);
|
|
1517
|
-
}
|
|
1518
|
-
if (this.applyEndPatternLast) {
|
|
1519
|
-
this._cachedCompiledPatterns.push(this._end.hasBackReferences ? this._end.clone() : this._end);
|
|
1520
|
-
} else {
|
|
1521
|
-
this._cachedCompiledPatterns.unshift(this._end.hasBackReferences ? this._end.clone() : this._end);
|
|
1522
|
-
}
|
|
1523
|
-
}
|
|
1524
|
-
if (this._end.hasBackReferences) {
|
|
1525
|
-
if (this.applyEndPatternLast) {
|
|
1526
|
-
this._cachedCompiledPatterns.setSource(this._cachedCompiledPatterns.length() - 1, endRegexSource);
|
|
1527
|
-
} else {
|
|
1528
|
-
this._cachedCompiledPatterns.setSource(0, endRegexSource);
|
|
1529
|
-
}
|
|
1530
|
-
}
|
|
1531
|
-
return this._cachedCompiledPatterns;
|
|
1532
|
-
}
|
|
1533
|
-
};
|
|
1534
|
-
var BeginWhileRule = class extends Rule {
|
|
1535
|
-
constructor($location, id, name, contentName, begin, beginCaptures, _while, whileCaptures, patterns) {
|
|
1536
|
-
super($location, id, name, contentName);
|
|
1537
|
-
this._begin = new RegExpSource(begin, this.id);
|
|
1538
|
-
this.beginCaptures = beginCaptures;
|
|
1539
|
-
this.whileCaptures = whileCaptures;
|
|
1540
|
-
this._while = new RegExpSource(_while, whileRuleId);
|
|
1541
|
-
this.whileHasBackReferences = this._while.hasBackReferences;
|
|
1542
|
-
this.patterns = patterns.patterns;
|
|
1543
|
-
this.hasMissingPatterns = patterns.hasMissingPatterns;
|
|
1544
|
-
this._cachedCompiledPatterns = null;
|
|
1545
|
-
this._cachedCompiledWhilePatterns = null;
|
|
1546
|
-
}
|
|
1547
|
-
dispose() {
|
|
1548
|
-
if (this._cachedCompiledPatterns) {
|
|
1549
|
-
this._cachedCompiledPatterns.dispose();
|
|
1550
|
-
this._cachedCompiledPatterns = null;
|
|
1551
|
-
}
|
|
1552
|
-
if (this._cachedCompiledWhilePatterns) {
|
|
1553
|
-
this._cachedCompiledWhilePatterns.dispose();
|
|
1554
|
-
this._cachedCompiledWhilePatterns = null;
|
|
1555
|
-
}
|
|
1556
|
-
}
|
|
1557
|
-
get debugBeginRegExp() {
|
|
1558
|
-
return `${this._begin.source}`;
|
|
1559
|
-
}
|
|
1560
|
-
get debugWhileRegExp() {
|
|
1561
|
-
return `${this._while.source}`;
|
|
1562
|
-
}
|
|
1563
|
-
getWhileWithResolvedBackReferences(lineText, captureIndices) {
|
|
1564
|
-
return this._while.resolveBackReferences(lineText, captureIndices);
|
|
1565
|
-
}
|
|
1566
|
-
collectPatterns(grammar, out) {
|
|
1567
|
-
out.push(this._begin);
|
|
1568
|
-
}
|
|
1569
|
-
compile(grammar, endRegexSource) {
|
|
1570
|
-
return this._getCachedCompiledPatterns(grammar).compile(grammar);
|
|
1571
|
-
}
|
|
1572
|
-
compileAG(grammar, endRegexSource, allowA, allowG) {
|
|
1573
|
-
return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);
|
|
1574
|
-
}
|
|
1575
|
-
_getCachedCompiledPatterns(grammar) {
|
|
1576
|
-
if (!this._cachedCompiledPatterns) {
|
|
1577
|
-
this._cachedCompiledPatterns = new RegExpSourceList();
|
|
1578
|
-
for (const pattern of this.patterns) {
|
|
1579
|
-
const rule = grammar.getRule(pattern);
|
|
1580
|
-
rule.collectPatterns(grammar, this._cachedCompiledPatterns);
|
|
1581
|
-
}
|
|
1582
|
-
}
|
|
1583
|
-
return this._cachedCompiledPatterns;
|
|
1584
|
-
}
|
|
1585
|
-
compileWhile(grammar, endRegexSource) {
|
|
1586
|
-
return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compile(grammar);
|
|
1587
|
-
}
|
|
1588
|
-
compileWhileAG(grammar, endRegexSource, allowA, allowG) {
|
|
1589
|
-
return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);
|
|
1590
|
-
}
|
|
1591
|
-
_getCachedCompiledWhilePatterns(grammar, endRegexSource) {
|
|
1592
|
-
if (!this._cachedCompiledWhilePatterns) {
|
|
1593
|
-
this._cachedCompiledWhilePatterns = new RegExpSourceList();
|
|
1594
|
-
this._cachedCompiledWhilePatterns.push(this._while.hasBackReferences ? this._while.clone() : this._while);
|
|
1595
|
-
}
|
|
1596
|
-
if (this._while.hasBackReferences) {
|
|
1597
|
-
this._cachedCompiledWhilePatterns.setSource(0, endRegexSource ? endRegexSource : "\uFFFF");
|
|
1598
|
-
}
|
|
1599
|
-
return this._cachedCompiledWhilePatterns;
|
|
1600
|
-
}
|
|
1601
|
-
};
|
|
1602
|
-
var RuleFactory = class _RuleFactory {
|
|
1603
|
-
static createCaptureRule(helper, $location, name, contentName, retokenizeCapturedWithRuleId) {
|
|
1604
|
-
return helper.registerRule((id) => {
|
|
1605
|
-
return new CaptureRule($location, id, name, contentName, retokenizeCapturedWithRuleId);
|
|
1606
|
-
});
|
|
1607
|
-
}
|
|
1608
|
-
static getCompiledRuleId(desc, helper, repository) {
|
|
1609
|
-
if (!desc.id) {
|
|
1610
|
-
helper.registerRule((id) => {
|
|
1611
|
-
desc.id = id;
|
|
1612
|
-
if (desc.match) {
|
|
1613
|
-
return new MatchRule(
|
|
1614
|
-
desc.$vscodeTextmateLocation,
|
|
1615
|
-
desc.id,
|
|
1616
|
-
desc.name,
|
|
1617
|
-
desc.match,
|
|
1618
|
-
_RuleFactory._compileCaptures(desc.captures, helper, repository)
|
|
1619
|
-
);
|
|
1620
|
-
}
|
|
1621
|
-
if (typeof desc.begin === "undefined") {
|
|
1622
|
-
if (desc.repository) {
|
|
1623
|
-
repository = mergeObjects({}, repository, desc.repository);
|
|
1624
|
-
}
|
|
1625
|
-
let patterns = desc.patterns;
|
|
1626
|
-
if (typeof patterns === "undefined" && desc.include) {
|
|
1627
|
-
patterns = [{ include: desc.include }];
|
|
1628
|
-
}
|
|
1629
|
-
return new IncludeOnlyRule(
|
|
1630
|
-
desc.$vscodeTextmateLocation,
|
|
1631
|
-
desc.id,
|
|
1632
|
-
desc.name,
|
|
1633
|
-
desc.contentName,
|
|
1634
|
-
_RuleFactory._compilePatterns(patterns, helper, repository)
|
|
1635
|
-
);
|
|
1636
|
-
}
|
|
1637
|
-
if (desc.while) {
|
|
1638
|
-
return new BeginWhileRule(
|
|
1639
|
-
desc.$vscodeTextmateLocation,
|
|
1640
|
-
desc.id,
|
|
1641
|
-
desc.name,
|
|
1642
|
-
desc.contentName,
|
|
1643
|
-
desc.begin,
|
|
1644
|
-
_RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),
|
|
1645
|
-
desc.while,
|
|
1646
|
-
_RuleFactory._compileCaptures(desc.whileCaptures || desc.captures, helper, repository),
|
|
1647
|
-
_RuleFactory._compilePatterns(desc.patterns, helper, repository)
|
|
1648
|
-
);
|
|
1649
|
-
}
|
|
1650
|
-
return new BeginEndRule(
|
|
1651
|
-
desc.$vscodeTextmateLocation,
|
|
1652
|
-
desc.id,
|
|
1653
|
-
desc.name,
|
|
1654
|
-
desc.contentName,
|
|
1655
|
-
desc.begin,
|
|
1656
|
-
_RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),
|
|
1657
|
-
desc.end,
|
|
1658
|
-
_RuleFactory._compileCaptures(desc.endCaptures || desc.captures, helper, repository),
|
|
1659
|
-
desc.applyEndPatternLast,
|
|
1660
|
-
_RuleFactory._compilePatterns(desc.patterns, helper, repository)
|
|
1661
|
-
);
|
|
1662
|
-
});
|
|
1663
|
-
}
|
|
1664
|
-
return desc.id;
|
|
1665
|
-
}
|
|
1666
|
-
static _compileCaptures(captures, helper, repository) {
|
|
1667
|
-
let r = [];
|
|
1668
|
-
if (captures) {
|
|
1669
|
-
let maximumCaptureId = 0;
|
|
1670
|
-
for (const captureId in captures) {
|
|
1671
|
-
if (captureId === "$vscodeTextmateLocation") {
|
|
1672
|
-
continue;
|
|
1673
|
-
}
|
|
1674
|
-
const numericCaptureId = parseInt(captureId, 10);
|
|
1675
|
-
if (numericCaptureId > maximumCaptureId) {
|
|
1676
|
-
maximumCaptureId = numericCaptureId;
|
|
1677
|
-
}
|
|
1678
|
-
}
|
|
1679
|
-
for (let i = 0; i <= maximumCaptureId; i++) {
|
|
1680
|
-
r[i] = null;
|
|
1681
|
-
}
|
|
1682
|
-
for (const captureId in captures) {
|
|
1683
|
-
if (captureId === "$vscodeTextmateLocation") {
|
|
1684
|
-
continue;
|
|
1685
|
-
}
|
|
1686
|
-
const numericCaptureId = parseInt(captureId, 10);
|
|
1687
|
-
let retokenizeCapturedWithRuleId = 0;
|
|
1688
|
-
if (captures[captureId].patterns) {
|
|
1689
|
-
retokenizeCapturedWithRuleId = _RuleFactory.getCompiledRuleId(captures[captureId], helper, repository);
|
|
1690
|
-
}
|
|
1691
|
-
r[numericCaptureId] = _RuleFactory.createCaptureRule(helper, captures[captureId].$vscodeTextmateLocation, captures[captureId].name, captures[captureId].contentName, retokenizeCapturedWithRuleId);
|
|
1692
|
-
}
|
|
1693
|
-
}
|
|
1694
|
-
return r;
|
|
1695
|
-
}
|
|
1696
|
-
static _compilePatterns(patterns, helper, repository) {
|
|
1697
|
-
let r = [];
|
|
1698
|
-
if (patterns) {
|
|
1699
|
-
for (let i = 0, len = patterns.length; i < len; i++) {
|
|
1700
|
-
const pattern = patterns[i];
|
|
1701
|
-
let ruleId = -1;
|
|
1702
|
-
if (pattern.include) {
|
|
1703
|
-
const reference = parseInclude(pattern.include);
|
|
1704
|
-
switch (reference.kind) {
|
|
1705
|
-
case 0 /* Base */:
|
|
1706
|
-
case 1 /* Self */:
|
|
1707
|
-
ruleId = _RuleFactory.getCompiledRuleId(repository[pattern.include], helper, repository);
|
|
1708
|
-
break;
|
|
1709
|
-
case 2 /* RelativeReference */:
|
|
1710
|
-
let localIncludedRule = repository[reference.ruleName];
|
|
1711
|
-
if (localIncludedRule) {
|
|
1712
|
-
ruleId = _RuleFactory.getCompiledRuleId(localIncludedRule, helper, repository);
|
|
1713
|
-
}
|
|
1714
|
-
break;
|
|
1715
|
-
case 3 /* TopLevelReference */:
|
|
1716
|
-
case 4 /* TopLevelRepositoryReference */:
|
|
1717
|
-
const externalGrammarName = reference.scopeName;
|
|
1718
|
-
const externalGrammarInclude = reference.kind === 4 /* TopLevelRepositoryReference */ ? reference.ruleName : null;
|
|
1719
|
-
const externalGrammar = helper.getExternalGrammar(externalGrammarName, repository);
|
|
1720
|
-
if (externalGrammar) {
|
|
1721
|
-
if (externalGrammarInclude) {
|
|
1722
|
-
let externalIncludedRule = externalGrammar.repository[externalGrammarInclude];
|
|
1723
|
-
if (externalIncludedRule) {
|
|
1724
|
-
ruleId = _RuleFactory.getCompiledRuleId(externalIncludedRule, helper, externalGrammar.repository);
|
|
1725
|
-
}
|
|
1726
|
-
} else {
|
|
1727
|
-
ruleId = _RuleFactory.getCompiledRuleId(externalGrammar.repository.$self, helper, externalGrammar.repository);
|
|
1728
|
-
}
|
|
1729
|
-
}
|
|
1730
|
-
break;
|
|
1731
|
-
}
|
|
1732
|
-
} else {
|
|
1733
|
-
ruleId = _RuleFactory.getCompiledRuleId(pattern, helper, repository);
|
|
1734
|
-
}
|
|
1735
|
-
if (ruleId !== -1) {
|
|
1736
|
-
const rule = helper.getRule(ruleId);
|
|
1737
|
-
let skipRule = false;
|
|
1738
|
-
if (rule instanceof IncludeOnlyRule || rule instanceof BeginEndRule || rule instanceof BeginWhileRule) {
|
|
1739
|
-
if (rule.hasMissingPatterns && rule.patterns.length === 0) {
|
|
1740
|
-
skipRule = true;
|
|
1741
|
-
}
|
|
1742
|
-
}
|
|
1743
|
-
if (skipRule) {
|
|
1744
|
-
continue;
|
|
1745
|
-
}
|
|
1746
|
-
r.push(ruleId);
|
|
1747
|
-
}
|
|
1748
|
-
}
|
|
1749
|
-
}
|
|
1750
|
-
return {
|
|
1751
|
-
patterns: r,
|
|
1752
|
-
hasMissingPatterns: (patterns ? patterns.length : 0) !== r.length
|
|
1753
|
-
};
|
|
1754
|
-
}
|
|
1755
|
-
};
|
|
1756
|
-
var RegExpSource = class _RegExpSource {
|
|
1757
|
-
constructor(regExpSource, ruleId) {
|
|
1758
|
-
if (regExpSource) {
|
|
1759
|
-
const len = regExpSource.length;
|
|
1760
|
-
let lastPushedPos = 0;
|
|
1761
|
-
let output = [];
|
|
1762
|
-
let hasAnchor = false;
|
|
1763
|
-
for (let pos = 0; pos < len; pos++) {
|
|
1764
|
-
const ch = regExpSource.charAt(pos);
|
|
1765
|
-
if (ch === "\\") {
|
|
1766
|
-
if (pos + 1 < len) {
|
|
1767
|
-
const nextCh = regExpSource.charAt(pos + 1);
|
|
1768
|
-
if (nextCh === "z") {
|
|
1769
|
-
output.push(regExpSource.substring(lastPushedPos, pos));
|
|
1770
|
-
output.push("$(?!\\n)(?<!\\n)");
|
|
1771
|
-
lastPushedPos = pos + 2;
|
|
1772
|
-
} else if (nextCh === "A" || nextCh === "G") {
|
|
1773
|
-
hasAnchor = true;
|
|
1774
|
-
}
|
|
1775
|
-
pos++;
|
|
1776
|
-
}
|
|
1777
|
-
}
|
|
1778
|
-
}
|
|
1779
|
-
this.hasAnchor = hasAnchor;
|
|
1780
|
-
if (lastPushedPos === 0) {
|
|
1781
|
-
this.source = regExpSource;
|
|
1782
|
-
} else {
|
|
1783
|
-
output.push(regExpSource.substring(lastPushedPos, len));
|
|
1784
|
-
this.source = output.join("");
|
|
1785
|
-
}
|
|
1786
|
-
} else {
|
|
1787
|
-
this.hasAnchor = false;
|
|
1788
|
-
this.source = regExpSource;
|
|
1789
|
-
}
|
|
1790
|
-
if (this.hasAnchor) {
|
|
1791
|
-
this._anchorCache = this._buildAnchorCache();
|
|
1792
|
-
} else {
|
|
1793
|
-
this._anchorCache = null;
|
|
1794
|
-
}
|
|
1795
|
-
this.ruleId = ruleId;
|
|
1796
|
-
this.hasBackReferences = HAS_BACK_REFERENCES.test(this.source);
|
|
1797
|
-
}
|
|
1798
|
-
clone() {
|
|
1799
|
-
return new _RegExpSource(this.source, this.ruleId);
|
|
1800
|
-
}
|
|
1801
|
-
setSource(newSource) {
|
|
1802
|
-
if (this.source === newSource) {
|
|
1803
|
-
return;
|
|
1804
|
-
}
|
|
1805
|
-
this.source = newSource;
|
|
1806
|
-
if (this.hasAnchor) {
|
|
1807
|
-
this._anchorCache = this._buildAnchorCache();
|
|
1808
|
-
}
|
|
1809
|
-
}
|
|
1810
|
-
resolveBackReferences(lineText, captureIndices) {
|
|
1811
|
-
let capturedValues = captureIndices.map((capture) => {
|
|
1812
|
-
return lineText.substring(capture.start, capture.end);
|
|
1813
|
-
});
|
|
1814
|
-
BACK_REFERENCING_END.lastIndex = 0;
|
|
1815
|
-
return this.source.replace(BACK_REFERENCING_END, (match, g1) => {
|
|
1816
|
-
return escapeRegExpCharacters(capturedValues[parseInt(g1, 10)] || "");
|
|
1817
|
-
});
|
|
1818
|
-
}
|
|
1819
|
-
_buildAnchorCache() {
|
|
1820
|
-
let A0_G0_result = [];
|
|
1821
|
-
let A0_G1_result = [];
|
|
1822
|
-
let A1_G0_result = [];
|
|
1823
|
-
let A1_G1_result = [];
|
|
1824
|
-
let pos, len, ch, nextCh;
|
|
1825
|
-
for (pos = 0, len = this.source.length; pos < len; pos++) {
|
|
1826
|
-
ch = this.source.charAt(pos);
|
|
1827
|
-
A0_G0_result[pos] = ch;
|
|
1828
|
-
A0_G1_result[pos] = ch;
|
|
1829
|
-
A1_G0_result[pos] = ch;
|
|
1830
|
-
A1_G1_result[pos] = ch;
|
|
1831
|
-
if (ch === "\\") {
|
|
1832
|
-
if (pos + 1 < len) {
|
|
1833
|
-
nextCh = this.source.charAt(pos + 1);
|
|
1834
|
-
if (nextCh === "A") {
|
|
1835
|
-
A0_G0_result[pos + 1] = "\uFFFF";
|
|
1836
|
-
A0_G1_result[pos + 1] = "\uFFFF";
|
|
1837
|
-
A1_G0_result[pos + 1] = "A";
|
|
1838
|
-
A1_G1_result[pos + 1] = "A";
|
|
1839
|
-
} else if (nextCh === "G") {
|
|
1840
|
-
A0_G0_result[pos + 1] = "\uFFFF";
|
|
1841
|
-
A0_G1_result[pos + 1] = "G";
|
|
1842
|
-
A1_G0_result[pos + 1] = "\uFFFF";
|
|
1843
|
-
A1_G1_result[pos + 1] = "G";
|
|
1844
|
-
} else {
|
|
1845
|
-
A0_G0_result[pos + 1] = nextCh;
|
|
1846
|
-
A0_G1_result[pos + 1] = nextCh;
|
|
1847
|
-
A1_G0_result[pos + 1] = nextCh;
|
|
1848
|
-
A1_G1_result[pos + 1] = nextCh;
|
|
1849
|
-
}
|
|
1850
|
-
pos++;
|
|
1851
|
-
}
|
|
1852
|
-
}
|
|
1853
|
-
}
|
|
1854
|
-
return {
|
|
1855
|
-
A0_G0: A0_G0_result.join(""),
|
|
1856
|
-
A0_G1: A0_G1_result.join(""),
|
|
1857
|
-
A1_G0: A1_G0_result.join(""),
|
|
1858
|
-
A1_G1: A1_G1_result.join("")
|
|
1859
|
-
};
|
|
1860
|
-
}
|
|
1861
|
-
resolveAnchors(allowA, allowG) {
|
|
1862
|
-
if (!this.hasAnchor || !this._anchorCache) {
|
|
1863
|
-
return this.source;
|
|
1864
|
-
}
|
|
1865
|
-
if (allowA) {
|
|
1866
|
-
if (allowG) {
|
|
1867
|
-
return this._anchorCache.A1_G1;
|
|
1868
|
-
} else {
|
|
1869
|
-
return this._anchorCache.A1_G0;
|
|
1870
|
-
}
|
|
1871
|
-
} else {
|
|
1872
|
-
if (allowG) {
|
|
1873
|
-
return this._anchorCache.A0_G1;
|
|
1874
|
-
} else {
|
|
1875
|
-
return this._anchorCache.A0_G0;
|
|
1876
|
-
}
|
|
1877
|
-
}
|
|
1878
|
-
}
|
|
1879
|
-
};
|
|
1880
|
-
var RegExpSourceList = class {
|
|
1881
|
-
constructor() {
|
|
1882
|
-
this._items = [];
|
|
1883
|
-
this._hasAnchors = false;
|
|
1884
|
-
this._cached = null;
|
|
1885
|
-
this._anchorCache = {
|
|
1886
|
-
A0_G0: null,
|
|
1887
|
-
A0_G1: null,
|
|
1888
|
-
A1_G0: null,
|
|
1889
|
-
A1_G1: null
|
|
1890
|
-
};
|
|
1891
|
-
}
|
|
1892
|
-
dispose() {
|
|
1893
|
-
this._disposeCaches();
|
|
1894
|
-
}
|
|
1895
|
-
_disposeCaches() {
|
|
1896
|
-
if (this._cached) {
|
|
1897
|
-
this._cached.dispose();
|
|
1898
|
-
this._cached = null;
|
|
1899
|
-
}
|
|
1900
|
-
if (this._anchorCache.A0_G0) {
|
|
1901
|
-
this._anchorCache.A0_G0.dispose();
|
|
1902
|
-
this._anchorCache.A0_G0 = null;
|
|
1903
|
-
}
|
|
1904
|
-
if (this._anchorCache.A0_G1) {
|
|
1905
|
-
this._anchorCache.A0_G1.dispose();
|
|
1906
|
-
this._anchorCache.A0_G1 = null;
|
|
1907
|
-
}
|
|
1908
|
-
if (this._anchorCache.A1_G0) {
|
|
1909
|
-
this._anchorCache.A1_G0.dispose();
|
|
1910
|
-
this._anchorCache.A1_G0 = null;
|
|
1911
|
-
}
|
|
1912
|
-
if (this._anchorCache.A1_G1) {
|
|
1913
|
-
this._anchorCache.A1_G1.dispose();
|
|
1914
|
-
this._anchorCache.A1_G1 = null;
|
|
1915
|
-
}
|
|
1916
|
-
}
|
|
1917
|
-
push(item) {
|
|
1918
|
-
this._items.push(item);
|
|
1919
|
-
this._hasAnchors = this._hasAnchors || item.hasAnchor;
|
|
1920
|
-
}
|
|
1921
|
-
unshift(item) {
|
|
1922
|
-
this._items.unshift(item);
|
|
1923
|
-
this._hasAnchors = this._hasAnchors || item.hasAnchor;
|
|
1924
|
-
}
|
|
1925
|
-
length() {
|
|
1926
|
-
return this._items.length;
|
|
1927
|
-
}
|
|
1928
|
-
setSource(index, newSource) {
|
|
1929
|
-
if (this._items[index].source !== newSource) {
|
|
1930
|
-
this._disposeCaches();
|
|
1931
|
-
this._items[index].setSource(newSource);
|
|
1932
|
-
}
|
|
1933
|
-
}
|
|
1934
|
-
compile(onigLib) {
|
|
1935
|
-
if (!this._cached) {
|
|
1936
|
-
let regExps = this._items.map((e) => e.source);
|
|
1937
|
-
this._cached = new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));
|
|
1938
|
-
}
|
|
1939
|
-
return this._cached;
|
|
1940
|
-
}
|
|
1941
|
-
compileAG(onigLib, allowA, allowG) {
|
|
1942
|
-
if (!this._hasAnchors) {
|
|
1943
|
-
return this.compile(onigLib);
|
|
1944
|
-
} else {
|
|
1945
|
-
if (allowA) {
|
|
1946
|
-
if (allowG) {
|
|
1947
|
-
if (!this._anchorCache.A1_G1) {
|
|
1948
|
-
this._anchorCache.A1_G1 = this._resolveAnchors(onigLib, allowA, allowG);
|
|
1949
|
-
}
|
|
1950
|
-
return this._anchorCache.A1_G1;
|
|
1951
|
-
} else {
|
|
1952
|
-
if (!this._anchorCache.A1_G0) {
|
|
1953
|
-
this._anchorCache.A1_G0 = this._resolveAnchors(onigLib, allowA, allowG);
|
|
1954
|
-
}
|
|
1955
|
-
return this._anchorCache.A1_G0;
|
|
1956
|
-
}
|
|
1957
|
-
} else {
|
|
1958
|
-
if (allowG) {
|
|
1959
|
-
if (!this._anchorCache.A0_G1) {
|
|
1960
|
-
this._anchorCache.A0_G1 = this._resolveAnchors(onigLib, allowA, allowG);
|
|
1961
|
-
}
|
|
1962
|
-
return this._anchorCache.A0_G1;
|
|
1963
|
-
} else {
|
|
1964
|
-
if (!this._anchorCache.A0_G0) {
|
|
1965
|
-
this._anchorCache.A0_G0 = this._resolveAnchors(onigLib, allowA, allowG);
|
|
1966
|
-
}
|
|
1967
|
-
return this._anchorCache.A0_G0;
|
|
1968
|
-
}
|
|
1969
|
-
}
|
|
1970
|
-
}
|
|
1971
|
-
}
|
|
1972
|
-
_resolveAnchors(onigLib, allowA, allowG) {
|
|
1973
|
-
let regExps = this._items.map((e) => e.resolveAnchors(allowA, allowG));
|
|
1974
|
-
return new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));
|
|
1975
|
-
}
|
|
1976
|
-
};
|
|
1977
|
-
var CompiledRule = class {
|
|
1978
|
-
constructor(onigLib, regExps, rules) {
|
|
1979
|
-
this.regExps = regExps;
|
|
1980
|
-
this.rules = rules;
|
|
1981
|
-
this.scanner = onigLib.createOnigScanner(regExps);
|
|
1982
|
-
}
|
|
1983
|
-
dispose() {
|
|
1984
|
-
if (typeof this.scanner.dispose === "function") {
|
|
1985
|
-
this.scanner.dispose();
|
|
1986
|
-
}
|
|
1987
|
-
}
|
|
1988
|
-
toString() {
|
|
1989
|
-
const r = [];
|
|
1990
|
-
for (let i = 0, len = this.rules.length; i < len; i++) {
|
|
1991
|
-
r.push(" - " + this.rules[i] + ": " + this.regExps[i]);
|
|
1992
|
-
}
|
|
1993
|
-
return r.join("\n");
|
|
1994
|
-
}
|
|
1995
|
-
findNextMatchSync(string, startPosition, options) {
|
|
1996
|
-
const result = this.scanner.findNextMatchSync(string, startPosition, options);
|
|
1997
|
-
if (!result) {
|
|
1998
|
-
return null;
|
|
1999
|
-
}
|
|
2000
|
-
return {
|
|
2001
|
-
ruleId: this.rules[result.index],
|
|
2002
|
-
captureIndices: result.captureIndices
|
|
2003
|
-
};
|
|
2004
|
-
}
|
|
2005
|
-
};
|
|
2006
|
-
|
|
2007
|
-
// src/grammar/basicScopesAttributeProvider.ts
|
|
2008
|
-
var BasicScopeAttributes = class {
|
|
2009
|
-
constructor(languageId, tokenType) {
|
|
2010
|
-
this.languageId = languageId;
|
|
2011
|
-
this.tokenType = tokenType;
|
|
2012
|
-
}
|
|
2013
|
-
};
|
|
2014
|
-
var _BasicScopeAttributesProvider = class _BasicScopeAttributesProvider {
|
|
2015
|
-
constructor(initialLanguageId, embeddedLanguages) {
|
|
2016
|
-
this._getBasicScopeAttributes = new CachedFn((scopeName) => {
|
|
2017
|
-
const languageId = this._scopeToLanguage(scopeName);
|
|
2018
|
-
const standardTokenType = this._toStandardTokenType(scopeName);
|
|
2019
|
-
return new BasicScopeAttributes(languageId, standardTokenType);
|
|
2020
|
-
});
|
|
2021
|
-
this._defaultAttributes = new BasicScopeAttributes(initialLanguageId, 8 /* NotSet */);
|
|
2022
|
-
this._embeddedLanguagesMatcher = new ScopeMatcher(Object.entries(embeddedLanguages || {}));
|
|
2023
|
-
}
|
|
2024
|
-
getDefaultAttributes() {
|
|
2025
|
-
return this._defaultAttributes;
|
|
2026
|
-
}
|
|
2027
|
-
getBasicScopeAttributes(scopeName) {
|
|
2028
|
-
if (scopeName === null) {
|
|
2029
|
-
return _BasicScopeAttributesProvider._NULL_SCOPE_METADATA;
|
|
2030
|
-
}
|
|
2031
|
-
return this._getBasicScopeAttributes.get(scopeName);
|
|
2032
|
-
}
|
|
2033
|
-
/**
|
|
2034
|
-
* Given a produced TM scope, return the language that token describes or null if unknown.
|
|
2035
|
-
* e.g. source.html => html, source.css.embedded.html => css, punctuation.definition.tag.html => null
|
|
2036
|
-
*/
|
|
2037
|
-
_scopeToLanguage(scope) {
|
|
2038
|
-
return this._embeddedLanguagesMatcher.match(scope) || 0;
|
|
2039
|
-
}
|
|
2040
|
-
_toStandardTokenType(scopeName) {
|
|
2041
|
-
const m = scopeName.match(_BasicScopeAttributesProvider.STANDARD_TOKEN_TYPE_REGEXP);
|
|
2042
|
-
if (!m) {
|
|
2043
|
-
return 8 /* NotSet */;
|
|
2044
|
-
}
|
|
2045
|
-
switch (m[1]) {
|
|
2046
|
-
case "comment":
|
|
2047
|
-
return 1 /* Comment */;
|
|
2048
|
-
case "string":
|
|
2049
|
-
return 2 /* String */;
|
|
2050
|
-
case "regex":
|
|
2051
|
-
return 3 /* RegEx */;
|
|
2052
|
-
case "meta.embedded":
|
|
2053
|
-
return 0 /* Other */;
|
|
2054
|
-
}
|
|
2055
|
-
throw new Error("Unexpected match for standard token type!");
|
|
2056
|
-
}
|
|
2057
|
-
};
|
|
2058
|
-
_BasicScopeAttributesProvider._NULL_SCOPE_METADATA = new BasicScopeAttributes(0, 0);
|
|
2059
|
-
_BasicScopeAttributesProvider.STANDARD_TOKEN_TYPE_REGEXP = /\b(comment|string|regex|meta\.embedded)\b/;
|
|
2060
|
-
var BasicScopeAttributesProvider = _BasicScopeAttributesProvider;
|
|
2061
|
-
var ScopeMatcher = class {
|
|
2062
|
-
constructor(values) {
|
|
2063
|
-
if (values.length === 0) {
|
|
2064
|
-
this.values = null;
|
|
2065
|
-
this.scopesRegExp = null;
|
|
2066
|
-
} else {
|
|
2067
|
-
this.values = new Map(values);
|
|
2068
|
-
const escapedScopes = values.map(
|
|
2069
|
-
([scopeName, value]) => escapeRegExpCharacters(scopeName)
|
|
2070
|
-
);
|
|
2071
|
-
escapedScopes.sort();
|
|
2072
|
-
escapedScopes.reverse();
|
|
2073
|
-
this.scopesRegExp = new RegExp(
|
|
2074
|
-
`^((${escapedScopes.join(")|(")}))($|\\.)`,
|
|
2075
|
-
""
|
|
2076
|
-
);
|
|
2077
|
-
}
|
|
2078
|
-
}
|
|
2079
|
-
match(scope) {
|
|
2080
|
-
if (!this.scopesRegExp) {
|
|
2081
|
-
return void 0;
|
|
2082
|
-
}
|
|
2083
|
-
const m = scope.match(this.scopesRegExp);
|
|
2084
|
-
if (!m) {
|
|
2085
|
-
return void 0;
|
|
2086
|
-
}
|
|
2087
|
-
return this.values.get(m[1]);
|
|
2088
|
-
}
|
|
2089
|
-
};
|
|
2090
|
-
|
|
2091
|
-
// src/debug.ts
|
|
2092
|
-
({
|
|
2093
|
-
InDebugMode: typeof process !== "undefined" && !!process.env["VSCODE_TEXTMATE_DEBUG"]
|
|
2094
|
-
});
|
|
2095
|
-
|
|
2096
|
-
// src/grammar/tokenizeString.ts
|
|
2097
|
-
var TokenizeStringResult = class {
|
|
2098
|
-
constructor(stack, stoppedEarly) {
|
|
2099
|
-
this.stack = stack;
|
|
2100
|
-
this.stoppedEarly = stoppedEarly;
|
|
2101
|
-
}
|
|
2102
|
-
};
|
|
2103
|
-
function _tokenizeString(grammar, lineText, isFirstLine, linePos, stack, lineTokens, checkWhileConditions, timeLimit) {
|
|
2104
|
-
const lineLength = lineText.content.length;
|
|
2105
|
-
let STOP = false;
|
|
2106
|
-
let anchorPosition = -1;
|
|
2107
|
-
if (checkWhileConditions) {
|
|
2108
|
-
const whileCheckResult = _checkWhileConditions(
|
|
2109
|
-
grammar,
|
|
2110
|
-
lineText,
|
|
2111
|
-
isFirstLine,
|
|
2112
|
-
linePos,
|
|
2113
|
-
stack,
|
|
2114
|
-
lineTokens
|
|
2115
|
-
);
|
|
2116
|
-
stack = whileCheckResult.stack;
|
|
2117
|
-
linePos = whileCheckResult.linePos;
|
|
2118
|
-
isFirstLine = whileCheckResult.isFirstLine;
|
|
2119
|
-
anchorPosition = whileCheckResult.anchorPosition;
|
|
2120
|
-
}
|
|
2121
|
-
const startTime = Date.now();
|
|
2122
|
-
while (!STOP) {
|
|
2123
|
-
if (timeLimit !== 0) {
|
|
2124
|
-
const elapsedTime = Date.now() - startTime;
|
|
2125
|
-
if (elapsedTime > timeLimit) {
|
|
2126
|
-
return new TokenizeStringResult(stack, true);
|
|
2127
|
-
}
|
|
2128
|
-
}
|
|
2129
|
-
scanNext();
|
|
2130
|
-
}
|
|
2131
|
-
return new TokenizeStringResult(stack, false);
|
|
2132
|
-
function scanNext() {
|
|
2133
|
-
const r = matchRuleOrInjections(
|
|
2134
|
-
grammar,
|
|
2135
|
-
lineText,
|
|
2136
|
-
isFirstLine,
|
|
2137
|
-
linePos,
|
|
2138
|
-
stack,
|
|
2139
|
-
anchorPosition
|
|
2140
|
-
);
|
|
2141
|
-
if (!r) {
|
|
2142
|
-
lineTokens.produce(stack, lineLength);
|
|
2143
|
-
STOP = true;
|
|
2144
|
-
return;
|
|
2145
|
-
}
|
|
2146
|
-
const captureIndices = r.captureIndices;
|
|
2147
|
-
const matchedRuleId = r.matchedRuleId;
|
|
2148
|
-
const hasAdvanced = captureIndices && captureIndices.length > 0 ? captureIndices[0].end > linePos : false;
|
|
2149
|
-
if (matchedRuleId === endRuleId) {
|
|
2150
|
-
const poppedRule = stack.getRule(grammar);
|
|
2151
|
-
lineTokens.produce(stack, captureIndices[0].start);
|
|
2152
|
-
stack = stack.withContentNameScopesList(stack.nameScopesList);
|
|
2153
|
-
handleCaptures(
|
|
2154
|
-
grammar,
|
|
2155
|
-
lineText,
|
|
2156
|
-
isFirstLine,
|
|
2157
|
-
stack,
|
|
2158
|
-
lineTokens,
|
|
2159
|
-
poppedRule.endCaptures,
|
|
2160
|
-
captureIndices
|
|
2161
|
-
);
|
|
2162
|
-
lineTokens.produce(stack, captureIndices[0].end);
|
|
2163
|
-
const popped = stack;
|
|
2164
|
-
stack = stack.parent;
|
|
2165
|
-
anchorPosition = popped.getAnchorPos();
|
|
2166
|
-
if (!hasAdvanced && popped.getEnterPos() === linePos) {
|
|
2167
|
-
stack = popped;
|
|
2168
|
-
lineTokens.produce(stack, lineLength);
|
|
2169
|
-
STOP = true;
|
|
2170
|
-
return;
|
|
2171
|
-
}
|
|
2172
|
-
} else {
|
|
2173
|
-
const _rule = grammar.getRule(matchedRuleId);
|
|
2174
|
-
lineTokens.produce(stack, captureIndices[0].start);
|
|
2175
|
-
const beforePush = stack;
|
|
2176
|
-
const scopeName = _rule.getName(lineText.content, captureIndices);
|
|
2177
|
-
const nameScopesList = stack.contentNameScopesList.pushAttributed(
|
|
2178
|
-
scopeName,
|
|
2179
|
-
grammar
|
|
2180
|
-
);
|
|
2181
|
-
stack = stack.push(
|
|
2182
|
-
matchedRuleId,
|
|
2183
|
-
linePos,
|
|
2184
|
-
anchorPosition,
|
|
2185
|
-
captureIndices[0].end === lineLength,
|
|
2186
|
-
null,
|
|
2187
|
-
nameScopesList,
|
|
2188
|
-
nameScopesList
|
|
2189
|
-
);
|
|
2190
|
-
if (_rule instanceof BeginEndRule) {
|
|
2191
|
-
const pushedRule = _rule;
|
|
2192
|
-
handleCaptures(
|
|
2193
|
-
grammar,
|
|
2194
|
-
lineText,
|
|
2195
|
-
isFirstLine,
|
|
2196
|
-
stack,
|
|
2197
|
-
lineTokens,
|
|
2198
|
-
pushedRule.beginCaptures,
|
|
2199
|
-
captureIndices
|
|
2200
|
-
);
|
|
2201
|
-
lineTokens.produce(stack, captureIndices[0].end);
|
|
2202
|
-
anchorPosition = captureIndices[0].end;
|
|
2203
|
-
const contentName = pushedRule.getContentName(
|
|
2204
|
-
lineText.content,
|
|
2205
|
-
captureIndices
|
|
2206
|
-
);
|
|
2207
|
-
const contentNameScopesList = nameScopesList.pushAttributed(
|
|
2208
|
-
contentName,
|
|
2209
|
-
grammar
|
|
2210
|
-
);
|
|
2211
|
-
stack = stack.withContentNameScopesList(contentNameScopesList);
|
|
2212
|
-
if (pushedRule.endHasBackReferences) {
|
|
2213
|
-
stack = stack.withEndRule(
|
|
2214
|
-
pushedRule.getEndWithResolvedBackReferences(
|
|
2215
|
-
lineText.content,
|
|
2216
|
-
captureIndices
|
|
2217
|
-
)
|
|
2218
|
-
);
|
|
2219
|
-
}
|
|
2220
|
-
if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {
|
|
2221
|
-
stack = stack.pop();
|
|
2222
|
-
lineTokens.produce(stack, lineLength);
|
|
2223
|
-
STOP = true;
|
|
2224
|
-
return;
|
|
2225
|
-
}
|
|
2226
|
-
} else if (_rule instanceof BeginWhileRule) {
|
|
2227
|
-
const pushedRule = _rule;
|
|
2228
|
-
handleCaptures(
|
|
2229
|
-
grammar,
|
|
2230
|
-
lineText,
|
|
2231
|
-
isFirstLine,
|
|
2232
|
-
stack,
|
|
2233
|
-
lineTokens,
|
|
2234
|
-
pushedRule.beginCaptures,
|
|
2235
|
-
captureIndices
|
|
2236
|
-
);
|
|
2237
|
-
lineTokens.produce(stack, captureIndices[0].end);
|
|
2238
|
-
anchorPosition = captureIndices[0].end;
|
|
2239
|
-
const contentName = pushedRule.getContentName(
|
|
2240
|
-
lineText.content,
|
|
2241
|
-
captureIndices
|
|
2242
|
-
);
|
|
2243
|
-
const contentNameScopesList = nameScopesList.pushAttributed(
|
|
2244
|
-
contentName,
|
|
2245
|
-
grammar
|
|
2246
|
-
);
|
|
2247
|
-
stack = stack.withContentNameScopesList(contentNameScopesList);
|
|
2248
|
-
if (pushedRule.whileHasBackReferences) {
|
|
2249
|
-
stack = stack.withEndRule(
|
|
2250
|
-
pushedRule.getWhileWithResolvedBackReferences(
|
|
2251
|
-
lineText.content,
|
|
2252
|
-
captureIndices
|
|
2253
|
-
)
|
|
2254
|
-
);
|
|
2255
|
-
}
|
|
2256
|
-
if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {
|
|
2257
|
-
stack = stack.pop();
|
|
2258
|
-
lineTokens.produce(stack, lineLength);
|
|
2259
|
-
STOP = true;
|
|
2260
|
-
return;
|
|
2261
|
-
}
|
|
2262
|
-
} else {
|
|
2263
|
-
const matchingRule = _rule;
|
|
2264
|
-
handleCaptures(
|
|
2265
|
-
grammar,
|
|
2266
|
-
lineText,
|
|
2267
|
-
isFirstLine,
|
|
2268
|
-
stack,
|
|
2269
|
-
lineTokens,
|
|
2270
|
-
matchingRule.captures,
|
|
2271
|
-
captureIndices
|
|
2272
|
-
);
|
|
2273
|
-
lineTokens.produce(stack, captureIndices[0].end);
|
|
2274
|
-
stack = stack.pop();
|
|
2275
|
-
if (!hasAdvanced) {
|
|
2276
|
-
stack = stack.safePop();
|
|
2277
|
-
lineTokens.produce(stack, lineLength);
|
|
2278
|
-
STOP = true;
|
|
2279
|
-
return;
|
|
2280
|
-
}
|
|
2281
|
-
}
|
|
2282
|
-
}
|
|
2283
|
-
if (captureIndices[0].end > linePos) {
|
|
2284
|
-
linePos = captureIndices[0].end;
|
|
2285
|
-
isFirstLine = false;
|
|
2286
|
-
}
|
|
2287
|
-
}
|
|
2288
|
-
}
|
|
2289
|
-
function _checkWhileConditions(grammar, lineText, isFirstLine, linePos, stack, lineTokens) {
|
|
2290
|
-
let anchorPosition = stack.beginRuleCapturedEOL ? 0 : -1;
|
|
2291
|
-
const whileRules = [];
|
|
2292
|
-
for (let node = stack; node; node = node.pop()) {
|
|
2293
|
-
const nodeRule = node.getRule(grammar);
|
|
2294
|
-
if (nodeRule instanceof BeginWhileRule) {
|
|
2295
|
-
whileRules.push({
|
|
2296
|
-
rule: nodeRule,
|
|
2297
|
-
stack: node
|
|
2298
|
-
});
|
|
2299
|
-
}
|
|
2300
|
-
}
|
|
2301
|
-
for (let whileRule = whileRules.pop(); whileRule; whileRule = whileRules.pop()) {
|
|
2302
|
-
const { ruleScanner, findOptions } = prepareRuleWhileSearch(whileRule.rule, grammar, whileRule.stack.endRule, isFirstLine, linePos === anchorPosition);
|
|
2303
|
-
const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);
|
|
2304
|
-
if (r) {
|
|
2305
|
-
const matchedRuleId = r.ruleId;
|
|
2306
|
-
if (matchedRuleId !== whileRuleId) {
|
|
2307
|
-
stack = whileRule.stack.pop();
|
|
2308
|
-
break;
|
|
2309
|
-
}
|
|
2310
|
-
if (r.captureIndices && r.captureIndices.length) {
|
|
2311
|
-
lineTokens.produce(whileRule.stack, r.captureIndices[0].start);
|
|
2312
|
-
handleCaptures(grammar, lineText, isFirstLine, whileRule.stack, lineTokens, whileRule.rule.whileCaptures, r.captureIndices);
|
|
2313
|
-
lineTokens.produce(whileRule.stack, r.captureIndices[0].end);
|
|
2314
|
-
anchorPosition = r.captureIndices[0].end;
|
|
2315
|
-
if (r.captureIndices[0].end > linePos) {
|
|
2316
|
-
linePos = r.captureIndices[0].end;
|
|
2317
|
-
isFirstLine = false;
|
|
2318
|
-
}
|
|
2319
|
-
}
|
|
2320
|
-
} else {
|
|
2321
|
-
stack = whileRule.stack.pop();
|
|
2322
|
-
break;
|
|
2323
|
-
}
|
|
2324
|
-
}
|
|
2325
|
-
return { stack, linePos, anchorPosition, isFirstLine };
|
|
2326
|
-
}
|
|
2327
|
-
function matchRuleOrInjections(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {
|
|
2328
|
-
const matchResult = matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition);
|
|
2329
|
-
const injections = grammar.getInjections();
|
|
2330
|
-
if (injections.length === 0) {
|
|
2331
|
-
return matchResult;
|
|
2332
|
-
}
|
|
2333
|
-
const injectionResult = matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition);
|
|
2334
|
-
if (!injectionResult) {
|
|
2335
|
-
return matchResult;
|
|
2336
|
-
}
|
|
2337
|
-
if (!matchResult) {
|
|
2338
|
-
return injectionResult;
|
|
2339
|
-
}
|
|
2340
|
-
const matchResultScore = matchResult.captureIndices[0].start;
|
|
2341
|
-
const injectionResultScore = injectionResult.captureIndices[0].start;
|
|
2342
|
-
if (injectionResultScore < matchResultScore || injectionResult.priorityMatch && injectionResultScore === matchResultScore) {
|
|
2343
|
-
return injectionResult;
|
|
2344
|
-
}
|
|
2345
|
-
return matchResult;
|
|
2346
|
-
}
|
|
2347
|
-
function matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {
|
|
2348
|
-
const rule = stack.getRule(grammar);
|
|
2349
|
-
const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, stack.endRule, isFirstLine, linePos === anchorPosition);
|
|
2350
|
-
const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);
|
|
2351
|
-
if (r) {
|
|
2352
|
-
return {
|
|
2353
|
-
captureIndices: r.captureIndices,
|
|
2354
|
-
matchedRuleId: r.ruleId
|
|
2355
|
-
};
|
|
2356
|
-
}
|
|
2357
|
-
return null;
|
|
2358
|
-
}
|
|
2359
|
-
function matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {
|
|
2360
|
-
let bestMatchRating = Number.MAX_VALUE;
|
|
2361
|
-
let bestMatchCaptureIndices = null;
|
|
2362
|
-
let bestMatchRuleId;
|
|
2363
|
-
let bestMatchResultPriority = 0;
|
|
2364
|
-
const scopes = stack.contentNameScopesList.getScopeNames();
|
|
2365
|
-
for (let i = 0, len = injections.length; i < len; i++) {
|
|
2366
|
-
const injection = injections[i];
|
|
2367
|
-
if (!injection.matcher(scopes)) {
|
|
2368
|
-
continue;
|
|
2369
|
-
}
|
|
2370
|
-
const rule = grammar.getRule(injection.ruleId);
|
|
2371
|
-
const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, null, isFirstLine, linePos === anchorPosition);
|
|
2372
|
-
const matchResult = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);
|
|
2373
|
-
if (!matchResult) {
|
|
2374
|
-
continue;
|
|
2375
|
-
}
|
|
2376
|
-
const matchRating = matchResult.captureIndices[0].start;
|
|
2377
|
-
if (matchRating >= bestMatchRating) {
|
|
2378
|
-
continue;
|
|
2379
|
-
}
|
|
2380
|
-
bestMatchRating = matchRating;
|
|
2381
|
-
bestMatchCaptureIndices = matchResult.captureIndices;
|
|
2382
|
-
bestMatchRuleId = matchResult.ruleId;
|
|
2383
|
-
bestMatchResultPriority = injection.priority;
|
|
2384
|
-
if (bestMatchRating === linePos) {
|
|
2385
|
-
break;
|
|
2386
|
-
}
|
|
2387
|
-
}
|
|
2388
|
-
if (bestMatchCaptureIndices) {
|
|
2389
|
-
return {
|
|
2390
|
-
priorityMatch: bestMatchResultPriority === -1,
|
|
2391
|
-
captureIndices: bestMatchCaptureIndices,
|
|
2392
|
-
matchedRuleId: bestMatchRuleId
|
|
2393
|
-
};
|
|
2394
|
-
}
|
|
2395
|
-
return null;
|
|
2396
|
-
}
|
|
2397
|
-
function prepareRuleSearch(rule, grammar, endRegexSource, allowA, allowG) {
|
|
2398
|
-
const ruleScanner = rule.compileAG(grammar, endRegexSource, allowA, allowG);
|
|
2399
|
-
return { ruleScanner, findOptions: 0 /* None */ };
|
|
2400
|
-
}
|
|
2401
|
-
function prepareRuleWhileSearch(rule, grammar, endRegexSource, allowA, allowG) {
|
|
2402
|
-
const ruleScanner = rule.compileWhileAG(grammar, endRegexSource, allowA, allowG);
|
|
2403
|
-
return { ruleScanner, findOptions: 0 /* None */ };
|
|
2404
|
-
}
|
|
2405
|
-
function handleCaptures(grammar, lineText, isFirstLine, stack, lineTokens, captures, captureIndices) {
|
|
2406
|
-
if (captures.length === 0) {
|
|
2407
|
-
return;
|
|
2408
|
-
}
|
|
2409
|
-
const lineTextContent = lineText.content;
|
|
2410
|
-
const len = Math.min(captures.length, captureIndices.length);
|
|
2411
|
-
const localStack = [];
|
|
2412
|
-
const maxEnd = captureIndices[0].end;
|
|
2413
|
-
for (let i = 0; i < len; i++) {
|
|
2414
|
-
const captureRule = captures[i];
|
|
2415
|
-
if (captureRule === null) {
|
|
2416
|
-
continue;
|
|
2417
|
-
}
|
|
2418
|
-
const captureIndex = captureIndices[i];
|
|
2419
|
-
if (captureIndex.length === 0) {
|
|
2420
|
-
continue;
|
|
2421
|
-
}
|
|
2422
|
-
if (captureIndex.start > maxEnd) {
|
|
2423
|
-
break;
|
|
2424
|
-
}
|
|
2425
|
-
while (localStack.length > 0 && localStack[localStack.length - 1].endPos <= captureIndex.start) {
|
|
2426
|
-
lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);
|
|
2427
|
-
localStack.pop();
|
|
2428
|
-
}
|
|
2429
|
-
if (localStack.length > 0) {
|
|
2430
|
-
lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, captureIndex.start);
|
|
2431
|
-
} else {
|
|
2432
|
-
lineTokens.produce(stack, captureIndex.start);
|
|
2433
|
-
}
|
|
2434
|
-
if (captureRule.retokenizeCapturedWithRuleId) {
|
|
2435
|
-
const scopeName = captureRule.getName(lineTextContent, captureIndices);
|
|
2436
|
-
const nameScopesList = stack.contentNameScopesList.pushAttributed(scopeName, grammar);
|
|
2437
|
-
const contentName = captureRule.getContentName(lineTextContent, captureIndices);
|
|
2438
|
-
const contentNameScopesList = nameScopesList.pushAttributed(contentName, grammar);
|
|
2439
|
-
const stackClone = stack.push(captureRule.retokenizeCapturedWithRuleId, captureIndex.start, -1, false, null, nameScopesList, contentNameScopesList);
|
|
2440
|
-
const onigSubStr = grammar.createOnigString(lineTextContent.substring(0, captureIndex.end));
|
|
2441
|
-
_tokenizeString(
|
|
2442
|
-
grammar,
|
|
2443
|
-
onigSubStr,
|
|
2444
|
-
isFirstLine && captureIndex.start === 0,
|
|
2445
|
-
captureIndex.start,
|
|
2446
|
-
stackClone,
|
|
2447
|
-
lineTokens,
|
|
2448
|
-
false,
|
|
2449
|
-
/* no time limit */
|
|
2450
|
-
0
|
|
2451
|
-
);
|
|
2452
|
-
disposeOnigString(onigSubStr);
|
|
2453
|
-
continue;
|
|
2454
|
-
}
|
|
2455
|
-
const captureRuleScopeName = captureRule.getName(lineTextContent, captureIndices);
|
|
2456
|
-
if (captureRuleScopeName !== null) {
|
|
2457
|
-
const base = localStack.length > 0 ? localStack[localStack.length - 1].scopes : stack.contentNameScopesList;
|
|
2458
|
-
const captureRuleScopesList = base.pushAttributed(captureRuleScopeName, grammar);
|
|
2459
|
-
localStack.push(new LocalStackElement(captureRuleScopesList, captureIndex.end));
|
|
2460
|
-
}
|
|
2461
|
-
}
|
|
2462
|
-
while (localStack.length > 0) {
|
|
2463
|
-
lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);
|
|
2464
|
-
localStack.pop();
|
|
2465
|
-
}
|
|
2466
|
-
}
|
|
2467
|
-
var LocalStackElement = class {
|
|
2468
|
-
constructor(scopes, endPos) {
|
|
2469
|
-
this.scopes = scopes;
|
|
2470
|
-
this.endPos = endPos;
|
|
2471
|
-
}
|
|
2472
|
-
};
|
|
2473
|
-
|
|
2474
|
-
// src/grammar/grammar.ts
|
|
2475
|
-
function createGrammar(scopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, onigLib) {
|
|
2476
|
-
return new Grammar(
|
|
2477
|
-
scopeName,
|
|
2478
|
-
grammar,
|
|
2479
|
-
initialLanguage,
|
|
2480
|
-
embeddedLanguages,
|
|
2481
|
-
tokenTypes,
|
|
2482
|
-
balancedBracketSelectors,
|
|
2483
|
-
grammarRepository,
|
|
2484
|
-
onigLib
|
|
2485
|
-
);
|
|
2486
|
-
}
|
|
2487
|
-
function collectInjections(result, selector, rule, ruleFactoryHelper, grammar) {
|
|
2488
|
-
const matchers = createMatchers(selector, nameMatcher);
|
|
2489
|
-
const ruleId = RuleFactory.getCompiledRuleId(rule, ruleFactoryHelper, grammar.repository);
|
|
2490
|
-
for (const matcher of matchers) {
|
|
2491
|
-
result.push({
|
|
2492
|
-
debugSelector: selector,
|
|
2493
|
-
matcher: matcher.matcher,
|
|
2494
|
-
ruleId,
|
|
2495
|
-
grammar,
|
|
2496
|
-
priority: matcher.priority
|
|
2497
|
-
});
|
|
2498
|
-
}
|
|
2499
|
-
}
|
|
2500
|
-
function nameMatcher(identifers, scopes) {
|
|
2501
|
-
if (scopes.length < identifers.length) {
|
|
2502
|
-
return false;
|
|
2503
|
-
}
|
|
2504
|
-
let lastIndex = 0;
|
|
2505
|
-
return identifers.every((identifier) => {
|
|
2506
|
-
for (let i = lastIndex; i < scopes.length; i++) {
|
|
2507
|
-
if (scopesAreMatching(scopes[i], identifier)) {
|
|
2508
|
-
lastIndex = i + 1;
|
|
2509
|
-
return true;
|
|
2510
|
-
}
|
|
2511
|
-
}
|
|
2512
|
-
return false;
|
|
2513
|
-
});
|
|
2514
|
-
}
|
|
2515
|
-
function scopesAreMatching(thisScopeName, scopeName) {
|
|
2516
|
-
if (!thisScopeName) {
|
|
2517
|
-
return false;
|
|
2518
|
-
}
|
|
2519
|
-
if (thisScopeName === scopeName) {
|
|
2520
|
-
return true;
|
|
2521
|
-
}
|
|
2522
|
-
const len = scopeName.length;
|
|
2523
|
-
return thisScopeName.length > len && thisScopeName.substr(0, len) === scopeName && thisScopeName[len] === ".";
|
|
2524
|
-
}
|
|
2525
|
-
var Grammar = class {
|
|
2526
|
-
constructor(_rootScopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, _onigLib) {
|
|
2527
|
-
this._rootScopeName = _rootScopeName;
|
|
2528
|
-
this.balancedBracketSelectors = balancedBracketSelectors;
|
|
2529
|
-
this._onigLib = _onigLib;
|
|
2530
|
-
this._basicScopeAttributesProvider = new BasicScopeAttributesProvider(
|
|
2531
|
-
initialLanguage,
|
|
2532
|
-
embeddedLanguages
|
|
2533
|
-
);
|
|
2534
|
-
this._rootId = -1;
|
|
2535
|
-
this._lastRuleId = 0;
|
|
2536
|
-
this._ruleId2desc = [null];
|
|
2537
|
-
this._includedGrammars = {};
|
|
2538
|
-
this._grammarRepository = grammarRepository;
|
|
2539
|
-
this._grammar = initGrammar(grammar, null);
|
|
2540
|
-
this._injections = null;
|
|
2541
|
-
this._tokenTypeMatchers = [];
|
|
2542
|
-
if (tokenTypes) {
|
|
2543
|
-
for (const selector of Object.keys(tokenTypes)) {
|
|
2544
|
-
const matchers = createMatchers(selector, nameMatcher);
|
|
2545
|
-
for (const matcher of matchers) {
|
|
2546
|
-
this._tokenTypeMatchers.push({
|
|
2547
|
-
matcher: matcher.matcher,
|
|
2548
|
-
type: tokenTypes[selector]
|
|
2549
|
-
});
|
|
2550
|
-
}
|
|
2551
|
-
}
|
|
2552
|
-
}
|
|
2553
|
-
}
|
|
2554
|
-
get themeProvider() {
|
|
2555
|
-
return this._grammarRepository;
|
|
2556
|
-
}
|
|
2557
|
-
dispose() {
|
|
2558
|
-
for (const rule of this._ruleId2desc) {
|
|
2559
|
-
if (rule) {
|
|
2560
|
-
rule.dispose();
|
|
2561
|
-
}
|
|
2562
|
-
}
|
|
2563
|
-
}
|
|
2564
|
-
createOnigScanner(sources) {
|
|
2565
|
-
return this._onigLib.createOnigScanner(sources);
|
|
2566
|
-
}
|
|
2567
|
-
createOnigString(sources) {
|
|
2568
|
-
return this._onigLib.createOnigString(sources);
|
|
2569
|
-
}
|
|
2570
|
-
getMetadataForScope(scope) {
|
|
2571
|
-
return this._basicScopeAttributesProvider.getBasicScopeAttributes(scope);
|
|
2572
|
-
}
|
|
2573
|
-
_collectInjections() {
|
|
2574
|
-
const grammarRepository = {
|
|
2575
|
-
lookup: (scopeName2) => {
|
|
2576
|
-
if (scopeName2 === this._rootScopeName) {
|
|
2577
|
-
return this._grammar;
|
|
2578
|
-
}
|
|
2579
|
-
return this.getExternalGrammar(scopeName2);
|
|
2580
|
-
},
|
|
2581
|
-
injections: (scopeName2) => {
|
|
2582
|
-
return this._grammarRepository.injections(scopeName2);
|
|
2583
|
-
}
|
|
2584
|
-
};
|
|
2585
|
-
const result = [];
|
|
2586
|
-
const scopeName = this._rootScopeName;
|
|
2587
|
-
const grammar = grammarRepository.lookup(scopeName);
|
|
2588
|
-
if (grammar) {
|
|
2589
|
-
const rawInjections = grammar.injections;
|
|
2590
|
-
if (rawInjections) {
|
|
2591
|
-
for (let expression in rawInjections) {
|
|
2592
|
-
collectInjections(
|
|
2593
|
-
result,
|
|
2594
|
-
expression,
|
|
2595
|
-
rawInjections[expression],
|
|
2596
|
-
this,
|
|
2597
|
-
grammar
|
|
2598
|
-
);
|
|
2599
|
-
}
|
|
2600
|
-
}
|
|
2601
|
-
const injectionScopeNames = this._grammarRepository.injections(scopeName);
|
|
2602
|
-
if (injectionScopeNames) {
|
|
2603
|
-
injectionScopeNames.forEach((injectionScopeName) => {
|
|
2604
|
-
const injectionGrammar = this.getExternalGrammar(injectionScopeName);
|
|
2605
|
-
if (injectionGrammar) {
|
|
2606
|
-
const selector = injectionGrammar.injectionSelector;
|
|
2607
|
-
if (selector) {
|
|
2608
|
-
collectInjections(
|
|
2609
|
-
result,
|
|
2610
|
-
selector,
|
|
2611
|
-
injectionGrammar,
|
|
2612
|
-
this,
|
|
2613
|
-
injectionGrammar
|
|
2614
|
-
);
|
|
2615
|
-
}
|
|
2616
|
-
}
|
|
2617
|
-
});
|
|
2618
|
-
}
|
|
2619
|
-
}
|
|
2620
|
-
result.sort((i1, i2) => i1.priority - i2.priority);
|
|
2621
|
-
return result;
|
|
2622
|
-
}
|
|
2623
|
-
getInjections() {
|
|
2624
|
-
if (this._injections === null) {
|
|
2625
|
-
this._injections = this._collectInjections();
|
|
2626
|
-
}
|
|
2627
|
-
return this._injections;
|
|
2628
|
-
}
|
|
2629
|
-
registerRule(factory) {
|
|
2630
|
-
const id = ++this._lastRuleId;
|
|
2631
|
-
const result = factory(ruleIdFromNumber(id));
|
|
2632
|
-
this._ruleId2desc[id] = result;
|
|
2633
|
-
return result;
|
|
2634
|
-
}
|
|
2635
|
-
getRule(ruleId) {
|
|
2636
|
-
return this._ruleId2desc[ruleIdToNumber(ruleId)];
|
|
2637
|
-
}
|
|
2638
|
-
getExternalGrammar(scopeName, repository) {
|
|
2639
|
-
if (this._includedGrammars[scopeName]) {
|
|
2640
|
-
return this._includedGrammars[scopeName];
|
|
2641
|
-
} else if (this._grammarRepository) {
|
|
2642
|
-
const rawIncludedGrammar = this._grammarRepository.lookup(scopeName);
|
|
2643
|
-
if (rawIncludedGrammar) {
|
|
2644
|
-
this._includedGrammars[scopeName] = initGrammar(
|
|
2645
|
-
rawIncludedGrammar,
|
|
2646
|
-
repository && repository.$base
|
|
2647
|
-
);
|
|
2648
|
-
return this._includedGrammars[scopeName];
|
|
2649
|
-
}
|
|
2650
|
-
}
|
|
2651
|
-
return void 0;
|
|
2652
|
-
}
|
|
2653
|
-
tokenizeLine(lineText, prevState, timeLimit = 0) {
|
|
2654
|
-
const r = this._tokenize(lineText, prevState, false, timeLimit);
|
|
2655
|
-
return {
|
|
2656
|
-
tokens: r.lineTokens.getResult(r.ruleStack, r.lineLength),
|
|
2657
|
-
ruleStack: r.ruleStack,
|
|
2658
|
-
stoppedEarly: r.stoppedEarly
|
|
2659
|
-
};
|
|
2660
|
-
}
|
|
2661
|
-
tokenizeLine2(lineText, prevState, timeLimit = 0) {
|
|
2662
|
-
const r = this._tokenize(lineText, prevState, true, timeLimit);
|
|
2663
|
-
return {
|
|
2664
|
-
tokens: r.lineTokens.getBinaryResult(r.ruleStack, r.lineLength),
|
|
2665
|
-
ruleStack: r.ruleStack,
|
|
2666
|
-
stoppedEarly: r.stoppedEarly
|
|
2667
|
-
};
|
|
2668
|
-
}
|
|
2669
|
-
_tokenize(lineText, prevState, emitBinaryTokens, timeLimit) {
|
|
2670
|
-
if (this._rootId === -1) {
|
|
2671
|
-
this._rootId = RuleFactory.getCompiledRuleId(
|
|
2672
|
-
this._grammar.repository.$self,
|
|
2673
|
-
this,
|
|
2674
|
-
this._grammar.repository
|
|
2675
|
-
);
|
|
2676
|
-
this.getInjections();
|
|
2677
|
-
}
|
|
2678
|
-
let isFirstLine;
|
|
2679
|
-
if (!prevState || prevState === StateStackImpl.NULL) {
|
|
2680
|
-
isFirstLine = true;
|
|
2681
|
-
const rawDefaultMetadata = this._basicScopeAttributesProvider.getDefaultAttributes();
|
|
2682
|
-
const defaultStyle = this.themeProvider.getDefaults();
|
|
2683
|
-
const defaultMetadata = EncodedTokenAttributes.set(
|
|
2684
|
-
0,
|
|
2685
|
-
rawDefaultMetadata.languageId,
|
|
2686
|
-
rawDefaultMetadata.tokenType,
|
|
2687
|
-
null,
|
|
2688
|
-
defaultStyle.fontStyle,
|
|
2689
|
-
defaultStyle.foregroundId,
|
|
2690
|
-
defaultStyle.backgroundId
|
|
2691
|
-
);
|
|
2692
|
-
const rootScopeName = this.getRule(this._rootId).getName(
|
|
2693
|
-
null,
|
|
2694
|
-
null
|
|
2695
|
-
);
|
|
2696
|
-
let scopeList;
|
|
2697
|
-
if (rootScopeName) {
|
|
2698
|
-
scopeList = AttributedScopeStack.createRootAndLookUpScopeName(
|
|
2699
|
-
rootScopeName,
|
|
2700
|
-
defaultMetadata,
|
|
2701
|
-
this
|
|
2702
|
-
);
|
|
2703
|
-
} else {
|
|
2704
|
-
scopeList = AttributedScopeStack.createRoot(
|
|
2705
|
-
"unknown",
|
|
2706
|
-
defaultMetadata
|
|
2707
|
-
);
|
|
2708
|
-
}
|
|
2709
|
-
prevState = new StateStackImpl(
|
|
2710
|
-
null,
|
|
2711
|
-
this._rootId,
|
|
2712
|
-
-1,
|
|
2713
|
-
-1,
|
|
2714
|
-
false,
|
|
2715
|
-
null,
|
|
2716
|
-
scopeList,
|
|
2717
|
-
scopeList
|
|
2718
|
-
);
|
|
2719
|
-
} else {
|
|
2720
|
-
isFirstLine = false;
|
|
2721
|
-
prevState.reset();
|
|
2722
|
-
}
|
|
2723
|
-
lineText = lineText + "\n";
|
|
2724
|
-
const onigLineText = this.createOnigString(lineText);
|
|
2725
|
-
const lineLength = onigLineText.content.length;
|
|
2726
|
-
const lineTokens = new LineTokens(
|
|
2727
|
-
emitBinaryTokens,
|
|
2728
|
-
lineText,
|
|
2729
|
-
this._tokenTypeMatchers,
|
|
2730
|
-
this.balancedBracketSelectors
|
|
2731
|
-
);
|
|
2732
|
-
const r = _tokenizeString(
|
|
2733
|
-
this,
|
|
2734
|
-
onigLineText,
|
|
2735
|
-
isFirstLine,
|
|
2736
|
-
0,
|
|
2737
|
-
prevState,
|
|
2738
|
-
lineTokens,
|
|
2739
|
-
true,
|
|
2740
|
-
timeLimit
|
|
2741
|
-
);
|
|
2742
|
-
disposeOnigString(onigLineText);
|
|
2743
|
-
return {
|
|
2744
|
-
lineLength,
|
|
2745
|
-
lineTokens,
|
|
2746
|
-
ruleStack: r.stack,
|
|
2747
|
-
stoppedEarly: r.stoppedEarly
|
|
2748
|
-
};
|
|
2749
|
-
}
|
|
2750
|
-
};
|
|
2751
|
-
function initGrammar(grammar, base) {
|
|
2752
|
-
grammar = clone(grammar);
|
|
2753
|
-
grammar.repository = grammar.repository || {};
|
|
2754
|
-
grammar.repository.$self = {
|
|
2755
|
-
$vscodeTextmateLocation: grammar.$vscodeTextmateLocation,
|
|
2756
|
-
patterns: grammar.patterns,
|
|
2757
|
-
name: grammar.scopeName
|
|
2758
|
-
};
|
|
2759
|
-
grammar.repository.$base = base || grammar.repository.$self;
|
|
2760
|
-
return grammar;
|
|
2761
|
-
}
|
|
2762
|
-
var AttributedScopeStack = class _AttributedScopeStack {
|
|
2763
|
-
/**
|
|
2764
|
-
* Invariant:
|
|
2765
|
-
* ```
|
|
2766
|
-
* if (parent && !scopePath.extends(parent.scopePath)) {
|
|
2767
|
-
* throw new Error();
|
|
2768
|
-
* }
|
|
2769
|
-
* ```
|
|
2770
|
-
*/
|
|
2771
|
-
constructor(parent, scopePath, tokenAttributes) {
|
|
2772
|
-
this.parent = parent;
|
|
2773
|
-
this.scopePath = scopePath;
|
|
2774
|
-
this.tokenAttributes = tokenAttributes;
|
|
2775
|
-
}
|
|
2776
|
-
static fromExtension(namesScopeList, contentNameScopesList) {
|
|
2777
|
-
let current = namesScopeList;
|
|
2778
|
-
let scopeNames = namesScopeList?.scopePath ?? null;
|
|
2779
|
-
for (const frame of contentNameScopesList) {
|
|
2780
|
-
scopeNames = ScopeStack.push(scopeNames, frame.scopeNames);
|
|
2781
|
-
current = new _AttributedScopeStack(current, scopeNames, frame.encodedTokenAttributes);
|
|
2782
|
-
}
|
|
2783
|
-
return current;
|
|
2784
|
-
}
|
|
2785
|
-
static createRoot(scopeName, tokenAttributes) {
|
|
2786
|
-
return new _AttributedScopeStack(null, new ScopeStack(null, scopeName), tokenAttributes);
|
|
2787
|
-
}
|
|
2788
|
-
static createRootAndLookUpScopeName(scopeName, tokenAttributes, grammar) {
|
|
2789
|
-
const rawRootMetadata = grammar.getMetadataForScope(scopeName);
|
|
2790
|
-
const scopePath = new ScopeStack(null, scopeName);
|
|
2791
|
-
const rootStyle = grammar.themeProvider.themeMatch(scopePath);
|
|
2792
|
-
const resolvedTokenAttributes = _AttributedScopeStack.mergeAttributes(
|
|
2793
|
-
tokenAttributes,
|
|
2794
|
-
rawRootMetadata,
|
|
2795
|
-
rootStyle
|
|
2796
|
-
);
|
|
2797
|
-
return new _AttributedScopeStack(null, scopePath, resolvedTokenAttributes);
|
|
2798
|
-
}
|
|
2799
|
-
get scopeName() {
|
|
2800
|
-
return this.scopePath.scopeName;
|
|
2801
|
-
}
|
|
2802
|
-
toString() {
|
|
2803
|
-
return this.getScopeNames().join(" ");
|
|
2804
|
-
}
|
|
2805
|
-
equals(other) {
|
|
2806
|
-
return _AttributedScopeStack.equals(this, other);
|
|
2807
|
-
}
|
|
2808
|
-
static equals(a, b) {
|
|
2809
|
-
do {
|
|
2810
|
-
if (a === b) {
|
|
2811
|
-
return true;
|
|
2812
|
-
}
|
|
2813
|
-
if (!a && !b) {
|
|
2814
|
-
return true;
|
|
2815
|
-
}
|
|
2816
|
-
if (!a || !b) {
|
|
2817
|
-
return false;
|
|
2818
|
-
}
|
|
2819
|
-
if (a.scopeName !== b.scopeName || a.tokenAttributes !== b.tokenAttributes) {
|
|
2820
|
-
return false;
|
|
2821
|
-
}
|
|
2822
|
-
a = a.parent;
|
|
2823
|
-
b = b.parent;
|
|
2824
|
-
} while (true);
|
|
2825
|
-
}
|
|
2826
|
-
static mergeAttributes(existingTokenAttributes, basicScopeAttributes, styleAttributes) {
|
|
2827
|
-
let fontStyle = -1 /* NotSet */;
|
|
2828
|
-
let foreground = 0;
|
|
2829
|
-
let background = 0;
|
|
2830
|
-
if (styleAttributes !== null) {
|
|
2831
|
-
fontStyle = styleAttributes.fontStyle;
|
|
2832
|
-
foreground = styleAttributes.foregroundId;
|
|
2833
|
-
background = styleAttributes.backgroundId;
|
|
2834
|
-
}
|
|
2835
|
-
return EncodedTokenAttributes.set(
|
|
2836
|
-
existingTokenAttributes,
|
|
2837
|
-
basicScopeAttributes.languageId,
|
|
2838
|
-
basicScopeAttributes.tokenType,
|
|
2839
|
-
null,
|
|
2840
|
-
fontStyle,
|
|
2841
|
-
foreground,
|
|
2842
|
-
background
|
|
2843
|
-
);
|
|
2844
|
-
}
|
|
2845
|
-
pushAttributed(scopePath, grammar) {
|
|
2846
|
-
if (scopePath === null) {
|
|
2847
|
-
return this;
|
|
2848
|
-
}
|
|
2849
|
-
if (scopePath.indexOf(" ") === -1) {
|
|
2850
|
-
return _AttributedScopeStack._pushAttributed(this, scopePath, grammar);
|
|
2851
|
-
}
|
|
2852
|
-
const scopes = scopePath.split(/ /g);
|
|
2853
|
-
let result = this;
|
|
2854
|
-
for (const scope of scopes) {
|
|
2855
|
-
result = _AttributedScopeStack._pushAttributed(result, scope, grammar);
|
|
2856
|
-
}
|
|
2857
|
-
return result;
|
|
2858
|
-
}
|
|
2859
|
-
static _pushAttributed(target, scopeName, grammar) {
|
|
2860
|
-
const rawMetadata = grammar.getMetadataForScope(scopeName);
|
|
2861
|
-
const newPath = target.scopePath.push(scopeName);
|
|
2862
|
-
const scopeThemeMatchResult = grammar.themeProvider.themeMatch(newPath);
|
|
2863
|
-
const metadata = _AttributedScopeStack.mergeAttributes(
|
|
2864
|
-
target.tokenAttributes,
|
|
2865
|
-
rawMetadata,
|
|
2866
|
-
scopeThemeMatchResult
|
|
2867
|
-
);
|
|
2868
|
-
return new _AttributedScopeStack(target, newPath, metadata);
|
|
2869
|
-
}
|
|
2870
|
-
getScopeNames() {
|
|
2871
|
-
return this.scopePath.getSegments();
|
|
2872
|
-
}
|
|
2873
|
-
getExtensionIfDefined(base) {
|
|
2874
|
-
const result = [];
|
|
2875
|
-
let self = this;
|
|
2876
|
-
while (self && self !== base) {
|
|
2877
|
-
result.push({
|
|
2878
|
-
encodedTokenAttributes: self.tokenAttributes,
|
|
2879
|
-
scopeNames: self.scopePath.getExtensionIfDefined(self.parent?.scopePath ?? null)
|
|
2880
|
-
});
|
|
2881
|
-
self = self.parent;
|
|
2882
|
-
}
|
|
2883
|
-
return self === base ? result.reverse() : void 0;
|
|
2884
|
-
}
|
|
2885
|
-
};
|
|
2886
|
-
var _StateStackImpl = class _StateStackImpl {
|
|
2887
|
-
/**
|
|
2888
|
-
* Invariant:
|
|
2889
|
-
* ```
|
|
2890
|
-
* if (contentNameScopesList !== nameScopesList && contentNameScopesList?.parent !== nameScopesList) {
|
|
2891
|
-
* throw new Error();
|
|
2892
|
-
* }
|
|
2893
|
-
* if (this.parent && !nameScopesList.extends(this.parent.contentNameScopesList)) {
|
|
2894
|
-
* throw new Error();
|
|
2895
|
-
* }
|
|
2896
|
-
* ```
|
|
2897
|
-
*/
|
|
2898
|
-
constructor(parent, ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {
|
|
2899
|
-
this.parent = parent;
|
|
2900
|
-
this.ruleId = ruleId;
|
|
2901
|
-
this.beginRuleCapturedEOL = beginRuleCapturedEOL;
|
|
2902
|
-
this.endRule = endRule;
|
|
2903
|
-
this.nameScopesList = nameScopesList;
|
|
2904
|
-
this.contentNameScopesList = contentNameScopesList;
|
|
2905
|
-
this._stackElementBrand = void 0;
|
|
2906
|
-
this.depth = this.parent ? this.parent.depth + 1 : 1;
|
|
2907
|
-
this._enterPos = enterPos;
|
|
2908
|
-
this._anchorPos = anchorPos;
|
|
2909
|
-
}
|
|
2910
|
-
equals(other) {
|
|
2911
|
-
if (other === null) {
|
|
2912
|
-
return false;
|
|
2913
|
-
}
|
|
2914
|
-
return _StateStackImpl._equals(this, other);
|
|
2915
|
-
}
|
|
2916
|
-
static _equals(a, b) {
|
|
2917
|
-
if (a === b) {
|
|
2918
|
-
return true;
|
|
2919
|
-
}
|
|
2920
|
-
if (!this._structuralEquals(a, b)) {
|
|
2921
|
-
return false;
|
|
2922
|
-
}
|
|
2923
|
-
return AttributedScopeStack.equals(a.contentNameScopesList, b.contentNameScopesList);
|
|
2924
|
-
}
|
|
2925
|
-
/**
|
|
2926
|
-
* A structural equals check. Does not take into account `scopes`.
|
|
2927
|
-
*/
|
|
2928
|
-
static _structuralEquals(a, b) {
|
|
2929
|
-
do {
|
|
2930
|
-
if (a === b) {
|
|
2931
|
-
return true;
|
|
2932
|
-
}
|
|
2933
|
-
if (!a && !b) {
|
|
2934
|
-
return true;
|
|
2935
|
-
}
|
|
2936
|
-
if (!a || !b) {
|
|
2937
|
-
return false;
|
|
2938
|
-
}
|
|
2939
|
-
if (a.depth !== b.depth || a.ruleId !== b.ruleId || a.endRule !== b.endRule) {
|
|
2940
|
-
return false;
|
|
2941
|
-
}
|
|
2942
|
-
a = a.parent;
|
|
2943
|
-
b = b.parent;
|
|
2944
|
-
} while (true);
|
|
2945
|
-
}
|
|
2946
|
-
clone() {
|
|
2947
|
-
return this;
|
|
2948
|
-
}
|
|
2949
|
-
static _reset(el) {
|
|
2950
|
-
while (el) {
|
|
2951
|
-
el._enterPos = -1;
|
|
2952
|
-
el._anchorPos = -1;
|
|
2953
|
-
el = el.parent;
|
|
2954
|
-
}
|
|
2955
|
-
}
|
|
2956
|
-
reset() {
|
|
2957
|
-
_StateStackImpl._reset(this);
|
|
2958
|
-
}
|
|
2959
|
-
pop() {
|
|
2960
|
-
return this.parent;
|
|
2961
|
-
}
|
|
2962
|
-
safePop() {
|
|
2963
|
-
if (this.parent) {
|
|
2964
|
-
return this.parent;
|
|
2965
|
-
}
|
|
2966
|
-
return this;
|
|
2967
|
-
}
|
|
2968
|
-
push(ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {
|
|
2969
|
-
return new _StateStackImpl(
|
|
2970
|
-
this,
|
|
2971
|
-
ruleId,
|
|
2972
|
-
enterPos,
|
|
2973
|
-
anchorPos,
|
|
2974
|
-
beginRuleCapturedEOL,
|
|
2975
|
-
endRule,
|
|
2976
|
-
nameScopesList,
|
|
2977
|
-
contentNameScopesList
|
|
2978
|
-
);
|
|
2979
|
-
}
|
|
2980
|
-
getEnterPos() {
|
|
2981
|
-
return this._enterPos;
|
|
2982
|
-
}
|
|
2983
|
-
getAnchorPos() {
|
|
2984
|
-
return this._anchorPos;
|
|
2985
|
-
}
|
|
2986
|
-
getRule(grammar) {
|
|
2987
|
-
return grammar.getRule(this.ruleId);
|
|
2988
|
-
}
|
|
2989
|
-
toString() {
|
|
2990
|
-
const r = [];
|
|
2991
|
-
this._writeString(r, 0);
|
|
2992
|
-
return "[" + r.join(",") + "]";
|
|
2993
|
-
}
|
|
2994
|
-
_writeString(res, outIndex) {
|
|
2995
|
-
if (this.parent) {
|
|
2996
|
-
outIndex = this.parent._writeString(res, outIndex);
|
|
2997
|
-
}
|
|
2998
|
-
res[outIndex++] = `(${this.ruleId}, ${this.nameScopesList?.toString()}, ${this.contentNameScopesList?.toString()})`;
|
|
2999
|
-
return outIndex;
|
|
3000
|
-
}
|
|
3001
|
-
withContentNameScopesList(contentNameScopeStack) {
|
|
3002
|
-
if (this.contentNameScopesList === contentNameScopeStack) {
|
|
3003
|
-
return this;
|
|
3004
|
-
}
|
|
3005
|
-
return this.parent.push(
|
|
3006
|
-
this.ruleId,
|
|
3007
|
-
this._enterPos,
|
|
3008
|
-
this._anchorPos,
|
|
3009
|
-
this.beginRuleCapturedEOL,
|
|
3010
|
-
this.endRule,
|
|
3011
|
-
this.nameScopesList,
|
|
3012
|
-
contentNameScopeStack
|
|
3013
|
-
);
|
|
3014
|
-
}
|
|
3015
|
-
withEndRule(endRule) {
|
|
3016
|
-
if (this.endRule === endRule) {
|
|
3017
|
-
return this;
|
|
3018
|
-
}
|
|
3019
|
-
return new _StateStackImpl(
|
|
3020
|
-
this.parent,
|
|
3021
|
-
this.ruleId,
|
|
3022
|
-
this._enterPos,
|
|
3023
|
-
this._anchorPos,
|
|
3024
|
-
this.beginRuleCapturedEOL,
|
|
3025
|
-
endRule,
|
|
3026
|
-
this.nameScopesList,
|
|
3027
|
-
this.contentNameScopesList
|
|
3028
|
-
);
|
|
3029
|
-
}
|
|
3030
|
-
// Used to warn of endless loops
|
|
3031
|
-
hasSameRuleAs(other) {
|
|
3032
|
-
let el = this;
|
|
3033
|
-
while (el && el._enterPos === other._enterPos) {
|
|
3034
|
-
if (el.ruleId === other.ruleId) {
|
|
3035
|
-
return true;
|
|
3036
|
-
}
|
|
3037
|
-
el = el.parent;
|
|
3038
|
-
}
|
|
3039
|
-
return false;
|
|
3040
|
-
}
|
|
3041
|
-
toStateStackFrame() {
|
|
3042
|
-
return {
|
|
3043
|
-
ruleId: ruleIdToNumber(this.ruleId),
|
|
3044
|
-
beginRuleCapturedEOL: this.beginRuleCapturedEOL,
|
|
3045
|
-
endRule: this.endRule,
|
|
3046
|
-
nameScopesList: this.nameScopesList?.getExtensionIfDefined(this.parent?.nameScopesList ?? null) ?? [],
|
|
3047
|
-
contentNameScopesList: this.contentNameScopesList?.getExtensionIfDefined(this.nameScopesList) ?? []
|
|
3048
|
-
};
|
|
3049
|
-
}
|
|
3050
|
-
static pushFrame(self, frame) {
|
|
3051
|
-
const namesScopeList = AttributedScopeStack.fromExtension(self?.nameScopesList ?? null, frame.nameScopesList);
|
|
3052
|
-
return new _StateStackImpl(
|
|
3053
|
-
self,
|
|
3054
|
-
ruleIdFromNumber(frame.ruleId),
|
|
3055
|
-
frame.enterPos ?? -1,
|
|
3056
|
-
frame.anchorPos ?? -1,
|
|
3057
|
-
frame.beginRuleCapturedEOL,
|
|
3058
|
-
frame.endRule,
|
|
3059
|
-
namesScopeList,
|
|
3060
|
-
AttributedScopeStack.fromExtension(namesScopeList, frame.contentNameScopesList)
|
|
3061
|
-
);
|
|
3062
|
-
}
|
|
3063
|
-
};
|
|
3064
|
-
// TODO remove me
|
|
3065
|
-
_StateStackImpl.NULL = new _StateStackImpl(
|
|
3066
|
-
null,
|
|
3067
|
-
0,
|
|
3068
|
-
0,
|
|
3069
|
-
0,
|
|
3070
|
-
false,
|
|
3071
|
-
null,
|
|
3072
|
-
null,
|
|
3073
|
-
null
|
|
3074
|
-
);
|
|
3075
|
-
var StateStackImpl = _StateStackImpl;
|
|
3076
|
-
var BalancedBracketSelectors = class {
|
|
3077
|
-
constructor(balancedBracketScopes, unbalancedBracketScopes) {
|
|
3078
|
-
this.allowAny = false;
|
|
3079
|
-
this.balancedBracketScopes = balancedBracketScopes.flatMap(
|
|
3080
|
-
(selector) => {
|
|
3081
|
-
if (selector === "*") {
|
|
3082
|
-
this.allowAny = true;
|
|
3083
|
-
return [];
|
|
3084
|
-
}
|
|
3085
|
-
return createMatchers(selector, nameMatcher).map((m) => m.matcher);
|
|
3086
|
-
}
|
|
3087
|
-
);
|
|
3088
|
-
this.unbalancedBracketScopes = unbalancedBracketScopes.flatMap(
|
|
3089
|
-
(selector) => createMatchers(selector, nameMatcher).map((m) => m.matcher)
|
|
3090
|
-
);
|
|
3091
|
-
}
|
|
3092
|
-
get matchesAlways() {
|
|
3093
|
-
return this.allowAny && this.unbalancedBracketScopes.length === 0;
|
|
3094
|
-
}
|
|
3095
|
-
get matchesNever() {
|
|
3096
|
-
return this.balancedBracketScopes.length === 0 && !this.allowAny;
|
|
3097
|
-
}
|
|
3098
|
-
match(scopes) {
|
|
3099
|
-
for (const excluder of this.unbalancedBracketScopes) {
|
|
3100
|
-
if (excluder(scopes)) {
|
|
3101
|
-
return false;
|
|
3102
|
-
}
|
|
3103
|
-
}
|
|
3104
|
-
for (const includer of this.balancedBracketScopes) {
|
|
3105
|
-
if (includer(scopes)) {
|
|
3106
|
-
return true;
|
|
3107
|
-
}
|
|
3108
|
-
}
|
|
3109
|
-
return this.allowAny;
|
|
3110
|
-
}
|
|
3111
|
-
};
|
|
3112
|
-
var LineTokens = class {
|
|
3113
|
-
constructor(emitBinaryTokens, lineText, tokenTypeOverrides, balancedBracketSelectors) {
|
|
3114
|
-
this.balancedBracketSelectors = balancedBracketSelectors;
|
|
3115
|
-
this._emitBinaryTokens = emitBinaryTokens;
|
|
3116
|
-
this._tokenTypeOverrides = tokenTypeOverrides;
|
|
3117
|
-
{
|
|
3118
|
-
this._lineText = null;
|
|
3119
|
-
}
|
|
3120
|
-
this._tokens = [];
|
|
3121
|
-
this._binaryTokens = [];
|
|
3122
|
-
this._lastTokenEndIndex = 0;
|
|
3123
|
-
}
|
|
3124
|
-
produce(stack, endIndex) {
|
|
3125
|
-
this.produceFromScopes(stack.contentNameScopesList, endIndex);
|
|
3126
|
-
}
|
|
3127
|
-
produceFromScopes(scopesList, endIndex) {
|
|
3128
|
-
if (this._lastTokenEndIndex >= endIndex) {
|
|
3129
|
-
return;
|
|
3130
|
-
}
|
|
3131
|
-
if (this._emitBinaryTokens) {
|
|
3132
|
-
let metadata = scopesList?.tokenAttributes ?? 0;
|
|
3133
|
-
let containsBalancedBrackets = false;
|
|
3134
|
-
if (this.balancedBracketSelectors?.matchesAlways) {
|
|
3135
|
-
containsBalancedBrackets = true;
|
|
3136
|
-
}
|
|
3137
|
-
if (this._tokenTypeOverrides.length > 0 || this.balancedBracketSelectors && !this.balancedBracketSelectors.matchesAlways && !this.balancedBracketSelectors.matchesNever) {
|
|
3138
|
-
const scopes2 = scopesList?.getScopeNames() ?? [];
|
|
3139
|
-
for (const tokenType of this._tokenTypeOverrides) {
|
|
3140
|
-
if (tokenType.matcher(scopes2)) {
|
|
3141
|
-
metadata = EncodedTokenAttributes.set(
|
|
3142
|
-
metadata,
|
|
3143
|
-
0,
|
|
3144
|
-
toOptionalTokenType(tokenType.type),
|
|
3145
|
-
null,
|
|
3146
|
-
-1 /* NotSet */,
|
|
3147
|
-
0,
|
|
3148
|
-
0
|
|
3149
|
-
);
|
|
3150
|
-
}
|
|
3151
|
-
}
|
|
3152
|
-
if (this.balancedBracketSelectors) {
|
|
3153
|
-
containsBalancedBrackets = this.balancedBracketSelectors.match(scopes2);
|
|
3154
|
-
}
|
|
3155
|
-
}
|
|
3156
|
-
if (containsBalancedBrackets) {
|
|
3157
|
-
metadata = EncodedTokenAttributes.set(
|
|
3158
|
-
metadata,
|
|
3159
|
-
0,
|
|
3160
|
-
8 /* NotSet */,
|
|
3161
|
-
containsBalancedBrackets,
|
|
3162
|
-
-1 /* NotSet */,
|
|
3163
|
-
0,
|
|
3164
|
-
0
|
|
3165
|
-
);
|
|
3166
|
-
}
|
|
3167
|
-
if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 1] === metadata) {
|
|
3168
|
-
this._lastTokenEndIndex = endIndex;
|
|
3169
|
-
return;
|
|
3170
|
-
}
|
|
3171
|
-
this._binaryTokens.push(this._lastTokenEndIndex);
|
|
3172
|
-
this._binaryTokens.push(metadata);
|
|
3173
|
-
this._lastTokenEndIndex = endIndex;
|
|
3174
|
-
return;
|
|
3175
|
-
}
|
|
3176
|
-
const scopes = scopesList?.getScopeNames() ?? [];
|
|
3177
|
-
this._tokens.push({
|
|
3178
|
-
startIndex: this._lastTokenEndIndex,
|
|
3179
|
-
endIndex,
|
|
3180
|
-
// value: lineText.substring(lastTokenEndIndex, endIndex),
|
|
3181
|
-
scopes
|
|
3182
|
-
});
|
|
3183
|
-
this._lastTokenEndIndex = endIndex;
|
|
3184
|
-
}
|
|
3185
|
-
getResult(stack, lineLength) {
|
|
3186
|
-
if (this._tokens.length > 0 && this._tokens[this._tokens.length - 1].startIndex === lineLength - 1) {
|
|
3187
|
-
this._tokens.pop();
|
|
3188
|
-
}
|
|
3189
|
-
if (this._tokens.length === 0) {
|
|
3190
|
-
this._lastTokenEndIndex = -1;
|
|
3191
|
-
this.produce(stack, lineLength);
|
|
3192
|
-
this._tokens[this._tokens.length - 1].startIndex = 0;
|
|
3193
|
-
}
|
|
3194
|
-
return this._tokens;
|
|
3195
|
-
}
|
|
3196
|
-
getBinaryResult(stack, lineLength) {
|
|
3197
|
-
if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 2] === lineLength - 1) {
|
|
3198
|
-
this._binaryTokens.pop();
|
|
3199
|
-
this._binaryTokens.pop();
|
|
3200
|
-
}
|
|
3201
|
-
if (this._binaryTokens.length === 0) {
|
|
3202
|
-
this._lastTokenEndIndex = -1;
|
|
3203
|
-
this.produce(stack, lineLength);
|
|
3204
|
-
this._binaryTokens[this._binaryTokens.length - 2] = 0;
|
|
3205
|
-
}
|
|
3206
|
-
const result = new Uint32Array(this._binaryTokens.length);
|
|
3207
|
-
for (let i = 0, len = this._binaryTokens.length; i < len; i++) {
|
|
3208
|
-
result[i] = this._binaryTokens[i];
|
|
3209
|
-
}
|
|
3210
|
-
return result;
|
|
3211
|
-
}
|
|
3212
|
-
};
|
|
3213
|
-
|
|
3214
|
-
// src/registry.ts
|
|
3215
|
-
var SyncRegistry = class {
|
|
3216
|
-
constructor(theme, _onigLib) {
|
|
3217
|
-
this._onigLib = _onigLib;
|
|
3218
|
-
this._grammars = /* @__PURE__ */ new Map();
|
|
3219
|
-
this._rawGrammars = /* @__PURE__ */ new Map();
|
|
3220
|
-
this._injectionGrammars = /* @__PURE__ */ new Map();
|
|
3221
|
-
this._theme = theme;
|
|
3222
|
-
}
|
|
3223
|
-
dispose() {
|
|
3224
|
-
for (const grammar of this._grammars.values()) {
|
|
3225
|
-
grammar.dispose();
|
|
3226
|
-
}
|
|
3227
|
-
}
|
|
3228
|
-
setTheme(theme) {
|
|
3229
|
-
this._theme = theme;
|
|
3230
|
-
}
|
|
3231
|
-
getColorMap() {
|
|
3232
|
-
return this._theme.getColorMap();
|
|
3233
|
-
}
|
|
3234
|
-
/**
|
|
3235
|
-
* Add `grammar` to registry and return a list of referenced scope names
|
|
3236
|
-
*/
|
|
3237
|
-
addGrammar(grammar, injectionScopeNames) {
|
|
3238
|
-
this._rawGrammars.set(grammar.scopeName, grammar);
|
|
3239
|
-
if (injectionScopeNames) {
|
|
3240
|
-
this._injectionGrammars.set(grammar.scopeName, injectionScopeNames);
|
|
3241
|
-
}
|
|
3242
|
-
}
|
|
3243
|
-
/**
|
|
3244
|
-
* Lookup a raw grammar.
|
|
3245
|
-
*/
|
|
3246
|
-
lookup(scopeName) {
|
|
3247
|
-
return this._rawGrammars.get(scopeName);
|
|
3248
|
-
}
|
|
3249
|
-
/**
|
|
3250
|
-
* Returns the injections for the given grammar
|
|
3251
|
-
*/
|
|
3252
|
-
injections(targetScope) {
|
|
3253
|
-
return this._injectionGrammars.get(targetScope);
|
|
3254
|
-
}
|
|
3255
|
-
/**
|
|
3256
|
-
* Get the default theme settings
|
|
3257
|
-
*/
|
|
3258
|
-
getDefaults() {
|
|
3259
|
-
return this._theme.getDefaults();
|
|
3260
|
-
}
|
|
3261
|
-
/**
|
|
3262
|
-
* Match a scope in the theme.
|
|
3263
|
-
*/
|
|
3264
|
-
themeMatch(scopePath) {
|
|
3265
|
-
return this._theme.match(scopePath);
|
|
3266
|
-
}
|
|
3267
|
-
/**
|
|
3268
|
-
* Lookup a grammar.
|
|
3269
|
-
*/
|
|
3270
|
-
grammarForScopeName(scopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {
|
|
3271
|
-
if (!this._grammars.has(scopeName)) {
|
|
3272
|
-
let rawGrammar = this._rawGrammars.get(scopeName);
|
|
3273
|
-
if (!rawGrammar) {
|
|
3274
|
-
return null;
|
|
3275
|
-
}
|
|
3276
|
-
this._grammars.set(scopeName, createGrammar(
|
|
3277
|
-
scopeName,
|
|
3278
|
-
rawGrammar,
|
|
3279
|
-
initialLanguage,
|
|
3280
|
-
embeddedLanguages,
|
|
3281
|
-
tokenTypes,
|
|
3282
|
-
balancedBracketSelectors,
|
|
3283
|
-
this,
|
|
3284
|
-
this._onigLib
|
|
3285
|
-
));
|
|
3286
|
-
}
|
|
3287
|
-
return this._grammars.get(scopeName);
|
|
3288
|
-
}
|
|
3289
|
-
};
|
|
3290
|
-
|
|
3291
|
-
// src/main.ts
|
|
3292
|
-
var Registry$1 = class Registry {
|
|
3293
|
-
constructor(options) {
|
|
3294
|
-
this._options = options;
|
|
3295
|
-
this._syncRegistry = new SyncRegistry(
|
|
3296
|
-
Theme.createFromRawTheme(options.theme, options.colorMap),
|
|
3297
|
-
options.onigLib
|
|
3298
|
-
);
|
|
3299
|
-
this._ensureGrammarCache = /* @__PURE__ */ new Map();
|
|
3300
|
-
}
|
|
3301
|
-
dispose() {
|
|
3302
|
-
this._syncRegistry.dispose();
|
|
3303
|
-
}
|
|
3304
|
-
/**
|
|
3305
|
-
* Change the theme. Once called, no previous `ruleStack` should be used anymore.
|
|
3306
|
-
*/
|
|
3307
|
-
setTheme(theme, colorMap) {
|
|
3308
|
-
this._syncRegistry.setTheme(Theme.createFromRawTheme(theme, colorMap));
|
|
3309
|
-
}
|
|
3310
|
-
/**
|
|
3311
|
-
* Returns a lookup array for color ids.
|
|
3312
|
-
*/
|
|
3313
|
-
getColorMap() {
|
|
3314
|
-
return this._syncRegistry.getColorMap();
|
|
3315
|
-
}
|
|
3316
|
-
/**
|
|
3317
|
-
* Load the grammar for `scopeName` and all referenced included grammars asynchronously.
|
|
3318
|
-
* Please do not use language id 0.
|
|
3319
|
-
*/
|
|
3320
|
-
loadGrammarWithEmbeddedLanguages(initialScopeName, initialLanguage, embeddedLanguages) {
|
|
3321
|
-
return this.loadGrammarWithConfiguration(initialScopeName, initialLanguage, { embeddedLanguages });
|
|
3322
|
-
}
|
|
3323
|
-
/**
|
|
3324
|
-
* Load the grammar for `scopeName` and all referenced included grammars asynchronously.
|
|
3325
|
-
* Please do not use language id 0.
|
|
3326
|
-
*/
|
|
3327
|
-
loadGrammarWithConfiguration(initialScopeName, initialLanguage, configuration) {
|
|
3328
|
-
return this._loadGrammar(
|
|
3329
|
-
initialScopeName,
|
|
3330
|
-
initialLanguage,
|
|
3331
|
-
configuration.embeddedLanguages,
|
|
3332
|
-
configuration.tokenTypes,
|
|
3333
|
-
new BalancedBracketSelectors(
|
|
3334
|
-
configuration.balancedBracketSelectors || [],
|
|
3335
|
-
configuration.unbalancedBracketSelectors || []
|
|
3336
|
-
)
|
|
3337
|
-
);
|
|
3338
|
-
}
|
|
3339
|
-
/**
|
|
3340
|
-
* Load the grammar for `scopeName` and all referenced included grammars asynchronously.
|
|
3341
|
-
*/
|
|
3342
|
-
loadGrammar(initialScopeName) {
|
|
3343
|
-
return this._loadGrammar(initialScopeName, 0, null, null, null);
|
|
3344
|
-
}
|
|
3345
|
-
_loadGrammar(initialScopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {
|
|
3346
|
-
const dependencyProcessor = new ScopeDependencyProcessor(this._syncRegistry, initialScopeName);
|
|
3347
|
-
while (dependencyProcessor.Q.length > 0) {
|
|
3348
|
-
dependencyProcessor.Q.map((request) => this._loadSingleGrammar(request.scopeName));
|
|
3349
|
-
dependencyProcessor.processQueue();
|
|
3350
|
-
}
|
|
3351
|
-
return this._grammarForScopeName(
|
|
3352
|
-
initialScopeName,
|
|
3353
|
-
initialLanguage,
|
|
3354
|
-
embeddedLanguages,
|
|
3355
|
-
tokenTypes,
|
|
3356
|
-
balancedBracketSelectors
|
|
3357
|
-
);
|
|
3358
|
-
}
|
|
3359
|
-
_loadSingleGrammar(scopeName) {
|
|
3360
|
-
if (!this._ensureGrammarCache.has(scopeName)) {
|
|
3361
|
-
this._doLoadSingleGrammar(scopeName);
|
|
3362
|
-
this._ensureGrammarCache.set(scopeName, true);
|
|
3363
|
-
}
|
|
3364
|
-
}
|
|
3365
|
-
_doLoadSingleGrammar(scopeName) {
|
|
3366
|
-
const grammar = this._options.loadGrammar(scopeName);
|
|
3367
|
-
if (grammar) {
|
|
3368
|
-
const injections = typeof this._options.getInjections === "function" ? this._options.getInjections(scopeName) : void 0;
|
|
3369
|
-
this._syncRegistry.addGrammar(grammar, injections);
|
|
3370
|
-
}
|
|
3371
|
-
}
|
|
3372
|
-
/**
|
|
3373
|
-
* Adds a rawGrammar.
|
|
3374
|
-
*/
|
|
3375
|
-
addGrammar(rawGrammar, injections = [], initialLanguage = 0, embeddedLanguages = null) {
|
|
3376
|
-
this._syncRegistry.addGrammar(rawGrammar, injections);
|
|
3377
|
-
return this._grammarForScopeName(rawGrammar.scopeName, initialLanguage, embeddedLanguages);
|
|
3378
|
-
}
|
|
3379
|
-
/**
|
|
3380
|
-
* Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `addGrammar`.
|
|
3381
|
-
*/
|
|
3382
|
-
_grammarForScopeName(scopeName, initialLanguage = 0, embeddedLanguages = null, tokenTypes = null, balancedBracketSelectors = null) {
|
|
3383
|
-
return this._syncRegistry.grammarForScopeName(
|
|
3384
|
-
scopeName,
|
|
3385
|
-
initialLanguage,
|
|
3386
|
-
embeddedLanguages,
|
|
3387
|
-
tokenTypes,
|
|
3388
|
-
balancedBracketSelectors
|
|
3389
|
-
);
|
|
3390
|
-
}
|
|
3391
|
-
};
|
|
3392
|
-
var INITIAL = StateStackImpl.NULL;
|
|
3393
|
-
|
|
3394
392
|
/**
|
|
3395
393
|
* GrammarState is a special reference object that holds the state of a grammar.
|
|
3396
394
|
*
|
|
@@ -3445,110 +443,6 @@ function getGrammarStack(state) {
|
|
|
3445
443
|
return state._stack;
|
|
3446
444
|
}
|
|
3447
445
|
|
|
3448
|
-
/**
|
|
3449
|
-
* Helpers to manage the "collapsed" metadata of an entire StackElement stack.
|
|
3450
|
-
* The following assumptions have been made:
|
|
3451
|
-
* - languageId < 256 => needs 8 bits
|
|
3452
|
-
* - unique color count < 512 => needs 9 bits
|
|
3453
|
-
*
|
|
3454
|
-
* The binary format is:
|
|
3455
|
-
* - -------------------------------------------
|
|
3456
|
-
* 3322 2222 2222 1111 1111 1100 0000 0000
|
|
3457
|
-
* 1098 7654 3210 9876 5432 1098 7654 3210
|
|
3458
|
-
* - -------------------------------------------
|
|
3459
|
-
* xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
|
|
3460
|
-
* bbbb bbbb bfff ffff ffFF FTTT LLLL LLLL
|
|
3461
|
-
* - -------------------------------------------
|
|
3462
|
-
* - L = LanguageId (8 bits)
|
|
3463
|
-
* - T = StandardTokenType (3 bits)
|
|
3464
|
-
* - F = FontStyle (3 bits)
|
|
3465
|
-
* - f = foreground color (9 bits)
|
|
3466
|
-
* - b = background color (9 bits)
|
|
3467
|
-
*/
|
|
3468
|
-
const MetadataConsts = {
|
|
3469
|
-
LANGUAGEID_MASK: 0b00000000000000000000000011111111,
|
|
3470
|
-
TOKEN_TYPE_MASK: 0b00000000000000000000001100000000,
|
|
3471
|
-
BALANCED_BRACKETS_MASK: 0b00000000000000000000010000000000,
|
|
3472
|
-
FONT_STYLE_MASK: 0b00000000000000000011100000000000,
|
|
3473
|
-
FOREGROUND_MASK: 0b00000000011111111100000000000000,
|
|
3474
|
-
BACKGROUND_MASK: 0b11111111100000000000000000000000,
|
|
3475
|
-
LANGUAGEID_OFFSET: 0,
|
|
3476
|
-
TOKEN_TYPE_OFFSET: 8,
|
|
3477
|
-
BALANCED_BRACKETS_OFFSET: 10,
|
|
3478
|
-
FONT_STYLE_OFFSET: 11,
|
|
3479
|
-
FOREGROUND_OFFSET: 15,
|
|
3480
|
-
BACKGROUND_OFFSET: 24,
|
|
3481
|
-
};
|
|
3482
|
-
class StackElementMetadata {
|
|
3483
|
-
static toBinaryStr(metadata) {
|
|
3484
|
-
let r = metadata.toString(2);
|
|
3485
|
-
while (r.length < 32)
|
|
3486
|
-
r = `0${r}`;
|
|
3487
|
-
return r;
|
|
3488
|
-
}
|
|
3489
|
-
// public static printMetadata(metadata: number): void {
|
|
3490
|
-
// const languageId = StackElementMetadata.getLanguageId(metadata)
|
|
3491
|
-
// const tokenType = StackElementMetadata.getTokenType(metadata)
|
|
3492
|
-
// const fontStyle = StackElementMetadata.getFontStyle(metadata)
|
|
3493
|
-
// const foreground = StackElementMetadata.getForeground(metadata)
|
|
3494
|
-
// const background = StackElementMetadata.getBackground(metadata)
|
|
3495
|
-
// console.log({
|
|
3496
|
-
// languageId,
|
|
3497
|
-
// tokenType,
|
|
3498
|
-
// fontStyle,
|
|
3499
|
-
// foreground,
|
|
3500
|
-
// background,
|
|
3501
|
-
// })
|
|
3502
|
-
// }
|
|
3503
|
-
static getLanguageId(metadata) {
|
|
3504
|
-
return (metadata & MetadataConsts.LANGUAGEID_MASK) >>> MetadataConsts.LANGUAGEID_OFFSET;
|
|
3505
|
-
}
|
|
3506
|
-
static getTokenType(metadata) {
|
|
3507
|
-
return (metadata & MetadataConsts.TOKEN_TYPE_MASK) >>> MetadataConsts.TOKEN_TYPE_OFFSET;
|
|
3508
|
-
}
|
|
3509
|
-
static getFontStyle(metadata) {
|
|
3510
|
-
return (metadata & MetadataConsts.FONT_STYLE_MASK) >>> MetadataConsts.FONT_STYLE_OFFSET;
|
|
3511
|
-
}
|
|
3512
|
-
static getForeground(metadata) {
|
|
3513
|
-
return (metadata & MetadataConsts.FOREGROUND_MASK) >>> MetadataConsts.FOREGROUND_OFFSET;
|
|
3514
|
-
}
|
|
3515
|
-
static getBackground(metadata) {
|
|
3516
|
-
return (metadata & MetadataConsts.BACKGROUND_MASK) >>> MetadataConsts.BACKGROUND_OFFSET;
|
|
3517
|
-
}
|
|
3518
|
-
static containsBalancedBrackets(metadata) {
|
|
3519
|
-
return (metadata & MetadataConsts.BALANCED_BRACKETS_MASK) !== 0;
|
|
3520
|
-
}
|
|
3521
|
-
static set(metadata, languageId, tokenType, fontStyle, foreground, background) {
|
|
3522
|
-
let _languageId = StackElementMetadata.getLanguageId(metadata);
|
|
3523
|
-
let _tokenType = StackElementMetadata.getTokenType(metadata);
|
|
3524
|
-
let _fontStyle = StackElementMetadata.getFontStyle(metadata);
|
|
3525
|
-
let _foreground = StackElementMetadata.getForeground(metadata);
|
|
3526
|
-
let _background = StackElementMetadata.getBackground(metadata);
|
|
3527
|
-
const _containsBalancedBracketsBit = StackElementMetadata.containsBalancedBrackets(metadata)
|
|
3528
|
-
? 1
|
|
3529
|
-
: 0;
|
|
3530
|
-
if (languageId !== 0)
|
|
3531
|
-
_languageId = languageId;
|
|
3532
|
-
if (tokenType !== 0 /* TemporaryStandardTokenType.Other */) {
|
|
3533
|
-
_tokenType
|
|
3534
|
-
= tokenType === 8 /* TemporaryStandardTokenType.MetaEmbedded */ ? 0 /* StandardTokenType.Other */ : tokenType;
|
|
3535
|
-
}
|
|
3536
|
-
if (fontStyle !== FontStyle.NotSet)
|
|
3537
|
-
_fontStyle = fontStyle;
|
|
3538
|
-
if (foreground !== 0)
|
|
3539
|
-
_foreground = foreground;
|
|
3540
|
-
if (background !== 0)
|
|
3541
|
-
_background = background;
|
|
3542
|
-
return (((_languageId << MetadataConsts.LANGUAGEID_OFFSET)
|
|
3543
|
-
| (_tokenType << MetadataConsts.TOKEN_TYPE_OFFSET)
|
|
3544
|
-
| (_fontStyle << MetadataConsts.FONT_STYLE_OFFSET)
|
|
3545
|
-
| (_containsBalancedBracketsBit << MetadataConsts.BALANCED_BRACKETS_OFFSET)
|
|
3546
|
-
| (_foreground << MetadataConsts.FOREGROUND_OFFSET)
|
|
3547
|
-
| (_background << MetadataConsts.BACKGROUND_OFFSET))
|
|
3548
|
-
>>> 0);
|
|
3549
|
-
}
|
|
3550
|
-
}
|
|
3551
|
-
|
|
3552
446
|
// src/colors.ts
|
|
3553
447
|
var namedColors = [
|
|
3554
448
|
"black",
|
|
@@ -3966,8 +860,8 @@ function _tokenizeWithTheme(code, grammar, theme, colorMap, options) {
|
|
|
3966
860
|
if (startIndex === nextStartIndex)
|
|
3967
861
|
continue;
|
|
3968
862
|
const metadata = result.tokens[2 * j + 1];
|
|
3969
|
-
const color = applyColorReplacements(colorMap[
|
|
3970
|
-
const fontStyle =
|
|
863
|
+
const color = applyColorReplacements(colorMap[EncodedTokenMetadata.getForeground(metadata)], colorReplacements);
|
|
864
|
+
const fontStyle = EncodedTokenMetadata.getFontStyle(metadata);
|
|
3971
865
|
const token = {
|
|
3972
866
|
content: line.substring(startIndex, nextStartIndex),
|
|
3973
867
|
offset: lineOffset + startIndex,
|
|
@@ -9392,4 +6286,4 @@ function createJavaScriptRegexEngine(options = {}) {
|
|
|
9392
6286
|
};
|
|
9393
6287
|
}
|
|
9394
6288
|
|
|
9395
|
-
export { FontStyle, ShikiError,
|
|
6289
|
+
export { FontStyle, ShikiError, addClassToHast, applyColorReplacements, codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createHighlighterCore, createHighlighterCoreSync, createJavaScriptRegexEngine, createPositionConverter, createShikiInternal, createShikiInternalSync, createSingletonShorthands, createWasmOnigEngine, createdBundledHighlighter, getHighlighterCore, getShikiInternal, getSingletonHighlighterCore, getTokenStyleObject, toHtml as hastToHtml, isNoneTheme, isPlainLang, isSpecialLang, isSpecialTheme, loadWasm, makeSingletonHighlighter, makeSingletonHighlighterCore, normalizeGetter, normalizeTheme, resolveColorReplacements, setDefaultWasmLoader, splitLines, splitToken, splitTokens, stringifyTokenStyle, toArray, tokenizeAnsiWithTheme, tokenizeWithTheme, tokensToHast, transformerDecorations };
|