use ra_db::LocalSyntaxPtr;
use ra_syntax::{
- TextRange, TextUnit,
+ TextRange, TextUnit, SmolStr,
algo::visit::{visitor, Visitor},
ast::{self, AstNode, DocCommentsOwner, NameOwner, LoopBodyOwner, ArgListOwner},
SyntaxNodeRef
ParenType(_inner) => Ty::Unknown, // TODO
TupleType(_inner) => Ty::Unknown, // TODO
NeverType(..) => Ty::Never,
- PathType(_inner) => Ty::Unknown, // TODO
+ PathType(inner) => {
+ let path = if let Some(p) = inner.path() { p } else { return Ty::Unknown };
+ if path.qualifier().is_none() {
+ let name = path.segment().and_then(|s| s.name_ref()).map(|n| n.text()).unwrap_or(SmolStr::new(""));
+ if let Some(int_ty) = primitive::IntTy::from_string(&name) {
+ Ty::Int(int_ty)
+ } else if let Some(uint_ty) = primitive::UintTy::from_string(&name) {
+ Ty::Uint(uint_ty)
+ } else if let Some(float_ty) = primitive::FloatTy::from_string(&name) {
+ Ty::Float(float_ty)
+ } else {
+ // TODO
+ Ty::Unknown
+ }
+ } else {
+ // TODO
+ Ty::Unknown
+ }
+ },
PointerType(_inner) => Ty::Unknown, // TODO
ArrayType(_inner) => Ty::Unknown, // TODO
SliceType(_inner) => Ty::Unknown, // TODO
IntTy::I128 => "i128",
}
}
+
+ pub fn from_string(s: &str) -> Option<IntTy> {
+ match s {
+ "isize" => Some(IntTy::Isize),
+ "i8" => Some(IntTy::I8),
+ "i16" => Some(IntTy::I16),
+ "i32" => Some(IntTy::I32),
+ "i64" => Some(IntTy::I64),
+ "i128" => Some(IntTy::I128),
+ _ => None,
+ }
+ }
}
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Copy)]
UintTy::U128 => "u128",
}
}
+
+ pub fn from_string(s: &str) -> Option<UintTy> {
+ match s {
+ "usize" => Some(UintTy::Usize),
+ "u8" => Some(UintTy::U8),
+ "u16" => Some(UintTy::U16),
+ "u32" => Some(UintTy::U32),
+ "u64" => Some(UintTy::U64),
+ "u128" => Some(UintTy::U128),
+ _ => None,
+ }
+ }
}
impl fmt::Debug for UintTy {
FloatTy::F64 => "f64",
}
}
+
+ pub fn from_string(s: &str) -> Option<FloatTy> {
+ match s {
+ "f32" => Some(FloatTy::F32),
+ "f64" => Some(FloatTy::F64),
+ _ => None,
+ }
+ }
}
}
-impl<'a> PathType<'a> {}
+impl<'a> PathType<'a> {
+ pub fn path(self) -> Option<Path<'a>> {
+ super::child_opt(self)
+ }
+}
// PlaceholderPat
#[derive(Debug, Clone, Copy,)]
"ParenType": (),
"TupleType": (),
"NeverType": (),
- "PathType": (),
+ "PathType": (options: ["Path"]),
"PointerType": (),
"ArrayType": (),
"SliceType": (),