diff options
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 15 | ||||
-rw-r--r-- | crates/ra_hir/src/lib.rs | 5 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 3 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 36 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/primitive.rs | 12 |
5 files changed, 61 insertions, 10 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 69496b624..3f77850dd 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -9,7 +9,7 @@ use crate::{ | |||
9 | type_ref::TypeRef, | 9 | type_ref::TypeRef, |
10 | nameres::{ModuleScope, Namespace, ImportId, CrateModuleId}, | 10 | nameres::{ModuleScope, Namespace, ImportId, CrateModuleId}, |
11 | expr::{Body, BodySourceMap, validation::ExprValidator}, | 11 | expr::{Body, BodySourceMap, validation::ExprValidator}, |
12 | ty::{TraitRef, InferenceResult}, | 12 | ty::{TraitRef, InferenceResult, primitive::{IntTy, FloatTy}}, |
13 | adt::{EnumVariantId, StructFieldId, VariantDef}, | 13 | adt::{EnumVariantId, StructFieldId, VariantDef}, |
14 | generics::HasGenericParams, | 14 | generics::HasGenericParams, |
15 | docs::{Documentation, Docs, docs_from_ast}, | 15 | docs::{Documentation, Docs, docs_from_ast}, |
@@ -75,6 +75,15 @@ pub struct Module { | |||
75 | pub(crate) module_id: CrateModuleId, | 75 | pub(crate) module_id: CrateModuleId, |
76 | } | 76 | } |
77 | 77 | ||
78 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
79 | pub enum BuiltinType { | ||
80 | Char, | ||
81 | Bool, | ||
82 | Str, | ||
83 | Int(IntTy), | ||
84 | Float(FloatTy), | ||
85 | } | ||
86 | |||
78 | /// The defs which can be visible in the module. | 87 | /// The defs which can be visible in the module. |
79 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 88 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
80 | pub enum ModuleDef { | 89 | pub enum ModuleDef { |
@@ -89,6 +98,7 @@ pub enum ModuleDef { | |||
89 | Static(Static), | 98 | Static(Static), |
90 | Trait(Trait), | 99 | Trait(Trait), |
91 | TypeAlias(TypeAlias), | 100 | TypeAlias(TypeAlias), |
101 | BuiltinType(BuiltinType), | ||
92 | } | 102 | } |
93 | impl_froms!( | 103 | impl_froms!( |
94 | ModuleDef: Module, | 104 | ModuleDef: Module, |
@@ -100,7 +110,8 @@ impl_froms!( | |||
100 | Const, | 110 | Const, |
101 | Static, | 111 | Static, |
102 | Trait, | 112 | Trait, |
103 | TypeAlias | 113 | TypeAlias, |
114 | BuiltinType | ||
104 | ); | 115 | ); |
105 | 116 | ||
106 | pub enum ModuleSource { | 117 | pub enum ModuleSource { |
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index cb09c60f8..3e00eea26 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs | |||
@@ -6,7 +6,7 @@ | |||
6 | //! applied. So, the relation between syntax and HIR is many-to-one. | 6 | //! applied. So, the relation between syntax and HIR is many-to-one. |
7 | 7 | ||
8 | macro_rules! impl_froms { | 8 | macro_rules! impl_froms { |
9 | ($e:ident: $($v:ident), *) => { | 9 | ($e:ident: $($v:ident),*) => { |
10 | $( | 10 | $( |
11 | impl From<$v> for $e { | 11 | impl From<$v> for $e { |
12 | fn from(it: $v) -> $e { | 12 | fn from(it: $v) -> $e { |
@@ -80,5 +80,6 @@ pub use self::code_model::{ | |||
80 | Function, FnSignature, | 80 | Function, FnSignature, |
81 | StructField, FieldSource, | 81 | StructField, FieldSource, |
82 | Static, Const, ConstSignature, | 82 | Static, Const, ConstSignature, |
83 | Trait, TypeAlias, MacroDef, Container | 83 | Trait, TypeAlias, MacroDef, Container, |
84 | BuiltinType, | ||
84 | }; | 85 | }; |
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 7d8250292..e8ae33ead 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -649,7 +649,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
649 | | TypableDef::Function(_) | 649 | | TypableDef::Function(_) |
650 | | TypableDef::Enum(_) | 650 | | TypableDef::Enum(_) |
651 | | TypableDef::Const(_) | 651 | | TypableDef::Const(_) |
652 | | TypableDef::Static(_) => (Ty::Unknown, None), | 652 | | TypableDef::Static(_) |
653 | | TypableDef::BuiltinType(_) => (Ty::Unknown, None), | ||
653 | } | 654 | } |
654 | } | 655 | } |
655 | 656 | ||
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index 7defa7a9b..c4cef2d7c 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -10,7 +10,7 @@ use std::iter; | |||
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | Function, Struct, Union, StructField, Enum, EnumVariant, Path, ModuleDef, TypeAlias, Const, Static, | 12 | Function, Struct, Union, StructField, Enum, EnumVariant, Path, ModuleDef, TypeAlias, Const, Static, |
13 | HirDatabase, | 13 | HirDatabase, BuiltinType, |
14 | type_ref::TypeRef, | 14 | type_ref::TypeRef, |
15 | name::KnownName, | 15 | name::KnownName, |
16 | nameres::Namespace, | 16 | nameres::Namespace, |
@@ -66,7 +66,7 @@ impl Ty { | |||
66 | 66 | ||
67 | pub(crate) fn from_hir_path(db: &impl HirDatabase, resolver: &Resolver, path: &Path) -> Self { | 67 | pub(crate) fn from_hir_path(db: &impl HirDatabase, resolver: &Resolver, path: &Path) -> Self { |
68 | if let Some(name) = path.as_ident() { | 68 | if let Some(name) = path.as_ident() { |
69 | // FIXME handle primitive type names in resolver as well? | 69 | // TODO: remove this |
70 | if let Some(int_ty) = primitive::IntTy::from_type_name(name) { | 70 | if let Some(int_ty) = primitive::IntTy::from_type_name(name) { |
71 | return Ty::simple(TypeCtor::Int(primitive::UncertainIntTy::Known(int_ty))); | 71 | return Ty::simple(TypeCtor::Int(primitive::UncertainIntTy::Known(int_ty))); |
72 | } else if let Some(float_ty) = primitive::FloatTy::from_type_name(name) { | 72 | } else if let Some(float_ty) = primitive::FloatTy::from_type_name(name) { |
@@ -128,7 +128,7 @@ impl Ty { | |||
128 | TypableDef::Enum(e) => Some(e.into()), | 128 | TypableDef::Enum(e) => Some(e.into()), |
129 | TypableDef::EnumVariant(var) => Some(var.parent_enum(db).into()), | 129 | TypableDef::EnumVariant(var) => Some(var.parent_enum(db).into()), |
130 | TypableDef::TypeAlias(t) => Some(t.into()), | 130 | TypableDef::TypeAlias(t) => Some(t.into()), |
131 | TypableDef::Const(_) | TypableDef::Static(_) => None, | 131 | TypableDef::Const(_) | TypableDef::Static(_) | TypableDef::BuiltinType(_) => None, |
132 | }; | 132 | }; |
133 | substs_from_path_segment(db, resolver, segment, def_generic, false) | 133 | substs_from_path_segment(db, resolver, segment, def_generic, false) |
134 | } | 134 | } |
@@ -149,7 +149,8 @@ impl Ty { | |||
149 | | TypableDef::Enum(_) | 149 | | TypableDef::Enum(_) |
150 | | TypableDef::Const(_) | 150 | | TypableDef::Const(_) |
151 | | TypableDef::Static(_) | 151 | | TypableDef::Static(_) |
152 | | TypableDef::TypeAlias(_) => last, | 152 | | TypableDef::TypeAlias(_) |
153 | | TypableDef::BuiltinType(_) => last, | ||
153 | TypableDef::EnumVariant(_) => { | 154 | TypableDef::EnumVariant(_) => { |
154 | // the generic args for an enum variant may be either specified | 155 | // the generic args for an enum variant may be either specified |
155 | // on the segment referring to the enum, or on the segment | 156 | // on the segment referring to the enum, or on the segment |
@@ -299,6 +300,7 @@ pub(crate) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace | |||
299 | (TypableDef::TypeAlias(t), Namespace::Types) => type_for_type_alias(db, t), | 300 | (TypableDef::TypeAlias(t), Namespace::Types) => type_for_type_alias(db, t), |
300 | (TypableDef::Const(c), Namespace::Values) => type_for_const(db, c), | 301 | (TypableDef::Const(c), Namespace::Values) => type_for_const(db, c), |
301 | (TypableDef::Static(c), Namespace::Values) => type_for_static(db, c), | 302 | (TypableDef::Static(c), Namespace::Values) => type_for_static(db, c), |
303 | (TypableDef::BuiltinType(t), Namespace::Types) => type_for_builtin(t), | ||
302 | 304 | ||
303 | // 'error' cases: | 305 | // 'error' cases: |
304 | (TypableDef::Function(_), Namespace::Types) => Ty::Unknown, | 306 | (TypableDef::Function(_), Namespace::Types) => Ty::Unknown, |
@@ -308,6 +310,7 @@ pub(crate) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace | |||
308 | (TypableDef::TypeAlias(_), Namespace::Values) => Ty::Unknown, | 310 | (TypableDef::TypeAlias(_), Namespace::Values) => Ty::Unknown, |
309 | (TypableDef::Const(_), Namespace::Types) => Ty::Unknown, | 311 | (TypableDef::Const(_), Namespace::Types) => Ty::Unknown, |
310 | (TypableDef::Static(_), Namespace::Types) => Ty::Unknown, | 312 | (TypableDef::Static(_), Namespace::Types) => Ty::Unknown, |
313 | (TypableDef::BuiltinType(_), Namespace::Values) => Ty::Unknown, | ||
311 | } | 314 | } |
312 | } | 315 | } |
313 | 316 | ||
@@ -399,6 +402,17 @@ fn type_for_static(db: &impl HirDatabase, def: Static) -> Ty { | |||
399 | Ty::from_hir(db, &resolver, signature.type_ref()) | 402 | Ty::from_hir(db, &resolver, signature.type_ref()) |
400 | } | 403 | } |
401 | 404 | ||
405 | /// Build the declared type of a static. | ||
406 | fn type_for_builtin(def: BuiltinType) -> Ty { | ||
407 | Ty::simple(match def { | ||
408 | BuiltinType::Char => TypeCtor::Char, | ||
409 | BuiltinType::Bool => TypeCtor::Bool, | ||
410 | BuiltinType::Str => TypeCtor::Str, | ||
411 | BuiltinType::Int(ty) => TypeCtor::Int(ty.into()), | ||
412 | BuiltinType::Float(ty) => TypeCtor::Float(ty.into()), | ||
413 | }) | ||
414 | } | ||
415 | |||
402 | fn fn_sig_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> FnSig { | 416 | fn fn_sig_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> FnSig { |
403 | let var_data = def.variant_data(db); | 417 | let var_data = def.variant_data(db); |
404 | let fields = match var_data.fields() { | 418 | let fields = match var_data.fields() { |
@@ -477,8 +491,19 @@ pub enum TypableDef { | |||
477 | TypeAlias(TypeAlias), | 491 | TypeAlias(TypeAlias), |
478 | Const(Const), | 492 | Const(Const), |
479 | Static(Static), | 493 | Static(Static), |
494 | BuiltinType(BuiltinType), | ||
480 | } | 495 | } |
481 | impl_froms!(TypableDef: Function, Struct, Union, Enum, EnumVariant, TypeAlias, Const, Static); | 496 | impl_froms!( |
497 | TypableDef: Function, | ||
498 | Struct, | ||
499 | Union, | ||
500 | Enum, | ||
501 | EnumVariant, | ||
502 | TypeAlias, | ||
503 | Const, | ||
504 | Static, | ||
505 | BuiltinType | ||
506 | ); | ||
482 | 507 | ||
483 | impl From<ModuleDef> for Option<TypableDef> { | 508 | impl From<ModuleDef> for Option<TypableDef> { |
484 | fn from(def: ModuleDef) -> Option<TypableDef> { | 509 | fn from(def: ModuleDef) -> Option<TypableDef> { |
@@ -491,6 +516,7 @@ impl From<ModuleDef> for Option<TypableDef> { | |||
491 | ModuleDef::TypeAlias(t) => t.into(), | 516 | ModuleDef::TypeAlias(t) => t.into(), |
492 | ModuleDef::Const(v) => v.into(), | 517 | ModuleDef::Const(v) => v.into(), |
493 | ModuleDef::Static(v) => v.into(), | 518 | ModuleDef::Static(v) => v.into(), |
519 | ModuleDef::BuiltinType(t) => t.into(), | ||
494 | ModuleDef::Module(_) | ModuleDef::Trait(_) => return None, | 520 | ModuleDef::Module(_) | ModuleDef::Trait(_) => return None, |
495 | }; | 521 | }; |
496 | Some(res) | 522 | Some(res) |
diff --git a/crates/ra_hir/src/ty/primitive.rs b/crates/ra_hir/src/ty/primitive.rs index b37326db7..e1ab16a6f 100644 --- a/crates/ra_hir/src/ty/primitive.rs +++ b/crates/ra_hir/src/ty/primitive.rs | |||
@@ -30,6 +30,12 @@ pub enum UncertainIntTy { | |||
30 | Known(IntTy), | 30 | Known(IntTy), |
31 | } | 31 | } |
32 | 32 | ||
33 | impl From<IntTy> for UncertainIntTy { | ||
34 | fn from(ty: IntTy) -> Self { | ||
35 | UncertainIntTy::Known(ty) | ||
36 | } | ||
37 | } | ||
38 | |||
33 | impl fmt::Display for UncertainIntTy { | 39 | impl fmt::Display for UncertainIntTy { |
34 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 40 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
35 | match *self { | 41 | match *self { |
@@ -45,6 +51,12 @@ pub enum UncertainFloatTy { | |||
45 | Known(FloatTy), | 51 | Known(FloatTy), |
46 | } | 52 | } |
47 | 53 | ||
54 | impl From<FloatTy> for UncertainFloatTy { | ||
55 | fn from(ty: FloatTy) -> Self { | ||
56 | UncertainFloatTy::Known(ty) | ||
57 | } | ||
58 | } | ||
59 | |||
48 | impl fmt::Display for UncertainFloatTy { | 60 | impl fmt::Display for UncertainFloatTy { |
49 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 61 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
50 | match *self { | 62 | match *self { |