@making-sense/antlr-editor
Version:
ANTLR Typescript editor
275 lines • 11.3 kB
JavaScript
;
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