Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_completion/src/snippet.rs')
| -rw-r--r-- | crates/ide_completion/src/snippet.rs | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/crates/ide_completion/src/snippet.rs b/crates/ide_completion/src/snippet.rs index d527f3aef6..53ed7de2d6 100644 --- a/crates/ide_completion/src/snippet.rs +++ b/crates/ide_completion/src/snippet.rs @@ -1,6 +1,8 @@ //! User (postfix)-snippet definitions. //! -//! Actual logic is implemented in [`crate::completions::postfix`] and [`crate::completions::snippet`]. +//! Actual logic is implemented in [`crate::completions::postfix`] and [`crate::completions::snippet`] respectively. + +use std::ops::Deref; // Feature: User Snippet Completions // @@ -58,6 +60,8 @@ use syntax::ast; use crate::{context::CompletionContext, ImportEdit}; +/// A snippet scope describing where a snippet may apply to. +/// These may differ slightly in meaning depending on the snippet trigger. #[derive(Clone, Debug, PartialEq, Eq)] pub enum SnippetScope { Item, @@ -65,14 +69,15 @@ pub enum SnippetScope { Type, } +/// A user supplied snippet. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Snippet { - pub postfix_triggers: Box<[String]>, - pub prefix_triggers: Box<[String]>, + pub postfix_triggers: Box<[Box<str>]>, + pub prefix_triggers: Box<[Box<str>]>, pub scope: SnippetScope, snippet: String, - pub description: Option<String>, - pub requires: Box<[String]>, + pub description: Option<Box<str>>, + pub requires: Box<[Box<str>]>, } impl Snippet { @@ -84,19 +89,22 @@ impl Snippet { requires: &[String], scope: SnippetScope, ) -> Option<Self> { + if prefix_triggers.is_empty() && postfix_triggers.is_empty() { + return None; + } let (snippet, description) = validate_snippet(snippet, description, requires)?; Some(Snippet { // Box::into doesn't work as that has a Copy bound 😒 - postfix_triggers: postfix_triggers.iter().cloned().collect(), - prefix_triggers: prefix_triggers.iter().cloned().collect(), + postfix_triggers: postfix_triggers.iter().map(Deref::deref).map(Into::into).collect(), + prefix_triggers: prefix_triggers.iter().map(Deref::deref).map(Into::into).collect(), scope, snippet, description, - requires: requires.iter().cloned().collect(), + requires: requires.iter().map(Deref::deref).map(Into::into).collect(), }) } - /// Returns None if the required items do not resolve. + /// Returns [`None`] if the required items do not resolve. pub(crate) fn imports( &self, ctx: &CompletionContext, @@ -112,20 +120,12 @@ impl Snippet { pub fn postfix_snippet(&self, receiver: &str) -> String { self.snippet.replace("${receiver}", receiver) } - - pub fn is_item(&self) -> bool { - self.scope == SnippetScope::Item - } - - pub fn is_expr(&self) -> bool { - self.scope == SnippetScope::Expr - } } fn import_edits( ctx: &CompletionContext, import_scope: &ImportScope, - requires: &[String], + requires: &[Box<str>], ) -> Option<Vec<ImportEdit>> { let resolve = |import| { let path = ast::Path::parse(import).ok()?; @@ -158,7 +158,7 @@ fn validate_snippet( snippet: &[String], description: &str, requires: &[String], -) -> Option<(String, Option<String>)> { +) -> Option<(String, Option<Box<str>>)> { // validate that these are indeed simple paths // we can't save the paths unfortunately due to them not being Send+Sync if requires.iter().any(|path| match ast::Path::parse(path) { @@ -171,6 +171,6 @@ fn validate_snippet( return None; } let snippet = snippet.iter().join("\n"); - let description = if description.is_empty() { None } else { Some(description.to_owned()) }; + let description = if description.is_empty() { None } else { Some(description.into()) }; Some((snippet, description)) } |