-
-
Notifications
You must be signed in to change notification settings - Fork 211
Implementation Policy: Bridges and Mixins
In the past, Sponge had no distinct structural policy beyond a couple of followed "rules" when adding new mixins/interfaces to the various projects. One of these rules, IMixin
-style interfaces, served us well and is followed by many projects out there but leads to hard-to-maintain code when it isn't clear where things are coming from and going to. Likewise prefixing or lack thereof in several Mixins and their injectors/redirectors/etc makes for hard to decipher logs of exactly where problems are at and, on a more alarming level, general comprehension of the codebase. After discussion and coming to terms with this, @gabizou and @Zidane have decided to iron this out with a policy once and for all.
-
Mixin
class names should be prefixed with the Mixin target's name then the wordMixin
followed by_
and finally the Mixin config's name.- Only one config is exempt from this and that is mixins originating from the
core
config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Only one config is exempt from this and that is mixins originating from the
- For multi-target mixins1, names should be prefixed with the most relevant name then the word
Mixin
followed by_
and finally the Mixin config's name.- Only one config is exempt from this and that is mixins originating from the
core
config in SpongeCommon as that is the baseline for the entire Sponge implementation.- Based on this exemption, if you are mixing into
Entity
andTileEntity
to implementDataHolder
from core, the mixin would beDataHolderMixin
2. - Based on this exemption, if you are mixing into
Entity
andTileEntity
to implementDataHolder
from forge, the mixin would beDataHolderMixin_Forge
.
- Based on this exemption, if you are mixing into
- Only one config is exempt from this and that is mixins originating from the
Bridges bridge the gap between Minecraft classes (ex. net.minecraft.world.chunk.Chunk
) and the Sponge implemented code via Mixins (ex. MixinChunk
. There are many times where we need to call methods to perform logic off of those classes and can do so via these distinct interfaces. Replaces legacy IMixin
intefaces (ex. IMixinChunk
).
- Bridge class names should be prefixed with the
Mixin
's target name then the word "Bridge
" followed by an underscore and finally the Mixin config's name.- Only one config is exempt from this and that is bridges originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Based on this exemption, if you are writing a bridge for
ChunkMixin
from core, the bridge would beChunkBridge
. - Based on this exemption, if you are writing a bridge for
ChunkMixin_Forge
from forge, the bridge would beChunkBridge_Forge
.
- Based on this exemption, if you are writing a bridge for
- Only one config is exempt from this and that is bridges originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- For multi-target bridges, names should be prefixed with the most relevant name then the word
Bridge
followed by_
and finally the Mixin config's name.- Only one config is exempt from this and that is bridges originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Based on this exemption, if you are mixing into
Entity
andTileEntity
to implement Creator tracking in core, the bridge would beOwnershipTrackableBridge
. - Based on this exemption, if you are mixing into
Entity
andTileEntity
to implement Creator tracking in forge, the bridge would beOwnershipTrackableBridge_Forge
.
- Based on this exemption, if you are mixing into
- Only one config is exempt from this and that is bridges originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Bridge method names should be prefixed with the Mixin config's name followed by the word
bridge
followed by an additional$
.- Only one config is exempt from this and that is bridges originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Based on this exemption,
setTransform
inEntityBridge
from core would be namedbridge$setTransform
. - Based on this exemption,
setTransform
inEntityBridge_Forge
from forge would be namedforgeBridge$setTransform
.
- Based on this exemption,
- Only one config is exempt from this and that is bridges originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Bridges are not allowed to extend from other Bridges, even if the Bridge is effectively a subclass of another Bridge (ex.
ChunkBridge_Forge
is effectively a child ofChunkBridge
)- The reasoning for this is to prevent potential corner cases where a developer inadvertently performs a cast on code that will not exist on the platform currently running it.
- For example, casting
ChunkProviderClient
toChunkProviderServerBridge
simply to call a method inherited fromChunkProviderBridge
.
- For example, casting
- The reasoning for this is to prevent potential corner cases where a developer inadvertently performs a cast on code that will not exist on the platform currently running it.
Injections "inject" Sponge logic into classes at explictly defined targets.
- Injection method names should be prefixed with the Mixin config's name followed by an appropriate method name for the context.
- Only one config is exempt from this and that is injections originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation. Instead we make this impl.
- Based on this exemption, an injection into
onUpdate
ofEntity
inEntityMixin
in core would be namedimpl$onUpdate
. - Based on this exemption, an injection into
onUpdate
ofEntity
inEntityMixin
in forge would be namedforge$onUpdate
.
- Based on this exemption, an injection into
- Only one config is exempt from this and that is injections originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation. Instead we make this impl.
Accessor mixins allow Sponge logic to access methods and fields in Minecraft classes whose visibility would not be available otherwise.
-
Accessor
class names should be prefixed with the Mixin target's name then the wordAccessor
followed by_
and finally the Mixin config's name.- Only one config is exempt from this and that is accessors originating from the
core
config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Only one config is exempt from this and that is accessors originating from the
- Accessor method names should be prefixed with the
Mixin
config's name followed by the wordaccessor
followed by an additional$
.- Only one config is exempt from this and that is accessors originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.
- Based on this exemption,
rand
inEntity
from core would be namedaccessor$getRandom()
. - Based on this exemption,
rand
inEntity
from forge would be namedforgeAccessor$getRandom()
.
- Based on this exemption,
- Only one config is exempt from this and that is accessors originating from the core config in SpongeCommon as that is the baseline for the entire Sponge implementation.