Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add: Support #[deprecated] attribute #860

Closed
wants to merge 25 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f86d749
WIP:
sevenc-nanashi Jul 22, 2023
87561a4
Add: Add deprecated
sevenc-nanashi Jul 23, 2023
e001222
Fix: Fix it generates invalid python code
sevenc-nanashi Jul 23, 2023
d75abe9
Fix: Support quotes
sevenc-nanashi Jul 23, 2023
19845d8
Change: Move creation of [[deprecated]]
sevenc-nanashi Jul 23, 2023
608a31e
Add: Support enum
sevenc-nanashi Jul 23, 2023
ff164fb
Change: Add deprecate if c23
sevenc-nanashi Jul 23, 2023
6c29ff7
Update: Update test
sevenc-nanashi Jul 23, 2023
5733bf8
Add: Add test exceptation
sevenc-nanashi Jul 23, 2023
b5ae00e
Code: Use out.write
sevenc-nanashi Jul 23, 2023
a9587bb
Fix: Fix condition
sevenc-nanashi Jul 23, 2023
fbe51c6
(WIP) Change: make it like must_use
sevenc-nanashi Jul 28, 2023
6bfb3ff
Change: make it like must_use
sevenc-nanashi Jul 28, 2023
31fff88
Fix: Fix formatting
sevenc-nanashi Jul 28, 2023
a439a3a
Update: Update template.toml
sevenc-nanashi Jul 28, 2023
bb39e3a
Change: deprecated -> deprecated_node
sevenc-nanashi Aug 25, 2023
1a3f566
Change: move finding deperecation node to outer side of a function
sevenc-nanashi Aug 25, 2023
81bf4ca
Refactor: Move to a new function to avoid copy-pasting
sevenc-nanashi Aug 25, 2023
50b6171
Change: Option<String> -> Option<&str>
sevenc-nanashi Aug 27, 2023
05d7035
Change: Result<Option<String>, String> -> Option<String> and warn!
sevenc-nanashi Aug 27, 2023
19db2a4
Change: Use helper
sevenc-nanashi Aug 27, 2023
d13bb58
Merge: master -> add/deprecated
sevenc-nanashi Aug 27, 2023
5b119db
Change: Use helper
sevenc-nanashi Aug 27, 2023
507eaa5
Change: Remove let-else
sevenc-nanashi Aug 27, 2023
5809afc
Fix: Use Some(
sevenc-nanashi Aug 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 3 additions & 35 deletions src/bindgen/ir/annotation.rs
Expand Up @@ -56,11 +56,11 @@ impl AnnotationSet {
}

pub(crate) fn deprecated_node(&self, config: &Config) -> Option<String> {
if config.language != Language::Cython {
if config.language == Language::Cython {
return None;
}

self.deprecated
self.deprecated.clone()
sevenc-nanashi marked this conversation as resolved.
Show resolved Hide resolved
}

pub fn load(attrs: &[syn::Attribute]) -> Result<AnnotationSet, String> {
Expand All @@ -78,39 +78,7 @@ impl AnnotationSet {
.collect();

let must_use = attrs.has_attr_word("must_use");
let deprecated =
// #[deprecated(note = "")]
if let Some(note) = attrs.attr_name_value_lookup("deprecated") {
Some(note)
} else if attrs.has_attr_word("deprecated") {
Some("".to_string())
} else if let Some(attr) = attrs.iter().find(|attr| {
if let Ok(syn::Meta::List(list)) = attr.parse_meta() {
list.path.is_ident("deprecated")
} else {
false
}
}) {
let args: syn::punctuated::Punctuated<syn::MetaNameValue, Token![,]> = attr
.parse_args_with(syn::punctuated::Punctuated::parse_terminated)
.map_err(|e| format!("Couldn't parse deprecated attribute: {}", e.to_string()))?;
let Some(lit) = args
.iter()
.find(|arg| arg.path.is_ident("note"))
.map(|arg| &arg.lit)
else {
return Err("Couldn't parse deprecated attribute: no `note` field".to_string());
};

if let syn::Lit::Str(lit) = lit {
Some(lit.value())
} else {
return Err("deprecated attribute must be a string".to_string());
}
} else {
None
};

let deprecated = attrs.find_deprecated_note()?;
let mut annotations = HashMap::new();

// Look at each line for an annotation
Expand Down
1 change: 0 additions & 1 deletion src/bindgen/ir/enumeration.rs
Expand Up @@ -907,7 +907,6 @@ impl Enum {
}

if let Some(note) = self.annotations.deprecated_node(config) {
let note = self.annotations.deprecated.as_ref().unwrap();
if note.is_empty() {
if let Some(ref anno) = config.structure.deprecated {
write!(out, " {}", anno);
Expand Down
41 changes: 41 additions & 0 deletions src/bindgen/utilities.rs
Expand Up @@ -116,6 +116,47 @@ pub trait SynAttributeHelpers {
})
}

fn find_deprecated_note(&self) -> Result<Option<String>, String> {
sevenc-nanashi marked this conversation as resolved.
Show resolved Hide resolved
let attrs = self.attrs();
// #[deprecated(note = "")]
if let Some(note) = attrs.attr_name_value_lookup("deprecated") {
return Ok(Some(note));
}

// #[deprecated]
if attrs.has_attr_word("deprecated") {
return Ok(Some("".to_string()));
}

// #[deprecated(note = "")]
if let Some(attr) = attrs.iter().find(|attr| {
if let Ok(syn::Meta::List(list)) = attr.parse_meta() {
list.path.is_ident("deprecated")
} else {
false
}
}) {
let args: syn::punctuated::Punctuated<syn::MetaNameValue, Token![,]> = attr
.parse_args_with(syn::punctuated::Punctuated::parse_terminated)
.map_err(|e| format!("Couldn't parse deprecated attribute: {}", e.to_string()))?;
let Some(lit) = args
.iter()
.find(|arg| arg.path.is_ident("note"))
.map(|arg| &arg.lit)
else {
return Err("Couldn't parse deprecated attribute: no `note` field".to_string());
};

return if let syn::Lit::Str(lit) = lit {
Ok(Some(lit.value()))
} else {
Err("deprecated attribute must be a string".to_string())
};
}

Ok(None)
}

fn is_no_mangle(&self) -> bool {
self.has_attr_word("no_mangle")
}
Expand Down