Parse impl qpath
diff --git a/src/generics.rs b/src/generics.rs
index afcf9a4..78c447f 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -490,19 +490,13 @@
impl Parse for Generics {
fn parse(input: ParseStream) -> Result<Self> {
- let mut params = Punctuated::new();
-
if !input.peek(Token![<]) {
- return Ok(Generics {
- lt_token: None,
- params: params,
- gt_token: None,
- where_clause: None,
- });
+ return Ok(Generics::default());
}
let lt_token: Token![<] = input.parse()?;
+ let mut params = Punctuated::new();
let mut has_type_param = false;
loop {
if input.peek(Token![>]) {
diff --git a/src/item.rs b/src/item.rs
index 39bd3cb..a851560 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1719,7 +1719,19 @@
let defaultness: Option<Token![default]> = input.parse()?;
let unsafety: Option<Token![unsafe]> = input.parse()?;
let impl_token: Token![impl ] = input.parse()?;
- let generics: Generics = input.parse()?;
+
+ let has_generics = input.peek(Token![<])
+ && (input.peek2(Token![>])
+ || input.peek2(Token![#])
+ || (input.peek2(Ident) || input.peek2(Lifetime))
+ && (input.peek3(Token![:]) || input.peek3(Token![,]) || input.peek3(Token![>]))
+ );
+ let generics: Generics = if has_generics {
+ input.parse()?
+ } else {
+ Generics::default()
+ };
+
let trait_ = {
let ahead = input.fork();
if ahead.parse::<Option<Token![!]>>().is_ok()