diff --git a/rewrite-core/src/main/java/org/openrewrite/rpc/DynamicDispatchRpcCodec.java b/rewrite-core/src/main/java/org/openrewrite/rpc/DynamicDispatchRpcCodec.java index 92e98fd5805..b8219a8101f 100644 --- a/rewrite-core/src/main/java/org/openrewrite/rpc/DynamicDispatchRpcCodec.java +++ b/rewrite-core/src/main/java/org/openrewrite/rpc/DynamicDispatchRpcCodec.java @@ -37,6 +37,25 @@ public abstract class DynamicDispatchRpcCodec implements RpcCodec { } } + /** + * Verifies that at least one {@link DynamicDispatchRpcCodec} is registered for the + * given source file type. Call this at startup to fail fast when the ServiceLoader + * has not discovered the expected codec implementations (e.g. missing module on the + * classpath). + * + * @param sourceFileType The fully-qualified class name of the source file type + * (e.g. {@code "org.openrewrite.json.tree.Json$Document"}). + * @throws IllegalStateException if no codec is registered for the given type. + */ + public static void requireCodecFor(String sourceFileType) { + if (!CODEC_BY_TYPE.containsKey(sourceFileType)) { + throw new IllegalStateException( + "No DynamicDispatchRpcCodec registered for '" + sourceFileType + "'. " + + "The ServiceLoader found zero DynamicDispatchRpcCodec implementations for this type. " + + "Ensure that the module providing this codec is on the classpath."); + } + } + @SuppressWarnings("unchecked") public static @Nullable RpcCodec getCodec(Object t, @Nullable String sourceFileType) { if (sourceFileType == null) { diff --git a/rewrite-javascript/src/main/java/org/openrewrite/javascript/rpc/JavaScriptRewriteRpc.java b/rewrite-javascript/src/main/java/org/openrewrite/javascript/rpc/JavaScriptRewriteRpc.java index 8b8343556d9..0e2c7a151af 100644 --- a/rewrite-javascript/src/main/java/org/openrewrite/javascript/rpc/JavaScriptRewriteRpc.java +++ b/rewrite-javascript/src/main/java/org/openrewrite/javascript/rpc/JavaScriptRewriteRpc.java @@ -23,10 +23,12 @@ import org.openrewrite.javascript.JavaScriptParser; import org.openrewrite.javascript.internal.rpc.JavaScriptValidator; import org.openrewrite.javascript.tree.JS; +import org.openrewrite.json.tree.Json; import org.openrewrite.marker.Markers; import org.openrewrite.tree.ParseError; import org.openrewrite.marketplace.RecipeBundleResolver; import org.openrewrite.marketplace.RecipeMarketplace; +import org.openrewrite.rpc.DynamicDispatchRpcCodec; import org.openrewrite.rpc.RewriteRpc; import org.openrewrite.rpc.RewriteRpcProcess; import org.openrewrite.rpc.RewriteRpcProcessManager; @@ -344,6 +346,8 @@ public Builder workingDirectory(@Nullable Path workingDirectory) { @Override public JavaScriptRewriteRpc get() { + DynamicDispatchRpcCodec.requireCodecFor(Json.Document.class.getName()); + Stream<@Nullable String> cmd; if (inspectBrk != null) {