@lvce-editor/editor-worker 19.43.0 → 19.45.0
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/editorWorkerMain.js +511 -34
- package/package.json +1 -1
package/dist/editorWorkerMain.js
CHANGED
|
@@ -1412,6 +1412,7 @@ const F12 = 68;
|
|
|
1412
1412
|
const Period = 87;
|
|
1413
1413
|
const Slash$1 = 88;
|
|
1414
1414
|
const BracketLeft = 90;
|
|
1415
|
+
const Backslash = 91;
|
|
1415
1416
|
const BracketRight = 92;
|
|
1416
1417
|
|
|
1417
1418
|
const CodeGenerator = 1;
|
|
@@ -4454,6 +4455,267 @@ const getMinimapLines = async (editor, syncIncremental) => {
|
|
|
4454
4455
|
return result.tokens.map((lineState, index) => getLine(lineState, result.embeddedResults, tokenMap, lines[index].length));
|
|
4455
4456
|
};
|
|
4456
4457
|
|
|
4458
|
+
const closingBrackets = {
|
|
4459
|
+
'(': ')',
|
|
4460
|
+
'[': ']',
|
|
4461
|
+
'{': '}'
|
|
4462
|
+
};
|
|
4463
|
+
const openingBrackets = {
|
|
4464
|
+
')': '(',
|
|
4465
|
+
']': '[',
|
|
4466
|
+
'}': '{'
|
|
4467
|
+
};
|
|
4468
|
+
const isOpeningBracket = character => character in closingBrackets;
|
|
4469
|
+
const isClosingBracket = character => character in openingBrackets;
|
|
4470
|
+
const isBefore$1 = (left, right) => left.rowIndex < right.rowIndex || left.rowIndex === right.rowIndex && left.columnIndex < right.columnIndex;
|
|
4471
|
+
const getCandidate = (lines, rowIndex, columnIndex) => {
|
|
4472
|
+
const line = lines.at(rowIndex);
|
|
4473
|
+
if (line === undefined) {
|
|
4474
|
+
return undefined;
|
|
4475
|
+
}
|
|
4476
|
+
const characterAtCursor = line[columnIndex];
|
|
4477
|
+
if (characterAtCursor && (isOpeningBracket(characterAtCursor) || isClosingBracket(characterAtCursor))) {
|
|
4478
|
+
return {
|
|
4479
|
+
character: characterAtCursor,
|
|
4480
|
+
position: {
|
|
4481
|
+
columnIndex,
|
|
4482
|
+
rowIndex
|
|
4483
|
+
}
|
|
4484
|
+
};
|
|
4485
|
+
}
|
|
4486
|
+
const characterBeforeCursor = line[columnIndex - 1];
|
|
4487
|
+
if (characterBeforeCursor && (isOpeningBracket(characterBeforeCursor) || isClosingBracket(characterBeforeCursor))) {
|
|
4488
|
+
return {
|
|
4489
|
+
character: characterBeforeCursor,
|
|
4490
|
+
position: {
|
|
4491
|
+
columnIndex: columnIndex - 1,
|
|
4492
|
+
rowIndex
|
|
4493
|
+
}
|
|
4494
|
+
};
|
|
4495
|
+
}
|
|
4496
|
+
return undefined;
|
|
4497
|
+
};
|
|
4498
|
+
const getCharacter = (lines, position) => lines[position.rowIndex][position.columnIndex];
|
|
4499
|
+
const findForward = (lines, source) => {
|
|
4500
|
+
const {
|
|
4501
|
+
columnIndex: sourceColumnIndex,
|
|
4502
|
+
rowIndex: sourceRowIndex
|
|
4503
|
+
} = source;
|
|
4504
|
+
const stack = [getCharacter(lines, source)];
|
|
4505
|
+
for (let rowIndex = sourceRowIndex; rowIndex < lines.length; rowIndex++) {
|
|
4506
|
+
const line = lines[rowIndex];
|
|
4507
|
+
const startColumnIndex = rowIndex === sourceRowIndex ? sourceColumnIndex + 1 : 0;
|
|
4508
|
+
for (let columnIndex = startColumnIndex; columnIndex < line.length; columnIndex++) {
|
|
4509
|
+
const character = line[columnIndex];
|
|
4510
|
+
if (isOpeningBracket(character)) {
|
|
4511
|
+
stack.push(character);
|
|
4512
|
+
} else if (isClosingBracket(character)) {
|
|
4513
|
+
const expectedOpeningBracket = openingBrackets[character];
|
|
4514
|
+
if (stack.at(-1) !== expectedOpeningBracket) {
|
|
4515
|
+
return undefined;
|
|
4516
|
+
}
|
|
4517
|
+
stack.pop();
|
|
4518
|
+
if (stack.length === 0) {
|
|
4519
|
+
return {
|
|
4520
|
+
columnIndex,
|
|
4521
|
+
rowIndex
|
|
4522
|
+
};
|
|
4523
|
+
}
|
|
4524
|
+
}
|
|
4525
|
+
}
|
|
4526
|
+
}
|
|
4527
|
+
return undefined;
|
|
4528
|
+
};
|
|
4529
|
+
const findBackward = (lines, source) => {
|
|
4530
|
+
const {
|
|
4531
|
+
columnIndex: sourceColumnIndex,
|
|
4532
|
+
rowIndex: sourceRowIndex
|
|
4533
|
+
} = source;
|
|
4534
|
+
const stack = [getCharacter(lines, source)];
|
|
4535
|
+
for (let rowIndex = sourceRowIndex; rowIndex >= 0; rowIndex--) {
|
|
4536
|
+
const line = lines[rowIndex];
|
|
4537
|
+
let startColumnIndex = line.length - 1;
|
|
4538
|
+
if (rowIndex === sourceRowIndex) {
|
|
4539
|
+
startColumnIndex = sourceColumnIndex - 1;
|
|
4540
|
+
}
|
|
4541
|
+
for (let columnIndex = startColumnIndex; columnIndex >= 0; columnIndex--) {
|
|
4542
|
+
const character = line[columnIndex];
|
|
4543
|
+
if (isClosingBracket(character)) {
|
|
4544
|
+
stack.push(character);
|
|
4545
|
+
} else if (isOpeningBracket(character)) {
|
|
4546
|
+
const expectedClosingBracket = closingBrackets[character];
|
|
4547
|
+
if (stack.at(-1) !== expectedClosingBracket) {
|
|
4548
|
+
return undefined;
|
|
4549
|
+
}
|
|
4550
|
+
stack.pop();
|
|
4551
|
+
if (stack.length === 0) {
|
|
4552
|
+
return {
|
|
4553
|
+
columnIndex,
|
|
4554
|
+
rowIndex
|
|
4555
|
+
};
|
|
4556
|
+
}
|
|
4557
|
+
}
|
|
4558
|
+
}
|
|
4559
|
+
}
|
|
4560
|
+
return undefined;
|
|
4561
|
+
};
|
|
4562
|
+
const findMatchingBracket = (lines, rowIndex, columnIndex) => {
|
|
4563
|
+
const candidate = getCandidate(lines, rowIndex, columnIndex);
|
|
4564
|
+
if (!candidate) {
|
|
4565
|
+
return undefined;
|
|
4566
|
+
}
|
|
4567
|
+
const {
|
|
4568
|
+
character,
|
|
4569
|
+
position: source
|
|
4570
|
+
} = candidate;
|
|
4571
|
+
const match = isOpeningBracket(character) ? findForward(lines, source) : findBackward(lines, source);
|
|
4572
|
+
if (!match) {
|
|
4573
|
+
return undefined;
|
|
4574
|
+
}
|
|
4575
|
+
return {
|
|
4576
|
+
match,
|
|
4577
|
+
source,
|
|
4578
|
+
sourceIsBeforeCursor: source.columnIndex === columnIndex - 1 && source.rowIndex === rowIndex
|
|
4579
|
+
};
|
|
4580
|
+
};
|
|
4581
|
+
const findEnclosingBrackets = (lines, rowIndex, columnIndex) => {
|
|
4582
|
+
const cursor = {
|
|
4583
|
+
columnIndex,
|
|
4584
|
+
rowIndex
|
|
4585
|
+
};
|
|
4586
|
+
const stack = [];
|
|
4587
|
+
let enclosingPair;
|
|
4588
|
+
for (let currentRowIndex = 0; currentRowIndex < lines.length; currentRowIndex++) {
|
|
4589
|
+
const line = lines[currentRowIndex];
|
|
4590
|
+
for (let currentColumnIndex = 0; currentColumnIndex < line.length; currentColumnIndex++) {
|
|
4591
|
+
const character = line[currentColumnIndex];
|
|
4592
|
+
const position = {
|
|
4593
|
+
columnIndex: currentColumnIndex,
|
|
4594
|
+
rowIndex: currentRowIndex
|
|
4595
|
+
};
|
|
4596
|
+
if (isOpeningBracket(character)) {
|
|
4597
|
+
stack.push({
|
|
4598
|
+
character,
|
|
4599
|
+
position
|
|
4600
|
+
});
|
|
4601
|
+
} else if (isClosingBracket(character)) {
|
|
4602
|
+
const openingBracket = stack.at(-1);
|
|
4603
|
+
if (!openingBracket || openingBracket.character !== openingBrackets[character]) {
|
|
4604
|
+
stack.length = 0;
|
|
4605
|
+
} else {
|
|
4606
|
+
stack.pop();
|
|
4607
|
+
if (!enclosingPair && isBefore$1(openingBracket.position, cursor) && isBefore$1(cursor, position)) {
|
|
4608
|
+
enclosingPair = {
|
|
4609
|
+
match: position,
|
|
4610
|
+
source: openingBracket.position,
|
|
4611
|
+
sourceIsBeforeCursor: false
|
|
4612
|
+
};
|
|
4613
|
+
}
|
|
4614
|
+
}
|
|
4615
|
+
}
|
|
4616
|
+
}
|
|
4617
|
+
}
|
|
4618
|
+
return enclosingPair;
|
|
4619
|
+
};
|
|
4620
|
+
const findNextBracket = (lines, rowIndex, columnIndex) => {
|
|
4621
|
+
for (let currentRowIndex = rowIndex; currentRowIndex < lines.length; currentRowIndex++) {
|
|
4622
|
+
const line = lines[currentRowIndex];
|
|
4623
|
+
const startColumnIndex = currentRowIndex === rowIndex ? columnIndex : 0;
|
|
4624
|
+
for (let currentColumnIndex = startColumnIndex; currentColumnIndex < line.length; currentColumnIndex++) {
|
|
4625
|
+
const character = line[currentColumnIndex];
|
|
4626
|
+
if (isOpeningBracket(character) || isClosingBracket(character)) {
|
|
4627
|
+
return {
|
|
4628
|
+
columnIndex: currentColumnIndex,
|
|
4629
|
+
rowIndex: currentRowIndex
|
|
4630
|
+
};
|
|
4631
|
+
}
|
|
4632
|
+
}
|
|
4633
|
+
}
|
|
4634
|
+
return undefined;
|
|
4635
|
+
};
|
|
4636
|
+
const findBracketPair = (lines, rowIndex, columnIndex) => {
|
|
4637
|
+
const directPair = findMatchingBracket(lines, rowIndex, columnIndex);
|
|
4638
|
+
if (directPair) {
|
|
4639
|
+
return directPair;
|
|
4640
|
+
}
|
|
4641
|
+
const enclosingPair = findEnclosingBrackets(lines, rowIndex, columnIndex);
|
|
4642
|
+
if (enclosingPair) {
|
|
4643
|
+
return enclosingPair;
|
|
4644
|
+
}
|
|
4645
|
+
const nextBracket = findNextBracket(lines, rowIndex, columnIndex);
|
|
4646
|
+
if (!nextBracket) {
|
|
4647
|
+
return undefined;
|
|
4648
|
+
}
|
|
4649
|
+
return findMatchingBracket(lines, nextBracket.rowIndex, nextBracket.columnIndex);
|
|
4650
|
+
};
|
|
4651
|
+
|
|
4652
|
+
const getPositionKey = position => `${position.rowIndex}:${position.columnIndex}`;
|
|
4653
|
+
const getInfo = async (editor, position, visibleLineIndices, startVisualRow) => {
|
|
4654
|
+
if (!visibleLineIndices.includes(position.rowIndex)) {
|
|
4655
|
+
return undefined;
|
|
4656
|
+
}
|
|
4657
|
+
const {
|
|
4658
|
+
charWidth,
|
|
4659
|
+
differences,
|
|
4660
|
+
foldingRanges,
|
|
4661
|
+
fontFamily,
|
|
4662
|
+
fontSize,
|
|
4663
|
+
fontWeight,
|
|
4664
|
+
isMonospaceFont,
|
|
4665
|
+
letterSpacing,
|
|
4666
|
+
lines,
|
|
4667
|
+
rowHeight,
|
|
4668
|
+
tabSize,
|
|
4669
|
+
width
|
|
4670
|
+
} = editor;
|
|
4671
|
+
const visualRow = getVisualRowForDocumentRow(position.rowIndex, foldingRanges);
|
|
4672
|
+
const relativeRow = visualRow - startVisualRow;
|
|
4673
|
+
const difference = differences[relativeRow] ?? 0;
|
|
4674
|
+
const line = lines[position.rowIndex];
|
|
4675
|
+
const x = await getX(line, position.columnIndex, fontWeight, fontSize, fontFamily, isMonospaceFont, letterSpacing, tabSize, 0, width, charWidth, difference);
|
|
4676
|
+
const endX = await getX(line, position.columnIndex + 1, fontWeight, fontSize, fontFamily, isMonospaceFont, letterSpacing, tabSize, 0, width, charWidth, difference);
|
|
4677
|
+
return {
|
|
4678
|
+
height: rowHeight,
|
|
4679
|
+
width: Math.max(1, endX - x),
|
|
4680
|
+
x,
|
|
4681
|
+
y: relativeRow * rowHeight
|
|
4682
|
+
};
|
|
4683
|
+
};
|
|
4684
|
+
const getVisibleBracketMatches = async editor => {
|
|
4685
|
+
const {
|
|
4686
|
+
deltaY,
|
|
4687
|
+
foldingRanges,
|
|
4688
|
+
itemHeight,
|
|
4689
|
+
lines,
|
|
4690
|
+
maxLineY,
|
|
4691
|
+
minLineY,
|
|
4692
|
+
selections,
|
|
4693
|
+
visibleLineIndices
|
|
4694
|
+
} = editor;
|
|
4695
|
+
const actualVisibleLineIndices = visibleLineIndices || Array.from({
|
|
4696
|
+
length: maxLineY - minLineY
|
|
4697
|
+
}, (_, index) => minLineY + index);
|
|
4698
|
+
const startVisualRow = itemHeight ? Math.floor(deltaY / itemHeight) : getVisualRowForDocumentRow(minLineY, foldingRanges);
|
|
4699
|
+
const positions = new Map();
|
|
4700
|
+
for (let i = 0; i < selections.length; i += 4) {
|
|
4701
|
+
const startRowIndex = selections[i];
|
|
4702
|
+
const startColumnIndex = selections[i + 1];
|
|
4703
|
+
const endRowIndex = selections[i + 2];
|
|
4704
|
+
const endColumnIndex = selections[i + 3];
|
|
4705
|
+
if (startRowIndex !== endRowIndex || startColumnIndex !== endColumnIndex) {
|
|
4706
|
+
continue;
|
|
4707
|
+
}
|
|
4708
|
+
const pair = findMatchingBracket(lines, endRowIndex, endColumnIndex);
|
|
4709
|
+
if (!pair) {
|
|
4710
|
+
continue;
|
|
4711
|
+
}
|
|
4712
|
+
positions.set(getPositionKey(pair.source), pair.source);
|
|
4713
|
+
positions.set(getPositionKey(pair.match), pair.match);
|
|
4714
|
+
}
|
|
4715
|
+
const infos = await Promise.all(Array.from(positions.values(), position => getInfo(editor, position, actualVisibleLineIndices, startVisualRow)));
|
|
4716
|
+
return infos.filter(info => info !== undefined);
|
|
4717
|
+
};
|
|
4718
|
+
|
|
4457
4719
|
const getDiagnosticType = diagnostic => {
|
|
4458
4720
|
return diagnostic.type;
|
|
4459
4721
|
};
|
|
@@ -4506,6 +4768,12 @@ const shouldUpdateDiagnosticData = (oldState, newState) => {
|
|
|
4506
4768
|
const shouldUpdateSelectionData = (oldState, newState) => {
|
|
4507
4769
|
return oldState.selections !== newState.selections || oldState.focused !== newState.focused || oldState.minLineY !== newState.minLineY || oldState.maxLineY !== newState.maxLineY || oldState.foldingRanges !== newState.foldingRanges || oldState.differences !== newState.differences || oldState.charWidth !== newState.charWidth || oldState.cursorWidth !== newState.cursorWidth || oldState.fontFamily !== newState.fontFamily || oldState.fontSize !== newState.fontSize || oldState.fontWeight !== newState.fontWeight || oldState.isMonospaceFont !== newState.isMonospaceFont || oldState.letterSpacing !== newState.letterSpacing || oldState.lines !== newState.lines || oldState.rowHeight !== newState.rowHeight || oldState.tabSize !== newState.tabSize || oldState.width !== newState.width;
|
|
4508
4770
|
};
|
|
4771
|
+
const shouldUpdateBracketMatchData = (oldState, newState) => {
|
|
4772
|
+
if (!('bracketMatchInfos' in newState)) {
|
|
4773
|
+
return false;
|
|
4774
|
+
}
|
|
4775
|
+
return oldState.selections !== newState.selections || oldState.lines !== newState.lines || oldState.minLineY !== newState.minLineY || oldState.maxLineY !== newState.maxLineY || oldState.visibleLineIndices !== newState.visibleLineIndices || oldState.foldingRanges !== newState.foldingRanges || oldState.differences !== newState.differences || oldState.charWidth !== newState.charWidth || oldState.fontFamily !== newState.fontFamily || oldState.fontSize !== newState.fontSize || oldState.fontWeight !== newState.fontWeight || oldState.isMonospaceFont !== newState.isMonospaceFont || oldState.letterSpacing !== newState.letterSpacing || oldState.rowHeight !== newState.rowHeight || oldState.tabSize !== newState.tabSize || oldState.width !== newState.width;
|
|
4776
|
+
};
|
|
4509
4777
|
const shouldUpdateLightBulb = (oldState, newState) => oldState.diagnostics !== newState.diagnostics || oldState.languageId !== newState.languageId || oldState.selections !== newState.selections || oldState.uri !== newState.uri;
|
|
4510
4778
|
const shouldUpdateVisibleTextData = (oldState, newState) => {
|
|
4511
4779
|
if (oldState.textInfos !== newState.textInfos || oldState.differences !== newState.differences) {
|
|
@@ -4546,6 +4814,12 @@ const updateDerivedState = async (oldState, newState) => {
|
|
|
4546
4814
|
minimapRevision: finalState.minimapRevision + 1
|
|
4547
4815
|
};
|
|
4548
4816
|
}
|
|
4817
|
+
if (shouldUpdateBracketMatchData(oldState, finalState)) {
|
|
4818
|
+
finalState = {
|
|
4819
|
+
...finalState,
|
|
4820
|
+
bracketMatchInfos: await getVisibleBracketMatches(finalState)
|
|
4821
|
+
};
|
|
4822
|
+
}
|
|
4549
4823
|
if (shouldUpdateDiagnosticData(oldState, nextState)) {
|
|
4550
4824
|
const visualDecorations = await getVisibleDiagnostics(finalState, finalState.diagnostics ?? []);
|
|
4551
4825
|
finalState = {
|
|
@@ -4673,6 +4947,7 @@ const createEditor2 = (id, uri, x, y, width, height, platform, assetDir) => {
|
|
|
4673
4947
|
const editor = {
|
|
4674
4948
|
additionalFocus: 0,
|
|
4675
4949
|
assetDir,
|
|
4950
|
+
bracketMatchInfos: [],
|
|
4676
4951
|
breadcrumbsEnabled: false,
|
|
4677
4952
|
breakPoints: [],
|
|
4678
4953
|
charWidth: 0,
|
|
@@ -4691,6 +4966,7 @@ const createEditor2 = (id, uri, x, y, width, height, platform, assetDir) => {
|
|
|
4691
4966
|
differences: [],
|
|
4692
4967
|
documentSymbols: [],
|
|
4693
4968
|
embeds: [],
|
|
4969
|
+
endOfLine: 'lf',
|
|
4694
4970
|
endOfLineDecorations: [],
|
|
4695
4971
|
finalDeltaY: 0,
|
|
4696
4972
|
finalY: 0,
|
|
@@ -4711,6 +4987,7 @@ const createEditor2 = (id, uri, x, y, width, height, platform, assetDir) => {
|
|
|
4711
4987
|
id,
|
|
4712
4988
|
incrementalEdits: emptyIncrementalEdits,
|
|
4713
4989
|
initial: true,
|
|
4990
|
+
insertSpaces: true,
|
|
4714
4991
|
invalidStartIndex: 0,
|
|
4715
4992
|
isAutoClosingBracketsEnabled: false,
|
|
4716
4993
|
isAutoClosingQuotesEnabled: false,
|
|
@@ -4774,6 +5051,7 @@ const createEditor2 = (id, uri, x, y, width, height, platform, assetDir) => {
|
|
|
4774
5051
|
};
|
|
4775
5052
|
|
|
4776
5053
|
const emptyEditor = {
|
|
5054
|
+
bracketMatchInfos: [],
|
|
4777
5055
|
breadcrumbsEnabled: false,
|
|
4778
5056
|
breakPoints: [],
|
|
4779
5057
|
cursorInfos: [],
|
|
@@ -4785,6 +5063,7 @@ const emptyEditor = {
|
|
|
4785
5063
|
differences: [],
|
|
4786
5064
|
documentSymbols: [],
|
|
4787
5065
|
embeds: [],
|
|
5066
|
+
endOfLine: 'lf',
|
|
4788
5067
|
endOfLineDecorations: [],
|
|
4789
5068
|
focused: false,
|
|
4790
5069
|
foldingRanges: [],
|
|
@@ -4792,6 +5071,7 @@ const emptyEditor = {
|
|
|
4792
5071
|
height: 0,
|
|
4793
5072
|
highlightedLine: -1,
|
|
4794
5073
|
incrementalEdits: emptyIncrementalEdits,
|
|
5074
|
+
insertSpaces: true,
|
|
4795
5075
|
isSelecting: false,
|
|
4796
5076
|
languageId: '',
|
|
4797
5077
|
// TODO use numeric language id?
|
|
@@ -4828,6 +5108,13 @@ const emptyEditor = {
|
|
|
4828
5108
|
y: 0
|
|
4829
5109
|
};
|
|
4830
5110
|
|
|
5111
|
+
const Lf = 'lf';
|
|
5112
|
+
const Crlf = 'crlf';
|
|
5113
|
+
|
|
5114
|
+
const getEndOfLine = content => {
|
|
5115
|
+
return content.includes('\r\n') ? Crlf : Lf;
|
|
5116
|
+
};
|
|
5117
|
+
|
|
4831
5118
|
const getFileExtensionIndex = file => {
|
|
4832
5119
|
string(file);
|
|
4833
5120
|
return file.lastIndexOf(Dot);
|
|
@@ -4895,6 +5182,13 @@ const measureCharacterWidth = async (fontWeight, fontSize, fontFamily, letterSpa
|
|
|
4895
5182
|
return await measureTextWidth('a', fontWeight, fontSize, fontFamily, letterSpacing, false, 0);
|
|
4896
5183
|
};
|
|
4897
5184
|
|
|
5185
|
+
const normalizeLineEndings = content => {
|
|
5186
|
+
return content.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
|
|
5187
|
+
};
|
|
5188
|
+
const applyLineEndings = (content, endOfLine) => {
|
|
5189
|
+
return endOfLine === Crlf ? normalizeLineEndings(content).replaceAll('\n', '\r\n') : normalizeLineEndings(content);
|
|
5190
|
+
};
|
|
5191
|
+
|
|
4898
5192
|
const get$3 = async key => {
|
|
4899
5193
|
const value = await getPreference(key);
|
|
4900
5194
|
return value;
|
|
@@ -4942,6 +5236,7 @@ const createEditor = async ({
|
|
|
4942
5236
|
const computedlanguageId = getLanguageId$1(uri, languages);
|
|
4943
5237
|
const editor = {
|
|
4944
5238
|
assetDir,
|
|
5239
|
+
bracketMatchInfos: [],
|
|
4945
5240
|
breakPoints: [],
|
|
4946
5241
|
charWidth,
|
|
4947
5242
|
columnWidth: 0,
|
|
@@ -4956,6 +5251,7 @@ const createEditor = async ({
|
|
|
4956
5251
|
diagnostics: [],
|
|
4957
5252
|
diagnosticsEnabled,
|
|
4958
5253
|
differences: [],
|
|
5254
|
+
endOfLine: getEndOfLine(content),
|
|
4959
5255
|
endOfLineDecorations: [],
|
|
4960
5256
|
finalDeltaY: 0,
|
|
4961
5257
|
finalY: 0,
|
|
@@ -4972,6 +5268,7 @@ const createEditor = async ({
|
|
|
4972
5268
|
height,
|
|
4973
5269
|
id,
|
|
4974
5270
|
incrementalEdits: emptyIncrementalEdits,
|
|
5271
|
+
insertSpaces: true,
|
|
4975
5272
|
invalidStartIndex: 0,
|
|
4976
5273
|
isAutoClosingBracketsEnabled,
|
|
4977
5274
|
isAutoClosingQuotesEnabled,
|
|
@@ -5027,7 +5324,7 @@ const createEditor = async ({
|
|
|
5027
5324
|
|
|
5028
5325
|
// TODO avoid creating intermediate editors here
|
|
5029
5326
|
const newEditor1 = setBounds(editor, x, y, width, height, 9);
|
|
5030
|
-
const newEditor2 = setText$1(newEditor1, content);
|
|
5327
|
+
const newEditor2 = setText$1(newEditor1, normalizeLineEndings(content));
|
|
5031
5328
|
let newEditor3;
|
|
5032
5329
|
if (lineToReveal && columnToReveal) {
|
|
5033
5330
|
const delta = lineToReveal * rowHeight;
|
|
@@ -5095,12 +5392,14 @@ const createStandaloneEditor = async ({
|
|
|
5095
5392
|
charWidth,
|
|
5096
5393
|
columnWidth: charWidth,
|
|
5097
5394
|
completionsOnType: false,
|
|
5395
|
+
endOfLine: getEndOfLine(content),
|
|
5098
5396
|
focus: FocusEditorText$1,
|
|
5099
5397
|
focused: true,
|
|
5100
5398
|
fontFamily,
|
|
5101
5399
|
fontSize,
|
|
5102
5400
|
fontWeight,
|
|
5103
5401
|
initial: false,
|
|
5402
|
+
insertSpaces: true,
|
|
5104
5403
|
isMonospaceFont: true,
|
|
5105
5404
|
itemHeight: rowHeight,
|
|
5106
5405
|
languageId,
|
|
@@ -5112,7 +5411,7 @@ const createStandaloneEditor = async ({
|
|
|
5112
5411
|
tokenizerId
|
|
5113
5412
|
};
|
|
5114
5413
|
const boundedEditor = setBounds(configuredEditor, x, y, width, height, charWidth);
|
|
5115
|
-
const editorWithText = setText$1(boundedEditor, content);
|
|
5414
|
+
const editorWithText = setText$1(boundedEditor, normalizeLineEndings(content));
|
|
5116
5415
|
const {
|
|
5117
5416
|
differences,
|
|
5118
5417
|
textInfos
|
|
@@ -5156,7 +5455,7 @@ const isEqual$3 = (oldState, newState) => {
|
|
|
5156
5455
|
};
|
|
5157
5456
|
|
|
5158
5457
|
const isEqual$2 = (oldState, newState) => {
|
|
5159
|
-
return oldState.breadcrumbsEnabled === newState.breadcrumbsEnabled && oldState.breakPoints === newState.breakPoints && oldState.cursorInfos === newState.cursorInfos && oldState.diagnostics === newState.diagnostics && oldState.documentSymbols === newState.documentSymbols && oldState.endOfLineDecorations === newState.endOfLineDecorations && oldState.highlightedLine === newState.highlightedLine && oldState.lineNumbers === newState.lineNumbers && oldState.loadError === newState.loadError && oldState.textInfos === newState.textInfos && oldState.differences === newState.differences && oldState.initial === newState.initial && oldState.selectionInfos === newState.selectionInfos && oldState.selections === newState.selections && oldState.workspaceUri === newState.workspaceUri;
|
|
5458
|
+
return oldState.breadcrumbsEnabled === newState.breadcrumbsEnabled && oldState.breakPoints === newState.breakPoints && oldState.bracketMatchInfos === newState.bracketMatchInfos && oldState.cursorInfos === newState.cursorInfos && oldState.diagnostics === newState.diagnostics && oldState.documentSymbols === newState.documentSymbols && oldState.endOfLineDecorations === newState.endOfLineDecorations && oldState.highlightedLine === newState.highlightedLine && oldState.lineNumbers === newState.lineNumbers && oldState.loadError === newState.loadError && oldState.textInfos === newState.textInfos && oldState.differences === newState.differences && oldState.initial === newState.initial && oldState.selectionInfos === newState.selectionInfos && oldState.selections === newState.selections && oldState.workspaceUri === newState.workspaceUri;
|
|
5160
5459
|
};
|
|
5161
5460
|
|
|
5162
5461
|
const isEqual$1 = (oldState, newState) => {
|
|
@@ -5246,6 +5545,8 @@ const getEditorStatus = editor => {
|
|
|
5246
5545
|
return {
|
|
5247
5546
|
column: columnIndex + 1,
|
|
5248
5547
|
encoding: 'utf8',
|
|
5548
|
+
endOfLine: editor.endOfLine,
|
|
5549
|
+
insertSpaces: editor.insertSpaces,
|
|
5249
5550
|
languageId: editor.languageId,
|
|
5250
5551
|
line: rowIndex + 1,
|
|
5251
5552
|
tabSize: editor.tabSize
|
|
@@ -5253,7 +5554,7 @@ const getEditorStatus = editor => {
|
|
|
5253
5554
|
};
|
|
5254
5555
|
|
|
5255
5556
|
const equals = (oldStatus, newStatus) => {
|
|
5256
|
-
return oldStatus.column === newStatus.column && oldStatus.encoding === newStatus.encoding && oldStatus.languageId === newStatus.languageId && oldStatus.line === newStatus.line && oldStatus.tabSize === newStatus.tabSize;
|
|
5557
|
+
return oldStatus.column === newStatus.column && oldStatus.endOfLine === newStatus.endOfLine && oldStatus.encoding === newStatus.encoding && oldStatus.insertSpaces === newStatus.insertSpaces && oldStatus.languageId === newStatus.languageId && oldStatus.line === newStatus.line && oldStatus.tabSize === newStatus.tabSize;
|
|
5257
5558
|
};
|
|
5258
5559
|
const notifyEditorStatusChange = async (oldEditor, newEditor) => {
|
|
5259
5560
|
if (newEditor.initial || !newEditor.focused) {
|
|
@@ -5894,7 +6195,7 @@ const save = async editor => {
|
|
|
5894
6195
|
uri
|
|
5895
6196
|
} = editor;
|
|
5896
6197
|
const newEditor = await getNewEditor$1(editor);
|
|
5897
|
-
const content = getText$1(newEditor);
|
|
6198
|
+
const content = applyLineEndings(getText$1(newEditor), newEditor.endOfLine);
|
|
5898
6199
|
if (isUntitledFile(uri)) {
|
|
5899
6200
|
const pickedFilePath = await saveUntitledFile(uri, content, platform);
|
|
5900
6201
|
if (pickedFilePath) {
|
|
@@ -7635,6 +7936,33 @@ const getWordBefore = (editor, rowIndex, columnIndex) => {
|
|
|
7635
7936
|
return getWordBefore$1(line, columnIndex);
|
|
7636
7937
|
};
|
|
7637
7938
|
|
|
7939
|
+
const goToBracket$1 = editor => {
|
|
7940
|
+
const {
|
|
7941
|
+
lines,
|
|
7942
|
+
selections
|
|
7943
|
+
} = editor;
|
|
7944
|
+
const newSelections = new Uint32Array(selections);
|
|
7945
|
+
for (let i = 0; i < selections.length; i += 4) {
|
|
7946
|
+
const [startRowIndex, startColumnIndex] = getSelectionPairs(selections, i);
|
|
7947
|
+
const directPair = findMatchingBracket(lines, startRowIndex, startColumnIndex);
|
|
7948
|
+
let target = directPair?.match;
|
|
7949
|
+
if (!target) {
|
|
7950
|
+
target = findEnclosingBrackets(lines, startRowIndex, startColumnIndex)?.match;
|
|
7951
|
+
}
|
|
7952
|
+
if (!target) {
|
|
7953
|
+
target = findNextBracket(lines, startRowIndex, startColumnIndex);
|
|
7954
|
+
}
|
|
7955
|
+
if (!target) {
|
|
7956
|
+
continue;
|
|
7957
|
+
}
|
|
7958
|
+
newSelections[i] = target.rowIndex;
|
|
7959
|
+
newSelections[i + 1] = target.columnIndex;
|
|
7960
|
+
newSelections[i + 2] = target.rowIndex;
|
|
7961
|
+
newSelections[i + 3] = target.columnIndex;
|
|
7962
|
+
}
|
|
7963
|
+
return scheduleSelections(editor, newSelections);
|
|
7964
|
+
};
|
|
7965
|
+
|
|
7638
7966
|
// @ts-ignore
|
|
7639
7967
|
const getDefinition = async (editor, offset) => {
|
|
7640
7968
|
return execute({
|
|
@@ -7687,6 +8015,7 @@ const FindAllReferences = 'Find All References';
|
|
|
7687
8015
|
const Fold = 'Editor: Fold';
|
|
7688
8016
|
const FormatDocument = 'Format Document';
|
|
7689
8017
|
const GoToDefinition = 'Go to Definition';
|
|
8018
|
+
const GoToBracket = 'Go to Bracket';
|
|
7690
8019
|
const GoToTypeDefinition = 'Go to Type Definition';
|
|
7691
8020
|
const MoveLineDown = 'Move Line Down';
|
|
7692
8021
|
const MoveLineUp = 'Move Line Up';
|
|
@@ -7696,6 +8025,7 @@ const NoTypeDefinitionFound = 'No type definition found';
|
|
|
7696
8025
|
const NoTypeDefinitionFoundFor = "No type definition found for '{PH1}'";
|
|
7697
8026
|
const Paste = 'Paste';
|
|
7698
8027
|
const Redo = 'Redo';
|
|
8028
|
+
const SelectToBracket = 'Select to Bracket';
|
|
7699
8029
|
const SourceAction = 'Source Action';
|
|
7700
8030
|
const ToggleBlockComment = 'Toggle Block Comment';
|
|
7701
8031
|
const ToggleBreakpoint = 'Toggle Breakpoint';
|
|
@@ -7705,6 +8035,9 @@ const Unfold = 'Editor: Unfold';
|
|
|
7705
8035
|
const goToDefinition$1 = () => {
|
|
7706
8036
|
return i18nString(GoToDefinition);
|
|
7707
8037
|
};
|
|
8038
|
+
const goToBracket = () => {
|
|
8039
|
+
return i18nString(GoToBracket);
|
|
8040
|
+
};
|
|
7708
8041
|
const noDefinitionFound = () => {
|
|
7709
8042
|
return i18nString(NoDefinitionFound);
|
|
7710
8043
|
};
|
|
@@ -7772,6 +8105,9 @@ const toggleBlockComment$1 = () => {
|
|
|
7772
8105
|
const toggleBreakpoint$1 = () => {
|
|
7773
8106
|
return i18nString(ToggleBreakpoint);
|
|
7774
8107
|
};
|
|
8108
|
+
const selectToBracket$1 = () => {
|
|
8109
|
+
return i18nString(SelectToBracket);
|
|
8110
|
+
};
|
|
7775
8111
|
const moveLineUp$1 = () => {
|
|
7776
8112
|
return i18nString(MoveLineUp);
|
|
7777
8113
|
};
|
|
@@ -9339,7 +9675,14 @@ const indentLess = editor => {
|
|
|
9339
9675
|
return scheduleDocumentAndCursorsSelections(editor, changes);
|
|
9340
9676
|
};
|
|
9341
9677
|
|
|
9342
|
-
const
|
|
9678
|
+
const getIndentString = ({
|
|
9679
|
+
insertSpaces,
|
|
9680
|
+
tabSize
|
|
9681
|
+
}) => {
|
|
9682
|
+
return insertSpaces ?? true ? ' '.repeat(tabSize || 2) : '\t';
|
|
9683
|
+
};
|
|
9684
|
+
|
|
9685
|
+
const getChanges$1 = (selections, indent) => {
|
|
9343
9686
|
const rowsToIndent = [];
|
|
9344
9687
|
for (let i = 0; i < selections.length; i += 4) {
|
|
9345
9688
|
const selectionStartRow = selections[i];
|
|
@@ -9354,7 +9697,7 @@ const getChanges$1 = selections => {
|
|
|
9354
9697
|
columnIndex: 0,
|
|
9355
9698
|
rowIndex: rowToIndent
|
|
9356
9699
|
},
|
|
9357
|
-
inserted: [
|
|
9700
|
+
inserted: [indent],
|
|
9358
9701
|
origin: IndentMore,
|
|
9359
9702
|
start: {
|
|
9360
9703
|
columnIndex: 0,
|
|
@@ -9367,7 +9710,7 @@ const indentMore = editor => {
|
|
|
9367
9710
|
const {
|
|
9368
9711
|
selections
|
|
9369
9712
|
} = editor;
|
|
9370
|
-
const changes = getChanges$1(selections);
|
|
9713
|
+
const changes = getChanges$1(selections, getIndentString(editor));
|
|
9371
9714
|
return scheduleDocumentAndCursorsSelections(editor, changes);
|
|
9372
9715
|
};
|
|
9373
9716
|
|
|
@@ -9392,7 +9735,7 @@ const shouldIncreaseIndent = (before, increaseIndentRegex) => {
|
|
|
9392
9735
|
}
|
|
9393
9736
|
return increaseIndentRegex.test(before);
|
|
9394
9737
|
};
|
|
9395
|
-
const getChanges = (lines, selections, languageConfiguration) => {
|
|
9738
|
+
const getChanges = (lines, selections, languageConfiguration, indentUnit) => {
|
|
9396
9739
|
const changes = [];
|
|
9397
9740
|
const selectionChanges = [];
|
|
9398
9741
|
const increaseIndentRegex = getIncreaseIndentRegex(languageConfiguration);
|
|
@@ -9420,11 +9763,11 @@ const getChanges = (lines, selections, languageConfiguration) => {
|
|
|
9420
9763
|
lines
|
|
9421
9764
|
}, range),
|
|
9422
9765
|
end: end,
|
|
9423
|
-
inserted: ['', indent +
|
|
9766
|
+
inserted: ['', indent + indentUnit, indent],
|
|
9424
9767
|
origin: InsertLineBreak,
|
|
9425
9768
|
start: start
|
|
9426
9769
|
});
|
|
9427
|
-
selectionChanges.push(selectionStartRow + 1, indent.length +
|
|
9770
|
+
selectionChanges.push(selectionStartRow + 1, indent.length + indentUnit.length, selectionStartRow + 1, indent.length + indentUnit.length);
|
|
9428
9771
|
} else {
|
|
9429
9772
|
changes.push({
|
|
9430
9773
|
deleted: getSelectionText({
|
|
@@ -9464,7 +9807,7 @@ const insertLineBreak = async editor => {
|
|
|
9464
9807
|
const {
|
|
9465
9808
|
changes,
|
|
9466
9809
|
selectionChanges
|
|
9467
|
-
} = getChanges(lines, selections, languageConfiguration);
|
|
9810
|
+
} = getChanges(lines, selections, languageConfiguration, getIndentString(editor));
|
|
9468
9811
|
return scheduleDocumentAndCursorsSelections(editor, changes, selectionChanges);
|
|
9469
9812
|
};
|
|
9470
9813
|
|
|
@@ -10703,6 +11046,36 @@ const selectPreviousOccurrence = editor => {
|
|
|
10703
11046
|
return editor;
|
|
10704
11047
|
};
|
|
10705
11048
|
|
|
11049
|
+
const isBefore = (left, right) => left.rowIndex < right.rowIndex || left.rowIndex === right.rowIndex && left.columnIndex < right.columnIndex;
|
|
11050
|
+
const selectToBracket = editor => {
|
|
11051
|
+
const {
|
|
11052
|
+
lines,
|
|
11053
|
+
selections
|
|
11054
|
+
} = editor;
|
|
11055
|
+
const newSelections = new Uint32Array(selections);
|
|
11056
|
+
for (let i = 0; i < selections.length; i += 4) {
|
|
11057
|
+
const [rowIndex, columnIndex] = getSelectionPairs(selections, i);
|
|
11058
|
+
const pair = findBracketPair(lines, rowIndex, columnIndex);
|
|
11059
|
+
if (!pair) {
|
|
11060
|
+
continue;
|
|
11061
|
+
}
|
|
11062
|
+
const start = isBefore(pair.source, pair.match) ? pair.source : pair.match;
|
|
11063
|
+
const end = start === pair.source ? pair.match : pair.source;
|
|
11064
|
+
if (pair.source === end) {
|
|
11065
|
+
newSelections[i] = end.rowIndex;
|
|
11066
|
+
newSelections[i + 1] = end.columnIndex + 1;
|
|
11067
|
+
newSelections[i + 2] = start.rowIndex;
|
|
11068
|
+
newSelections[i + 3] = start.columnIndex;
|
|
11069
|
+
} else {
|
|
11070
|
+
newSelections[i] = start.rowIndex;
|
|
11071
|
+
newSelections[i + 1] = start.columnIndex;
|
|
11072
|
+
newSelections[i + 2] = end.rowIndex;
|
|
11073
|
+
newSelections[i + 3] = end.columnIndex + 1;
|
|
11074
|
+
}
|
|
11075
|
+
}
|
|
11076
|
+
return scheduleSelections(editor, newSelections);
|
|
11077
|
+
};
|
|
11078
|
+
|
|
10706
11079
|
// @ts-ignore
|
|
10707
11080
|
|
|
10708
11081
|
// @ts-ignore
|
|
@@ -10747,6 +11120,36 @@ const setDecorations = (editor, decorations, diagnostics) => {
|
|
|
10747
11120
|
};
|
|
10748
11121
|
};
|
|
10749
11122
|
|
|
11123
|
+
const setEndOfLine = async (editor, endOfLine) => {
|
|
11124
|
+
if (endOfLine !== Lf && endOfLine !== Crlf) {
|
|
11125
|
+
throw new TypeError(`Unsupported end of line sequence: ${endOfLine}`);
|
|
11126
|
+
}
|
|
11127
|
+
if (editor.endOfLine === endOfLine) {
|
|
11128
|
+
return editor;
|
|
11129
|
+
}
|
|
11130
|
+
if (!editor.modified) {
|
|
11131
|
+
await notifyTabModifiedStatusChange(editor.uri, true);
|
|
11132
|
+
}
|
|
11133
|
+
return {
|
|
11134
|
+
...editor,
|
|
11135
|
+
endOfLine,
|
|
11136
|
+
focused: true,
|
|
11137
|
+
lines: [...editor.lines],
|
|
11138
|
+
modified: true
|
|
11139
|
+
};
|
|
11140
|
+
};
|
|
11141
|
+
|
|
11142
|
+
const setIndentation = (editor, insertSpaces) => {
|
|
11143
|
+
if (editor.insertSpaces === insertSpaces) {
|
|
11144
|
+
return editor;
|
|
11145
|
+
}
|
|
11146
|
+
return {
|
|
11147
|
+
...editor,
|
|
11148
|
+
focused: true,
|
|
11149
|
+
insertSpaces
|
|
11150
|
+
};
|
|
11151
|
+
};
|
|
11152
|
+
|
|
10750
11153
|
const setLanguageId = async (editor, languageId, tokenizePath) => {
|
|
10751
11154
|
const {
|
|
10752
11155
|
tokenizerId
|
|
@@ -12589,6 +12992,10 @@ const getKeyBindings = () => {
|
|
|
12589
12992
|
command: 'Editor.fold',
|
|
12590
12993
|
key: CtrlCmd | Shift | BracketLeft,
|
|
12591
12994
|
when: FocusEditorText
|
|
12995
|
+
}, {
|
|
12996
|
+
command: 'Editor.goToBracket',
|
|
12997
|
+
key: CtrlCmd | Shift | Backslash,
|
|
12998
|
+
when: FocusEditorText
|
|
12592
12999
|
}, {
|
|
12593
13000
|
command: 'Editor.closeFind',
|
|
12594
13001
|
key: Escape,
|
|
@@ -12955,12 +13362,18 @@ const getQuickPickMenuEntries = () => {
|
|
|
12955
13362
|
}, {
|
|
12956
13363
|
id: 'Editor.goToDefinition',
|
|
12957
13364
|
label: editorGoToDefinition()
|
|
13365
|
+
}, {
|
|
13366
|
+
id: 'Editor.goToBracket',
|
|
13367
|
+
label: goToBracket()
|
|
12958
13368
|
}, {
|
|
12959
13369
|
id: 'Editor.goToTypeDefinition',
|
|
12960
13370
|
label: editorGoToTypeDefinition()
|
|
12961
13371
|
}, {
|
|
12962
13372
|
id: 'Editor.selectInsideString',
|
|
12963
13373
|
label: editorSelectInsideString()
|
|
13374
|
+
}, {
|
|
13375
|
+
id: 'Editor.selectToBracket',
|
|
13376
|
+
label: selectToBracket$1()
|
|
12964
13377
|
}, {
|
|
12965
13378
|
aliases: ['Indent More', 'DeIndent'],
|
|
12966
13379
|
id: 'Editor.indent',
|
|
@@ -13069,6 +13482,7 @@ const kFontSize = 'editor.fontSize';
|
|
|
13069
13482
|
const kFontFamily = 'editor.fontFamily';
|
|
13070
13483
|
const kLetterSpacing = 'editor.letterSpacing';
|
|
13071
13484
|
const kTabSize = 'editor.tabSize';
|
|
13485
|
+
const kInsertSpaces = 'editor.insertSpaces';
|
|
13072
13486
|
const kLineNumbers = 'editor.lineNumbers';
|
|
13073
13487
|
const kDiagnostics = 'editor.diagnostics';
|
|
13074
13488
|
const kQuickSuggestions = 'editor.quickSuggestions';
|
|
@@ -13111,6 +13525,9 @@ const getLetterSpacing = async () => {
|
|
|
13111
13525
|
const getTabSize = async () => {
|
|
13112
13526
|
return (await get$3(kTabSize)) || 2;
|
|
13113
13527
|
};
|
|
13528
|
+
const getInsertSpaces = async () => {
|
|
13529
|
+
return (await get$3(kInsertSpaces)) ?? true;
|
|
13530
|
+
};
|
|
13114
13531
|
const getLineNumbers = async () => {
|
|
13115
13532
|
return (await get$3(kLineNumbers)) ?? false;
|
|
13116
13533
|
};
|
|
@@ -13131,7 +13548,7 @@ const getBreadcrumbsEnabled = async () => {
|
|
|
13131
13548
|
};
|
|
13132
13549
|
|
|
13133
13550
|
const getEditorPreferences = async () => {
|
|
13134
|
-
const [diagnosticsEnabled$1, fontFamily, fontSize, fontWeight, hoverEnabled, isAutoClosingBracketsEnabled$1, isAutoClosingQuotesEnabled$1, isAutoClosingTagsEnabled$1, isQuickSuggestionsEnabled$1, lineNumbers, rowHeight, tabSize, letterSpacing, completionTriggerCharacters, minimapEnabled, breadcrumbsEnabled] = await Promise.all([diagnosticsEnabled(), getFontFamily(), getFontSize(), getFontWeight(), getHoverEnabled(), isAutoClosingBracketsEnabled(), isAutoClosingQuotesEnabled(), isAutoClosingTagsEnabled(), isQuickSuggestionsEnabled(), getLineNumbers(), getRowHeight(), getTabSize(), getLetterSpacing(), getCompletionTriggerCharacters(), getMinimapEnabled(), getBreadcrumbsEnabled()]);
|
|
13551
|
+
const [diagnosticsEnabled$1, fontFamily, fontSize, fontWeight, hoverEnabled, isAutoClosingBracketsEnabled$1, isAutoClosingQuotesEnabled$1, isAutoClosingTagsEnabled$1, isQuickSuggestionsEnabled$1, lineNumbers, rowHeight, tabSize, letterSpacing, completionTriggerCharacters, minimapEnabled, breadcrumbsEnabled, insertSpaces] = await Promise.all([diagnosticsEnabled(), getFontFamily(), getFontSize(), getFontWeight(), getHoverEnabled(), isAutoClosingBracketsEnabled(), isAutoClosingQuotesEnabled(), isAutoClosingTagsEnabled(), isQuickSuggestionsEnabled(), getLineNumbers(), getRowHeight(), getTabSize(), getLetterSpacing(), getCompletionTriggerCharacters(), getMinimapEnabled(), getBreadcrumbsEnabled(), getInsertSpaces()]);
|
|
13135
13552
|
return {
|
|
13136
13553
|
breadcrumbsEnabled,
|
|
13137
13554
|
completionTriggerCharacters,
|
|
@@ -13140,6 +13557,7 @@ const getEditorPreferences = async () => {
|
|
|
13140
13557
|
fontSize,
|
|
13141
13558
|
fontWeight,
|
|
13142
13559
|
hoverEnabled,
|
|
13560
|
+
insertSpaces,
|
|
13143
13561
|
isAutoClosingBracketsEnabled: isAutoClosingBracketsEnabled$1,
|
|
13144
13562
|
isAutoClosingQuotesEnabled: isAutoClosingQuotesEnabled$1,
|
|
13145
13563
|
isAutoClosingTagsEnabled: isAutoClosingTagsEnabled$1,
|
|
@@ -13204,8 +13622,7 @@ const applyTabCompletion = (editor, result) => {
|
|
|
13204
13622
|
};
|
|
13205
13623
|
|
|
13206
13624
|
const insertTab = editor => {
|
|
13207
|
-
|
|
13208
|
-
return type(editor, ' ');
|
|
13625
|
+
return type(editor, getIndentString(editor));
|
|
13209
13626
|
};
|
|
13210
13627
|
const handleTab = async editor => {
|
|
13211
13628
|
if (!isEverySelectionEmpty(editor.selections)) {
|
|
@@ -13475,6 +13892,7 @@ const loadContent = async (state, savedState) => {
|
|
|
13475
13892
|
fontSize,
|
|
13476
13893
|
fontWeight,
|
|
13477
13894
|
hoverEnabled,
|
|
13895
|
+
insertSpaces,
|
|
13478
13896
|
isAutoClosingBracketsEnabled,
|
|
13479
13897
|
isAutoClosingQuotesEnabled,
|
|
13480
13898
|
isAutoClosingTagsEnabled,
|
|
@@ -13505,6 +13923,7 @@ const loadContent = async (state, savedState) => {
|
|
|
13505
13923
|
fontSize,
|
|
13506
13924
|
fontWeight,
|
|
13507
13925
|
hoverEnabled,
|
|
13926
|
+
insertSpaces,
|
|
13508
13927
|
isAutoClosingBracketsEnabled,
|
|
13509
13928
|
isAutoClosingQuotesEnabled,
|
|
13510
13929
|
isAutoClosingTagsEnabled,
|
|
@@ -13527,9 +13946,12 @@ const loadContent = async (state, savedState) => {
|
|
|
13527
13946
|
}
|
|
13528
13947
|
}
|
|
13529
13948
|
let content = existingEditor ? getText$1(existingEditor) : '';
|
|
13949
|
+
let endOfLine = existingEditor?.endOfLine || 'lf';
|
|
13530
13950
|
try {
|
|
13531
13951
|
if (!existingEditor) {
|
|
13532
13952
|
content = await readFile$1(uri);
|
|
13953
|
+
endOfLine = getEndOfLine(content);
|
|
13954
|
+
content = normalizeLineEndings(content);
|
|
13533
13955
|
}
|
|
13534
13956
|
} catch (error) {
|
|
13535
13957
|
const newEditor1 = setBounds(newEditor0, x, y, width, height, 9);
|
|
@@ -13546,7 +13968,10 @@ const loadContent = async (state, savedState) => {
|
|
|
13546
13968
|
const savedHistory = existingEditor ? undefined : getSavedHistory(savedState, content);
|
|
13547
13969
|
|
|
13548
13970
|
// TODO avoid creating intermediate editors here
|
|
13549
|
-
const newEditor1 = setBounds(
|
|
13971
|
+
const newEditor1 = setBounds({
|
|
13972
|
+
...newEditor0,
|
|
13973
|
+
endOfLine
|
|
13974
|
+
}, x, y, width, height, 9);
|
|
13550
13975
|
const newEditor2 = setText$1(newEditor1, content);
|
|
13551
13976
|
let newEditor3 = newEditor2;
|
|
13552
13977
|
|
|
@@ -13700,6 +14125,13 @@ ${editorSelector} .EditorLineDecoration {
|
|
|
13700
14125
|
user-select: none;
|
|
13701
14126
|
}
|
|
13702
14127
|
${editorSelector} .R{background-color:#add6ff40}
|
|
14128
|
+
${editorSelector} .BracketMatch {
|
|
14129
|
+
position: absolute;
|
|
14130
|
+
box-sizing: border-box;
|
|
14131
|
+
border: 1px solid var(--EditorBracketMatchBorder, rgba(128, 128, 128, 0.8));
|
|
14132
|
+
background: var(--EditorBracketMatchBackground, rgba(128, 128, 128, 0.25));
|
|
14133
|
+
pointer-events: none;
|
|
14134
|
+
}
|
|
13703
14135
|
${editorSelector} .ScrollBarThumbVertical {
|
|
13704
14136
|
height: var(--ScrollBarHeight);
|
|
13705
14137
|
translate: 0px var(--ScrollBarTop);
|
|
@@ -14154,6 +14586,23 @@ const getEditorCursorsVirtualDom = cursorInfos => {
|
|
|
14154
14586
|
}, ...cursorsDom];
|
|
14155
14587
|
};
|
|
14156
14588
|
|
|
14589
|
+
const getBracketMatchesVirtualDom = infos => {
|
|
14590
|
+
return infos.map(({
|
|
14591
|
+
height,
|
|
14592
|
+
width,
|
|
14593
|
+
x,
|
|
14594
|
+
y
|
|
14595
|
+
}) => ({
|
|
14596
|
+
childCount: 0,
|
|
14597
|
+
className: 'BracketMatch',
|
|
14598
|
+
height,
|
|
14599
|
+
left: x,
|
|
14600
|
+
top: y,
|
|
14601
|
+
type: Div,
|
|
14602
|
+
width
|
|
14603
|
+
}));
|
|
14604
|
+
};
|
|
14605
|
+
|
|
14157
14606
|
// TODO use numeric value
|
|
14158
14607
|
const Error$1 = 'error';
|
|
14159
14608
|
const Warning = 'warning';
|
|
@@ -14194,13 +14643,14 @@ const getDiagnosticsVirtualDom = diagnostics => {
|
|
|
14194
14643
|
return dom;
|
|
14195
14644
|
};
|
|
14196
14645
|
|
|
14197
|
-
const getEditorDiagnosticsVirtualDom = diagnostics => {
|
|
14646
|
+
const getEditorDiagnosticsVirtualDom = (diagnostics, bracketMatchInfos = []) => {
|
|
14198
14647
|
const diagnosticsDom = getDiagnosticsVirtualDom([...diagnostics]);
|
|
14648
|
+
const bracketMatchesDom = getBracketMatchesVirtualDom(bracketMatchInfos);
|
|
14199
14649
|
return [{
|
|
14200
|
-
childCount: diagnostics.length,
|
|
14650
|
+
childCount: diagnostics.length + bracketMatchInfos.length,
|
|
14201
14651
|
className: 'LayerDiagnostics',
|
|
14202
14652
|
type: Div
|
|
14203
|
-
}, ...diagnosticsDom];
|
|
14653
|
+
}, ...diagnosticsDom, ...bracketMatchesDom];
|
|
14204
14654
|
};
|
|
14205
14655
|
|
|
14206
14656
|
const editorLineDecorationNode = {
|
|
@@ -14286,8 +14736,8 @@ const editorLayersNode = {
|
|
|
14286
14736
|
className: 'EditorLayers',
|
|
14287
14737
|
type: Div
|
|
14288
14738
|
};
|
|
14289
|
-
const getEditorLayersVirtualDom = (selectionInfos, textInfos, differences, lineNumbers = true, highlightedLine = -1, cursorInfos = [], diagnostics = [], visibleLineIndices = [], endOfLineDecorations = []) => {
|
|
14290
|
-
return [editorLayersNode, ...getEditorSelectionsVirtualDom(selectionInfos), ...getEditorRowsVirtualDom(textInfos, differences, lineNumbers, highlightedLine, visibleLineIndices, endOfLineDecorations), ...getEditorCursorsVirtualDom(cursorInfos), ...getEditorDiagnosticsVirtualDom(diagnostics)];
|
|
14739
|
+
const getEditorLayersVirtualDom = (selectionInfos, textInfos, differences, lineNumbers = true, highlightedLine = -1, cursorInfos = [], diagnostics = [], visibleLineIndices = [], endOfLineDecorations = [], bracketMatchInfos = []) => {
|
|
14740
|
+
return [editorLayersNode, ...getEditorSelectionsVirtualDom(selectionInfos), ...getEditorRowsVirtualDom(textInfos, differences, lineNumbers, highlightedLine, visibleLineIndices, endOfLineDecorations), ...getEditorCursorsVirtualDom(cursorInfos), ...getEditorDiagnosticsVirtualDom(diagnostics, bracketMatchInfos)];
|
|
14291
14741
|
};
|
|
14292
14742
|
|
|
14293
14743
|
const getEditorScrollBarDiagnosticsVirtualDom = scrollBarDiagnostics => {
|
|
@@ -14344,6 +14794,7 @@ const editorContentNode = {
|
|
|
14344
14794
|
type: Div
|
|
14345
14795
|
};
|
|
14346
14796
|
const getEditorContentVirtualDom = ({
|
|
14797
|
+
bracketMatchInfos = [],
|
|
14347
14798
|
cursorInfos = [],
|
|
14348
14799
|
diagnostics = [],
|
|
14349
14800
|
differences,
|
|
@@ -14355,14 +14806,20 @@ const getEditorContentVirtualDom = ({
|
|
|
14355
14806
|
textInfos,
|
|
14356
14807
|
visibleLineIndices = []
|
|
14357
14808
|
}) => {
|
|
14358
|
-
return [editorContentNode, ...getEditorInputVirtualDom(), ...getEditorLayersVirtualDom(selectionInfos, textInfos, differences, lineNumbers, highlightedLine, cursorInfos, diagnostics, visibleLineIndices, endOfLineDecorations), ...getEditorScrollBarDiagnosticsVirtualDom(scrollBarDiagnostics), ...getScrollBarVirtualDom()];
|
|
14809
|
+
return [editorContentNode, ...getEditorInputVirtualDom(), ...getEditorLayersVirtualDom(selectionInfos, textInfos, differences, lineNumbers, highlightedLine, cursorInfos, diagnostics, visibleLineIndices, endOfLineDecorations, bracketMatchInfos), ...getEditorScrollBarDiagnosticsVirtualDom(scrollBarDiagnostics), ...getScrollBarVirtualDom()];
|
|
14359
14810
|
};
|
|
14360
14811
|
|
|
14361
|
-
const getGutterInfoVirtualDom = gutterInfo => {
|
|
14812
|
+
const getGutterInfoVirtualDom = (gutterInfo, activeLineNumber) => {
|
|
14362
14813
|
const isBreakpoint = typeof gutterInfo === 'object' && gutterInfo.isBreakpoint;
|
|
14363
14814
|
const isLightBulb = typeof gutterInfo === 'object' && gutterInfo.isLightBulb;
|
|
14364
14815
|
const lineNumber = typeof gutterInfo === 'object' ? gutterInfo.lineNumber : gutterInfo;
|
|
14365
14816
|
const label = isLightBulb ? `Show Code Actions on line ${lineNumber}` : `Breakpoint on line ${lineNumber}`;
|
|
14817
|
+
let className = lineNumber === activeLineNumber ? 'LineNumber LineNumberActive' : 'LineNumber';
|
|
14818
|
+
if (isLightBulb) {
|
|
14819
|
+
className += ' LineNumberLightBulb MaskIconLightBulb';
|
|
14820
|
+
} else if (isBreakpoint) {
|
|
14821
|
+
className += ' LineNumberBreakpoint';
|
|
14822
|
+
}
|
|
14366
14823
|
return [{
|
|
14367
14824
|
...((isBreakpoint || isLightBulb) && {
|
|
14368
14825
|
ariaLabel: label,
|
|
@@ -14372,7 +14829,7 @@ const getGutterInfoVirtualDom = gutterInfo => {
|
|
|
14372
14829
|
style: 'color:var(--DebugIconBreakpointForeground,#e51400)'
|
|
14373
14830
|
}),
|
|
14374
14831
|
childCount: 1,
|
|
14375
|
-
className
|
|
14832
|
+
className,
|
|
14376
14833
|
...(isLightBulb && {
|
|
14377
14834
|
onClick: HandleLightBulbClick,
|
|
14378
14835
|
role: Button
|
|
@@ -14380,13 +14837,13 @@ const getGutterInfoVirtualDom = gutterInfo => {
|
|
|
14380
14837
|
type: Span
|
|
14381
14838
|
}, text(isLightBulb ? '' : isBreakpoint ? '●' : lineNumber)];
|
|
14382
14839
|
};
|
|
14383
|
-
const getEditorGutterVirtualDom$1 = gutterInfos => {
|
|
14384
|
-
const dom = gutterInfos.flatMap(getGutterInfoVirtualDom);
|
|
14840
|
+
const getEditorGutterVirtualDom$1 = (gutterInfos, activeLineNumber = -1) => {
|
|
14841
|
+
const dom = gutterInfos.flatMap(gutterInfo => getGutterInfoVirtualDom(gutterInfo, activeLineNumber));
|
|
14385
14842
|
return dom;
|
|
14386
14843
|
};
|
|
14387
14844
|
|
|
14388
|
-
const getEditorGutterVirtualDom = gutterInfos => {
|
|
14389
|
-
const gutterDom = getEditorGutterVirtualDom$1([...gutterInfos]);
|
|
14845
|
+
const getEditorGutterVirtualDom = (gutterInfos, activeLineNumber = -1) => {
|
|
14846
|
+
const gutterDom = getEditorGutterVirtualDom$1([...gutterInfos], activeLineNumber);
|
|
14390
14847
|
return [{
|
|
14391
14848
|
childCount: gutterInfos.length,
|
|
14392
14849
|
className: 'Gutter',
|
|
@@ -14421,6 +14878,10 @@ const getGutterInfos = (minLineY, maxLineY, breakPoints, showLineNumbers = true,
|
|
|
14421
14878
|
return gutterInfos;
|
|
14422
14879
|
};
|
|
14423
14880
|
|
|
14881
|
+
const getPrimaryCursorRowIndex = (selections, primarySelectionIndex = 0) => {
|
|
14882
|
+
return selections?.[primarySelectionIndex + 2] ?? -1;
|
|
14883
|
+
};
|
|
14884
|
+
|
|
14424
14885
|
const textEditorErrorIconNode = {
|
|
14425
14886
|
childCount: 0,
|
|
14426
14887
|
className: mergeClassNames('EditorTextIcon', 'EditorTextIconError', 'MaskIcon', 'MaskIconError'),
|
|
@@ -14445,6 +14906,7 @@ const getMinimapVirtualDom = (minimapEnabled, minimapLines, minLineY) => {
|
|
|
14445
14906
|
}];
|
|
14446
14907
|
};
|
|
14447
14908
|
const getEditorVirtualDom = ({
|
|
14909
|
+
bracketMatchInfos = [],
|
|
14448
14910
|
breadcrumbsEnabled = false,
|
|
14449
14911
|
breakPoints = [],
|
|
14450
14912
|
cursorInfos = [],
|
|
@@ -14483,7 +14945,8 @@ const getEditorVirtualDom = ({
|
|
|
14483
14945
|
}
|
|
14484
14946
|
const visibleGutterInfos = breakPoints.length > 0 || visibleLineIndices ? getGutterInfos(minLineY, maxLineY, breakPoints, lineNumbers, visibleLineIndices, lightBulbRowIndex) : gutterInfos;
|
|
14485
14947
|
const showGutter = lineNumbers || breakPoints.length > 0 || lightBulbRowIndex >= 0;
|
|
14486
|
-
const
|
|
14948
|
+
const primaryCursorRowIndex = getPrimaryCursorRowIndex(selections, primarySelectionIndex);
|
|
14949
|
+
const gutterDom = showGutter ? getEditorGutterVirtualDom(visibleGutterInfos, primaryCursorRowIndex + 1) : [];
|
|
14487
14950
|
const minimapDom = getMinimapVirtualDom(minimapEnabled, minimapLines, minLineY);
|
|
14488
14951
|
const breadcrumbsDom = breadcrumbsEnabled ? getEditorBreadcrumbsVirtualDom({
|
|
14489
14952
|
breadcrumbsEnabled,
|
|
@@ -14502,6 +14965,7 @@ const getEditorVirtualDom = ({
|
|
|
14502
14965
|
role: Code,
|
|
14503
14966
|
type: Div
|
|
14504
14967
|
}, ...breadcrumbsDom, ...gutterDom, ...getEditorContentVirtualDom({
|
|
14968
|
+
bracketMatchInfos,
|
|
14505
14969
|
cursorInfos,
|
|
14506
14970
|
diagnostics,
|
|
14507
14971
|
differences,
|
|
@@ -14735,10 +15199,12 @@ const renderAdditionalFocusContext = {
|
|
|
14735
15199
|
};
|
|
14736
15200
|
const renderDecorations = {
|
|
14737
15201
|
apply(oldState, newState) {
|
|
14738
|
-
const
|
|
15202
|
+
const diagnosticsDom = getDiagnosticsVirtualDom(newState.visualDecorations || []);
|
|
15203
|
+
const bracketMatchesDom = getBracketMatchesVirtualDom(newState.bracketMatchInfos || []);
|
|
15204
|
+
const dom = [...diagnosticsDom, ...bracketMatchesDom];
|
|
14739
15205
|
return ['setDecorationsDom', dom];
|
|
14740
15206
|
},
|
|
14741
|
-
isEqual: (oldState, newState) => oldState.visualDecorations === newState.visualDecorations
|
|
15207
|
+
isEqual: (oldState, newState) => oldState.visualDecorations === newState.visualDecorations && oldState.bracketMatchInfos === newState.bracketMatchInfos
|
|
14742
15208
|
};
|
|
14743
15209
|
const renderGutterInfo = {
|
|
14744
15210
|
apply(oldState, newState) {
|
|
@@ -14748,16 +15214,19 @@ const renderGutterInfo = {
|
|
|
14748
15214
|
lineNumbers,
|
|
14749
15215
|
maxLineY,
|
|
14750
15216
|
minLineY,
|
|
15217
|
+
primarySelectionIndex,
|
|
15218
|
+
selections,
|
|
14751
15219
|
visibleLineIndices
|
|
14752
15220
|
} = newState;
|
|
14753
15221
|
if (!lineNumbers && breakPoints.length === 0 && lightBulbRowIndex === -1) {
|
|
14754
15222
|
return ['renderGutter', []];
|
|
14755
15223
|
}
|
|
14756
15224
|
const gutterInfos = getGutterInfos(minLineY, maxLineY, breakPoints, lineNumbers, visibleLineIndices, lightBulbRowIndex);
|
|
14757
|
-
const
|
|
15225
|
+
const primaryCursorRowIndex = getPrimaryCursorRowIndex(selections, primarySelectionIndex);
|
|
15226
|
+
const dom = getEditorGutterVirtualDom$1(gutterInfos, primaryCursorRowIndex + 1);
|
|
14758
15227
|
return ['renderGutter', dom];
|
|
14759
15228
|
},
|
|
14760
|
-
isEqual: (oldState, newState) => oldState.breakPoints === newState.breakPoints && oldState.lightBulbRowIndex === newState.lightBulbRowIndex && oldState.foldingRanges === newState.foldingRanges && oldState.lineNumbers === newState.lineNumbers && oldState.minLineY === newState.minLineY && oldState.maxLineY === newState.maxLineY
|
|
15229
|
+
isEqual: (oldState, newState) => oldState.breakPoints === newState.breakPoints && oldState.lightBulbRowIndex === newState.lightBulbRowIndex && oldState.foldingRanges === newState.foldingRanges && oldState.lineNumbers === newState.lineNumbers && oldState.minLineY === newState.minLineY && oldState.maxLineY === newState.maxLineY && getPrimaryCursorRowIndex(oldState.selections, oldState.primarySelectionIndex) === getPrimaryCursorRowIndex(newState.selections, newState.primarySelectionIndex)
|
|
14761
15230
|
};
|
|
14762
15231
|
const renderWidgets = {
|
|
14763
15232
|
apply: renderWidgets$1,
|
|
@@ -15115,7 +15584,9 @@ const wrapCommand = (fn, preservesTypingCoalescing = false) => async (uid, ...ar
|
|
|
15115
15584
|
const state = oldInstance.newState;
|
|
15116
15585
|
const {
|
|
15117
15586
|
cursorUndoStack,
|
|
15587
|
+
endOfLine,
|
|
15118
15588
|
initial,
|
|
15589
|
+
insertSpaces,
|
|
15119
15590
|
isSelecting,
|
|
15120
15591
|
lines,
|
|
15121
15592
|
modified,
|
|
@@ -15155,7 +15626,7 @@ const wrapCommand = (fn, preservesTypingCoalescing = false) => async (uid, ...ar
|
|
|
15155
15626
|
set$8(uid, state, finalEditor);
|
|
15156
15627
|
}
|
|
15157
15628
|
await notifyEditorStatusChange(state, finalEditor);
|
|
15158
|
-
if (!initial && uri === finalEditor.uri && (lines !== finalEditor.lines || modified !== finalEditor.modified || redoStack !== finalEditor.redoStack || undoStack !== finalEditor.undoStack)) {
|
|
15629
|
+
if (!initial && uri === finalEditor.uri && (endOfLine !== finalEditor.endOfLine || insertSpaces !== finalEditor.insertSpaces || lines !== finalEditor.lines || modified !== finalEditor.modified || redoStack !== finalEditor.redoStack || undoStack !== finalEditor.undoStack)) {
|
|
15159
15630
|
for (const key of getKeys$2()) {
|
|
15160
15631
|
const otherUid = Number(key);
|
|
15161
15632
|
const instance = get$8(otherUid);
|
|
@@ -15167,7 +15638,9 @@ const wrapCommand = (fn, preservesTypingCoalescing = false) => async (uid, ...ar
|
|
|
15167
15638
|
...editor,
|
|
15168
15639
|
decorations: finalEditor.decorations,
|
|
15169
15640
|
diagnostics: finalEditor.diagnostics,
|
|
15641
|
+
endOfLine: finalEditor.endOfLine,
|
|
15170
15642
|
incrementalEdits: emptyIncrementalEdits,
|
|
15643
|
+
insertSpaces: finalEditor.insertSpaces,
|
|
15171
15644
|
invalidStartIndex: Math.min(editor.invalidStartIndex, finalEditor.invalidStartIndex),
|
|
15172
15645
|
lines: finalEditor.lines,
|
|
15173
15646
|
modified: finalEditor.modified,
|
|
@@ -15289,6 +15762,7 @@ const commandMap = {
|
|
|
15289
15762
|
'Editor.getWordAtOffset2': getWordAtOffset2,
|
|
15290
15763
|
'Editor.getWordBefore': getWordBefore,
|
|
15291
15764
|
'Editor.getWordBefore2': getWordBefore2,
|
|
15765
|
+
'Editor.goToBracket': wrapCommand(goToBracket$1),
|
|
15292
15766
|
'Editor.goToDefinition': wrapCommand(goToDefinition),
|
|
15293
15767
|
'Editor.goToTypeDefinition': wrapCommand(goToTypeDefinition),
|
|
15294
15768
|
'Editor.handleBeforeInput': wrapCommand(handleBeforeInput, true),
|
|
@@ -15372,6 +15846,7 @@ const commandMap = {
|
|
|
15372
15846
|
'Editor.selectLine': wrapCommand(selectLine),
|
|
15373
15847
|
'Editor.selectNextOccurrence': wrapCommand(selectNextOccurrence),
|
|
15374
15848
|
'Editor.selectPreviousOccurrence': wrapCommand(selectPreviousOccurrence),
|
|
15849
|
+
'Editor.selectToBracket': wrapCommand(selectToBracket),
|
|
15375
15850
|
'Editor.selectUp': wrapCommand(selectUp),
|
|
15376
15851
|
'Editor.selectWord': wrapCommand(selectWord),
|
|
15377
15852
|
'Editor.selectWordLeft': wrapCommand(selectWordLeft),
|
|
@@ -15381,6 +15856,8 @@ const commandMap = {
|
|
|
15381
15856
|
'Editor.setDelta': wrapCommand(setDelta),
|
|
15382
15857
|
'Editor.setDeltaY': wrapCommand(setDeltaY),
|
|
15383
15858
|
'Editor.setDiagnostics': wrapCommand(addDiagnostics),
|
|
15859
|
+
'Editor.setEndOfLine': wrapCommand(setEndOfLine),
|
|
15860
|
+
'Editor.setIndentation': wrapCommand(setIndentation),
|
|
15384
15861
|
'Editor.setLanguageId': wrapCommand(setLanguageId),
|
|
15385
15862
|
'Editor.setSelections': wrapCommand(setSelections),
|
|
15386
15863
|
'Editor.setSelections2': setSelections2,
|