I wrote a procedural macro which can add impl MyTrait for the given struct, but some of the struct are not written by me (third party codes), for example:
// third party struct in Foo.rs
struct Foo {
}
// main.rs
#[derive(MyMacro)]
struct Foo;
Generally you can't do that directly, not for some type T defined outside of your crate.
But what you can do is newtype T, implement your functionality for that type, and implement Deref<Target = T> so you can still access the functionality provided by T.
Usually, we apply a derive macro on a struct to implement traits, which has a high chance to violate the orphan rules if the struct is a third party struct.
I realized that prevent a derive macro from applying on a third party struct directly sound reasonable.