LeetCode Intelligent

为 LeetCode 增加智能代码提示,提供代码补全功能

Version vom 15.10.2024. Aktuellste Version

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         LeetCode Intelligent
// @namespace    https://shiyu.dev/
// @version      0.1
// @description  为 LeetCode 增加智能代码提示,提供代码补全功能
// @author       ShiYu
// @license      MIT
// @match        https://leetcode.com/problems/* 
// @match        https://leetcode.cn/problems/*
// @match        https://www.leetcode.com/problems/* 
// @match        https://www.leetcode.cn/problems/*
// @grant        none
// @antifeature  none
// @run-at       document-end
// ==/UserScript==

// src/cpp/utils.ts
function extractVariables(code, position) {
  const variableRegex = /\b(?:vector|stack|queue|deque|map|unordered_map|set|unordered_set|list|forward_list|multiset|unordered_multiset|multimap|unordered_multimap|priority_queue|pair|tuple|array)\s*<[^>]+>\s+(\w+)\s*;/g;
  const basicTypeRegex = /\b(?:int|float|double|char|bool|string|auto)\s+(\w+)\s*;/g;
  const funcParamRegex = /\(([^)]*)\)/g;
  const variables = new Map;
  const lines = code.split("\n").slice(0, position.lineNumber - 1);
  let currentLine = code.split("\n")[position.lineNumber - 1].substring(0, position.column - 1);
  lines.push(currentLine);
  const codeBeforeCursor = lines.join("\n");
  let match;
  while ((match = variableRegex.exec(codeBeforeCursor)) !== null) {
    const varName = match[1];
    variables.set(varName, { type: "template", kind: "variable" });
  }
  while ((match = basicTypeRegex.exec(codeBeforeCursor)) !== null) {
    const varName = match[1];
    variables.set(varName, { type: "basic", kind: "variable" });
  }
  const funcMatch = funcParamRegex.exec(codeBeforeCursor);
  if (funcMatch) {
    const params = funcMatch[1].split(",");
    params.forEach((param) => {
      const parts = param.trim().split(/\s+/);
      const paramName = parts[parts.length - 1];
      variables.set(paramName, { type: "parameter", kind: "parameter" });
    });
  }
  return variables;
}
function getRange(position, word) {
  return {
    startLineNumber: position.lineNumber,
    endLineNumber: position.lineNumber,
    startColumn: word.startColumn,
    endColumn: word.endColumn
  };
}

// src/cpp/vector.ts
function getVectorSuggestions(monaco, range) {
  return [
    {
      label: "push_back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "push_back(${1:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Adds an element to the end of the vector.",
      range
    },
    {
      label: "pop_back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "pop_back();",
      documentation: "Removes the last element of the vector.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size()",
      documentation: "Returns the number of elements in the vector.",
      range
    },
    {
      label: "clear",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "clear();",
      documentation: "Removes all elements from the vector.",
      range
    },
    {
      label: "at",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "at(${1:index})",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns a reference to the element at the specified position.",
      range
    },
    {
      label: "empty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "empty()",
      documentation: "Checks if the vector is empty.",
      range
    },
    {
      label: "reserve",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "reserve(${1:size});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Requests that the vector capacity be at least enough to contain a specified number of elements.",
      range
    },
    {
      label: "capacity",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "capacity()",
      documentation: "Returns the number of elements that can be held in currently allocated storage.",
      range
    },
    {
      label: "front",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "front()",
      documentation: "Returns a reference to the first element in the vector.",
      range
    },
    {
      label: "back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "back()",
      documentation: "Returns a reference to the last element in the vector.",
      range
    },
    {
      label: "insert",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "insert(${1:position}, ${2:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts elements at the specified position.",
      range
    },
    {
      label: "erase",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "erase(${1:position});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Erases elements at the specified position.",
      range
    },
    {
      label: "resize",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "resize(${1:new_size});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Resizes the container to contain the specified number of elements.",
      range
    },
    {
      label: "shrink_to_fit",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "shrink_to_fit();",
      documentation: "Reduces the capacity of the vector to fit its size.",
      range
    },
    {
      label: "data",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "data()",
      documentation: "Returns a direct pointer to the memory array used internally by the vector to store its owned elements.",
      range
    },
    {
      label: "emplace_back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "emplace_back(${1:args});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Constructs and inserts a new element at the end of the vector.",
      range
    }
  ];
}

// src/cpp/stack.ts
function getStackSuggestions(monaco, range) {
  return [
    {
      label: "push",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "push(${1:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Pushes an element onto the stack.",
      range
    },
    {
      label: "pop",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "pop();",
      documentation: "Removes the top element of the stack.",
      range
    },
    {
      label: "top",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "top()",
      documentation: "Returns a reference to the top element of the stack.",
      range
    },
    {
      label: "empty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "empty()",
      documentation: "Checks whether the stack is empty.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size()",
      documentation: "Returns the number of elements in the stack.",
      range
    },
    {
      label: "emplace",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "emplace(${1:args});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Constructs and inserts an element at the top of the stack.",
      range
    },
    {
      label: "swap",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "swap(${1:other_stack});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Exchanges the contents of the container with another stack.",
      range
    }
  ];
}

// src/cpp/queue.ts
function getQueueSuggestions(monaco, range) {
  return [
    {
      label: "push",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "push(${1:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts an element at the end of the queue.",
      range
    },
    {
      label: "pop",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "pop();",
      documentation: "Removes the next element in the queue.",
      range
    },
    {
      label: "front",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "front()",
      documentation: "Accesses the next element in the queue.",
      range
    },
    {
      label: "back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "back()",
      documentation: "Accesses the last element in the queue.",
      range
    },
    {
      label: "empty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "empty()",
      documentation: "Checks if the queue is empty.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size()",
      documentation: "Returns the number of elements in the queue.",
      range
    },
    {
      label: "emplace",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "emplace(${1:args});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Constructs and inserts a new element at the end of the queue.",
      range
    },
    {
      label: "swap",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "swap(${1:other_queue});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Exchanges the contents of the queue with another.",
      range
    }
  ];
}

// src/cpp/generalSuggestions.ts
function getGeneralSuggestions(monaco, range) {
  return [
    {
      label: "cout",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "cout << $1 << endl;",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Standard output stream",
      range
    },
    {
      label: "cin",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "cin >> $1;",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Standard input stream",
      range
    },
    {
      label: "for (auto x : num)",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "for (auto ${1:x} : ${2:container}) {\n\t$0\n}",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Range-based for loop using auto",
      range
    },
    {
      label: "for",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "for (int ${1:i} = 0; ${1:i} < ${2:n}; ${1:i}++) {\n\t$0\n}",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "For loop",
      range
    },
    {
      label: "while",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "while (${1:condition}) {\n\t$0\n}",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "While loop",
      range
    },
    {
      label: "vector",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "vector<${1:int}> ${2:vec};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::vector",
      range
    },
    {
      label: "stack",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "stack<${1:int}> ${2:stk};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::stack",
      range
    },
    {
      label: "queue",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "queue<${1:int}> ${2:q};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::queue",
      range
    },
    {
      label: "deque",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "deque<${1:int}> ${2:dq};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::deque",
      range
    },
    {
      label: "map",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "map<${1:int}, ${2:int}> ${3:m};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::map",
      range
    },
    {
      label: "unordered_map",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "unordered_map<${1:int}, ${2:int}> ${3:umap};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::unordered_map",
      range
    },
    {
      label: "set",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "set<${1:int}> ${2:s};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::set",
      range
    },
    {
      label: "unordered_set",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "unordered_set<${1:int}> ${2:uset};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::unordered_set",
      range
    },
    {
      label: "multimap",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "multimap<${1:int}, ${2:int}> ${3:mm};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::multimap",
      range
    },
    {
      label: "multiset",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "multiset<${1:int}> ${2:ms};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::multiset",
      range
    },
    {
      label: "priority_queue",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "priority_queue<${1:int}> ${2:pq};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::priority_queue",
      range
    },
    {
      label: "array",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "array<${1:int}, ${2:N}> ${3:arr};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::array",
      range
    },
    {
      label: "pair",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "pair<${1:int}, ${2:int}> ${3:p};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::pair",
      range
    },
    {
      label: "forward_list",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "forward_list<${1:int}> ${2:fl};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::forward_list",
      range
    },
    {
      label: "unordered_multimap",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "unordered_multimap<${1:int}, ${2:int}> ${3:umm};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::unordered_multimap",
      range
    },
    {
      label: "unordered_multiset",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "unordered_multiset<${1:int}> ${2:ums};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::unordered_multiset",
      range
    },
    {
      label: "tuple",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "tuple<${1:int}, ${2:int}, ${3:int}> ${4:tup};",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a std::tuple",
      range
    },
    {
      label: "sort",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "sort(${1:begin}, ${2:end});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Sorts the range [begin, end).",
      range
    },
    {
      label: "max",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "max(${1:a}, ${2:b});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns the maximum of two values.",
      range
    },
    {
      label: "min",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "min(${1:a}, ${2:b});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns the minimum of two values.",
      range
    },
    {
      label: "reverse",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "reverse(${1:begin}, ${2:end});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Reverses the range [begin, end).",
      range
    },
    {
      label: "find",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "find(${1:begin}, ${2:end}, ${3:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Finds the first occurrence of value in the range [begin, end).",
      range
    },
    {
      label: "accumulate",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "accumulate(${1:begin}, ${2:end}, ${3:init});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Accumulates the sum of the range [begin, end) starting from init.",
      range
    },
    {
      label: "binary_search",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "binary_search(${1:begin}, ${2:end}, ${3:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Checks if value exists in the sorted range [begin, end).",
      range
    },
    {
      label: "lower_bound",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "lower_bound(${1:begin}, ${2:end}, ${3:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns an iterator pointing to the first element not less than value in the sorted range [begin, end).",
      range
    },
    {
      label: "upper_bound",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "upper_bound(${1:begin}, ${2:end}, ${3:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns an iterator pointing to the first element greater than value in the sorted range [begin, end).",
      range
    },
    {
      label: "unique",
      kind: monaco.languages.CompletionItemKind.Function,
      insertText: "unique(${1:begin}, ${2:end});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Removes consecutive duplicates in the range [begin, end).",
      range
    }
  ];
}

// src/cpp/deque.ts
function getDequeSuggestions(monaco, range) {
  return [
    {
      label: "push_back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "push_back(${1:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Adds an element to the end of the deque.",
      range
    },
    {
      label: "push_front",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "push_front(${1:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Adds an element to the front of the deque.",
      range
    },
    {
      label: "pop_back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "pop_back();",
      documentation: "Removes the last element of the deque.",
      range
    },
    {
      label: "pop_front",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "pop_front();",
      documentation: "Removes the first element of the deque.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size()",
      documentation: "Returns the number of elements in the deque.",
      range
    },
    {
      label: "clear",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "clear();",
      documentation: "Removes all elements from the deque.",
      range
    },
    {
      label: "at",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "at(${1:index})",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns a reference to the element at the specified position.",
      range
    },
    {
      label: "empty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "empty()",
      documentation: "Checks if the deque is empty.",
      range
    },
    {
      label: "front",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "front()",
      documentation: "Returns a reference to the first element in the deque.",
      range
    },
    {
      label: "back",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "back()",
      documentation: "Returns a reference to the last element in the deque.",
      range
    },
    {
      label: "insert",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "insert(${1:position}, ${2:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts elements at the specified position.",
      range
    },
    {
      label: "erase",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "erase(${1:position});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Erases elements at the specified position.",
      range
    },
    {
      label: "resize",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "resize(${1:new_size});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Resizes the container to contain the specified number of elements.",
      range
    },
    {
      label: "shrink_to_fit",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "shrink_to_fit();",
      documentation: "Reduces the capacity of the deque to fit its size.",
      range
    },
    {
      label: "data",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "data()",
      documentation: "Returns a direct pointer to the memory array used internally by the deque.",
      range
    }
  ];
}

// src/cpp/map.ts
function getMapSuggestions(monaco, range) {
  return [
    {
      label: "insert",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "insert(${1:pair});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts a pair (key, value) into the map.",
      range
    },
    {
      label: "erase",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "erase(${1:key});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Erases the element by key from the map.",
      range
    },
    {
      label: "find",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "find(${1:key})",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Finds an element by its key.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size()",
      documentation: "Returns the number of elements in the map.",
      range
    },
    {
      label: "clear",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "clear();",
      documentation: "Removes all elements from the map.",
      range
    },
    {
      label: "empty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "empty()",
      documentation: "Checks if the map is empty.",
      range
    },
    {
      label: "at",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "at(${1:key})",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Accesses an element by key and returns a reference to its value.",
      range
    },
    {
      label: "count",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "count(${1:key})",
      documentation: "Returns the number of elements matching the key (either 0 or 1 in a map).",
      range
    }
  ];
}

// src/cpp/unordered_map.ts
function getUnorderedMapSuggestions(monaco, range) {
  return [
    {
      label: "insert",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "insert(${1:pair});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts a pair (key, value) into the unordered_map.",
      range
    },
    {
      label: "erase",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "erase(${1:key});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Erases the element by key from the unordered_map.",
      range
    },
    {
      label: "find",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "find(${1:key})",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Finds an element by its key.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size()",
      documentation: "Returns the number of elements in the unordered_map.",
      range
    },
    {
      label: "clear",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "clear();",
      documentation: "Removes all elements from the unordered_map.",
      range
    },
    {
      label: "empty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "empty()",
      documentation: "Checks if the unordered_map is empty.",
      range
    },
    {
      label: "at",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "at(${1:key})",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Accesses an element by key and returns a reference to its value.",
      range
    },
    {
      label: "count",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "count(${1:key})",
      documentation: "Returns the number of elements matching the key (either 0 or 1 in an unordered_map).",
      range
    }
  ];
}

// src/cpp/index.ts
function initCppCompletion(monaco) {
  monaco.languages.registerCompletionItemProvider("cpp", {
    provideCompletionItems: (model, position) => {
      const word = model.getWordUntilPosition(position);
      const range = getRange(position, word);
      const code = model.getValue();
      const variables = extractVariables(code, position);
      const variableSuggestions = [];
      variables.forEach(({ type }, name) => {
        variableSuggestions.push({
          label: name,
          kind: monaco.languages.CompletionItemKind.Variable,
          insertText: name,
          documentation: `Variable of type ${type}`,
          range
        });
      });
      const lineContent = model.getLineContent(position.lineNumber);
      const textBeforeCursor = lineContent.substring(0, position.column - 1).trim();
      const lastDotIndex = textBeforeCursor.lastIndexOf(".");
      let functionSuggestions = [];
      let isDotAfterVariable = false;
      if (lastDotIndex !== -1) {
        const varName = textBeforeCursor.substring(0, lastDotIndex).trim();
        if (variables.has(varName)) {
          const varInfo = variables.get(varName);
          isDotAfterVariable = true;
          switch (varInfo?.type) {
            case "template":
              functionSuggestions = getVectorSuggestions(monaco, range);
              break;
            case "stack":
              functionSuggestions = getStackSuggestions(monaco, range);
              break;
            case "queue":
              functionSuggestions = getQueueSuggestions(monaco, range);
              break;
            case "deque":
              functionSuggestions = getDequeSuggestions(monaco, range);
              break;
            case "map":
              functionSuggestions = getMapSuggestions(monaco, range);
              break;
            case "unordered_map":
              functionSuggestions = getUnorderedMapSuggestions(monaco, range);
              break;
            default:
              break;
          }
        }
      }
      if (!isDotAfterVariable) {
        const generalSuggestions = getGeneralSuggestions(monaco, range);
        return {
          suggestions: [...generalSuggestions, ...variableSuggestions]
        };
      } else {
        return {
          suggestions: [...functionSuggestions]
        };
      }
    }
  });
}

// src/java/arrayList.ts
function getArrayListSuggestions(monaco, range) {
  return [
    {
      label: "add",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "add(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Adds an element to the ArrayList.",
      range
    },
    {
      label: "remove",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "remove(${1:index});",
      documentation: "Removes the element at the specified index.",
      range
    },
    {
      label: "get",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "get(${1:index});",
      documentation: "Returns the element at the specified index.",
      range
    },
    {
      label: "set",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "set(${1:index}, ${2:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Replaces the element at the specified index with the specified element.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of elements in the ArrayList.",
      range
    },
    {
      label: "clear",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "clear();",
      documentation: "Removes all elements from the ArrayList.",
      range
    },
    {
      label: "contains",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "contains(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns true if this list contains the specified element.",
      range
    },
    {
      label: "indexOf",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "indexOf(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns the index of the first occurrence of the specified element, or -1 if this list does not contain the element.",
      range
    },
    {
      label: "lastIndexOf",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "lastIndexOf(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns the index of the last occurrence of the specified element, or -1 if this list does not contain the element.",
      range
    },
    {
      label: "isEmpty",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "isEmpty();",
      documentation: "Returns true if this list contains no elements.",
      range
    },
    {
      label: "toArray",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "toArray();",
      documentation: "Returns an array containing all of the elements in this list in proper sequence.",
      range
    }
  ];
}

// src/java/hashMap.ts
function getHashMapSuggestions(monaco, range) {
  return [
    {
      label: "put",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "put(${1:key}, ${2:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Associates the specified value with the specified key in this map.",
      range
    },
    {
      label: "get",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "get(${1:key});",
      documentation: "Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.",
      range
    },
    {
      label: "remove",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "remove(${1:key});",
      documentation: "Removes the mapping for the specified key from this map if present.",
      range
    },
    {
      label: "containsKey",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "containsKey(${1:key});",
      documentation: "Returns true if this map contains a mapping for the specified key.",
      range
    },
    {
      label: "containsValue",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "containsValue(${1:value});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Returns true if this map maps one or more keys to the specified value.",
      range
    },
    {
      label: "keySet",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "keySet();",
      documentation: "Returns a Set view of the keys contained in this map.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of key-value mappings in this map.",
      range
    },
    {
      label: "clear",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "clear();",
      documentation: "Removes all of the mappings from this map. The map will be empty after this call.",
      range
    },
    {
      label: "values",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "values();",
      documentation: "Returns a Collection view of the values contained in this map.",
      range
    },
    {
      label: "entrySet",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "entrySet();",
      documentation: "Returns a Set view of the mappings contained in this map.",
      range
    }
  ];
}

// src/java/list.ts
function getListSuggestions(monaco, range) {
  return [
    {
      label: "add",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "add(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Appends the specified element to the end of this list.",
      range
    },
    {
      label: "get",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "get(${1:index});",
      documentation: "Returns the element at the specified position in this list.",
      range
    },
    {
      label: "remove",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "remove(${1:index});",
      documentation: "Removes the element at the specified position in this list.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of elements in this list.",
      range
    }
  ];
}

// src/java/set.ts
function getSetSuggestions(monaco, range) {
  return [
    {
      label: "add",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "add(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Adds the specified element to this set if it is not already present.",
      range
    },
    {
      label: "contains",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "contains(${1:element});",
      documentation: "Returns true if this set contains the specified element.",
      range
    },
    {
      label: "remove",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "remove(${1:element});",
      documentation: "Removes the specified element from this set if it is present.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of elements in this set.",
      range
    }
  ];
}

// src/java/queue.ts
function getQueueSuggestions2(monaco, range) {
  return [
    {
      label: "offer",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "offer(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts the specified element into this queue.",
      range
    },
    {
      label: "poll",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "poll();",
      documentation: "Retrieves and removes the head of this queue, or returns null if this queue is empty.",
      range
    },
    {
      label: "peek",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "peek();",
      documentation: "Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of elements in this queue.",
      range
    }
  ];
}

// src/java/stack.ts
function getStackSuggestions2(monaco, range) {
  return [
    {
      label: "push",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "push(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Pushes an item onto the top of this stack.",
      range
    },
    {
      label: "pop",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "pop();",
      documentation: "Removes the object at the top of this stack and returns that object as the value of this function.",
      range
    },
    {
      label: "peek",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "peek();",
      documentation: "Looks at the object at the top of this stack without removing it from the stack.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of elements in this stack.",
      range
    }
  ];
}

// src/java/deque.ts
function getDequeSuggestions2(monaco, range) {
  return [
    {
      label: "addFirst",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "addFirst(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts the specified element at the front of this deque.",
      range
    },
    {
      label: "addLast",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "addLast(${1:element});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Inserts the specified element at the end of this deque.",
      range
    },
    {
      label: "removeFirst",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "removeFirst();",
      documentation: "Removes and returns the first element from this deque.",
      range
    },
    {
      label: "removeLast",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "removeLast();",
      documentation: "Removes and returns the last element from this deque.",
      range
    },
    {
      label: "size",
      kind: monaco.languages.CompletionItemKind.Method,
      insertText: "size();",
      documentation: "Returns the number of elements in this deque.",
      range
    }
  ];
}

// src/java/utils.ts
function extractJavaVariables(code, position) {
  const variableRegex = /\b(?:ArrayList|List|Set|Map|Queue|Stack|Deque|LinkedList|HashMap|HashSet|TreeMap|TreeSet|PriorityQueue)\s*<[^>]+>\s+(\w+)\s*=/g;
  const basicTypeRegex = /\b(?:int|float|double|char|boolean|String|byte|short|long)\s+(\w+)\s*;/g;
  const funcParamRegex = /\(([^)]*)\)/g;
  const variables = new Map;
  const lines = code.split("\n").slice(0, position.lineNumber - 1);
  let currentLine = code.split("\n")[position.lineNumber - 1].substring(0, position.column - 1);
  lines.push(currentLine);
  const codeBeforeCursor = lines.join("\n");
  let match;
  while ((match = variableRegex.exec(codeBeforeCursor)) !== null) {
    const varName = match[1];
    variables.set(varName, { type: "ArrayList", kind: "variable" });
  }
  while ((match = basicTypeRegex.exec(codeBeforeCursor)) !== null) {
    const varName = match[1];
    variables.set(varName, { type: "basic", kind: "variable" });
  }
  const funcMatch = funcParamRegex.exec(codeBeforeCursor);
  if (funcMatch) {
    const params = funcMatch[1].split(",");
    params.forEach((param) => {
      const parts = param.trim().split(/\s+/);
      const paramName = parts[parts.length - 1];
      variables.set(paramName, { type: "parameter", kind: "parameter" });
    });
  }
  return variables;
}
function getJavaRange(position, word) {
  return {
    startLineNumber: position.lineNumber,
    endLineNumber: position.lineNumber,
    startColumn: word.startColumn,
    endColumn: word.endColumn
  };
}

// src/java/getGeneralSuggestions.ts
function getGeneralSuggestions2(monaco, range) {
  return [
    {
      label: "System.out.println",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "System.out.println(${1:message});",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Prints a message to the standard output",
      range
    },
    {
      label: "for (int i = 0; i < n; i++)",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "for (int ${1:i} = 0; ${1:i} < ${2:n}; ${1:i}++) {\n\t$0\n}",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Basic for loop",
      range
    },
    {
      label: "while",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "while (${1:condition}) {\n\t$0\n}",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "While loop",
      range
    },
    {
      label: "if",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "if (${1:condition}) {\n\t$0\n}",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "If statement",
      range
    },
    {
      label: "ArrayList",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "ArrayList<${1:type}> ${2:list} = new ArrayList<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates an ArrayList",
      range
    },
    {
      label: "HashMap",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "HashMap<${1:K}, ${2:V}> ${3:map} = new HashMap<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a HashMap",
      range
    },
    {
      label: "HashSet",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "HashSet<${1:type}> ${2:set} = new HashSet<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a HashSet",
      range
    },
    {
      label: "LinkedList",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "LinkedList<${1:type}> ${2:list} = new LinkedList<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a LinkedList",
      range
    },
    {
      label: "Stack",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "Stack<${1:type}> ${2:stack} = new Stack<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a Stack",
      range
    },
    {
      label: "Queue",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "Queue<${1:type}> ${2:queue} = new LinkedList<>(); // \u4F7F\u7528 LinkedList \u5B9E\u73B0\u961F\u5217",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a Queue",
      range
    },
    {
      label: "PriorityQueue",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "PriorityQueue<${1:type}> ${2:pq} = new PriorityQueue<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a PriorityQueue",
      range
    },
    {
      label: "Deque",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "Deque<${1:type}> ${2:deque} = new ArrayDeque<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a Deque",
      range
    },
    {
      label: "Set",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "Set<${1:type}> ${2:set} = new HashSet<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a Set",
      range
    },
    {
      label: "TreeMap",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "TreeMap<${1:K}, ${2:V}> ${3:map} = new TreeMap<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a TreeMap",
      range
    },
    {
      label: "TreeSet",
      kind: monaco.languages.CompletionItemKind.Snippet,
      insertText: "TreeSet<${1:type}> ${2:set} = new TreeSet<>();",
      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
      documentation: "Creates a TreeSet",
      range
    }
  ];
}

// src/java/index.ts
function initJavaCompletion(monaco) {
  monaco.languages.registerCompletionItemProvider("java", {
    provideCompletionItems: (model, position) => {
      const word = model.getWordUntilPosition(position);
      const range = getJavaRange(position, word);
      const code = model.getValue();
      const variables = extractJavaVariables(code, position);
      const variableSuggestions = [];
      variables.forEach(({ type }, name) => {
        variableSuggestions.push({
          label: name,
          kind: monaco.languages.CompletionItemKind.Variable,
          insertText: name,
          documentation: `Variable of type ${type}`,
          range
        });
      });
      const lineContent = model.getLineContent(position.lineNumber);
      const textBeforeCursor = lineContent.substring(0, position.column - 1).trim();
      const lastDotIndex = textBeforeCursor.lastIndexOf(".");
      let methodSuggestions = [];
      let isDotAfterVariable = false;
      if (lastDotIndex !== -1) {
        const varName = textBeforeCursor.substring(0, lastDotIndex).trim();
        if (variables.has(varName)) {
          const varInfo = variables.get(varName);
          isDotAfterVariable = true;
          switch (varInfo?.type) {
            case "ArrayList":
              methodSuggestions = getArrayListSuggestions(monaco, range);
              break;
            case "HashMap":
              methodSuggestions = getHashMapSuggestions(monaco, range);
              break;
            case "List":
              methodSuggestions = getListSuggestions(monaco, range);
              break;
            case "Set":
              methodSuggestions = getSetSuggestions(monaco, range);
              break;
            case "Queue":
              methodSuggestions = getQueueSuggestions2(monaco, range);
              break;
            case "Stack":
              methodSuggestions = getStackSuggestions2(monaco, range);
              break;
            case "Deque":
              methodSuggestions = getDequeSuggestions2(monaco, range);
              break;
            default:
              break;
          }
        }
      }
      if (!isDotAfterVariable) {
        const generalSuggestions = getGeneralSuggestions2(monaco, range);
        return {
          suggestions: [...generalSuggestions, ...variableSuggestions]
        };
      } else {
        return {
          suggestions: [...methodSuggestions]
        };
      }
    }
  });
}

// src/index.ts
function waitForMonaco() {
  return new Promise((resolve) => {
    const interval = setInterval(() => {
      if (window.monaco) {
        clearInterval(interval);
        resolve(window.monaco);
      }
    }, 100);
  });
}
async function init() {
  const monaco = await waitForMonaco();
  monaco.editor.onDidCreateEditor((editor) => {
    setTimeout(() => {
      editor.updateOptions({ suggestOnTriggerCharacters: true });
      editor.updateOptions({ quickSuggestions: { comments: "on", strings: "on", other: "on" } });
    }, 500);
  });
  initCppCompletion(monaco);
  initJavaCompletion(monaco);
}
window.addEventListener("load", init);