aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/display.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/display.rs')
-rw-r--r--crates/hir_ty/src/display.rs104
1 files changed, 50 insertions, 54 deletions
diff --git a/crates/hir_ty/src/display.rs b/crates/hir_ty/src/display.rs
index f1232a72f..ddfd8c8af 100644
--- a/crates/hir_ty/src/display.rs
+++ b/crates/hir_ty/src/display.rs
@@ -74,9 +74,29 @@ pub trait HirDisplay {
74 curr_size: 0, 74 curr_size: 0,
75 max_size: None, 75 max_size: None,
76 omit_verbose_types: false, 76 omit_verbose_types: false,
77 #[cfg(not(test))]
78 display_target: DisplayTarget::SourceCode { module_id }, 77 display_target: DisplayTarget::SourceCode { module_id },
79 #[cfg(test)] 78 }) {
79 Ok(()) => {}
80 Err(HirDisplayError::FmtError) => panic!("Writing to String can't fail!"),
81 Err(HirDisplayError::DisplaySourceCodeError(e)) => return Err(e),
82 };
83 Ok(result)
84 }
85
86 /// Returns a String representation of `self` for test purposes
87 fn display_test<'a>(
88 &'a self,
89 db: &'a dyn HirDatabase,
90 module_id: ModuleId,
91 ) -> Result<String, DisplaySourceCodeError> {
92 let mut result = String::new();
93 match self.hir_fmt(&mut HirFormatter {
94 db,
95 fmt: &mut result,
96 buf: String::with_capacity(20),
97 curr_size: 0,
98 max_size: None,
99 omit_verbose_types: false,
80 display_target: DisplayTarget::Test { module_id }, 100 display_target: DisplayTarget::Test { module_id },
81 }) { 101 }) {
82 Ok(()) => {} 102 Ok(()) => {}
@@ -138,7 +158,6 @@ enum DisplayTarget {
138 /// The generated code should compile, so paths need to be qualified. 158 /// The generated code should compile, so paths need to be qualified.
139 SourceCode { module_id: ModuleId }, 159 SourceCode { module_id: ModuleId },
140 /// Only for test purpose to keep real types 160 /// Only for test purpose to keep real types
141 #[cfg(test)]
142 Test { module_id: ModuleId }, 161 Test { module_id: ModuleId },
143} 162}
144 163
@@ -147,14 +166,7 @@ impl DisplayTarget {
147 matches!(self, Self::SourceCode {..}) 166 matches!(self, Self::SourceCode {..})
148 } 167 }
149 fn is_test(&self) -> bool { 168 fn is_test(&self) -> bool {
150 #[cfg(test)] 169 matches!(self, Self::Test {..})
151 {
152 matches!(self, Self::Test {..})
153 }
154 #[cfg(not(test))]
155 {
156 false
157 }
158 } 170 }
159} 171}
160 172
@@ -344,21 +356,7 @@ impl HirDisplay for ApplicationTy {
344 }; 356 };
345 write!(f, "{}", name)?; 357 write!(f, "{}", name)?;
346 } 358 }
347 DisplayTarget::SourceCode { module_id } => { 359 DisplayTarget::SourceCode { module_id } | DisplayTarget::Test { module_id } => {
348 if let Some(path) = find_path::find_path(
349 f.db.upcast(),
350 ItemInNs::Types(def_id.into()),
351 module_id,
352 ) {
353 write!(f, "{}", path)?;
354 } else {
355 return Err(HirDisplayError::DisplaySourceCodeError(
356 DisplaySourceCodeError::PathNotFound,
357 ));
358 }
359 }
360 #[cfg(test)]
361 DisplayTarget::Test { module_id } => {
362 if let Some(path) = find_path::find_path( 360 if let Some(path) = find_path::find_path(
363 f.db.upcast(), 361 f.db.upcast(),
364 ItemInNs::Types(def_id.into()), 362 ItemInNs::Types(def_id.into()),
@@ -374,40 +372,38 @@ impl HirDisplay for ApplicationTy {
374 } 372 }
375 373
376 if self.parameters.len() > 0 { 374 if self.parameters.len() > 0 {
377 let parameters_to_write = if f.display_target.is_source_code() 375 let parameters_to_write =
378 || f.display_target.is_test() 376 if f.display_target.is_source_code() || f.omit_verbose_types() {
379 || f.omit_verbose_types() 377 match self
380 { 378 .ctor
381 match self 379 .as_generic_def()
382 .ctor 380 .map(|generic_def_id| f.db.generic_defaults(generic_def_id))
383 .as_generic_def() 381 .filter(|defaults| !defaults.is_empty())
384 .map(|generic_def_id| f.db.generic_defaults(generic_def_id)) 382 {
385 .filter(|defaults| !defaults.is_empty()) 383 None => self.parameters.0.as_ref(),
386 { 384 Some(default_parameters) => {
387 None => self.parameters.0.as_ref(), 385 let mut default_from = 0;
388 Some(default_parameters) => { 386 for (i, parameter) in self.parameters.iter().enumerate() {
389 let mut default_from = 0; 387 match (parameter, default_parameters.get(i)) {
390 for (i, parameter) in self.parameters.iter().enumerate() { 388 (&Ty::Unknown, _) | (_, None) => {
391 match (parameter, default_parameters.get(i)) {
392 (&Ty::Unknown, _) | (_, None) => {
393 default_from = i + 1;
394 }
395 (_, Some(default_parameter)) => {
396 let actual_default = default_parameter
397 .clone()
398 .subst(&self.parameters.prefix(i));
399 if parameter != &actual_default {
400 default_from = i + 1; 389 default_from = i + 1;
401 } 390 }
391 (_, Some(default_parameter)) => {
392 let actual_default = default_parameter
393 .clone()
394 .subst(&self.parameters.prefix(i));
395 if parameter != &actual_default {
396 default_from = i + 1;
397 }
398 }
402 } 399 }
403 } 400 }
401 &self.parameters.0[0..default_from]
404 } 402 }
405 &self.parameters.0[0..default_from]
406 } 403 }
407 } 404 } else {
408 } else { 405 self.parameters.0.as_ref()
409 self.parameters.0.as_ref() 406 };
410 };
411 if !parameters_to_write.is_empty() { 407 if !parameters_to_write.is_empty() {
412 write!(f, "<")?; 408 write!(f, "<")?;
413 f.write_joined(parameters_to_write, ", ")?; 409 f.write_joined(parameters_to_write, ", ")?;