@valtown/codemirror-codeium
Version:
codemirror integration for codeium
69 lines • 2.8 kB
JavaScript
import { completionStatus } from "@codemirror/autocomplete";
import { ChangeSet, Transaction } from "@codemirror/state";
import { completionsToChangeSpec, getCodeiumCompletions } from "./codeium.js";
import { addSuggestions } from "./effects.js";
import { copilotEvent, copilotIgnore } from "./annotations.js";
import { codeiumConfig, codeiumOtherDocumentsConfig } from "./config.js";
/**
* Inner 'requestCompletion' API, which can optionally
* be run all the time if you set `alwaysOn`
*/
export async function requestCompletion(view, lastPos) {
const config = view.state.facet(codeiumConfig);
const { override } = view.state.facet(codeiumOtherDocumentsConfig);
const otherDocuments = await override();
// Get the current position and source
const state = view.state;
const pos = state.selection.main.head;
const source = state.doc.toString();
// Request completion from the server
try {
const completionResult = await getCodeiumCompletions({
text: source,
cursorOffset: pos,
config,
otherDocuments,
});
if (!completionResult || completionResult.completionItems.length === 0) {
return;
}
// Check if the position is still the same. If
// it has changed, ignore the code that we just
// got from the API and don't show anything.
if (!((lastPos === undefined || pos === lastPos) &&
completionStatus(view.state) !== "active" &&
view.hasFocus)) {
return;
}
// Dispatch an effect to add the suggestion
// If the completion starts before the end of the line,
// check the end of the line with the end of the completion
const changeSpecs = completionsToChangeSpec(completionResult);
const index = 0;
const firstSpec = changeSpecs.at(index);
if (!firstSpec)
return;
const insertChangeSet = ChangeSet.of(firstSpec, state.doc.length);
const reverseChangeSet = insertChangeSet.invert(state.doc);
view.dispatch({
changes: insertChangeSet,
effects: addSuggestions.of({
index,
reverseChangeSet,
changeSpecs,
}),
annotations: [
copilotIgnore.of(null),
copilotEvent.of(null),
Transaction.addToHistory.of(false),
],
});
}
catch (error) {
console.warn("copilot completion failed", error);
// Javascript wait for 300ms for some reason is necessary here.
// TODO - FIGURE OUT WHY THIS RESOLVES THE BUG
await new Promise((resolve) => setTimeout(resolve, 300));
}
}
//# sourceMappingURL=requestCompletion.js.map