'use strict'; const vscode = require('vscode'); const { indentationEdits, onTypeCharacters, shouldFormatOnType, selectionEndLine } = require('./indentation'); const { unmatchedBrackets } = require('./brackets'); const { registerRunner } = require('./runner'); const languageId = 'cie-pseudocode'; function formatLines(document, startLine, endLine, keepBlankIndent = false) { const lines = document.getText().split(/\r?\n/); return indentationEdits(lines, startLine, endLine, keepBlankIndent).map(edit => vscode.TextEdit.replace(new vscode.Range(edit.line, 0, edit.line, edit.length), edit.text)); } function activate(context) { registerRunner(vscode, context); const invalidBracket = vscode.window.createTextEditorDecorationType({ dark: { color: '#F44747' } }); function refreshBrackets(document) { const rangesByDocument = new Map(); for (const editor of vscode.window.visibleTextEditors) { if (document && editor.document !== document) continue; if (editor.document.languageId !== languageId) { editor.setDecorations(invalidBracket, []); continue; } if (!rangesByDocument.has(editor.document)) { const ranges = unmatchedBrackets(editor.document.getText()).map(offset => new vscode.Range(editor.document.positionAt(offset), editor.document.positionAt(offset + 1))); rangesByDocument.set(editor.document, ranges); } editor.setDecorations(invalidBracket, rangesByDocument.get(editor.document)); } } context.subscriptions.push( invalidBracket, vscode.workspace.onDidChangeTextDocument(event => refreshBrackets(event.document)), // Changing a document's language closes/reopens it without a text edit. vscode.workspace.onDidOpenTextDocument(() => refreshBrackets()), vscode.window.onDidChangeVisibleTextEditors(() => refreshBrackets()), vscode.languages.registerDocumentRangeFormattingEditProvider(languageId, { provideDocumentRangeFormattingEdits(document, range) { const endLine = selectionEndLine(range.start.line, range.end.line, range.end.character); return formatLines(document, range.start.line, endLine); } }), vscode.languages.registerOnTypeFormattingEditProvider(languageId, { provideOnTypeFormattingEdits(document, position, char) { if (!shouldFormatOnType(document.lineAt(position.line).text, char)) return []; return formatLines(document, position.line, position.line, char === '\n'); } }, ...onTypeCharacters) ); refreshBrackets(); } module.exports = { activate };