I have recently refactored my math library PRBMath to use user-defined value types UD60x18 and SD59x18 instead of the traditional library syntax.
I had a pleasant experience so far, but I just bumped into a major limitation.
I wanted to modularize the code base, i.e. to split the logic in my UD60x18.sol and SD59x18.sol files into multiple sub-files, like this:
└── ud60x18
├── Casting.sol
├── Conversions.sol
├── Errors.sol
├── Helpers.sol
├── Math.sol
└── ValueType.sol
Where the actual type UD60x18 is defined in ValueType.sol and all other files import it from there.
I worked on this on the modularization branch, but I bumped into this compiler error:
Compiler run failed
error[4117]: TypeError: Can only use “global” with types defined in the same source unit at file level.
I think that this is a severe limitation because it prevents user from modularizing their code bases. I am basically required to maintain a monolith file in UD60x18.sol, which is generally a bad practice in programming.
Therefore, my feature request from you is to lift this limitation, and allow developers to use the using for ... global directive in files other than that in which the value type has been defined. I wonder if something like this would work:
- The compiler finds the first use of
using for ... globalby searching through the imports - The compiler accepts the first use of the directive even if it’s not in the same file as the value type
- If there is another declaration of the directive, the compiler throws an error
Update: I have found a way to enable some modularization by bundling the code in the Helpers.sol and the Math.sol file in the ValueType.sol. This works because apparently circular imports (at least with specific symbols) are allowed!? See commit 0714c9.
Whatever the case, I will not delete this post because I believe this is an important feature that is missing. I would prefer to modularize the helpers and the math functions in separate files.