Hey everyone,
I’ve created a code-editor using codemirror in react js. i want to provide dynamic autocompletion in the editor using tern js.
here is the code would look in vanilla js.
import { EditorView, basicSetup } from "codemirror";
import { EditorState } from "@codemirror/state";
import { javascript } from "@codemirror/lang-javascript";
import { autocompletion } from "@codemirror/autocomplete";
const state = EditorState.create({
doc: "function main(){\n return true;\n}\n",
extensions: [basicSetup, javascript(), autocompletion()],
});
const editorView = new EditorView({
state,
parent: document.querySelector("#editor"),
});
here is the code of how I’ve created the tern server. you can try it to find how it is providing completions.
import * as tern from "tern";
import "tern/plugin/doc_comment";
import "tern/plugin/complete_strings";
import ecma from "tern/defs/ecmascript.json";
export default function getAutocompletion(code) {
const query = {
type: "completions",
file: "temp.js",
end: code.length,
lineCharPositions: true,
types: true,
};
const defs = [ecma];
const ternServer = new tern.Server({
getFile(filename, callback) {
callback(null, code);
},
async: false,
defs,
});
let ast = code;
const completionList = [];
ternServer.request(
{
query,
files: [
{
type: "full",
name: "temp.js",
text: code,
scope: "document",
},
],
doc: ast,
},
(error, res) => {
if (error) {
console.error("Tern.js error:", error);
return;
}
if (res?.completions) {
completionList.push(
...res?.completions.map((item) => ({
label: item.name,
detail: item.type,
apply: () => item.name,
}))
);
}
}
);
return completionList;
}
console.log(getAutocompletion("let obj = {\n foo: true\n}\nobj."));
can somebody help me use this getAutocompletion function to get completions in the editor ? I’ve tried various ways like override in autocompletion extension, completionList, using EditorView.updateListener.of() and few more… but none of them showed me completions in the editor.