fn keyword(ctx: &CompletionContext, kw: &str, snippet: &str) -> CompletionItem {
CompletionItem::new(CompletionKind::Keyword, ctx.source_range(), kw)
.kind(CompletionItemKind::Keyword)
- .snippet(snippet)
+ .insert_snippet(snippet)
.build()
}
use ra_text_edit::TextEditBuilder;
fn postfix_snippet(ctx: &CompletionContext, label: &str, detail: &str, snippet: &str) -> Builder {
- let replace_range = ctx.source_range();
- let receiver_range = ctx.dot_receiver.expect("no receiver available").syntax().range();
- let delete_range = TextRange::from_to(receiver_range.start(), replace_range.start());
- let mut builder = TextEditBuilder::default();
- builder.delete(delete_range);
- CompletionItem::new(CompletionKind::Postfix, replace_range, label)
- .snippet(snippet)
+ let edit = {
+ let receiver_range = ctx.dot_receiver.expect("no receiver available").syntax().range();
+ let delete_range = TextRange::from_to(receiver_range.start(), ctx.source_range().end());
+ let mut builder = TextEditBuilder::default();
+ builder.replace(delete_range, snippet.to_string());
+ builder.finish()
+ };
+ CompletionItem::new(CompletionKind::Postfix, ctx.source_range(), label)
.detail(detail)
- .text_edit(builder.finish())
+ .snippet_edit(edit)
}
pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
fn snippet(ctx: &CompletionContext, label: &str, snippet: &str) -> Builder {
CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), label)
- .snippet(snippet)
+ .insert_snippet(snippet)
.kind(CompletionItemKind::Snippet)
}
use hir::{Docs, Documentation, PerNs, Resolution};
use ra_syntax::TextRange;
-use ra_text_edit::TextEdit;
+use ra_text_edit::{ TextEditBuilder, TextEdit};
use test_utils::tested_by;
use crate::completion::{
/// `CompletionItem`, use `new` method and the `Builder` struct.
pub struct CompletionItem {
/// Used only internally in tests, to check only specific kind of
- /// completion.
+ /// completion (postfix, keyword, reference, etc).
#[allow(unused)]
completion_kind: CompletionKind,
+ /// Label in the completion pop up which identifies completion.
label: String,
+ /// Range of identifier that is being completed.
+ ///
+ /// It should be used primarily for UI, but we also use this to convert
+ /// genetic TextEdit into LSP's completion edit (see conv.rs).
+ ///
+ /// `source_range` must contain the completion offset. `insert_text` should
+ /// start with what `source_range` points to, or VSCode will filter out the
+ /// completion silently.
+ source_range: TextRange,
+ /// What happens when user selects this item.
+ ///
+ /// Typically, replaces `source_range` with new identifier.
+ text_edit: TextEdit,
+ insert_text_format: InsertTextFormat,
+
+ /// What item (struct, function, etc) are we completing.
kind: Option<CompletionItemKind>,
+
+ /// Lookup is used to check if completion item indeed can complete current
+ /// ident.
+ ///
+ /// That is, in `foo.bar<|>` lookup of `abracadabra` will be accepted (it
+ /// contains `bar` sub sequence), and `quux` will rejected.
lookup: Option<String>,
+
+ /// Additional info to show in the UI pop up.
detail: Option<String>,
documentation: Option<Documentation>,
- insert_text: Option<String>,
- insert_text_format: InsertTextFormat,
- /// Where completion occurs. `source_range` must contain the completion offset.
- /// `insert_text` should start with what `source_range` points to, or VSCode
- /// will filter out the completion silently.
- source_range: TextRange,
- /// Additional text edit, ranges in `text_edit` must never intersect with `source_range`.
- /// Or VSCode will drop it silently.
- text_edit: Option<TextEdit>,
}
+// We use custom debug for CompletionItem to make `insta`'s diffs more readable.
impl fmt::Debug for CompletionItem {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut s = f.debug_struct("CompletionItem");
s.field("label", &self.label()).field("source_range", &self.source_range());
+ if self.text_edit().as_atoms().len() == 1 {
+ let atom = &self.text_edit().as_atoms()[0];
+ s.field("delete", &atom.delete);
+ s.field("insert", &atom.insert);
+ } else {
+ s.field("text_edit", &self.text_edit);
+ }
if let Some(kind) = self.kind().as_ref() {
s.field("kind", kind);
}
if let Some(documentation) = self.documentation() {
s.field("documentation", &documentation);
}
- if self.insert_text() != self.label() {
- s.field("insert_text", &self.insert_text())
- .field("insert_text_format", &self.insert_text_format());
- }
- if let Some(edit) = self.text_edit.as_ref() {
- s.field("text_edit", edit);
- }
s.finish()
}
}
impl CompletionItem {
pub(crate) fn new(
completion_kind: CompletionKind,
- replace_range: TextRange,
+ source_range: TextRange,
label: impl Into<String>,
) -> Builder {
let label = label.into();
Builder {
- source_range: replace_range,
+ source_range,
completion_kind,
label,
insert_text: None,
pub fn label(&self) -> &str {
&self.label
}
+ pub fn source_range(&self) -> TextRange {
+ self.source_range
+ }
+
+ pub fn insert_text_format(&self) -> InsertTextFormat {
+ self.insert_text_format
+ }
+
+ pub fn text_edit(&self) -> &TextEdit {
+ &self.text_edit
+ }
+
/// Short one-line additional information, like a type
pub fn detail(&self) -> Option<&str> {
self.detail.as_ref().map(|it| it.as_str())
self.lookup.as_ref().map(|it| it.as_str()).unwrap_or_else(|| self.label())
}
- pub fn insert_text_format(&self) -> InsertTextFormat {
- self.insert_text_format
- }
- pub fn insert_text(&self) -> String {
- match &self.insert_text {
- Some(t) => t.clone(),
- None => self.label.clone(),
- }
- }
pub fn kind(&self) -> Option<CompletionItemKind> {
self.kind
}
- pub fn take_text_edit(&mut self) -> Option<TextEdit> {
- self.text_edit.take()
- }
- pub fn source_range(&self) -> TextRange {
- self.source_range
- }
}
/// A helper to make `CompletionItem`s.
}
pub(crate) fn build(self) -> CompletionItem {
+ let label = self.label;
+ let text_edit = match self.text_edit {
+ Some(it) => it,
+ None => {
+ let mut builder = TextEditBuilder::default();
+ builder
+ .replace(self.source_range, self.insert_text.unwrap_or_else(|| label.clone()));
+ builder.finish()
+ }
+ };
+
CompletionItem {
source_range: self.source_range,
- label: self.label,
+ label,
+ insert_text_format: self.insert_text_format,
+ text_edit,
detail: self.detail,
documentation: self.documentation,
- insert_text_format: self.insert_text_format,
lookup: self.lookup,
kind: self.kind,
completion_kind: self.completion_kind,
- text_edit: self.text_edit,
- insert_text: self.insert_text,
}
}
pub(crate) fn lookup_by(mut self, lookup: impl Into<String>) -> Builder {
self.insert_text = Some(insert_text.into());
self
}
- #[allow(unused)]
- pub(crate) fn insert_text_format(mut self, insert_text_format: InsertTextFormat) -> Builder {
- self.insert_text_format = insert_text_format;
- self
- }
- pub(crate) fn snippet(mut self, snippet: impl Into<String>) -> Builder {
+ pub(crate) fn insert_snippet(mut self, snippet: impl Into<String>) -> Builder {
self.insert_text_format = InsertTextFormat::Snippet;
self.insert_text(snippet)
}
self.kind = Some(kind);
self
}
- #[allow(unused)]
pub(crate) fn text_edit(mut self, edit: TextEdit) -> Builder {
self.text_edit = Some(edit);
self
}
+ pub(crate) fn snippet_edit(mut self, edit: TextEdit) -> Builder {
+ self.insert_text_format = InsertTextFormat::Snippet;
+ self.text_edit(edit)
+ }
#[allow(unused)]
pub(crate) fn detail(self, detail: impl Into<String>) -> Builder {
self.set_detail(Some(detail))
---
-created: "2019-02-18T07:29:59.736783986Z"
+created: "2019-02-18T09:22:24.132341107Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "quux",
source_range: [83; 83),
+ delete: [83; 83),
+ insert: "quux()$0",
kind: Function,
- detail: "fn quux()",
- insert_text: "quux()$0",
- insert_text_format: Snippet
+ detail: "fn quux()"
},
CompletionItem {
label: "x",
source_range: [83; 83),
+ delete: [83; 83),
+ insert: "x",
kind: Binding
}
]
---
-created: "2019-02-18T07:29:59.739513594Z"
+created: "2019-02-18T09:22:24.126809445Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "a",
source_range: [214; 214),
+ delete: [214; 214),
+ insert: "a",
kind: Binding
},
CompletionItem {
label: "b",
source_range: [214; 214),
+ delete: [214; 214),
+ insert: "b",
kind: Binding
},
CompletionItem {
label: "quux",
source_range: [214; 214),
+ delete: [214; 214),
+ insert: "quux()$0",
kind: Function,
- detail: "fn quux()",
- insert_text: "quux()$0",
- insert_text_format: Snippet
+ detail: "fn quux()"
}
]
---
-created: "2019-02-18T07:29:59.739513592Z"
+created: "2019-02-18T09:22:24.126696322Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "quux",
source_range: [79; 79),
+ delete: [79; 79),
+ insert: "quux($0)",
kind: Function,
- detail: "fn quux(x: i32)",
- insert_text: "quux($0)",
- insert_text_format: Snippet
+ detail: "fn quux(x: i32)"
},
CompletionItem {
label: "x",
source_range: [79; 79),
+ delete: [79; 79),
+ insert: "x",
kind: Binding
},
CompletionItem {
label: "y",
source_range: [79; 79),
+ delete: [79; 79),
+ insert: "y",
kind: Binding
}
]
---
-created: "2019-02-18T07:29:59.630948152Z"
+created: "2019-02-18T09:22:23.976673150Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "break",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "break;",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "break;",
+ kind: Keyword
},
CompletionItem {
label: "continue",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "continue;",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "continue;",
+ kind: Keyword
},
CompletionItem {
label: "if",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "return $0;",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "return $0;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [55; 55),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [55; 55),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.662074625Z"
+created: "2019-02-18T09:22:24.068967569Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [60; 60),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [60; 60),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [60; 60),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [60; 60),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [60; 60),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [60; 60),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [60; 60),
- kind: Keyword,
- insert_text: "return $0;",
- insert_text_format: Snippet
+ delete: [60; 60),
+ insert: "return $0;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [60; 60),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [60; 60),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.774580359Z"
+created: "2019-02-18T09:22:24.180517434Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Option",
source_range: [18; 18),
+ delete: [18; 18),
+ insert: "Option",
kind: Struct
},
CompletionItem {
label: "foo",
source_range: [18; 18),
+ delete: [18; 18),
+ insert: "foo()$0",
kind: Function,
- detail: "fn foo()",
- insert_text: "foo()$0",
- insert_text_format: Snippet
+ detail: "fn foo()"
},
CompletionItem {
label: "std",
source_range: [18; 18),
+ delete: [18; 18),
+ insert: "std",
kind: Module
}
]
---
-created: "2019-02-18T07:29:59.729954589Z"
+created: "2019-02-18T09:22:24.118807216Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "bar",
source_range: [9; 9),
+ delete: [9; 9),
+ insert: "bar",
kind: Module
}
]
---
-created: "2019-02-18T07:29:59.663233766Z"
+created: "2019-02-18T09:22:24.044567777Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Spam",
source_range: [23; 25),
+ delete: [23; 25),
+ insert: "Spam",
kind: Struct
}
]
---
-created: "2019-02-18T07:29:59.637726929Z"
+created: "2019-02-18T09:22:23.987788705Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [85; 85),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [85; 85),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [85; 85),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [85; 85),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [85; 85),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [85; 85),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [85; 85),
- kind: Keyword,
- insert_text: "return $0",
- insert_text_format: Snippet
+ delete: [85; 85),
+ insert: "return $0",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [85; 85),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [85; 85),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.812347626Z"
+created: "2019-02-18T09:22:24.211680376Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "frobnicate",
source_range: [35; 39),
+ delete: [35; 39),
+ insert: "frobnicate",
kind: Function,
detail: "fn frobnicate()"
},
CompletionItem {
label: "main",
source_range: [35; 39),
+ delete: [35; 39),
+ insert: "main",
kind: Function,
detail: "fn main()"
}
---
-created: "2019-02-18T07:29:59.843178841Z"
+created: "2019-02-18T09:22:24.268227065Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "new",
source_range: [67; 69),
+ delete: [67; 69),
+ insert: "new",
kind: Method,
detail: "fn new() -> Foo"
}
---
-created: "2019-02-18T07:29:59.808400485Z"
+created: "2019-02-18T09:22:24.213677341Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "foo",
source_range: [40; 41),
+ delete: [40; 41),
+ insert: "foo",
kind: Function,
detail: "pub fn foo()"
}
---
-created: "2019-02-18T07:29:59.810202671Z"
+created: "2019-02-18T09:22:24.188564584Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "bar",
source_range: [129; 129),
+ delete: [129; 129),
+ insert: "bar",
kind: Binding
},
CompletionItem {
label: "foo",
source_range: [129; 129),
+ delete: [129; 129),
+ insert: "foo()$0",
kind: Function,
- detail: "fn foo() ->",
- insert_text: "foo()$0",
- insert_text_format: Snippet
+ detail: "fn foo() ->"
}
]
---
-created: "2019-02-18T07:29:59.672144115Z"
+created: "2019-02-18T09:22:24.045355450Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Bar",
source_range: [116; 116),
+ delete: [116; 116),
+ insert: "Bar",
kind: EnumVariant,
detail: "(i32)",
documentation: Documentation(
CompletionItem {
label: "Foo",
source_range: [116; 116),
+ delete: [116; 116),
+ insert: "Foo",
kind: EnumVariant,
detail: "()",
documentation: Documentation(
---
-created: "2019-02-18T07:29:59.686329490Z"
+created: "2019-02-18T09:22:24.062138085Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Bar",
source_range: [180; 180),
+ delete: [180; 180),
+ insert: "Bar",
kind: EnumVariant,
detail: "(i32, u32)",
documentation: Documentation(
CompletionItem {
label: "Foo",
source_range: [180; 180),
+ delete: [180; 180),
+ insert: "Foo",
kind: EnumVariant,
detail: "()",
documentation: Documentation(
CompletionItem {
label: "S",
source_range: [180; 180),
+ delete: [180; 180),
+ insert: "S",
kind: EnumVariant,
detail: "(S)"
}
---
-created: "2019-02-18T07:29:59.763042807Z"
+created: "2019-02-18T09:22:24.137183638Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "other_crate",
source_range: [4; 4),
+ delete: [4; 4),
+ insert: "other_crate",
kind: Module
}
]
---
-created: "2019-02-18T07:29:59.765665697Z"
+created: "2019-02-18T09:22:24.143253235Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "T",
source_range: [44; 44),
+ delete: [44; 44),
+ insert: "T",
kind: TypeParam
},
CompletionItem {
label: "quux",
source_range: [44; 44),
+ delete: [44; 44),
+ insert: "quux()$0",
kind: Function,
- detail: "fn quux<T>()",
- insert_text: "quux()$0",
- insert_text_format: Snippet
+ detail: "fn quux<T>()"
}
]
---
-created: "2019-02-18T07:29:59.768275744Z"
+created: "2019-02-18T09:22:24.149424158Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "T",
source_range: [46; 46),
+ delete: [46; 46),
+ insert: "T",
kind: TypeParam
},
CompletionItem {
label: "X",
source_range: [46; 46),
+ delete: [46; 46),
+ insert: "X",
kind: Struct
}
]
---
-created: "2019-02-18T07:29:59.808403924Z"
+created: "2019-02-18T09:22:24.224510370Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "main",
source_range: [53; 56),
+ delete: [53; 56),
+ insert: "main()$0",
kind: Function,
- detail: "fn main()",
- insert_text: "main()$0",
- insert_text_format: Snippet
+ detail: "fn main()"
},
CompletionItem {
label: "no_args",
source_range: [53; 56),
+ delete: [53; 56),
+ insert: "no_args()$0",
kind: Function,
- detail: "fn no_args()",
- insert_text: "no_args()$0",
- insert_text_format: Snippet
+ detail: "fn no_args()"
}
]
---
-created: "2019-02-18T07:29:59.843178843Z"
+created: "2019-02-18T09:22:24.267013140Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "main",
source_range: [72; 77),
+ delete: [72; 77),
+ insert: "main()$0",
kind: Function,
- detail: "fn main()",
- insert_text: "main()$0",
- insert_text_format: Snippet
+ detail: "fn main()"
},
CompletionItem {
label: "with_args",
source_range: [72; 77),
+ delete: [72; 77),
+ insert: "with_args($0)",
kind: Function,
- detail: "fn with_args(x: i32, y: String)",
- insert_text: "with_args($0)",
- insert_text_format: Snippet
+ detail: "fn with_args(x: i32, y: String)"
}
]
---
-created: "2019-02-18T07:29:59.877573951Z"
+created: "2019-02-18T09:22:24.303360770Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "foo",
source_range: [139; 140),
+ delete: [139; 140),
+ insert: "foo()$0",
kind: Method,
- detail: "fn foo(&self)",
- insert_text: "foo()$0",
- insert_text_format: Snippet
+ detail: "fn foo(&self)"
}
]
---
-created: "2019-02-18T07:29:59.639066512Z"
+created: "2019-02-18T09:22:23.987788720Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "return;",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "return;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.630760038Z"
+created: "2019-02-18T09:22:23.984740354Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "else",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "else {$0}",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "else {$0}",
+ kind: Keyword
},
CompletionItem {
label: "else if",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "else if $0 {}",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "else if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "if",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "return;",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "return;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [92; 92),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [92; 92),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.659527166Z"
+created: "2019-02-18T09:22:24.049699338Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [48; 48),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [48; 48),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [48; 48),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [48; 48),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [48; 48),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [48; 48),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [48; 48),
- kind: Keyword,
- insert_text: "return $0;",
- insert_text_format: Snippet
+ delete: [48; 48),
+ insert: "return $0;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [48; 48),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [48; 48),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.696757543Z"
+created: "2019-02-18T09:22:24.090949782Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "return;",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "return;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [41; 41),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [41; 41),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.633925638Z"
+created: "2019-02-18T09:22:23.988755424Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "crate",
source_range: [17; 17),
- kind: Keyword,
- insert_text: "crate::",
- insert_text_format: PlainText
+ delete: [17; 17),
+ insert: "crate::",
+ kind: Keyword
},
CompletionItem {
label: "self",
source_range: [17; 17),
+ delete: [17; 17),
+ insert: "self",
kind: Keyword
},
CompletionItem {
label: "super",
source_range: [17; 17),
- kind: Keyword,
- insert_text: "super::",
- insert_text_format: PlainText
+ delete: [17; 17),
+ insert: "super::",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.658885169Z"
+created: "2019-02-18T09:22:24.030382527Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "self",
source_range: [20; 20),
+ delete: [20; 20),
+ insert: "self",
kind: Keyword
},
CompletionItem {
label: "super",
source_range: [20; 20),
- kind: Keyword,
- insert_text: "super::",
- insert_text_format: PlainText
+ delete: [20; 20),
+ insert: "super::",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.688856977Z"
+created: "2019-02-18T09:22:24.073607133Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "self",
source_range: [24; 24),
+ delete: [24; 24),
+ insert: "self",
kind: Keyword
},
CompletionItem {
label: "super",
source_range: [24; 24),
- kind: Keyword,
- insert_text: "super::",
- insert_text_format: PlainText
+ delete: [24; 24),
+ insert: "super::",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.638715790Z"
+created: "2019-02-18T09:22:23.989188654Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "return $0;",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "return $0;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.661936290Z"
+created: "2019-02-18T09:22:24.036383875Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "if",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "return $0;",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "return $0;",
+ kind: Keyword
},
CompletionItem {
label: "while",
source_range: [83; 83),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [83; 83),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.598946710Z"
+created: "2019-02-18T09:22:23.941335305Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "the_method",
source_range: [249; 249),
+ delete: [249; 249),
+ insert: "the_method()$0",
kind: Method,
- detail: "fn the_method(&self)",
- insert_text: "the_method()$0",
- insert_text_format: Snippet
+ detail: "fn the_method(&self)"
}
]
---
-created: "2019-02-18T07:29:59.598948318Z"
+created: "2019-02-18T09:22:23.939676100Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "the_method",
source_range: [144; 144),
+ delete: [144; 144),
+ insert: "the_method()$0",
kind: Method,
- detail: "fn the_method(&self)",
- insert_text: "the_method()$0",
- insert_text_format: Snippet
+ detail: "fn the_method(&self)"
}
]
---
-created: "2019-02-18T07:29:59.682030298Z"
+created: "2019-02-18T09:22:24.066918191Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "my",
source_range: [23; 25),
+ delete: [23; 25),
+ insert: "my",
kind: Module,
documentation: Documentation(
"Some simple\ndocs describing `mod my`."
---
-created: "2019-02-18T07:29:59.770568686Z"
+created: "2019-02-18T09:22:24.161888678Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Baz",
source_range: [89; 89),
+ delete: [89; 89),
+ insert: "Baz",
kind: Enum
},
CompletionItem {
label: "Foo",
source_range: [89; 89),
+ delete: [89; 89),
+ insert: "Foo",
kind: Struct
},
CompletionItem {
label: "quux",
source_range: [89; 89),
+ delete: [89; 89),
+ insert: "quux()$0",
kind: Function,
- detail: "fn quux()",
- insert_text: "quux()$0",
- insert_text_format: Snippet
+ detail: "fn quux()"
}
]
---
-created: "2019-02-18T07:29:59.770992040Z"
+created: "2019-02-18T09:22:24.180517419Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Bar",
source_range: [101; 101),
+ delete: [101; 101),
+ insert: "Bar",
kind: Struct
},
CompletionItem {
label: "quux",
source_range: [101; 101),
+ delete: [101; 101),
+ insert: "quux()$0",
kind: Function,
- detail: "fn quux()",
- insert_text: "quux()$0",
- insert_text_format: Snippet
+ detail: "fn quux()"
}
]
---
-created: "2019-02-18T07:29:59.689653720Z"
+created: "2019-02-18T09:22:24.085605313Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Spam",
source_range: [12; 14),
+ delete: [12; 14),
+ insert: "Spam",
kind: Struct
},
CompletionItem {
label: "foo",
source_range: [12; 14),
+ delete: [12; 14),
+ insert: "foo",
kind: Module
}
]
---
-created: "2019-02-18T07:29:59.641375216Z"
+created: "2019-02-18T09:22:23.999953358Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "break",
source_range: [106; 108),
+ delete: [106; 108),
+ insert: "break",
kind: Keyword
},
CompletionItem {
label: "continue",
source_range: [106; 108),
+ delete: [106; 108),
+ insert: "continue",
kind: Keyword
},
CompletionItem {
label: "if",
source_range: [106; 108),
- kind: Keyword,
- insert_text: "if $0 {}",
- insert_text_format: Snippet
+ delete: [106; 108),
+ insert: "if $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "loop",
source_range: [106; 108),
- kind: Keyword,
- insert_text: "loop {$0}",
- insert_text_format: Snippet
+ delete: [106; 108),
+ insert: "loop {$0}",
+ kind: Keyword
},
CompletionItem {
label: "match",
source_range: [106; 108),
- kind: Keyword,
- insert_text: "match $0 {}",
- insert_text_format: Snippet
+ delete: [106; 108),
+ insert: "match $0 {}",
+ kind: Keyword
},
CompletionItem {
label: "return",
source_range: [106; 108),
+ delete: [106; 108),
+ insert: "return",
kind: Keyword
},
CompletionItem {
label: "while",
source_range: [106; 108),
- kind: Keyword,
- insert_text: "while $0 {}",
- insert_text_format: Snippet
+ delete: [106; 108),
+ insert: "while $0 {}",
+ kind: Keyword
}
]
---
-created: "2019-02-18T07:29:59.606265507Z"
+created: "2019-02-18T09:22:23.949634602Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "file_id: FileId",
source_range: [98; 102),
+ delete: [98; 102),
+ insert: "file_id: FileId",
lookup: "file_id"
}
]
---
-created: "2019-02-18T07:29:59.606265538Z"
+created: "2019-02-18T09:22:23.949634355Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "file_id: FileId",
source_range: [98; 102),
+ delete: [98; 102),
+ insert: "file_id: FileId",
lookup: "file_id"
}
]
---
-created: "2019-02-18T07:29:59.628419014Z"
+created: "2019-02-18T09:22:23.974417169Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "file_id: FileId",
source_range: [269; 273),
+ delete: [269; 273),
+ insert: "file_id: FileId",
lookup: "file_id"
}
]
---
-created: "2019-02-18T07:29:59.734401559Z"
+created: "2019-02-18T09:22:24.127119709Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "dbg",
source_range: [76; 76),
- detail: "dbg!(expr)",
- insert_text: "dbg!(bar)",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "dbg!(bar)",
+ detail: "dbg!(expr)"
},
CompletionItem {
label: "if",
source_range: [76; 76),
- detail: "if expr {}",
- insert_text: "if bar {$0}",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "if bar {$0}",
+ detail: "if expr {}"
},
CompletionItem {
label: "match",
source_range: [76; 76),
- detail: "match expr {}",
- insert_text: "match bar {\n${1:_} => {$0\\},\n}",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "match bar {\n${1:_} => {$0\\},\n}",
+ detail: "match expr {}"
},
CompletionItem {
label: "not",
source_range: [76; 76),
- detail: "!expr",
- insert_text: "!bar",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "!bar",
+ detail: "!expr"
},
CompletionItem {
label: "ref",
source_range: [76; 76),
- detail: "&expr",
- insert_text: "&bar",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "&bar",
+ detail: "&expr"
},
CompletionItem {
label: "refm",
source_range: [76; 76),
- detail: "&mut expr",
- insert_text: "&mut bar",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "&mut bar",
+ detail: "&mut expr"
},
CompletionItem {
label: "while",
source_range: [76; 76),
- detail: "while expr {}",
- insert_text: "while bar {\n$0\n}",
- insert_text_format: Snippet,
- text_edit: TextEdit {
- atoms: [
- AtomTextEdit {
- delete: [72; 76),
- insert: ""
- }
- ]
- }
+ delete: [72; 76),
+ insert: "while bar {\n$0\n}",
+ detail: "while expr {}"
}
]
---
-created: "2019-02-18T07:29:59.780512486Z"
+created: "2019-02-18T09:22:24.182964414Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Foo",
source_range: [47; 47),
+ delete: [47; 47),
+ insert: "Foo",
kind: Struct
},
CompletionItem {
label: "x",
source_range: [47; 47),
+ delete: [47; 47),
+ insert: "x()$0",
kind: Function,
- detail: "fn x() ->",
- insert_text: "x()$0",
- insert_text_format: Snippet
+ detail: "fn x() ->"
}
]
---
-created: "2019-02-18T07:29:59.774705610Z"
+created: "2019-02-18T09:22:24.174038680Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Self",
source_range: [25; 25),
+ delete: [25; 25),
+ insert: "Self",
kind: TypeParam
},
CompletionItem {
label: "self",
source_range: [25; 25),
+ delete: [25; 25),
+ insert: "self",
kind: Binding
}
]
---
-created: "2019-02-18T07:29:59.799497268Z"
+created: "2019-02-18T09:22:24.191576723Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "pd",
source_range: [17; 17),
- kind: Snippet,
- insert_text: "eprintln!(\"$0 = {:?}\", $0);",
- insert_text_format: Snippet
+ delete: [17; 17),
+ insert: "eprintln!(\"$0 = {:?}\", $0);",
+ kind: Snippet
},
CompletionItem {
label: "ppd",
source_range: [17; 17),
- kind: Snippet,
- insert_text: "eprintln!(\"$0 = {:#?}\", $0);",
- insert_text_format: Snippet
+ delete: [17; 17),
+ insert: "eprintln!(\"$0 = {:#?}\", $0);",
+ kind: Snippet
}
]
---
-created: "2019-02-18T07:29:59.800831987Z"
+created: "2019-02-18T09:22:24.187670733Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Test function",
source_range: [66; 66),
+ delete: [66; 66),
+ insert: "#[test]\nfn ${1:feature}() {\n $0\n}",
kind: Snippet,
- lookup: "tfn",
- insert_text: "#[test]\nfn ${1:feature}() {\n $0\n}",
- insert_text_format: Snippet
+ lookup: "tfn"
},
CompletionItem {
label: "pub(crate)",
source_range: [66; 66),
- kind: Snippet,
- insert_text: "pub(crate) $0",
- insert_text_format: Snippet
+ delete: [66; 66),
+ insert: "pub(crate) $0",
+ kind: Snippet
}
]
---
-created: "2019-02-18T07:29:59.704544613Z"
+created: "2019-02-18T09:22:24.093406123Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "C",
source_range: [107; 107),
+ delete: [107; 107),
+ insert: "C",
kind: Const,
detail: "const C: i32 = 42;",
documentation: Documentation(
---
-created: "2019-02-18T07:29:59.704544615Z"
+created: "2019-02-18T09:22:24.093082839Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "m",
source_range: [100; 100),
+ delete: [100; 100),
+ insert: "m()$0",
kind: Method,
detail: "fn m()",
documentation: Documentation(
"An associated method"
- ),
- insert_text: "m()$0",
- insert_text_format: Snippet
+ )
}
]
---
-created: "2019-02-18T07:29:59.725668999Z"
+created: "2019-02-18T09:22:24.090876030Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "T",
source_range: [101; 101),
+ delete: [101; 101),
+ insert: "T",
kind: TypeAlias,
detail: "type T = i32;",
documentation: Documentation(
---
-created: "2019-02-18T07:29:59.599230647Z"
+created: "2019-02-18T09:22:23.939645902Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "the_field",
source_range: [85; 85),
+ delete: [85; 85),
+ insert: "the_field",
kind: Field,
detail: "u32"
}
---
-created: "2019-02-18T07:29:59.598966298Z"
+created: "2019-02-18T09:22:23.940872916Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "foo",
source_range: [126; 126),
+ delete: [126; 126),
+ insert: "foo()$0",
kind: Method,
- detail: "fn foo(&self)",
- insert_text: "foo()$0",
- insert_text_format: Snippet
+ detail: "fn foo(&self)"
},
CompletionItem {
label: "the_field",
source_range: [126; 126),
+ delete: [126; 126),
+ insert: "the_field",
kind: Field,
detail: "(u32, i32)"
}
---
-created: "2019-02-18T07:29:59.598965593Z"
+created: "2019-02-18T09:22:23.940872918Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "foo",
source_range: [187; 187),
+ delete: [187; 187),
+ insert: "foo()$0",
kind: Method,
- detail: "fn foo(self)",
- insert_text: "foo()$0",
- insert_text_format: Snippet
+ detail: "fn foo(self)"
},
CompletionItem {
label: "the_field",
source_range: [187; 187),
+ delete: [187; 187),
+ insert: "the_field",
kind: Field,
detail: "(u32,)",
documentation: Documentation(
---
-created: "2019-02-18T07:29:59.598973382Z"
+created: "2019-02-18T09:22:23.939710971Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "0",
source_range: [75; 75),
+ delete: [75; 75),
+ insert: "0",
kind: Field,
detail: "i32"
},
CompletionItem {
label: "1",
source_range: [75; 75),
+ delete: [75; 75),
+ insert: "1",
kind: Field,
detail: "f64"
}
---
-created: "2019-02-18T07:29:59.726365989Z"
+created: "2019-02-18T09:22:24.098574884Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Spam",
source_range: [11; 13),
+ delete: [11; 13),
+ insert: "Spam",
kind: Struct
},
CompletionItem {
label: "foo",
source_range: [11; 13),
+ delete: [11; 13),
+ insert: "foo",
kind: Module
}
]
---
-created: "2019-02-18T07:29:59.731789946Z"
+created: "2019-02-18T09:22:24.102063333Z"
creator: insta@0.6.2
source: crates/ra_ide_api/src/completion/completion_item.rs
expression: kind_completions
CompletionItem {
label: "Bar",
source_range: [26; 26),
+ delete: [26; 26),
+ insert: "Bar",
kind: Struct
}
]
type Ctx = LineIndex;
type Output = ::lsp_types::CompletionItem;
- fn conv_with(mut self, ctx: &LineIndex) -> ::lsp_types::CompletionItem {
- let atom_text_edit = AtomTextEdit::replace(self.source_range(), self.insert_text());
- let text_edit = (&atom_text_edit).conv_with(ctx);
- let additional_text_edits =
- if let Some(edit) = self.take_text_edit() { Some(edit.conv_with(ctx)) } else { None };
+ fn conv_with(self, ctx: &LineIndex) -> ::lsp_types::CompletionItem {
+ let mut additional_text_edits = Vec::new();
+ let mut text_edit = None;
+ // LSP does not allow arbitrary edits in completion, so we have to do a
+ // non-trivial mapping here.
+ for atom_edit in self.text_edit().as_atoms() {
+ if self.source_range().is_subrange(&atom_edit.delete) {
+ text_edit = Some(if atom_edit.delete == self.source_range() {
+ atom_edit.conv_with(ctx)
+ } else {
+ assert!(self.source_range().end() == atom_edit.delete.end());
+ let range1 =
+ TextRange::from_to(atom_edit.delete.start(), self.source_range().start());
+ let range2 = self.source_range();
+ let edit1 = AtomTextEdit::replace(range1, String::new());
+ let edit2 = AtomTextEdit::replace(range2, atom_edit.insert.clone());
+ additional_text_edits.push(edit1.conv_with(ctx));
+ edit2.conv_with(ctx)
+ })
+ } else {
+ assert!(self.source_range().intersection(&atom_edit.delete).is_none());
+ additional_text_edits.push(atom_edit.conv_with(ctx));
+ }
+ }
+ let text_edit = text_edit.unwrap();
let mut res = lsp_types::CompletionItem {
label: self.label().to_string(),
filter_text: Some(self.lookup().to_string()),
kind: self.kind().map(|it| it.conv()),
text_edit: Some(text_edit),
- additional_text_edits,
+ additional_text_edits: Some(additional_text_edits),
documentation: self.documentation().map(|it| it.conv()),
..Default::default()
};