mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 21:35:20 +00:00
Move type inlay hint truncation to language server
This commit implements a general truncation framework for HirFormatter that keeps track of how much has been output so far. This information can then be used to perform truncation inside the language server, instead of relying on the client. Initial support is implemented for truncating types hints using the maxInlayHintLength server config option. The existing solution in the VSCode extension has been removed in favor of letting the server truncate type hints.
This commit is contained in:
parent
c24ee09904
commit
dadad36bb9
10 changed files with 97 additions and 35 deletions
|
@ -19,10 +19,15 @@ pub struct InlayHint {
|
|||
pub label: SmolStr,
|
||||
}
|
||||
|
||||
pub(crate) fn inlay_hints(db: &RootDatabase, file_id: FileId, file: &SourceFile) -> Vec<InlayHint> {
|
||||
pub(crate) fn inlay_hints(
|
||||
db: &RootDatabase,
|
||||
file_id: FileId,
|
||||
file: &SourceFile,
|
||||
max_inlay_hint_length: Option<usize>,
|
||||
) -> Vec<InlayHint> {
|
||||
file.syntax()
|
||||
.descendants()
|
||||
.map(|node| get_inlay_hints(db, file_id, &node).unwrap_or_default())
|
||||
.map(|node| get_inlay_hints(db, file_id, &node, max_inlay_hint_length).unwrap_or_default())
|
||||
.flatten()
|
||||
.collect()
|
||||
}
|
||||
|
@ -31,6 +36,7 @@ fn get_inlay_hints(
|
|||
db: &RootDatabase,
|
||||
file_id: FileId,
|
||||
node: &SyntaxNode,
|
||||
max_inlay_hint_length: Option<usize>,
|
||||
) -> Option<Vec<InlayHint>> {
|
||||
let analyzer = SourceAnalyzer::new(db, hir::Source::new(file_id.into(), node), None);
|
||||
match_ast! {
|
||||
|
@ -40,7 +46,7 @@ fn get_inlay_hints(
|
|||
return None;
|
||||
}
|
||||
let pat = it.pat()?;
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, false))
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, false, max_inlay_hint_length))
|
||||
},
|
||||
ast::LambdaExpr(it) => {
|
||||
it.param_list().map(|param_list| {
|
||||
|
@ -48,22 +54,22 @@ fn get_inlay_hints(
|
|||
.params()
|
||||
.filter(|closure_param| closure_param.ascribed_type().is_none())
|
||||
.filter_map(|closure_param| closure_param.pat())
|
||||
.map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, false))
|
||||
.map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, false, max_inlay_hint_length))
|
||||
.flatten()
|
||||
.collect()
|
||||
})
|
||||
},
|
||||
ast::ForExpr(it) => {
|
||||
let pat = it.pat()?;
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, false))
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, false, max_inlay_hint_length))
|
||||
},
|
||||
ast::IfExpr(it) => {
|
||||
let pat = it.condition()?.pat()?;
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, true))
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, true, max_inlay_hint_length))
|
||||
},
|
||||
ast::WhileExpr(it) => {
|
||||
let pat = it.condition()?.pat()?;
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, true))
|
||||
Some(get_pat_type_hints(db, &analyzer, pat, true, max_inlay_hint_length))
|
||||
},
|
||||
ast::MatchArmList(it) => {
|
||||
Some(
|
||||
|
@ -71,7 +77,7 @@ fn get_inlay_hints(
|
|||
.arms()
|
||||
.map(|match_arm| match_arm.pats())
|
||||
.flatten()
|
||||
.map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, true))
|
||||
.map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, true, max_inlay_hint_length))
|
||||
.flatten()
|
||||
.collect(),
|
||||
)
|
||||
|
@ -86,6 +92,7 @@ fn get_pat_type_hints(
|
|||
analyzer: &SourceAnalyzer,
|
||||
root_pat: ast::Pat,
|
||||
skip_root_pat_hint: bool,
|
||||
max_inlay_hint_length: Option<usize>,
|
||||
) -> Vec<InlayHint> {
|
||||
let original_pat = &root_pat.clone();
|
||||
|
||||
|
@ -99,7 +106,7 @@ fn get_pat_type_hints(
|
|||
.map(|(range, pat_type)| InlayHint {
|
||||
range,
|
||||
kind: InlayKind::TypeHint,
|
||||
label: pat_type.display(db).to_string().into(),
|
||||
label: pat_type.display_truncated(db, max_inlay_hint_length).to_string().into(),
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
@ -209,7 +216,7 @@ fn main() {
|
|||
}"#,
|
||||
);
|
||||
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id).unwrap(), @r###"
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id, None).unwrap(), @r###"
|
||||
[
|
||||
InlayHint {
|
||||
range: [193; 197),
|
||||
|
@ -278,7 +285,7 @@ fn main() {
|
|||
}"#,
|
||||
);
|
||||
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id).unwrap(), @r###"
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id, None).unwrap(), @r###"
|
||||
[
|
||||
InlayHint {
|
||||
range: [21; 30),
|
||||
|
@ -307,7 +314,7 @@ fn main() {
|
|||
}"#,
|
||||
);
|
||||
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id).unwrap(), @r###"
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id, None).unwrap(), @r###"
|
||||
[
|
||||
InlayHint {
|
||||
range: [21; 30),
|
||||
|
@ -355,7 +362,7 @@ fn main() {
|
|||
}"#,
|
||||
);
|
||||
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id).unwrap(), @r###"
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id, None).unwrap(), @r###"
|
||||
[
|
||||
InlayHint {
|
||||
range: [166; 170),
|
||||
|
@ -418,7 +425,7 @@ fn main() {
|
|||
}"#,
|
||||
);
|
||||
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id).unwrap(), @r###"
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id, None).unwrap(), @r###"
|
||||
[
|
||||
InlayHint {
|
||||
range: [166; 170),
|
||||
|
@ -481,7 +488,7 @@ fn main() {
|
|||
}"#,
|
||||
);
|
||||
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id).unwrap(), @r###"
|
||||
assert_debug_snapshot!(analysis.inlay_hints(file_id, None).unwrap(), @r###"
|
||||
[
|
||||
InlayHint {
|
||||
range: [311; 315),
|
||||
|
|
|
@ -338,8 +338,14 @@ impl Analysis {
|
|||
}
|
||||
|
||||
/// Returns a list of the places in the file where type hints can be displayed.
|
||||
pub fn inlay_hints(&self, file_id: FileId) -> Cancelable<Vec<InlayHint>> {
|
||||
self.with_db(|db| inlay_hints::inlay_hints(db, file_id, &db.parse(file_id).tree()))
|
||||
pub fn inlay_hints(
|
||||
&self,
|
||||
file_id: FileId,
|
||||
max_inlay_hint_length: Option<usize>,
|
||||
) -> Cancelable<Vec<InlayHint>> {
|
||||
self.with_db(|db| {
|
||||
inlay_hints::inlay_hints(db, file_id, &db.parse(file_id).tree(), max_inlay_hint_length)
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns the set of folding ranges.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue