Skip to content

Commit fab1c06

Browse files
bors[bot]matklad
andauthored
Merge #8343
8343: internal: document hypothetical completion problem r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 8a18f23 + 1f00191 commit fab1c06

File tree

1 file changed

+28
-0
lines changed
  • crates/ide_completion/src

1 file changed

+28
-0
lines changed

crates/ide_completion/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,34 @@ pub use crate::{
106106
/// `foo` *should* be present among the completion variants. Filtering by
107107
/// identifier prefix/fuzzy match should be done higher in the stack, together
108108
/// with ordering of completions (currently this is done by the client).
109+
///
110+
/// # Hypothetical Completion Problem
111+
///
112+
/// There's a curious unsolved problem in the current implementation. Often, you
113+
/// want to compute completions on a *slightly different* text document.
114+
///
115+
/// In the simplest case, when the code looks like `let x = `, you want to
116+
/// insert a fake identifier to get a better syntax tree: `let x = complete_me`.
117+
///
118+
/// We do this in `CompletionContext`, and it works OK-enough for *syntax*
119+
/// analysis. However, we might want to, eg, ask for the type of `complete_me`
120+
/// variable, and that's where our current infrastructure breaks down. salsa
121+
/// doesn't allow such "phantom" inputs.
122+
///
123+
/// Another case where this would be instrumental is macro expansion. We want to
124+
/// insert a fake ident and re-expand code. There's `expand_hypothetical` as a
125+
/// work-around for this.
126+
///
127+
/// A different use-case is completion of injection (examples and links in doc
128+
/// comments). When computing completion for a path in a doc-comment, you want
129+
/// to inject a fake path expression into the item being documented and complete
130+
/// that.
131+
///
132+
/// IntelliJ has CodeFragment/Context infrastructure for that. You can create a
133+
/// temporary PSI node, and say that the context ("parent") of this node is some
134+
/// existing node. Asking for, eg, type of this `CodeFragment` node works
135+
/// correctly, as the underlying infrastructure makes use of contexts to do
136+
/// analysis.
109137
pub fn completions(
110138
db: &RootDatabase,
111139
config: &CompletionConfig,

0 commit comments

Comments
 (0)