UNPKG

@making-sense/antlr-editor

Version:
275 lines 11.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getVtlTheme = exports.cleanupProviders = exports.getEditorWillMount = exports.getBracketsConfiguration = exports.getTheme = void 0; const EditorApi = __importStar(require("monaco-editor")); const grammarGraph_1 = require("../grammar-graph/grammarGraph"); const ParserFacade_1 = require("./ParserFacade"); const tokensProvider_1 = require("./tokensProvider"); const vocabularyPack_1 = require("./vocabularyPack"); const constants_1 = require("./constants"); const getTheme = () => { return { base: "vs", inherit: true, rules: [ { token: "string", foreground: "018B03" }, { token: "comment", foreground: "939393" }, { token: "operator", foreground: "8B3301" }, { token: "delimiter.bracket", foreground: "8B3301" }, { token: "operator.special", foreground: "8B3301", fontStyle: "bold" } ], colors: {} }; }; exports.getTheme = getTheme; const getBracketsConfiguration = () => { return { surroundingPairs: [ { open: "{", close: "}" }, { open: "(", close: ")" }, { open: "[", close: "]" } ], autoClosingPairs: [ { open: "{", close: "}" }, { open: "(", close: ")" }, { open: "[", close: "]" } ], brackets: [ ["{", "}"], ["(", ")"], ["[", "]"] ] }; }; exports.getBracketsConfiguration = getBracketsConfiguration; // Improved provider management with proper cleanup class ProviderManager { constructor() { this.completionItemDispose = undefined; this.registeredLanguages = new Set(); this.registeredThemes = new Set(); this.getEditorWillMount = (tools) => { const { id } = tools; return ({ variables, editor }) => { return (monaco) => { try { // Register language only if not already registered if (!this.registeredLanguages.has(id)) { monaco.languages.register({ id }); this.registeredLanguages.add(id); } if (tools.monarchDefinition) { const tokensProvider = new tokensProvider_1.TokensProvider(tools); monaco.languages.setMonarchTokensProvider(id, tokensProvider.monarchLanguage()); } // Register themes only if not already registered const themes = [id, "vtl-default", "vtl-light", "vtl-dark", "vtl-black"]; themes.forEach(themeName => { if (!this.registeredThemes.has(themeName)) { if (themeName === id) { monaco.editor.defineTheme(themeName, (0, exports.getTheme)()); } else { monaco.editor.defineTheme(themeName, (0, exports.getVtlTheme)(themeName)); } this.registeredThemes.add(themeName); } }); monaco.languages.setLanguageConfiguration(id, (0, exports.getBracketsConfiguration)()); // Dispose previous completion provider if (this.completionItemDispose) { try { this.completionItemDispose.dispose(); } catch (error) { console.warn("Error disposing previous completion provider:", error); } } // Register new completion provider this.completionItemDispose = monaco.languages.registerCompletionItemProvider(id, { provideCompletionItems: getSuggestions(tools, { variables }) }); // Configure suggest widget try { //@ts-ignore const { widget } = editor.getContribution("editor.contrib.suggestController"); if (widget) { const suggestWidget = widget.value; suggestWidget._setDetailsVisible(true); } } catch (error) { console.warn("Error configuring suggest widget:", error); } } catch (error) { console.error("Error in getEditorWillMount:", error); } }; }; }; } dispose() { if (this.completionItemDispose) { try { this.completionItemDispose.dispose(); } catch (error) { console.warn("Error disposing completion item provider:", error); } this.completionItemDispose = undefined; } } } // Global provider manager instance const providerManager = new ProviderManager(); exports.getEditorWillMount = providerManager.getEditorWillMount; // Cleanup function to be called when needed const cleanupProviders = () => { providerManager.dispose(); }; exports.cleanupProviders = cleanupProviders; const buildGrammarGraph = (tools) => { const { Lexer, Parser, grammar } = tools; const lexer = (0, ParserFacade_1.createLexer)(Lexer)(""); const parser = (0, ParserFacade_1.createParser)({ Lexer, Parser })(""); const vocabulary = new vocabularyPack_1.VocabularyPack(lexer, parser); const grammarGraph = new grammarGraph_1.GrammarGraph(vocabulary, grammar); return grammarGraph; }; const getVtlTheme = (name) => { switch (name) { case "vtl-default": { return { base: "vs", inherit: true, rules: [ { token: "string", foreground: "018B03" }, { token: "comment", foreground: "939393" }, { token: "operator", foreground: "8B3301" }, { token: "attribute", foreground: "9ffb88" }, { token: "dimension", foreground: "f7b74e" }, { token: "primaryMeasure", foreground: "953d55" }, { token: "delimiter.bracket", foreground: "8B3301" }, { token: "operator.special", foreground: "8B3301", fontStyle: "bold" } ], colors: {} }; } case "vtl-light": { return { base: "vs", inherit: true, rules: [ { token: "attribute", foreground: "9ffb88" }, { token: "dimension", foreground: "f7b74e" }, { token: "primaryMeasure", foreground: "953d55" } ], colors: {} }; } case "vtl-dark": { return { base: "vs-dark", inherit: true, rules: [ { token: "attribute", foreground: "9ffb88" }, { token: "dimension", foreground: "f7b74e" }, { token: "primaryMeasure", foreground: "953d55" } ], colors: {} }; } case "vtl-black": { return { base: "hc-black", inherit: true, rules: [ { token: "attribute", foreground: "9ffb88" }, { token: "dimension", foreground: "f7b74e" }, { token: "primaryMeasure", foreground: "953d55" } ], colors: {} }; } } return { base: "vs", colors: {}, inherit: true, rules: [] }; }; exports.getVtlTheme = getVtlTheme; const getSuggestions = (tools, { variables }) => { return function (model, position) { const textUntilPosition = model.getValueInRange({ startLineNumber: 1, startColumn: 1, endLineNumber: position.lineNumber, endColumn: position.column }); const word = model.getWordUntilPosition(position); const range = { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, startColumn: word.startColumn, endColumn: word.endColumn }; let uniquetext = Array.from(new Set(textUntilPosition .replace(/"(.*?)"/g, "") .replace(/[^a-zA-Z_]/g, " ") .split(" ") .filter(w => w !== "")).values()); buildGrammarGraph(tools); const { getSuggestionsFromRange = () => [] } = tools; const grammarSuggestions = getSuggestionsFromRange(range); const suggestionList = grammarSuggestions.length !== 0 ? grammarSuggestions : buildGrammarGraph(tools).suggestions(); uniquetext = removeLanguageSyntaxFromList(uniquetext, suggestionList); const array = uniquetext.map(w => { return { label: w, kind: EditorApi.languages.CompletionItemKind.Variable, insertText: w }; }); const vars = (variables || []).map(({ label, name }) => ({ label, kind: constants_1.VARIABLE, insertText: name, range })); return { suggestions: [...array, ...vars, ...suggestionList] }; }; function removeLanguageSyntaxFromList(vars, suggestionList) { const suggestionsLabels = suggestionList.map(s => s.label.toLowerCase()); return vars.filter(t => !suggestionsLabels.includes(t.toLowerCase())); } }; //# sourceMappingURL=providers.js.map