Improve type checking and error messages for slice type
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 95dd67c..6e5b36e 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -1,3 +1,4 @@
+use crate::syntax::Atom::*;
use crate::syntax::{
attrs, error, Api, Atom, Doc, ExternFn, ExternType, Lang, Receiver, Ref, Signature, Slice,
Struct, Ty1, Type, Var,
@@ -220,25 +221,13 @@
match ty {
RustType::Reference(ty) => parse_type_reference(ty),
RustType::Path(ty) => parse_type_path(ty),
+ RustType::Slice(ty) => parse_type_slice(ty),
RustType::BareFn(ty) => parse_type_fn(ty),
RustType::Tuple(ty) if ty.elems.is_empty() => Ok(Type::Void(ty.paren_token.span)),
- RustType::Slice(ty) => parse_type_slice(ty),
_ => Err(Error::new_spanned(ty, "unsupported type")),
}
}
-fn parse_type_slice(ty: &TypeSlice) -> Result<Type> {
- let inner = parse_type(&ty.elem)?;
- let which = match &inner {
- Type::Ident(ident) if ident == "u8" => Type::Slice,
- _ => return Err(Error::new_spanned(ty, "unsupported type")),
- };
- Ok(which(Box::new(Slice {
- bracket: ty.bracket_token,
- inner,
- })))
-}
-
fn parse_type_reference(ty: &TypeReference) -> Result<Type> {
let inner = parse_type(&ty.elem)?;
let which = match &inner {
@@ -249,9 +238,9 @@
Type::Str
}
}
- Type::Slice(inner2) => match &inner2.inner {
- Type::Ident(ident) if ident == "u8" => Type::SliceRefU8,
- _ => return Err(Error::new_spanned(ty, "unsupported type")),
+ Type::Slice(slice) => match &slice.inner {
+ Type::Ident(ident) if ident == U8 && ty.mutability.is_none() => Type::SliceRefU8,
+ _ => Type::Ref,
},
_ => Type::Ref,
};
@@ -298,6 +287,14 @@
Err(Error::new_spanned(ty, "unsupported type"))
}
+fn parse_type_slice(ty: &TypeSlice) -> Result<Type> {
+ let inner = parse_type(&ty.elem)?;
+ Ok(Type::Slice(Box::new(Slice {
+ bracket: ty.bracket_token,
+ inner,
+ })))
+}
+
fn parse_type_fn(ty: &TypeBareFn) -> Result<Type> {
if ty.lifetimes.is_some() {
return Err(Error::new_spanned(