You kept proc_macro::TokenStream in your inner function, though, which completely defeats the purpose and isn't any clearer, so maybe my comment and its example weren't clear enough. It's only a suggestion, so it might not be relevant for small macros. It's really up to you. 
EDIT: Maybe the problem you met is parse_macro_input!, which takes a proc_macro::TokenStream. You can use this instead:
use proc_macro2::{Span, TokenStream};
use syn::parse2;
// ...
pub fn derive_yuck_tokens(input: TokenStream) -> TokenStream {
let input: DeriveInput = parse2(input).unwrap();
// ...
expanded // into() not necessary any more
}
That allows you to send your own test streams to this top function, or use it from other macros (if that's relevant; it might not).
Note that ugly unwrap() I wrote. If you look at the macro you were using, it processes the errors. From the macro expansion, or its doc comments:
match syn::parse::<$Type>($variable) {
Ok(syntax_tree) => syntax_tree,
Err(err) => return proc_macro::TokenStream::from(err.to_compile_error()),
}
So maybe you should return a compile_error(...) instead, in case the result of parse2 is an error.
Another way to handle the parsing is to move the line
let input = parse_macro_input!(input as DeriveInput);
into derive_kitchen_nightmares and have derive_yuck_tokens take input: DeriveInput. In that case, I'm not entirely sure how to feed it with test streams, but you can still share this with other derives if that's relevant.
It's just to show there are alternatives available, but don't feel forced to move anything if you don't need it. I think those are more like general tips than something that will benefit an example like this.
Apart from that, I'm a little on the fence regarding the shadowing of input with a different type, but it's still the input with all the information, after all. But it generally looks good to me, and it handles errors, which is nice. I didn't look in depth, so for what it's worth.