diff options
Diffstat (limited to 'crates/hir_ty/src/display.rs')
-rw-r--r-- | crates/hir_ty/src/display.rs | 104 |
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, ", ")?; |