This makes various improvements to help truffle do partial evaluation of code related to typechecking. * Split `UnionTypeNode` into `UnionTypeNodeExploded` and `UnionTypeNodeLooped` to avoid gigantic graphs. This especially helps in the case of typealiases, because they are inlined into their usage sites. * Move constraint-failure exception construction in `TypeConstraintNode` behind `@TruffleBoundary` helper methods instead of `transferToInterpreterAndInvalidate`, since building the exception is a rare, off-hot-path operation. * Move `ClassNode`'s one-time class-initialization logic behind a `@TruffleBoundary` method (`initClass`), store `VmLanguage` as a field instead of recomputing it via `VmLanguage.get(this)`, and use `transferToInterpreterAndInvalidate` since class init never needs to re-run on the compiled path. * Pass `VmLanguage` explicitly into `TypeTestNode` and `ClassNode` (via `AstBuilder`) rather than resolving it with `VmLanguage.get(this)` on a hot path. * Fix various issues where the partial evaluator determines that a frame should have been materialized but was not. * Pre-initialize call targets in `ObjectMember.setMemberNode()` and `FunctionLiteralNode` so the first invocation doesn't trigger a compilation invalidation. * Fix truffle node tree issues (don't mark `@RootNode` as child, deepCopy instead of passing an already adopted node). * Remove unnecessary interpreter transfers when throwing type mismatch exceptions
Core implementation of the Pkl language. Includes Java APIs for embedding the language into JVM applications, and for building libraries and tools on top of the language.