833bde81cb95b9b474a87396928774bf58f7ddd990000486782ec97067cdf7e3b68fecd139da09c99d382ea15386bb34dfcdcfcd99ccf6a3c367c36c4638b7 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { LanguageAgnosticBracketTokens } from './bracketPairsTree/brackets.js';
  6. import { lengthAdd, lengthGetColumnCountIfZeroLineCount, lengthZero } from './bracketPairsTree/length.js';
  7. import { parseDocument } from './bracketPairsTree/parser.js';
  8. import { DenseKeyProvider } from './bracketPairsTree/smallImmutableSet.js';
  9. import { TextBufferTokenizer } from './bracketPairsTree/tokenizer.js';
  10. export function fixBracketsInLine(tokens, languageConfigurationService) {
  11. const denseKeyProvider = new DenseKeyProvider();
  12. const bracketTokens = new LanguageAgnosticBracketTokens(denseKeyProvider, (languageId) => languageConfigurationService.getLanguageConfiguration(languageId));
  13. const tokenizer = new TextBufferTokenizer(new StaticTokenizerSource([tokens]), bracketTokens);
  14. const node = parseDocument(tokenizer, [], undefined, true);
  15. let str = '';
  16. const line = tokens.getLineContent();
  17. function processNode(node, offset) {
  18. if (node.kind === 2 /* AstNodeKind.Pair */) {
  19. processNode(node.openingBracket, offset);
  20. offset = lengthAdd(offset, node.openingBracket.length);
  21. if (node.child) {
  22. processNode(node.child, offset);
  23. offset = lengthAdd(offset, node.child.length);
  24. }
  25. if (node.closingBracket) {
  26. processNode(node.closingBracket, offset);
  27. offset = lengthAdd(offset, node.closingBracket.length);
  28. }
  29. else {
  30. const singleLangBracketTokens = bracketTokens.getSingleLanguageBracketTokens(node.openingBracket.languageId);
  31. const closingTokenText = singleLangBracketTokens.findClosingTokenText(node.openingBracket.bracketIds);
  32. str += closingTokenText;
  33. }
  34. }
  35. else if (node.kind === 3 /* AstNodeKind.UnexpectedClosingBracket */) {
  36. // remove the bracket
  37. }
  38. else if (node.kind === 0 /* AstNodeKind.Text */ || node.kind === 1 /* AstNodeKind.Bracket */) {
  39. str += line.substring(lengthGetColumnCountIfZeroLineCount(offset), lengthGetColumnCountIfZeroLineCount(lengthAdd(offset, node.length)));
  40. }
  41. else if (node.kind === 4 /* AstNodeKind.List */) {
  42. for (const child of node.children) {
  43. processNode(child, offset);
  44. offset = lengthAdd(offset, child.length);
  45. }
  46. }
  47. }
  48. processNode(node, lengthZero);
  49. return str;
  50. }
  51. class StaticTokenizerSource {
  52. constructor(lines) {
  53. this.lines = lines;
  54. this.tokenization = {
  55. getLineTokens: (lineNumber) => {
  56. return this.lines[lineNumber - 1];
  57. }
  58. };
  59. }
  60. getLineCount() {
  61. return this.lines.length;
  62. }
  63. getLineLength(lineNumber) {
  64. return this.lines[lineNumber - 1].getLineContent().length;
  65. }
  66. }