{"record":{"id":"e2b11a65da097634","repo":"apple/pkl","slug":"failed-to-convert-pkl-semver-version-to-org-pkl","errorCode":null,"errorMessage":"Failed to convert `pkl.semver#Version` to `org.pkl.core.Version`.","messagePattern":"Failed to convert `pkl\\.semver#Version` to `org\\.pkl\\.core\\.Version`\\.","errorType":"exception","errorClass":"ConversionException","httpStatus":null,"severity":"error","filePath":"pkl-config-java/src/main/java/org/pkl/config/java/mapper/Conversions.java","lineNumber":226,"sourceCode":"          PClassInfo.Duration, java.time.Duration.class, (value, mapper) -> value.toJavaDuration());\n\n  /** Conversion from {@code pkl.semver#Version} to {@link Version}. */\n  // Cannot leave this to `ConverterFactories.pObjectToDataObject`\n  // because `Version` is part of pkl-core and thus cannot be annotated with `@Named`.\n  public static final Conversion<PObject, Version> pVersionToVersion =\n      Conversion.of(\n          PClassInfo.Version,\n          Version.class,\n          (value, mapper) -> {\n            try {\n              return new Version(\n                  Math.toIntExact((Long) value.getProperty(\"major\")),\n                  Math.toIntExact((Long) value.getProperty(\"minor\")),\n                  Math.toIntExact((Long) value.getProperty(\"patch\")),\n                  (String) value.get(\"preRelease\"),\n                  (String) value.get(\"build\"));\n            } catch (ArithmeticException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.semver#Version` to `org.pkl.core.Version`.\", e);\n            }\n          });\n\n  public static final Conversion<PObject, String> pVersionToString =\n      Conversion.of(\n          PClassInfo.Version,\n          String.class,\n          (value, mapper) -> {\n            var builder = new StringBuilder();\n            builder.append(value.get(\"major\"));\n            builder.append('.');\n            builder.append(value.get(\"minor\"));\n            builder.append('.');\n            builder.append(value.get(\"patch\"));\n            var preRelease = value.get(\"preRelease\");\n            if (preRelease != null) {\n              builder.append('-');","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-config-java/src/main/java/org/pkl/config/java/mapper/Conversions.java#L208-L244","documentation":"Thrown by the Conversions.pVersionToVersion conversion when mapping a Pkl `pkl.semver#Version` object to `org.pkl.core.Version`. The major/minor/patch components are read as Long values and converted via Math.toIntExact; if any component exceeds Integer.MAX_VALUE (or is otherwise out of int range), ArithmeticException is thrown and wrapped in a ConversionException.","triggerScenarios":"A Pkl `pkl.semver#Version` whose `major`, `minor`, or `patch` property is greater than 2147483647 (semver allows arbitrarily large numeric components; Java Version stores them as ints), then mapping a module object to a Java target type with an `org.pkl.core.Version` field or invoking pVersionToVersion directly.","commonSituations":"Synthetic/test versions like `99999999999.0.0`; programmatically generated Pkl values where a build-number was put into major; dates-as-numbers (e.g. `20260908.0.0`) are fine, but values past 2^31 are not.","solutions":["Reduce the offending semver component in the Pkl config to a value that fits in a 32-bit signed integer (<= 2147483647).","If huge components are genuinely needed, map the version to String (pVersionToString) and parse with a library supporting arbitrary-precision components.","Pre-validate in Pkl or Java: check major/minor/patch against Int.MAX_VALUE before mapping.","Audit where the large number comes from — often a concatenation bug (e.g. timestamp in wrong field) in the generating code."],"exampleFix":"// before (pkl)\nversion = import(\"pkl\").semver.Version(99999999999, 0, 0)\n// after (pkl)\nversion = import(\"pkl\").semver.Version(2147483647, 0, 0)","handlingStrategy":"validation","validationCode":"if (version.get(\"major\") instanceof Long m && (m > Integer.MAX_VALUE || m < 0)) throw new IllegalStateException(\"semver major does not fit in int: \" + m); // same for minor/patch","typeGuard":"static boolean fitsJavaVersion(pkl.semver.Version v) { return v.get(\"major\") instanceof Long a && a <= Integer.MAX_VALUE && a >= 0 && v.get(\"minor\") instanceof Long b && b <= Integer.MAX_VALUE && v.get(\"patch\") instanceof Long c && c <= Integer.MAX_VALUE; }","tryCatchPattern":"try { MyConfig cfg = mapper.map(module, MyConfig.class); } catch (ConversionException e) { throw new IllegalStateException(\"Semver component exceeds 32-bit range\", e.getCause()); }","preventionTips":["Keep semver components below 2^31 in config","Constrain the pkl.semver.Version fields with a check in the Pkl schema (major <= 2147483647)","Use string versions if arbitrary-precision components are needed","Audit generated configs for concatenated/timestamp numbers placed in version components"],"tags":["pkl","java","semver","conversion","value-out-of-range"],"backgroundTag":"value-out-of-range","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}