CodeEditApp / CodeEditApp/CodeEditSourceEditor
Inline completion (ghost text) coordination layer
- Dominant language
- Swift
- Stars
- 719
- Forks
- 160
- PR merge metrics
- No merged PRs in 30d
Description
### Description
Add an inline completion (ghost text) coordination layer to `CodeEditSourceEditor`, built on the inline suggestion rendering primitive in `CodeEditTextView`. This gives the editor a provider-agnostic way to request, show, accept, cycle, and dismiss inline AI suggestions (the GitHub Copilot UI pattern).
Proposed API:
- `InlineCompletionDelegate`: a `@MainActor` protocol a host conforms to. `inlineCompletionsRequested(textView:cursorPosition:) async -> [InlineCompletionItem]` returns suggestions; optional `inlineCompletionDidShow/Accept/Dismiss` hooks report lifecycle.
- `InlineCompletionItem`: the suggestion model (insert text plus the range it applies to).
- `TextViewController` methods: `requestInlineSuggestion()` (debounced), `setInlineSuggestions(_:selectedIndex:)`, `acceptInlineSuggestion()`, `dismissInlineSuggestion()`, `selectNext/PreviousInlineSuggestion()`.
- Behavior: requests are debounced and skipped while the completion popup is visible (ghost text and popup never co-exist); Tab accepts when a suggestion is active; moving the cursor or editing dismisses the ghost text.
### Alternatives Considered
- Putting this logic in the app target (`CodeEdit`) directly. Rejected because the request/accept/dismiss lifecycle is tightly coupled to the editor's cursor, selection, and key handling, which live here. Keeping it in `CodeEditSourceEditor` lets any host provide completions through a small delegate, rather than each host re-implementing the lifecycle.
- Mutating the document to preview suggestions. Rejected; the underlying `CodeEditTextView` primitive renders ghost text as an overlay without touching text storage, so previews never pollute undo or layout.
### Additional Context
This is the middle layer of a planned native inline-completion feature for the CodeEdit stack: `CodeEditTextView` provides the rendering primitive (CodeEditApp/CodeEditTextView#124), `CodeEditSourceEditor` (this issue) coordinates the lifecycle, and `CodeEdit` wires up a concrete provider such as GitHub Copilot.
I have a working, documented implementation with unit tests covering request/show, accept, dismiss, cycling, Tab-accept gating, and ghost-text clearing on cursor move and edit. It builds and tests pass via `xcodebuild ... clean test` (against the `CodeEditTextView` change above), and SwiftLint is clean. Would the maintainers welcome this in `CodeEditSourceEditor`?
### Screenshots
The user-visible ghost text is shown by the app-level integration in `CodeEdit`; this layer is the coordination API and is covered by unit tests.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.