Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/unresolved_field.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/unresolved_field.rs61
1 files changed, 51 insertions, 10 deletions
diff --git a/crates/ide-diagnostics/src/handlers/unresolved_field.rs b/crates/ide-diagnostics/src/handlers/unresolved_field.rs
index 41357b5962..eb8eea69f6 100644
--- a/crates/ide-diagnostics/src/handlers/unresolved_field.rs
+++ b/crates/ide-diagnostics/src/handlers/unresolved_field.rs
@@ -1,9 +1,8 @@
use std::iter;
-use hir::{db::ExpandDatabase, Adt, HasSource, HirDisplay, InFile, Struct, Union};
+use hir::{db::ExpandDatabase, Adt, FileRange, HasSource, HirDisplay, InFile, Struct, Union};
use ide_db::{
assists::{Assist, AssistId, AssistKind},
- base_db::FileRange,
helpers::is_editable_crate,
label::Label,
source_change::{SourceChange, SourceChangeBuilder},
@@ -76,7 +75,7 @@ fn field_fix(ctx: &DiagnosticsContext<'_>, d: &hir::UnresolvedField) -> Option<A
let expr = d.expr.value.to_node(&root);
let error_range = ctx.sema.original_range_opt(expr.syntax())?;
- let field_name = d.name.as_str()?;
+ let field_name = d.name.as_str();
// Convert the receiver to an ADT
let adt = d.receiver.strip_references().as_adt()?;
let target_module = adt.module(ctx.sema.db);
@@ -130,7 +129,7 @@ fn add_variant_to_union(
group: None,
target: error_range.range,
source_change: Some(src_change_builder.finish()),
- trigger_signature_help: false,
+ command: None,
})
}
@@ -153,7 +152,12 @@ fn add_field_to_struct_fix(
} else {
Some(make::visibility_pub_crate())
};
- let field_name = make::name(field_name);
+
+ let field_name = match field_name.chars().next() {
+ Some(ch) if ch.is_numeric() => return None,
+ Some(_) => make::name(field_name),
+ None => return None,
+ };
let (offset, record_field) = record_field_layout(
visibility,
@@ -173,13 +177,18 @@ fn add_field_to_struct_fix(
group: None,
target: error_range.range,
source_change: Some(src_change_builder.finish()),
- trigger_signature_help: false,
+ command: None,
})
}
None => {
// Add a field list to the Unit Struct
let mut src_change_builder = SourceChangeBuilder::new(struct_range.file_id);
- let field_name = make::name(field_name);
+ let field_name = match field_name.chars().next() {
+ // FIXME : See match arm below regarding tuple structs.
+ Some(ch) if ch.is_numeric() => return None,
+ Some(_) => make::name(field_name),
+ None => return None,
+ };
let visibility = if error_range.file_id == struct_range.file_id {
None
} else {
@@ -204,7 +213,7 @@ fn add_field_to_struct_fix(
group: None,
target: error_range.range,
source_change: Some(src_change_builder.finish()),
- trigger_signature_help: false,
+ command: None,
})
}
Some(FieldList::TupleFieldList(_tuple)) => {
@@ -266,7 +275,7 @@ fn method_fix(
file_id,
TextEdit::insert(range.end(), "()".to_owned()),
)),
- trigger_signature_help: false,
+ command: None,
})
}
#[cfg(test)]
@@ -275,7 +284,7 @@ mod tests {
use crate::{
tests::{
check_diagnostics, check_diagnostics_with_config, check_diagnostics_with_disabled,
- check_fix,
+ check_fix, check_no_fix,
},
DiagnosticsConfig,
};
@@ -460,4 +469,36 @@ fn foo() {
"#,
);
}
+
+ #[test]
+ fn no_fix_when_indexed() {
+ check_no_fix(
+ r#"
+ struct Kek {}
+impl Kek {
+ pub fn foo(self) {
+ self.$00
+ }
+}
+
+fn main() {}
+ "#,
+ )
+ }
+
+ #[test]
+ fn no_fix_when_without_field() {
+ check_no_fix(
+ r#"
+ struct Kek {}
+impl Kek {
+ pub fn foo(self) {
+ self.$0
+ }
+}
+
+fn main() {}
+ "#,
+ )
+ }
}