-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Reorganize files, split requestCompletion into its own file
- Loading branch information
Showing
5 changed files
with
89 additions
and
85 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
import { completionStatus } from "@codemirror/autocomplete"; | ||
import { ChangeSet, Transaction } from "@codemirror/state"; | ||
import type { EditorView } from "@codemirror/view"; | ||
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: EditorView, lastPos?: number) { | ||
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 500ms for some reason is necessary here. | ||
// TODO - FIGURE OUT WHY THIS RESOLVES THE BUG | ||
|
||
await new Promise((resolve) => setTimeout(resolve, 300)); | ||
} | ||
} |