Diagnostic for invalid lifetime param 'static
diff --git a/syntax/check.rs b/syntax/check.rs
index bab2dec..640c41c 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -2,12 +2,13 @@
use crate::syntax::report::Errors;
use crate::syntax::visit::{self, Visit};
use crate::syntax::{
- error, ident, trivial, Api, Array, Enum, ExternFn, ExternType, Impl, Lang, NamedType, Ptr,
- Receiver, Ref, Signature, SliceRef, Struct, Trait, Ty1, Type, TypeAlias, Types,
+ error, ident, trivial, Api, Array, Enum, ExternFn, ExternType, Impl, Lang, Lifetimes,
+ NamedType, Ptr, Receiver, Ref, Signature, SliceRef, Struct, Trait, Ty1, Type, TypeAlias, Types,
};
use proc_macro2::{Delimiter, Group, Ident, TokenStream};
use quote::{quote, ToTokens};
use std::fmt::Display;
+use syn::{GenericParam, Generics, Lifetime};
pub(crate) struct Check<'a> {
apis: &'a [Api],
@@ -294,6 +295,7 @@
fn check_api_struct(cx: &mut Check, strct: &Struct) {
let name = &strct.name;
check_reserved_name(cx, &name.rust);
+ check_lifetimes(cx, &strct.generics);
if strct.fields.is_empty() {
let span = span_for_struct_error(strct);
@@ -330,6 +332,7 @@
fn check_api_enum(cx: &mut Check, enm: &Enum) {
check_reserved_name(cx, &enm.name.rust);
+ check_lifetimes(cx, &enm.generics);
if enm.variants.is_empty() && !enm.explicit_repr {
let span = span_for_enum_error(enm);
@@ -349,6 +352,7 @@
fn check_api_type(cx: &mut Check, ety: &ExternType) {
check_reserved_name(cx, &ety.name.rust);
+ check_lifetimes(cx, &ety.generics);
for derive in &ety.derives {
if derive.what == Trait::ExternType && ety.lang == Lang::Rust {
@@ -400,6 +404,8 @@
}
}
+ check_generics(cx, &efn.sig.generics);
+
if let Some(receiver) = &efn.receiver {
let ref span = span_for_receiver_error(receiver);
@@ -472,6 +478,8 @@
}
fn check_api_type_alias(cx: &mut Check, alias: &TypeAlias) {
+ check_lifetimes(cx, &alias.generics);
+
for derive in &alias.derives {
let msg = format!("derive({}) on extern type alias is not supported", derive);
cx.error(derive, msg);
@@ -481,6 +489,8 @@
fn check_api_impl(cx: &mut Check, imp: &Impl) {
let ty = &imp.ty;
+ check_lifetimes(cx, &imp.impl_generics);
+
if let Some(negative) = imp.negative_token {
let span = quote!(#negative #ty);
cx.error(span, "negative impl is not supported yet");
@@ -583,6 +593,26 @@
}
}
+fn check_reserved_lifetime(cx: &mut Check, lifetime: &Lifetime) {
+ if lifetime.ident == "static" {
+ cx.error(lifetime, error::RESERVED_LIFETIME);
+ }
+}
+
+fn check_lifetimes(cx: &mut Check, generics: &Lifetimes) {
+ for lifetime in &generics.lifetimes {
+ check_reserved_lifetime(cx, lifetime);
+ }
+}
+
+fn check_generics(cx: &mut Check, generics: &Generics) {
+ for generic_param in &generics.params {
+ if let GenericParam::Lifetime(def) = generic_param {
+ check_reserved_lifetime(cx, &def.lifetime);
+ }
+ }
+}
+
fn is_unsized(cx: &mut Check, ty: &Type) -> bool {
match ty {
Type::Ident(ident) => {