implement a suggestion for a floating point number with a type suffix

This commit is contained in:
Takayuki Maeda 2022-07-12 13:59:51 +09:00
parent 6f65b7e64b
commit e03cb7fb9a
6 changed files with 159 additions and 11 deletions

View File

@ -48,7 +48,7 @@ use rustc_middle::ty::{self, AdtKind, DefIdTree, Ty, TypeVisitable};
use rustc_session::parse::feature_err;
use rustc_span::hygiene::DesugaringKind;
use rustc_span::lev_distance::find_best_match_for_name;
use rustc_span::source_map::Span;
use rustc_span::source_map::{Span, Spanned};
use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{BytePos, Pos};
use rustc_target::spec::abi::Abi::RustIntrinsic;
@ -2170,14 +2170,38 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
E0610,
"`{expr_t}` is a primitive type and therefore doesn't have fields",
);
if expr_t.is_integral()
&& (field_name
.strip_prefix('e')
.or_else(|| field_name.strip_prefix('E'))
.map(|prefix| prefix.chars().all(|c| c.is_numeric()))
.unwrap_or_default()
|| field.name == sym::f32
|| field.name == sym::f64)
let is_valid_suffix = |field: String| {
if field == "f32" || field == "f64" {
return true;
}
let mut chars = field.chars().peekable();
match chars.peek() {
Some('e') | Some('E') => {
chars.next();
if let Some(c) = chars.peek()
&& !c.is_numeric() && *c != '-' && *c != '+'
{
return false;
}
while let Some(c) = chars.peek() {
if !c.is_numeric() {
break;
}
chars.next();
}
}
_ => (),
}
let suffix = chars.collect::<String>();
suffix.is_empty() || suffix == "f32" || suffix == "f64"
};
if let ty::Infer(ty::IntVar(_)) = expr_t.kind()
&& let ExprKind::Lit(Spanned {
node: ast::LitKind::Int(_, ast::LitIntType::Unsuffixed),
..
}) = base.kind
&& !base.span.from_expansion()
&& is_valid_suffix(field_name)
{
err.span_suggestion_verbose(
field.span.shrink_to_lo(),

View File

@ -0,0 +1,21 @@
macro_rules! num { () => { 1 } }
fn main() {
let x = 1i32;
x.e10; //~ERROR `i32` is a primitive type and therefore doesn't have fields
let y = 1;
y.e10; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2u32.e10; //~ERROR `u32` is a primitive type and therefore doesn't have fields
num!().e10; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.e10foo; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
42._;
//~^ERROR expected identifier, found reserved identifier `_`
//~|ERROR `{integer}` is a primitive type and therefore doesn't have fields
42.a; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
}

View File

@ -0,0 +1,51 @@
error: expected identifier, found reserved identifier `_`
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:16:8
|
LL | 42._;
| ^ expected identifier, found reserved identifier
error[E0610]: `i32` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:5:7
|
LL | x.e10;
| ^^^
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:8:7
|
LL | y.e10;
| ^^^
error[E0610]: `u32` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:10:10
|
LL | 2u32.e10;
| ^^^
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:12:12
|
LL | num!().e10;
| ^^^
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:14:7
|
LL | 2.e10foo;
| ^^^^^^
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:16:8
|
LL | 42._;
| ^
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:20:8
|
LL | 42.a;
| ^
error: aborting due to 8 previous errors
For more information about this error, try `rustc --explain E0610`.

View File

@ -2,6 +2,10 @@
fn main() {
2.0e1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.0E1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.0f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.0f64; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.0e+12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.0e-12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.0e1f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
}

View File

@ -2,6 +2,10 @@
fn main() {
2.e1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.E1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.f64; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.e+12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.e-12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
2.e1f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
}

View File

@ -12,6 +12,17 @@ LL | 2.0e1;
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:5:7
|
LL | 2.E1;
| ^^
|
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
LL | 2.0E1;
| +
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:6:7
|
LL | 2.f32;
| ^^^
|
@ -21,7 +32,7 @@ LL | 2.0f32;
| +
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:6:7
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:7:7
|
LL | 2.f64;
| ^^^
@ -31,6 +42,39 @@ help: If the number is meant to be a floating point number, consider adding a `0
LL | 2.0f64;
| +
error: aborting due to 3 previous errors
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:8:7
|
LL | 2.e+12;
| ^
|
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
LL | 2.0e+12;
| +
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:9:7
|
LL | 2.e-12;
| ^
|
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
LL | 2.0e-12;
| +
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:10:7
|
LL | 2.e1f32;
| ^^^^^
|
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
LL | 2.0e1f32;
| +
error: aborting due to 7 previous errors
For more information about this error, try `rustc --explain E0610`.