 22305acf66
			
		
	
	
		22305acf66
		
			
		
	
	
	
	
		
			
			# Objective - Some of the "large" crates have sub-crates, usually for things such as macros. - For an example, see [`bevy_ecs_macros` at `bevy_ecs/macros`](4f9f987099/crates/bevy_ecs/macros). - The one crate that does not follow this convention is [`bevy_reflect_derive`](4f9f987099/crates/bevy_reflect/bevy_reflect_derive), which is in the `bevy_reflect/bevy_reflect_derive` folder and not `bevy_reflect/derive` or `bevy_reflect/macros`. ## Solution - Rename folder `bevy_reflect_derive` to `derive`. - I chose to use `derive` instead of `macros` because the crate name itself ends in `_derive`. (One of only two crates to actually use this convention, funnily enough.) ## Testing - Build and test `bevy_reflect` and `bevy_reflect_derive`. - Apply the following patch to `publish.sh` to run it in `--dry-run` mode, to test that the path has been successfully updated: - If you have any security concerns about applying random diffs, feel free to skip this step. Worst case scenario it fails and Cart has to manually publish a few crates. ```bash # Apply patch to make `publish.sh` *not* actually publish anything. git apply path/to/foo.patch # Make `publish.sh` executable. chmod +x tools/publish.sh # Execute `publish.sh`. ./tools/publish.sh ``` ```patch diff --git a/tools/publish.sh b/tools/publish.sh index b020bad28..fbcc09281 100644 --- a/tools/publish.sh +++ b/tools/publish.sh @@ -49,7 +49,7 @@ crates=( if [ -n "$(git status --porcelain)" ]; then echo "You have local changes!" - exit 1 + # exit 1 fi pushd crates @@ -61,15 +61,15 @@ do cp ../LICENSE-APACHE "$crate" pushd "$crate" git add LICENSE-MIT LICENSE-APACHE - cargo publish --no-verify --allow-dirty + cargo publish --no-verify --allow-dirty --dry-run popd - sleep 20 + # sleep 20 done popd echo "Publishing root crate" -cargo publish --allow-dirty +cargo publish --allow-dirty --dry-run echo "Cleaning local state" git reset HEAD --hard ``` --- ## Changelog - Moved `bevy_reflect_derive` from `crates/bevy_reflect/bevy_reflect_derive` to `crates/bevy_reflect/derive`.
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Contains code related to documentation reflection (requires the `documentation` feature).
 | |
| 
 | |
| use bevy_macro_utils::fq_std::FQOption;
 | |
| use proc_macro2::TokenStream;
 | |
| use quote::{quote, ToTokens};
 | |
| use syn::{Attribute, Expr, ExprLit, Lit, Meta};
 | |
| 
 | |
| /// A struct used to represent a type's documentation, if any.
 | |
| ///
 | |
| /// When converted to a [`TokenStream`], this will output an `Option<String>`
 | |
| /// containing the collection of doc comments.
 | |
| #[derive(Default, Clone)]
 | |
| pub(crate) struct Documentation {
 | |
|     docs: Vec<String>,
 | |
| }
 | |
| 
 | |
| impl Documentation {
 | |
|     /// Create a new [`Documentation`] from a type's attributes.
 | |
|     ///
 | |
|     /// This will collect all `#[doc = "..."]` attributes, including the ones generated via `///` and `//!`.
 | |
|     pub fn from_attributes<'a>(attributes: impl IntoIterator<Item = &'a Attribute>) -> Self {
 | |
|         let docs = attributes
 | |
|             .into_iter()
 | |
|             .filter_map(|attr| match &attr.meta {
 | |
|                 Meta::NameValue(pair) if pair.path.is_ident("doc") => {
 | |
|                     if let Expr::Lit(ExprLit {
 | |
|                         lit: Lit::Str(lit), ..
 | |
|                     }) = &pair.value
 | |
|                     {
 | |
|                         Some(lit.value())
 | |
|                     } else {
 | |
|                         None
 | |
|                     }
 | |
|                 }
 | |
|                 _ => None,
 | |
|             })
 | |
|             .collect();
 | |
| 
 | |
|         Self { docs }
 | |
|     }
 | |
| 
 | |
|     /// The full docstring, if any.
 | |
|     pub fn doc_string(&self) -> Option<String> {
 | |
|         if self.docs.is_empty() {
 | |
|             return None;
 | |
|         }
 | |
| 
 | |
|         let len = self.docs.len();
 | |
|         Some(
 | |
|             self.docs
 | |
|                 .iter()
 | |
|                 .enumerate()
 | |
|                 .map(|(index, doc)| {
 | |
|                     if index < len - 1 {
 | |
|                         format!("{doc}\n")
 | |
|                     } else {
 | |
|                         doc.to_owned()
 | |
|                     }
 | |
|                 })
 | |
|                 .collect(),
 | |
|         )
 | |
|     }
 | |
| 
 | |
|     /// Push a new docstring to the collection
 | |
|     pub fn push(&mut self, doc: String) {
 | |
|         self.docs.push(doc);
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ToTokens for Documentation {
 | |
|     fn to_tokens(&self, tokens: &mut TokenStream) {
 | |
|         if let Some(doc) = self.doc_string() {
 | |
|             quote!(#FQOption::Some(#doc)).to_tokens(tokens);
 | |
|         } else {
 | |
|             quote!(#FQOption::None).to_tokens(tokens);
 | |
|         }
 | |
|     }
 | |
| }
 |