Omit duplicate LSP data when generating completion item labels (#29137)
Before: <img width="875" alt="before" src="https://github.com/user-attachments/assets/eec34f4e-3665-47e1-a224-16f1b98d5b29" /> After: <img width="769" alt="after" src="https://github.com/user-attachments/assets/4ce6a24b-6fd0-4043-b67c-c92105c1501a" /> Release Notes: - N/A
This commit is contained in:
parent
4473b45c3d
commit
4dcfe0cff9
1 changed files with 99 additions and 2 deletions
|
@ -1913,12 +1913,13 @@ impl CodeLabel {
|
||||||
let runs = highlight_id
|
let runs = highlight_id
|
||||||
.map(|highlight_id| vec![(0..label_length, highlight_id)])
|
.map(|highlight_id| vec![(0..label_length, highlight_id)])
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
let text = if let Some(detail) = &item.detail {
|
let text = if let Some(detail) = item.detail.as_deref().filter(|detail| detail != label) {
|
||||||
format!("{label} {detail}")
|
format!("{label} {detail}")
|
||||||
} else if let Some(description) = item
|
} else if let Some(description) = item
|
||||||
.label_details
|
.label_details
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|label_details| label_details.description.as_ref())
|
.and_then(|label_details| label_details.description.as_deref())
|
||||||
|
.filter(|description| description != label)
|
||||||
{
|
{
|
||||||
format!("{label} {description}")
|
format!("{label} {description}")
|
||||||
} else {
|
} else {
|
||||||
|
@ -2213,4 +2214,100 @@ mod tests {
|
||||||
// Loading an unknown language returns an error.
|
// Loading an unknown language returns an error.
|
||||||
assert!(languages.language_for_name("Unknown").await.is_err());
|
assert!(languages.language_for_name("Unknown").await.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_completion_label_omits_duplicate_data() {
|
||||||
|
let regular_completion_item_1 = lsp::CompletionItem {
|
||||||
|
label: "regular1".to_string(),
|
||||||
|
detail: Some("detail1".to_string()),
|
||||||
|
label_details: Some(lsp::CompletionItemLabelDetails {
|
||||||
|
detail: None,
|
||||||
|
description: Some("description 1".to_string()),
|
||||||
|
}),
|
||||||
|
..lsp::CompletionItem::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let regular_completion_item_2 = lsp::CompletionItem {
|
||||||
|
label: "regular2".to_string(),
|
||||||
|
label_details: Some(lsp::CompletionItemLabelDetails {
|
||||||
|
detail: None,
|
||||||
|
description: Some("description 2".to_string()),
|
||||||
|
}),
|
||||||
|
..lsp::CompletionItem::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let completion_item_with_duplicate_detail_and_proper_description = lsp::CompletionItem {
|
||||||
|
detail: Some(regular_completion_item_1.label.clone()),
|
||||||
|
..regular_completion_item_1.clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
let completion_item_with_duplicate_detail = lsp::CompletionItem {
|
||||||
|
detail: Some(regular_completion_item_1.label.clone()),
|
||||||
|
label_details: None,
|
||||||
|
..regular_completion_item_1.clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
let completion_item_with_duplicate_description = lsp::CompletionItem {
|
||||||
|
label_details: Some(lsp::CompletionItemLabelDetails {
|
||||||
|
detail: None,
|
||||||
|
description: Some(regular_completion_item_2.label.clone()),
|
||||||
|
}),
|
||||||
|
..regular_completion_item_2.clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
CodeLabel::fallback_for_completion(®ular_completion_item_1, None).text,
|
||||||
|
format!(
|
||||||
|
"{} {}",
|
||||||
|
regular_completion_item_1.label,
|
||||||
|
regular_completion_item_1.detail.unwrap()
|
||||||
|
),
|
||||||
|
"LSP completion items with both detail and label_details.description should prefer detail"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
CodeLabel::fallback_for_completion(®ular_completion_item_2, None).text,
|
||||||
|
format!(
|
||||||
|
"{} {}",
|
||||||
|
regular_completion_item_2.label,
|
||||||
|
regular_completion_item_2
|
||||||
|
.label_details
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.description
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
),
|
||||||
|
"LSP completion items without detail but with label_details.description should use that"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
CodeLabel::fallback_for_completion(
|
||||||
|
&completion_item_with_duplicate_detail_and_proper_description,
|
||||||
|
None
|
||||||
|
)
|
||||||
|
.text,
|
||||||
|
format!(
|
||||||
|
"{} {}",
|
||||||
|
regular_completion_item_1.label,
|
||||||
|
regular_completion_item_1
|
||||||
|
.label_details
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.description
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
),
|
||||||
|
"LSP completion items with both detail and label_details.description should prefer description only if the detail duplicates the completion label"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
CodeLabel::fallback_for_completion(&completion_item_with_duplicate_detail, None).text,
|
||||||
|
regular_completion_item_1.label,
|
||||||
|
"LSP completion items with duplicate label and detail, should omit the detail"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
CodeLabel::fallback_for_completion(&completion_item_with_duplicate_description, None)
|
||||||
|
.text,
|
||||||
|
regular_completion_item_2.label,
|
||||||
|
"LSP completion items with duplicate label and detail, should omit the detail"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue