Helper to smooth transition between D1 and D2 runtime behaviours regarding array stomping. In D2 appending to array slice after length has been changed results in allocating new array to prevent overwriting old data.
Mixin helper to generate proper opCmp declaration. It differs between D1 and D2 runtime and not matching exact signature will result in weird segmentation faults from inside the runtime.
Mixin helper to generate proper opEquals declaration. It differs between D1 and D2 runtime and not matching exact signature will result in the default version, defined by the compiler, to be silently called instead.
Utility intended to help with situations when generic function had to return its templated argument which could turn out to be a static array. In D1 that would require slicing such argument as returning static array types is not allowed. In D2, however, static arrays are value types and such slicing is neither necessary nor memory-safe.
In D1, typeof(this) is always a reference type to the aggregate, while in D2 it's the actual type of the aggregate. It doesn't change anything for classes which are reference types, but for struct and unions, it yields a pointer instead of the actual type. d1tod2fix does the conversion automatically for structs, but there are places where manual intervention is needed (e.g. mixin templates).
Checks (non-transitively) if type is mutable
This modules contains utilities and aliases that are used during D1->D2 transition process. Idea is to define single module that contains wrapper aliases / structures and switch all code to use it. Once actual porting time comes it will be enough to simply change version in this module.
version(D2) can't be used because D2 code can't be even parsed by D1 compiler, resorting to commenting out because of that.