@@ -106,6 +106,34 @@ pub use crate::{
106
106
/// `foo` *should* be present among the completion variants. Filtering by
107
107
/// identifier prefix/fuzzy match should be done higher in the stack, together
108
108
/// 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.
109
137
pub fn completions (
110
138
db : & RootDatabase ,
111
139
config : & CompletionConfig ,
0 commit comments