jiebi/CodeConvo huggingface dataset:
} protected abstract _showTerminalCloseConfirmation(): TPromise<boolean>; <ins> protected abstract _showNotEnoughSpaceToast(): void; </ins> public abstract createTerminal(shell?: IShellLaunchConfig, wasNewTerminalAction?: boolean): ITerminalInstance; public abstract createTerminalRenderer(name: string): ITerminalInstance; public abstract createInstance(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, container: HTMLElement, shellLaunchConfig: IShellLaunchConfig, doCreateProcess: boolean): ITerminalInstance;
} const instance = tab.split(this._terminalFocusContextKey, this.configHelper, shellLaunchConfig); <del> this._initInstanceListeners(instance); this._onInstancesChanged.fire(); </del> <ins> if (instance) { this._initInstanceListeners(instance); this._onInstancesChanged.fire(); </ins> <del> this._terminalTabs.forEach((t, i) => t.setVisible(i === this._activeTabIndex)); </del> <ins> this._terminalTabs.forEach((t, i) => t.setVisible(i === this._activeTabIndex)); } else { this._showNotEnoughSpaceToast(); } </ins> } protected _initInstanceListeners(instance: ITerminalInstance): void {
}).then(res => !res.confirmed); } <ins> protected _showNotEnoughSpaceToast(): void { this._notificationService.warn(nls.localize('terminal.minWidth', "Not enough space to split terminal.")); } </ins> public setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void { this._configHelper.panelContainer = panelContainer; this._terminalContainer = terminalContainer;
import { ModelDecorationMinimapOptions } from 'vs/editor/common/model/textModel'; import { Selection } from 'vs/editor/common/core/selection'; import { Color } from 'vs/base/common/color'; <ins> import { GestureEvent, EventType, Gesture } from 'vs/base/browser/touch'; </ins> function getMinimapLineHeight(renderMinimap: RenderMinimap): number { if (renderMinimap === RenderMinimap.Large) {
private readonly _mouseDownListener: IDisposable; private readonly _sliderMouseMoveMonitor: GlobalMouseMoveMonitor<IStandardMouseMoveEventData>; private readonly _sliderMouseDownListener: IDisposable; <ins> private readonly _sliderTouchStartListener: IDisposable; private readonly _sliderTouchMoveListener: IDisposable; private readonly _sliderTouchEndListener: IDisposable; </ins> private _options: MinimapOptions; private _lastRenderData: RenderData | null; private _selections: Selection[] = []; private _selectionColor: Color | undefined; private _renderDecorations: boolean = false; <ins> private _gestureInProgress: boolean = false; </ins> private _buffers: MinimapBuffers | null; constructor(context: ViewContext) {
); } }); <ins> Gesture.addTarget(this._domNode.domNode); this._sliderTouchStartListener = dom.addDisposableListener(this._domNode.domNode, EventType.Start, (e: GestureEvent) => { e.preventDefault(); e.stopPropagation(); if (this._lastRenderData) { this._slider.toggleClassName('active', true); this._gestureInProgress = true; this.scrollDueToTouchEvent(e); } }); this._sliderTouchMoveListener = dom.addStandardDisposableListener(this._domNode.domNode, EventType.Change, (e: GestureEvent) => { e.preventDefault(); e.stopPropagation(); if (this._lastRenderData && this._gestureInProgress) { this.scrollDueToTouchEvent(e); } }); this._sliderTouchEndListener = dom.addStandardDisposableListener(this._domNode.domNode, EventType.End, (e: GestureEvent) => { e.preventDefault(); e.stopPropagation(); this._gestureInProgress = false; this._slider.toggleClassName('active', false); }); } private scrollDueToTouchEvent(touch: GestureEvent) { const startY = this._domNode.domNode.getBoundingClientRect().top; const scrollTop = this._lastRenderData!.renderedLayout.getDesiredScrollTopFromTouchLocation(touch.pageY - startY); this._context.viewLayout.setScrollPositionNow({ scrollTop: scrollTop }); </ins> } public dispose(): void { this._mouseDownListener.dispose(); this._sliderMouseMoveMonitor.dispose(); this._sliderMouseDownListener.dispose(); <ins> this._sliderTouchStartListener.dispose(); this._sliderTouchMoveListener.dispose(); this._sliderTouchEndListener.dispose(); </ins> super.dispose(); }
"native-watchdog": "0.3.0", "node-pty": "0.7.7", "semver": "^5.5.0", <del> "spdlog": "0.7.1", </del> <ins> "spdlog": "0.7.2", </ins> "sudo-prompt": "8.2.0", "v8-inspect-profiler": "^0.0.8", "vscode-chokidar": "1.6.4",
version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" <del> spdlog@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.7.1.tgz#960b8cdced12e8c482d1df9fa65220789f276979" </del> <ins> spdlog@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.7.2.tgz#9298753d7694b9ee9bbfd7e01ea1e4c6ace1e64d" </ins> dependencies: bindings "^1.3.0" mkdirp "^0.5.1"
import { Schemas } from 'vs/base/common/network'; import { IDialogService, IConfirmationResult, IConfirmation, getConfirmMessage } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; <ins> import { Constants } from 'vs/editor/common/core/uint'; </ins> export interface IEditableData { action: IAction;
export function incrementFileName(name: string, isFolder: boolean): string { const separators = '[.-_]'; <ins> const maxNumber = Constants.MAX_SAFE_SMALL_INTEGER; </ins> // file.1.txt=>file.2.txt let suffixFileRegex = RegExp('(.*' + separators + ')(d+)(..*)$'); if (!isFolder && name.match(suffixFileRegex)) { return name.replace(suffixFileRegex, (match, g1?, g2?, g3?) => { <del> return g1 + strings.pad(parseInt(g2) + 1, g2.length) + g3; </del> <ins> let number = parseInt(g2); return number < maxNumber ? g1 + strings.pad(number + 1, g2.length) + g3 : strings.format('{0}{1}.1{2}', g1, g2, g3); </ins> }); }
let prefixFileRegex = RegExp('(d+)(' + separators + '.*)(..*)$'); if (!isFolder && name.match(prefixFileRegex)) { return name.replace(prefixFileRegex, (match, g1?, g2?, g3?) => { <del> return strings.pad(parseInt(g1) + 1, g1.length) + g2 + g3; </del> <ins> let number = parseInt(g1); return number < maxNumber ? strings.pad(number + 1, g1.length) + g2 + g3 : strings.format('{0}{1}.1{2}', g1, g2, g3); </ins> }); }
// folder.1=>folder.2 if (isFolder && name.match(/(d+)$/)) { <del> return name.replace(/(d+)$/, (match: string, ...groups: any[]) => { return strings.pad(parseInt(groups[0]) + 1, groups[0].length); }); </del> <ins> return name.replace(/(d+)$/, (match: string, ...groups: any[]) => { let number = parseInt(groups[0]); return number < maxNumber ? strings.pad(number + 1, groups[0].length) : strings.format('{0}.1', groups[0]); }); </ins> } // 1.folder=>2.folder if (isFolder && name.match(/^(d+)/)) { <del> return name.replace(/^(d+)/, (match: string, ...groups: any[]) => { return strings.pad(parseInt(groups[0]) + 1, groups[0].length); }); </del> <ins> return name.replace(/^(d+)(.*)$/, (match: string, ...groups: any[]) => { let number = parseInt(groups[0]); return number < maxNumber ? strings.pad(number + 1, groups[0].length) + groups[1] : strings.format('{0}{1}.1', groups[0], groups[1]); }); </ins> } // file/folder=>file.1/folder.1
assert.strictEqual(result, 'test_2'); }); <ins> test('Increment file name with suffix version, too big number', function () { const name = 'test.9007199254740992.js'; const result = incrementFileName(name, false); assert.strictEqual(result, 'test.9007199254740992.1.js'); }); test('Increment folder name with suffix version, too big number', function () { const name = 'test.9007199254740992'; const result = incrementFileName(name, true); assert.strictEqual(result, 'test.9007199254740992.1'); }); </ins> test('Increment file name with prefix version', function () { const name = '1.test.js'; const result = incrementFileName(name, false);
assert.strictEqual(result, '2_test.js'); }); <del> test('Increment folder name with suffix version', function () { </del> <ins> test('Increment file name with prefix version, too big number', function () { const name = '9007199254740992.test.js'; const result = incrementFileName(name, false); assert.strictEqual(result, '9007199254740992.test.1.js'); }); test('Increment folder name with prefix version', function () { </ins> const name = '1.test'; const result = incrementFileName(name, true); assert.strictEqual(result, '2.test'); }); <del> test('Increment folder name with suffix version, trailing zeros', function () { </del> <ins> test('Increment folder name with prefix version, too big number', function () { const name = '9007199254740992.test'; const result = incrementFileName(name, true); assert.strictEqual(result, '9007199254740992.test.1'); }); test('Increment folder name with prefix version, trailing zeros', function () { </ins> const name = '001.test'; const result = incrementFileName(name, true); assert.strictEqual(result, '002.test'); }); <del> test('Increment folder name with suffix version  with `-` as separator', function () { </del> <ins> test('Increment folder name with prefix version  with `-` as separator', function () { </ins> const name = '1-test'; const result = incrementFileName(name, true); assert.strictEqual(result, '2-test');
import { nullTokenize2 } from 'vs/editor/common/modes/nullMode'; import { generateTokensCSSForColorMap } from 'vs/editor/common/modes/supports/tokenization'; import { Color } from 'vs/base/common/color'; <ins> import { INotificationService } from 'vs/platform/notification/common/notification'; </ins> import URI from 'vs/base/common/uri'; export class TMScopeRegistry {
constructor( @IModeService modeService: IModeService, <del> @IWorkbenchThemeService themeService: IWorkbenchThemeService </del> <ins> @IWorkbenchThemeService themeService: IWorkbenchThemeService, @INotificationService notificationService: INotificationService </ins> ) { this._styleElement = dom.createStyleSheet(); this._styleElement.className = 'vscode-tokens-styles';
private registerDefinition(modeId: string): void { this._createGrammar(modeId).then((r) => { <del> TokenizationRegistry.register(modeId, new TMTokenization(this._scopeRegistry, r.languageId, r.grammar, r.initialState, r.containsEmbeddedLanguages)); </del> <ins> TokenizationRegistry.register(modeId, new TMTokenization(this._scopeRegistry, r.languageId, r.grammar, r.initialState, r.containsEmbeddedLanguages, this._notificationService)); </ins> }, onUnexpectedError); } }
private readonly _containsEmbeddedLanguages: boolean; private readonly _seenLanguages: boolean[]; private readonly _initialState: StackElement; <ins> private _tokenizationWarningAlreadyShown: boolean; </ins> <del> constructor(scopeRegistry: TMScopeRegistry, languageId: LanguageId, grammar: IGrammar, initialState: StackElement, containsEmbeddedLanguages: boolean) { </del> <ins> constructor(scopeRegistry: TMScopeRegistry, languageId: LanguageId, grammar: IGrammar, initialState: StackElement, containsEmbeddedLanguages: boolean, @INotificationService private notificationService: INotificationService) { </ins> this._scopeRegistry = scopeRegistry; this._languageId = languageId; this._grammar = grammar;
// Do not attempt to tokenize if a line has over 20k if (line.length >= 20000) { <ins> if (!this._tokenizationWarningAlreadyShown) { this._tokenizationWarningAlreadyShown = true; this.notificationService.warn(nls.localize('too many characters', "Tokenization is skipped for lines longer than 20k characters for performance reasons.")); } </ins> console.log(`Line (${line.substr(0, 15)}...): longer than 20k characters, tokenization skipped.`); return nullTokenize2(this._languageId, line, state, offsetDelta); }
private updateRecommendationStatus(extension: IExtension, data: ITemplateData) { const extRecommendations = this.extensionTipsService.getAllRecommendationsWithReason(); <ins> let ariaLabel = extension.displayName + '. '; </ins> if (!extRecommendations[extension.id.toLowerCase()]) { <del> data.root.setAttribute('aria-label', extension.displayName); data.root.title = ''; </del> removeClass(data.root, 'recommended'); <ins> data.root.title = ''; </ins> } else { <del> data.root.setAttribute('aria-label', extension.displayName + '. ' + extRecommendations[extension.id]); data.root.title = extRecommendations[extension.id.toLowerCase()].reasonText; </del> addClass(data.root, 'recommended'); <ins> ariaLabel += extRecommendations[extension.id.toLowerCase()].reasonText + ' '; data.root.title = extRecommendations[extension.id.toLowerCase()].reasonText; </ins> } <ins> ariaLabel += localize('viewExtensionDetailsAria', "Press enter for extension details."); data.root.setAttribute('aria-label', ariaLabel); </ins> } disposeTemplate(data: ITemplateData): void {
this.disposables.push(this.list.onOpen(e => { let isSingleClick = false; let isDoubleClick = false; <ins> let isMiddleClick = false; </ins> let openToSide = false; const browserEvent = e.browserEvent; if (browserEvent instanceof MouseEvent) { isSingleClick = browserEvent.detail === 1; isDoubleClick = browserEvent.detail === 2; <ins> isMiddleClick = browserEvent.button === 1; </ins> openToSide = (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); } const focused = this.list.getFocusedElements(); const element = focused.length ? focused[0] : undefined; <ins> if (isMiddleClick) { if (element instanceof Breakpoint) { this.debugService.removeBreakpoints(element.getId()); } else if (element instanceof FunctionBreakpoint) { this.debugService.removeFunctionBreakpoints(element.getId()); } return; } </ins> if (element instanceof Breakpoint) { openBreakpointSource(element, openToSide, isSingleClick, this.debugService, this.editorService).done(undefined, onUnexpectedError); }
this.searchBox.setModel(this.modelService.createModel('', null, uri.parse('extensions:searchinput'), true)); this.disposables.push(this.searchBox.onDidPaste(() => { <del> this.searchBox.setValue(this.searchBox.getValue().replace(/s+/g, ' ')); </del> <ins> let trimmed = this.searchBox.getValue().replace(/s+/g, ' '); this.searchBox.setValue(trimmed); </ins> this.searchBox.setScrollTop(0); <ins> this.searchBox.setPosition(new Position(1, trimmed.length + 1)); </ins> })); this.disposables.push(this.searchBox.onDidFocusEditorText(() => addClass(this.monacoStyleContainer, 'synthetic-focus'))); this.disposables.push(this.searchBox.onDidBlurEditorText(() => removeClass(this.monacoStyleContainer, 'synthetic-focus')));
}, "Insert link": { "prefix": "link", <del> "body": "[${1:text}](http://${2:link})$0", </del> <ins> "body": "[${1:text}](https://${2:link})$0", </ins> "description": "Insert link" }, "Insert image": { "prefix": "image", <del> "body": "![${1:alt}](http://${2:link})$0", </del> <ins> "body": "![${1:alt}](https://${2:link})$0", </ins> "description": "Insert image" } }
this.addDisposable(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('terminal.integrated')) { this.updateConfig(); <ins> // HACK: Trigger another async layout to ensure xterm's CharMeasure is ready to use, // this hack can be removed when https://github.com/xtermjs/xterm.js/issues/702 is // supported. this.setVisible(this._isVisible); </ins> } if (e.affectsConfiguration('editor.accessibilitySupport')) { this.updateAccessibilitySupport();
actionRunner?: IActionRunner; ariaLabel?: string; animated?: boolean; <ins> triggerKeys?: ActionTrigger; </ins> } let defaultOptions: IActionBarOptions = { orientation: ActionsOrientation.HORIZONTAL, <del> context: null </del> <ins> context: null, triggerKeys: { keys: [KeyCode.Enter, KeyCode.Space], keyDown: false } </ins> }; export interface IActionOptions extends IActionItemOptions {
this.focusNext(); } else if (event.equals(KeyCode.Escape)) { this.cancel(); <del> } else if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { // Nothing, just staying out of the else branch </del> <ins> } else if (this.isTriggerKeyEvent(event)) { // Staying out of the else branch even if not triggered if (this.options.triggerKeys && this.options.triggerKeys.keyDown) { this.doTrigger(event); } </ins> } else { eventHandled = false; }
let event = new StandardKeyboardEvent(e as KeyboardEvent); // Run action on Enter/Space <del> if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { this.doTrigger(event); </del> <ins> if (this.isTriggerKeyEvent(event)) { if (!this.options.triggerKeys.keyDown) { this.doTrigger(event); } </ins> event.preventDefault(); event.stopPropagation(); }
} } <ins> private isTriggerKeyEvent(event: StandardKeyboardEvent): boolean { let ret = false; if (this.options.triggerKeys) { this.options.triggerKeys.keys.forEach(keyCode => { ret = ret || event.equals(keyCode); }); } return ret; } </ins> private updateFocusedItem(): void { for (let i = 0; i < this.actionsList.children.length; i++) { let elem = this.actionsList.children[i];
if (defaultUri && defaultUri.scheme !== Schemas.file) { return Promise.reject(new Error('Not supported - Open-dialogs can only be opened on `file`-uris.')); } <del> const filters = []; if (options.filters) { for (let name in options.filters) { filters.push({ name, extensions: options.filters[name] }); } } </del> const newOptions: OpenDialogOptions = { title: options.title, defaultPath: defaultUri && defaultUri.fsPath, buttonLabel: options.openLabel, <del> filters, </del> <ins> filters: options.filters, </ins> properties: [] }; newOptions.properties.push('createDirectory');
resetStateMachine = true; } } else if (state === State.End) { <del> const chClass = classifier.get(chCode); </del> <ins> let chClass: CharacterClass; if (chCode === CharCode.OpenSquareBracket) { // Allow for the authority part to contain ipv6 addresses which contain [ and ] hasOpenSquareBracket = true; chClass = CharacterClass.None; } else { chClass = classifier.get(chCode); } </ins> // Check if character terminates link if (chClass === CharacterClass.ForceTermination) {
'                                                                                                                                                 https://msdn.microsoft.com/en-us/library/windows/desktop/ms687414(v=vs.85).aspx                                  ' ); }); <ins> test('issue #62278: "Ctrl + click to follow link" for IPv6 URLs', () => { assertLink( 'let x = "http://[::1]:5000/connect/token"', '         http://[::1]:5000/connect/token  ' ); }); </ins> });
} const resultsSelectedBackground = theme.getColor(peekViewResultsSelectionBackground); if (resultsSelectedBackground) { <del> collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${resultsSelectedBackground}; }`); </del> <ins> collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { background-color: ${resultsSelectedBackground}; }`); </ins> } const resultsSelectedForeground = theme.getColor(peekViewResultsSelectionForeground); if (resultsSelectedForeground) { <del> collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: ${resultsSelectedForeground} !important; }`); </del> <ins> collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { color: ${resultsSelectedForeground} !important; }`); </ins> } const editorBackground = theme.getColor(peekViewEditorBackground); if (editorBackground) {
import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { IExtensionService, IExtensionsStatus } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensionEditor'; <ins> import { isWeb } from 'vs/base/common/platform'; </ins> interface IExtensionStateProvider<T> { (extension: Extension): T;
} const infos: IExtensionInfo[] = []; for (const installed of this.local) { <del> if (installed.type === ExtensionType.User && (!onlyBuiltin || installed.isBuiltin)) { </del> <ins> if (!onlyBuiltin || installed.isBuiltin) { </ins> infos.push({ ...installed.identifier, preRelease: !!installed.local?.preRelease }); } }
assert.strictEqual(extension.outdated, true); }); <del> test('extension is not outdated when local is built in and older than gallery', () => { </del> <ins> test('extension is outdated when local is built in and older than gallery', () => { </ins> const extension = instantiationService.createInstance(Extension, () => ExtensionState.Installed, undefined, aLocalExtension('somext', { version: '1.0.0' }, { type: ExtensionType.System }), aGalleryExtension('somext', { version: '1.0.1' })); <del> assert.strictEqual(extension.outdated, false); </del> <ins> assert.strictEqual(extension.outdated, true); </ins> }); test('extension is outdated when local and gallery are on same version but on different target platforms', () => {
}); test('findFiles', () => { <del> return vscode.workspace.findFiles('*.png').then((res) => { </del> <ins> return vscode.workspace.findFiles('**/*.png').then((res) => { assert.equal(res.length, 2); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); }); }); test('findFiles, exclude', () => { return vscode.workspace.findFiles('**/*.png', '**/sub/**').then((res) => { </ins> assert.equal(res.length, 1); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'image.png'); });
if (options.includePattern) { includeSearchPathsInfo = options.expandPatterns ? this.parseSearchPaths(options.includePattern) : <del> { pattern: patternListToIExpression(...splitGlobPattern(options.includePattern)) }; </del> <ins> { pattern: patternListToIExpression(options.includePattern) }; </ins> } let excludeSearchPathsInfo: ISearchPathsInfo = {}; if (options.excludePattern) { excludeSearchPathsInfo = options.expandPatterns ? this.parseSearchPaths(options.excludePattern) : <del> { pattern: patternListToIExpression(...splitGlobPattern(options.excludePattern)) }; </del> <ins> { pattern: patternListToIExpression(options.excludePattern) }; </ins> } // Build folderQueries from searchPaths, if given, otherwise folderResources
} // Handle empty to restore <del> if (emptyToRestore.length > 0) { emptyToRestore.forEach(emptyWindowBackupInfo => { </del> <ins> const allEmptyToRestore = arrays.distinct(emptyToRestore, info => info.backupFolder); // prevent duplicates if (allEmptyToRestore.length > 0) { allEmptyToRestore.forEach(emptyWindowBackupInfo => { </ins> const remoteAuthority = emptyWindowBackupInfo.remoteAuthority; const fileInputsForWindow = (fileInputs && fileInputs.remoteAuthority === remoteAuthority) ? fileInputs : undefined;
// Filename not allowed this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateBadFilename', 'Please enter a valid file name.'); return Promise.resolve(false); <del> } else if (!statDirname || !statDirname.isDirectory) { </del> <ins> } else if (!statDirname) { </ins> // Folder to save in doesn't exist <ins> const message = nls.localize('remoteFileDialog.validateCreateDirectory', 'The folder {0} does not exist. Would you like to create it?', resources.basename(resources.dirname(uri))); return this.yesNoPrompt(uri, message); } else if (!statDirname.isDirectory) { </ins> this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateNonexistentDir', 'Please enter a path that exists.'); return Promise.resolve(false); }
const picks = formatter.map((formatter, index) => { return <IIndexedPick>{ index, <del> label: formatter.displayName || formatter.extensionId || '?' </del> <ins> label: formatter.displayName || formatter.extensionId || '?', description: formatter.extensionId && formatter.extensionId.value </ins> }; }); const langName = this._modeService.getLanguageName(document.getModeId()) || document.getModeId();
{ "open": "{", "close": "}" }, { "open": "(", "close": ")" }, { "open": "'", "close": "'", "notIn": ["string", "comment"] }, <del> { "open": """, "close": """, "notIn": ["string"] } </del> <ins> { "open": """, "close": """, "notIn": ["string"] }, { "open": "/*", "close": " */", "notIn": ["string", "comment"] } </ins> ], "surroundingPairs": [ ["{", "}"],