From b49ecafd40f3dd6c9c55d14c392b8c10ce682b84 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 18 Apr 2020 11:38:58 +0200 Subject: find_path: Builtins are always in scope Fixes #3977. --- crates/ra_hir_def/src/builtin_type.rs | 54 +++++++++++++++++++---------------- crates/ra_hir_def/src/find_path.rs | 21 +++++++++++++- 2 files changed, 50 insertions(+), 25 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir_def/src/builtin_type.rs b/crates/ra_hir_def/src/builtin_type.rs index d14901a9b..0f872b5c0 100644 --- a/crates/ra_hir_def/src/builtin_type.rs +++ b/crates/ra_hir_def/src/builtin_type.rs @@ -5,7 +5,7 @@ use std::fmt; -use hir_expand::name::{name, Name}; +use hir_expand::name::{name, AsName, Name}; #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub enum Signedness { @@ -75,33 +75,39 @@ impl BuiltinType { ]; } -impl fmt::Display for BuiltinType { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let type_name = match self { - BuiltinType::Char => "char", - BuiltinType::Bool => "bool", - BuiltinType::Str => "str", +impl AsName for BuiltinType { + fn as_name(&self) -> Name { + match self { + BuiltinType::Char => name![char], + BuiltinType::Bool => name![bool], + BuiltinType::Str => name![str], BuiltinType::Int(BuiltinInt { signedness, bitness }) => match (signedness, bitness) { - (Signedness::Signed, IntBitness::Xsize) => "isize", - (Signedness::Signed, IntBitness::X8) => "i8", - (Signedness::Signed, IntBitness::X16) => "i16", - (Signedness::Signed, IntBitness::X32) => "i32", - (Signedness::Signed, IntBitness::X64) => "i64", - (Signedness::Signed, IntBitness::X128) => "i128", - - (Signedness::Unsigned, IntBitness::Xsize) => "usize", - (Signedness::Unsigned, IntBitness::X8) => "u8", - (Signedness::Unsigned, IntBitness::X16) => "u16", - (Signedness::Unsigned, IntBitness::X32) => "u32", - (Signedness::Unsigned, IntBitness::X64) => "u64", - (Signedness::Unsigned, IntBitness::X128) => "u128", + (Signedness::Signed, IntBitness::Xsize) => name![isize], + (Signedness::Signed, IntBitness::X8) => name![i8], + (Signedness::Signed, IntBitness::X16) => name![i16], + (Signedness::Signed, IntBitness::X32) => name![i32], + (Signedness::Signed, IntBitness::X64) => name![i64], + (Signedness::Signed, IntBitness::X128) => name![i128], + + (Signedness::Unsigned, IntBitness::Xsize) => name![usize], + (Signedness::Unsigned, IntBitness::X8) => name![u8], + (Signedness::Unsigned, IntBitness::X16) => name![u16], + (Signedness::Unsigned, IntBitness::X32) => name![u32], + (Signedness::Unsigned, IntBitness::X64) => name![u64], + (Signedness::Unsigned, IntBitness::X128) => name![u128], }, BuiltinType::Float(BuiltinFloat { bitness }) => match bitness { - FloatBitness::X32 => "f32", - FloatBitness::X64 => "f64", + FloatBitness::X32 => name![f32], + FloatBitness::X64 => name![f64], }, - }; - f.write_str(type_name) + } + } +} + +impl fmt::Display for BuiltinType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let type_name = self.as_name(); + type_name.fmt(f) } } diff --git a/crates/ra_hir_def/src/find_path.rs b/crates/ra_hir_def/src/find_path.rs index d58ac6ba5..81eff5bfe 100644 --- a/crates/ra_hir_def/src/find_path.rs +++ b/crates/ra_hir_def/src/find_path.rs @@ -7,7 +7,7 @@ use crate::{ visibility::Visibility, CrateId, ModuleDefId, ModuleId, }; -use hir_expand::name::{known, Name}; +use hir_expand::name::{known, AsName, Name}; use test_utils::tested_by; const MAX_PATH_LEN: usize = 15; @@ -113,6 +113,11 @@ fn find_path_inner( } } + // - if the item is a builtin, it's in scope + if let ItemInNs::Types(ModuleDefId::BuiltinType(builtin)) = item { + return Some(ModPath::from_segments(PathKind::Plain, vec![builtin.as_name()])); + } + // Recursive case: // - if the item is an enum variant, refer to it via the enum if let Some(ModuleDefId::EnumVariantId(variant)) = item.as_module_def_id() { @@ -523,4 +528,18 @@ mod tests { "#; check_found_path(code, "megaalloc::Arc"); } + + #[test] + fn builtins_are_in_scope() { + let code = r#" + //- /main.rs + <|> + + pub mod primitive { + pub use u8; + } + "#; + check_found_path(code, "u8"); + check_found_path(code, "u16"); + } } -- cgit v1.2.3