mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
fix: Fix tuple- and record struct completions not working with existing braces
This commit is contained in:
parent
7370a6b5b8
commit
000e681d5f
@ -49,12 +49,12 @@ fn render(
|
|||||||
name: hir::Name,
|
name: hir::Name,
|
||||||
path: Option<hir::ModPath>,
|
path: Option<hir::ModPath>,
|
||||||
) -> Option<CompletionItem> {
|
) -> Option<CompletionItem> {
|
||||||
if let Some(PathCompletionCtx { has_call_parens: true, .. }) = completion.path_context {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
let db = completion.db;
|
let db = completion.db;
|
||||||
let fields = thing.fields(completion)?;
|
let kind = thing.kind(db);
|
||||||
|
let has_call_parens =
|
||||||
|
matches!(completion.path_context, Some(PathCompletionCtx { has_call_parens: true, .. }));
|
||||||
|
|
||||||
|
let fields = thing.fields(completion)?;
|
||||||
let (qualified_name, short_qualified_name, qualified) = match path {
|
let (qualified_name, short_qualified_name, qualified) = match path {
|
||||||
Some(path) => {
|
Some(path) => {
|
||||||
let short = hir::ModPath::from_segments(
|
let short = hir::ModPath::from_segments(
|
||||||
@ -68,13 +68,14 @@ fn render(
|
|||||||
let qualified_name = qualified_name.to_string();
|
let qualified_name = qualified_name.to_string();
|
||||||
let snippet_cap = ctx.snippet_cap();
|
let snippet_cap = ctx.snippet_cap();
|
||||||
|
|
||||||
let kind = thing.kind(db);
|
|
||||||
let mut rendered = match kind {
|
let mut rendered = match kind {
|
||||||
StructKind::Tuple => render_tuple_lit(db, snippet_cap, &fields, &qualified_name),
|
StructKind::Tuple if !has_call_parens => {
|
||||||
StructKind::Record => render_record_lit(db, snippet_cap, &fields, &qualified_name),
|
render_tuple_lit(db, snippet_cap, &fields, &qualified_name)
|
||||||
StructKind::Unit => {
|
|
||||||
RenderedLiteral { literal: qualified_name.clone(), detail: qualified_name.clone() }
|
|
||||||
}
|
}
|
||||||
|
StructKind::Record if !has_call_parens => {
|
||||||
|
render_record_lit(db, snippet_cap, &fields, &qualified_name)
|
||||||
|
}
|
||||||
|
_ => RenderedLiteral { literal: qualified_name.clone(), detail: qualified_name.clone() },
|
||||||
};
|
};
|
||||||
|
|
||||||
if snippet_cap.is_some() {
|
if snippet_cap.is_some() {
|
||||||
|
@ -6,7 +6,7 @@ use itertools::Itertools;
|
|||||||
use syntax::SmolStr;
|
use syntax::SmolStr;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
context::{ParamKind, PatternContext},
|
context::{ParamKind, PathCompletionCtx, PatternContext},
|
||||||
render::{variant::visible_fields, RenderContext},
|
render::{variant::visible_fields, RenderContext},
|
||||||
CompletionItem, CompletionItemKind,
|
CompletionItem, CompletionItemKind,
|
||||||
};
|
};
|
||||||
@ -77,12 +77,19 @@ fn render_pat(
|
|||||||
fields: &[hir::Field],
|
fields: &[hir::Field],
|
||||||
fields_omitted: bool,
|
fields_omitted: bool,
|
||||||
) -> Option<String> {
|
) -> Option<String> {
|
||||||
|
let has_call_parens = matches!(
|
||||||
|
ctx.completion.path_context,
|
||||||
|
Some(PathCompletionCtx { has_call_parens: true, .. })
|
||||||
|
);
|
||||||
let mut pat = match kind {
|
let mut pat = match kind {
|
||||||
StructKind::Tuple => render_tuple_as_pat(ctx.snippet_cap(), fields, name, fields_omitted),
|
StructKind::Tuple if !has_call_parens => {
|
||||||
StructKind::Record => {
|
render_tuple_as_pat(ctx.snippet_cap(), fields, name, fields_omitted)
|
||||||
|
}
|
||||||
|
StructKind::Record if !has_call_parens => {
|
||||||
render_record_as_pat(ctx.db(), ctx.snippet_cap(), fields, name, fields_omitted)
|
render_record_as_pat(ctx.db(), ctx.snippet_cap(), fields, name, fields_omitted)
|
||||||
}
|
}
|
||||||
_ => return None,
|
StructKind::Unit => return None,
|
||||||
|
_ => name.to_owned(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if matches!(
|
if matches!(
|
||||||
@ -91,7 +98,7 @@ fn render_pat(
|
|||||||
param_ctx: Some((.., ParamKind::Function(_))),
|
param_ctx: Some((.., ParamKind::Function(_))),
|
||||||
has_type_ascription: false,
|
has_type_ascription: false,
|
||||||
..
|
..
|
||||||
})
|
}) if !has_call_parens
|
||||||
) {
|
) {
|
||||||
pat.push(':');
|
pat.push(':');
|
||||||
pat.push(' ');
|
pat.push(' ');
|
||||||
|
@ -552,3 +552,24 @@ fn func() {
|
|||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn with_parens() {
|
||||||
|
check_empty(
|
||||||
|
r#"
|
||||||
|
enum Enum {
|
||||||
|
Variant()
|
||||||
|
}
|
||||||
|
impl Enum {
|
||||||
|
fn variant() -> Self { Enum::Variant() }
|
||||||
|
}
|
||||||
|
fn func() {
|
||||||
|
Enum::$0()
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
ev Variant(…) Variant
|
||||||
|
fn variant fn() -> Enum
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -429,7 +429,9 @@ fn foo() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#""#]],
|
expect![[r#"
|
||||||
|
ev TupleVariant(…) TupleVariant
|
||||||
|
"#]],
|
||||||
);
|
);
|
||||||
check_empty(
|
check_empty(
|
||||||
r#"
|
r#"
|
||||||
@ -442,7 +444,9 @@ fn foo() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#""#]],
|
expect![[r#"
|
||||||
|
ev RecordVariant {…} RecordVariant
|
||||||
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user