Skip to content

Commit 803ff2e

Browse files
bors[bot]Veykril
andauthored
Merge #7804
7804: Introduce TypeCtor::Scalar r=lnicola a=Veykril `TypeCtor::Int(..) | TypeCtor::Float(..) | TypeCtor::Char | TypeCtor::Bool` => `TypeCtor::Scalar(..)`, in this case we can actually just straight up use `chalk_ir::Scalar` already since its just a POD without any IDs or anything. Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2 parents 7f57a01 + 7c2dd85 commit 803ff2e

File tree

13 files changed

+270
-419
lines changed

13 files changed

+270
-419
lines changed

crates/hir/src/code_model.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ use hir_ty::{
3232
method_resolution,
3333
traits::{FnTrait, Solution, SolutionVariables},
3434
ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate,
35-
InEnvironment, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, Ty,
36-
TyDefId, TyKind, TypeCtor,
35+
InEnvironment, Obligation, ProjectionPredicate, ProjectionTy, Scalar, Substs, TraitEnvironment,
36+
Ty, TyDefId, TyKind, TypeCtor,
3737
};
3838
use rustc_hash::FxHashSet;
3939
use stdx::{format_to, impl_from};
@@ -1553,7 +1553,10 @@ impl Type {
15531553
)
15541554
}
15551555
pub fn is_bool(&self) -> bool {
1556-
matches!(self.ty.value, Ty::Apply(ApplicationTy { ctor: TypeCtor::Bool, .. }))
1556+
matches!(
1557+
self.ty.value,
1558+
Ty::Apply(ApplicationTy { ctor: TypeCtor::Scalar(Scalar::Bool), .. })
1559+
)
15571560
}
15581561

15591562
pub fn is_mutable_reference(&self) -> bool {

crates/hir_def/src/body/lower.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use test_utils::mark;
2424
use crate::{
2525
adt::StructKind,
2626
body::{Body, BodySourceMap, Expander, LabelSource, PatPtr, SyntheticSyntax},
27-
builtin_type::{BuiltinFloat, BuiltinInt},
27+
builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint},
2828
db::DefDatabase,
2929
diagnostics::{InactiveCode, MacroError, UnresolvedProcMacro},
3030
expr::{
@@ -1065,19 +1065,24 @@ impl From<ast::LiteralKind> for Literal {
10651065
fn from(ast_lit_kind: ast::LiteralKind) -> Self {
10661066
match ast_lit_kind {
10671067
LiteralKind::IntNumber(lit) => {
1068-
if let Some(float_suffix) = lit.suffix().and_then(BuiltinFloat::from_suffix) {
1069-
return Literal::Float(Default::default(), Some(float_suffix));
1068+
if let builtin @ Some(_) = lit.suffix().and_then(BuiltinFloat::from_suffix) {
1069+
return Literal::Float(Default::default(), builtin);
1070+
} else if let builtin @ Some(_) =
1071+
lit.suffix().and_then(|it| BuiltinInt::from_suffix(&it))
1072+
{
1073+
Literal::Int(Default::default(), builtin)
1074+
} else {
1075+
let builtin = lit.suffix().and_then(|it| BuiltinUint::from_suffix(&it));
1076+
Literal::Uint(Default::default(), builtin)
10701077
}
1071-
let ty = lit.suffix().and_then(|it| BuiltinInt::from_suffix(&it));
1072-
Literal::Int(Default::default(), ty)
10731078
}
10741079
LiteralKind::FloatNumber(lit) => {
10751080
let ty = lit.suffix().and_then(|it| BuiltinFloat::from_suffix(&it));
10761081
Literal::Float(Default::default(), ty)
10771082
}
10781083
LiteralKind::ByteString(_) => Literal::ByteString(Default::default()),
10791084
LiteralKind::String(_) => Literal::String(Default::default()),
1080-
LiteralKind::Byte => Literal::Int(Default::default(), Some(BuiltinInt::U8)),
1085+
LiteralKind::Byte => Literal::Uint(Default::default(), Some(BuiltinUint::U8)),
10811086
LiteralKind::Bool(val) => Literal::Bool(val),
10821087
LiteralKind::Char => Literal::Char(Default::default()),
10831088
}

crates/hir_def/src/builtin_type.rs

Lines changed: 60 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,32 @@
66
use std::fmt;
77

88
use hir_expand::name::{name, AsName, Name};
9-
10-
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
11-
pub enum Signedness {
12-
Signed,
13-
Unsigned,
14-
}
15-
16-
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
17-
pub enum IntBitness {
18-
Xsize,
19-
X8,
20-
X16,
21-
X32,
22-
X64,
23-
X128,
24-
}
25-
26-
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
27-
pub enum FloatBitness {
28-
X32,
29-
X64,
9+
/// Different signed int types.
10+
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
11+
pub enum BuiltinInt {
12+
Isize,
13+
I8,
14+
I16,
15+
I32,
16+
I64,
17+
I128,
3018
}
3119

32-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
33-
pub struct BuiltinInt {
34-
pub signedness: Signedness,
35-
pub bitness: IntBitness,
20+
/// Different unsigned int types.
21+
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
22+
pub enum BuiltinUint {
23+
Usize,
24+
U8,
25+
U16,
26+
U32,
27+
U64,
28+
U128,
3629
}
3730

38-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
39-
pub struct BuiltinFloat {
40-
pub bitness: FloatBitness,
31+
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
32+
pub enum BuiltinFloat {
33+
F32,
34+
F64,
4135
}
4236

4337
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -46,6 +40,7 @@ pub enum BuiltinType {
4640
Bool,
4741
Str,
4842
Int(BuiltinInt),
43+
Uint(BuiltinUint),
4944
Float(BuiltinFloat),
5045
}
5146

@@ -56,19 +51,19 @@ impl BuiltinType {
5651
(name![bool], BuiltinType::Bool),
5752
(name![str], BuiltinType::Str),
5853

59-
(name![isize], BuiltinType::Int(BuiltinInt::ISIZE)),
54+
(name![isize], BuiltinType::Int(BuiltinInt::Isize)),
6055
(name![i8], BuiltinType::Int(BuiltinInt::I8)),
6156
(name![i16], BuiltinType::Int(BuiltinInt::I16)),
6257
(name![i32], BuiltinType::Int(BuiltinInt::I32)),
6358
(name![i64], BuiltinType::Int(BuiltinInt::I64)),
6459
(name![i128], BuiltinType::Int(BuiltinInt::I128)),
6560

66-
(name![usize], BuiltinType::Int(BuiltinInt::USIZE)),
67-
(name![u8], BuiltinType::Int(BuiltinInt::U8)),
68-
(name![u16], BuiltinType::Int(BuiltinInt::U16)),
69-
(name![u32], BuiltinType::Int(BuiltinInt::U32)),
70-
(name![u64], BuiltinType::Int(BuiltinInt::U64)),
71-
(name![u128], BuiltinType::Int(BuiltinInt::U128)),
61+
(name![usize], BuiltinType::Uint(BuiltinUint::Usize)),
62+
(name![u8], BuiltinType::Uint(BuiltinUint::U8)),
63+
(name![u16], BuiltinType::Uint(BuiltinUint::U16)),
64+
(name![u32], BuiltinType::Uint(BuiltinUint::U32)),
65+
(name![u64], BuiltinType::Uint(BuiltinUint::U64)),
66+
(name![u128], BuiltinType::Uint(BuiltinUint::U128)),
7267

7368
(name![f32], BuiltinType::Float(BuiltinFloat::F32)),
7469
(name![f64], BuiltinType::Float(BuiltinFloat::F64)),
@@ -81,24 +76,25 @@ impl AsName for BuiltinType {
8176
BuiltinType::Char => name![char],
8277
BuiltinType::Bool => name![bool],
8378
BuiltinType::Str => name![str],
84-
BuiltinType::Int(BuiltinInt { signedness, bitness }) => match (signedness, bitness) {
85-
(Signedness::Signed, IntBitness::Xsize) => name![isize],
86-
(Signedness::Signed, IntBitness::X8) => name![i8],
87-
(Signedness::Signed, IntBitness::X16) => name![i16],
88-
(Signedness::Signed, IntBitness::X32) => name![i32],
89-
(Signedness::Signed, IntBitness::X64) => name![i64],
90-
(Signedness::Signed, IntBitness::X128) => name![i128],
91-
92-
(Signedness::Unsigned, IntBitness::Xsize) => name![usize],
93-
(Signedness::Unsigned, IntBitness::X8) => name![u8],
94-
(Signedness::Unsigned, IntBitness::X16) => name![u16],
95-
(Signedness::Unsigned, IntBitness::X32) => name![u32],
96-
(Signedness::Unsigned, IntBitness::X64) => name![u64],
97-
(Signedness::Unsigned, IntBitness::X128) => name![u128],
79+
BuiltinType::Int(it) => match it {
80+
BuiltinInt::Isize => name![isize],
81+
BuiltinInt::I8 => name![i8],
82+
BuiltinInt::I16 => name![i16],
83+
BuiltinInt::I32 => name![i32],
84+
BuiltinInt::I64 => name![i64],
85+
BuiltinInt::I128 => name![i128],
86+
},
87+
BuiltinType::Uint(it) => match it {
88+
BuiltinUint::Usize => name![usize],
89+
BuiltinUint::U8 => name![u8],
90+
BuiltinUint::U16 => name![u16],
91+
BuiltinUint::U32 => name![u32],
92+
BuiltinUint::U64 => name![u64],
93+
BuiltinUint::U128 => name![u128],
9894
},
99-
BuiltinType::Float(BuiltinFloat { bitness }) => match bitness {
100-
FloatBitness::X32 => name![f32],
101-
FloatBitness::X64 => name![f64],
95+
BuiltinType::Float(it) => match it {
96+
BuiltinFloat::F32 => name![f32],
97+
BuiltinFloat::F64 => name![f64],
10298
},
10399
}
104100
}
@@ -113,31 +109,26 @@ impl fmt::Display for BuiltinType {
113109

114110
#[rustfmt::skip]
115111
impl BuiltinInt {
116-
pub const ISIZE: BuiltinInt = BuiltinInt { signedness: Signedness::Signed, bitness: IntBitness::Xsize };
117-
pub const I8 : BuiltinInt = BuiltinInt { signedness: Signedness::Signed, bitness: IntBitness::X8 };
118-
pub const I16 : BuiltinInt = BuiltinInt { signedness: Signedness::Signed, bitness: IntBitness::X16 };
119-
pub const I32 : BuiltinInt = BuiltinInt { signedness: Signedness::Signed, bitness: IntBitness::X32 };
120-
pub const I64 : BuiltinInt = BuiltinInt { signedness: Signedness::Signed, bitness: IntBitness::X64 };
121-
pub const I128 : BuiltinInt = BuiltinInt { signedness: Signedness::Signed, bitness: IntBitness::X128 };
122-
123-
pub const USIZE: BuiltinInt = BuiltinInt { signedness: Signedness::Unsigned, bitness: IntBitness::Xsize };
124-
pub const U8 : BuiltinInt = BuiltinInt { signedness: Signedness::Unsigned, bitness: IntBitness::X8 };
125-
pub const U16 : BuiltinInt = BuiltinInt { signedness: Signedness::Unsigned, bitness: IntBitness::X16 };
126-
pub const U32 : BuiltinInt = BuiltinInt { signedness: Signedness::Unsigned, bitness: IntBitness::X32 };
127-
pub const U64 : BuiltinInt = BuiltinInt { signedness: Signedness::Unsigned, bitness: IntBitness::X64 };
128-
pub const U128 : BuiltinInt = BuiltinInt { signedness: Signedness::Unsigned, bitness: IntBitness::X128 };
129-
130-
131112
pub fn from_suffix(suffix: &str) -> Option<BuiltinInt> {
132113
let res = match suffix {
133-
"isize" => Self::ISIZE,
114+
"isize" => Self::Isize,
134115
"i8" => Self::I8,
135116
"i16" => Self::I16,
136117
"i32" => Self::I32,
137118
"i64" => Self::I64,
138119
"i128" => Self::I128,
139120

140-
"usize" => Self::USIZE,
121+
_ => return None,
122+
};
123+
Some(res)
124+
}
125+
}
126+
127+
#[rustfmt::skip]
128+
impl BuiltinUint {
129+
pub fn from_suffix(suffix: &str) -> Option<BuiltinUint> {
130+
let res = match suffix {
131+
"usize" => Self::Usize,
141132
"u8" => Self::U8,
142133
"u16" => Self::U16,
143134
"u32" => Self::U32,
@@ -152,9 +143,6 @@ impl BuiltinInt {
152143

153144
#[rustfmt::skip]
154145
impl BuiltinFloat {
155-
pub const F32: BuiltinFloat = BuiltinFloat { bitness: FloatBitness::X32 };
156-
pub const F64: BuiltinFloat = BuiltinFloat { bitness: FloatBitness::X64 };
157-
158146
pub fn from_suffix(suffix: &str) -> Option<BuiltinFloat> {
159147
let res = match suffix {
160148
"f32" => BuiltinFloat::F32,

crates/hir_def/src/expr.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use la_arena::{Idx, RawIdx};
1717
use syntax::ast::RangeOp;
1818

1919
use crate::{
20-
builtin_type::{BuiltinFloat, BuiltinInt},
20+
builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint},
2121
path::{GenericArgs, Path},
2222
type_ref::{Mutability, Rawness, TypeRef},
2323
BlockId,
@@ -43,6 +43,7 @@ pub enum Literal {
4343
Char(char),
4444
Bool(bool),
4545
Int(u64, Option<BuiltinInt>),
46+
Uint(u64, Option<BuiltinUint>),
4647
Float(u64, Option<BuiltinFloat>), // FIXME: f64 is not Eq
4748
}
4849

crates/hir_ty/src/display.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
use std::{borrow::Cow, fmt};
44

55
use crate::{
6-
db::HirDatabase, utils::generics, ApplicationTy, CallableDefId, FnSig, GenericPredicate,
7-
Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Substs, TraitRef, Ty, TypeCtor,
6+
db::HirDatabase, primitive, utils::generics, ApplicationTy, CallableDefId, FnSig,
7+
GenericPredicate, Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Scalar, Substs,
8+
TraitRef, Ty, TypeCtor,
89
};
910
use arrayvec::ArrayVec;
1011
use hir_def::{
@@ -241,10 +242,13 @@ impl HirDisplay for ApplicationTy {
241242
}
242243

243244
match self.ctor {
244-
TypeCtor::Bool => write!(f, "bool")?,
245-
TypeCtor::Char => write!(f, "char")?,
246-
TypeCtor::Int(t) => write!(f, "{}", t)?,
247-
TypeCtor::Float(t) => write!(f, "{}", t)?,
245+
TypeCtor::Scalar(Scalar::Bool) => write!(f, "bool")?,
246+
TypeCtor::Scalar(Scalar::Char) => write!(f, "char")?,
247+
TypeCtor::Scalar(Scalar::Float(t)) => {
248+
write!(f, "{}", primitive::float_ty_to_string(t))?
249+
}
250+
TypeCtor::Scalar(Scalar::Int(t)) => write!(f, "{}", primitive::int_ty_to_string(t))?,
251+
TypeCtor::Scalar(Scalar::Uint(t)) => write!(f, "{}", primitive::uint_ty_to_string(t))?,
248252
TypeCtor::Str => write!(f, "str")?,
249253
TypeCtor::Slice => {
250254
let t = self.parameters.as_single();

crates/hir_ty/src/infer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use super::{
4141
InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor, TypeWalk,
4242
};
4343
use crate::{
44-
db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode,
44+
db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode, Scalar,
4545
};
4646

4747
pub(crate) use unify::unify;
@@ -684,8 +684,8 @@ impl InferTy {
684684
fn fallback_value(self) -> Ty {
685685
match self {
686686
InferTy::TypeVar(..) => Ty::Unknown,
687-
InferTy::IntVar(..) => Ty::simple(TypeCtor::Int(IntTy::i32())),
688-
InferTy::FloatVar(..) => Ty::simple(TypeCtor::Float(FloatTy::f64())),
687+
InferTy::IntVar(..) => Ty::simple(TypeCtor::Scalar(Scalar::Int(IntTy::I32))),
688+
InferTy::FloatVar(..) => Ty::simple(TypeCtor::Scalar(Scalar::Float(FloatTy::F64))),
689689
InferTy::MaybeNeverTypeVar(..) => Ty::simple(TypeCtor::Never),
690690
}
691691
}

0 commit comments

Comments
 (0)