From f648b5c6602d6dffbf715f3883c01f994c92ea4f Mon Sep 17 00:00:00 2001 From: Jonathan Breedlove Date: Wed, 2 Oct 2024 14:01:46 -0700 Subject: [PATCH] Deserialization support for AWS LSP extended InitializeResult (#49) --- plugin/META-INF/MANIFEST.MF | 2 +- .../amazonq/lsp/AmazonQLspServerBuilder.java | 16 +++++++ .../amazonq/lsp/QLspTypeAdapterFactory.java | 42 +++++++++++++++++++ .../model/AwsExtendedInitializeResult.java | 18 ++++++++ .../lsp/model/AwsServerCapabilities.java | 6 +++ .../amazonq/lsp/model/ChatOptions.java | 6 +++ .../eclipse/amazonq/lsp/model/Command.java | 6 +++ .../amazonq/lsp/model/QuickActions.java | 8 ++++ .../lsp/model/QuickActionsCommandGroup.java | 8 ++++ 9 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/QLspTypeAdapterFactory.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsExtendedInitializeResult.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsServerCapabilities.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/ChatOptions.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/Command.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActions.java create mode 100644 plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActionsCommandGroup.java diff --git a/plugin/META-INF/MANIFEST.MF b/plugin/META-INF/MANIFEST.MF index 0f673190..8fa783a1 100644 --- a/plugin/META-INF/MANIFEST.MF +++ b/plugin/META-INF/MANIFEST.MF @@ -115,4 +115,4 @@ Bundle-Classpath: ., target/dependency/utils-2.25.33.jar, target/dependency/xml-apis-ext-1.3.04.jar, target/dependency/xmlgraphics-commons-2.9.jar, - target/dependency/xz-1.9.jar + target/dependency/xz-1.9.jar \ No newline at end of file diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServerBuilder.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServerBuilder.java index bd2685df..1b2e264f 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServerBuilder.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServerBuilder.java @@ -10,7 +10,11 @@ import org.eclipse.lsp4j.jsonrpc.MessageConsumer; import org.eclipse.lsp4j.jsonrpc.messages.Message; import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage; +import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage; +import software.aws.toolkits.eclipse.amazonq.lsp.model.AwsExtendedInitializeResult; +import software.aws.toolkits.eclipse.amazonq.lsp.model.Command; +import software.aws.toolkits.eclipse.amazonq.lsp.model.QuickActionsCommandGroup; import software.aws.toolkits.eclipse.amazonq.providers.LspProvider; import software.aws.toolkits.eclipse.amazonq.util.ClientMetadata; @@ -19,6 +23,9 @@ public class AmazonQLspServerBuilder extends Builder { @Override public final Launcher create() { super.setRemoteInterface(AmazonQLspServer.class); + super.configureGson(builder -> { + builder.registerTypeAdapterFactory(new QLspTypeAdapterFactory()); + }); Launcher launcher = super.create(); LspProvider.setServer(AmazonQLspServer.class, launcher.getRemoteProxy()); return launcher; @@ -31,6 +38,15 @@ protected final MessageConsumer wrapMessageConsumer(final MessageConsumer consum InitializeParams initParams = (InitializeParams) ((RequestMessage) message).getParams(); initParams.setClientInfo(new ClientInfo(ClientMetadata.getPluginName(), ClientMetadata.getPluginVersion())); } + if (message instanceof ResponseMessage && ((ResponseMessage) message).getResult() instanceof AwsExtendedInitializeResult) { + AwsExtendedInitializeResult result = (AwsExtendedInitializeResult) ((ResponseMessage) message).getResult(); + for (QuickActionsCommandGroup commandGroups : result.getAwsServerCapabilities().chatOptions().quickActions().quickActionsCommandGroups()) { + for (Command command : commandGroups.commands()) { + System.out.println("Command: " + command.command()); + System.out.println("Description: " + command.description()); + } + } + } consumer.consume(message); }); } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/QLspTypeAdapterFactory.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/QLspTypeAdapterFactory.java new file mode 100644 index 00000000..ea055ab6 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/QLspTypeAdapterFactory.java @@ -0,0 +1,42 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp; + +import java.io.IOException; + +import org.eclipse.lsp4j.InitializeResult; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import software.aws.toolkits.eclipse.amazonq.lsp.model.AwsExtendedInitializeResult; + +public class QLspTypeAdapterFactory implements TypeAdapterFactory { + + @Override + @SuppressWarnings("unchecked") + public final TypeAdapter create(final Gson gson, final TypeToken type) { + if (type.getRawType() == InitializeResult.class) { + final TypeAdapter delegate = (TypeAdapter) gson.getDelegateAdapter(this, type); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(final JsonWriter out, final InitializeResult value) throws IOException { + delegate.write(out, value); + } + + @Override + public InitializeResult read(final JsonReader in) throws IOException { + return gson.fromJson(in, AwsExtendedInitializeResult.class); + } + }; + } + return null; + } + +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsExtendedInitializeResult.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsExtendedInitializeResult.java new file mode 100644 index 00000000..d0bbc134 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsExtendedInitializeResult.java @@ -0,0 +1,18 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp.model; + +import org.eclipse.lsp4j.InitializeResult; + +public class AwsExtendedInitializeResult extends InitializeResult { + private AwsServerCapabilities awsServerCapabilities; + + public final AwsServerCapabilities getAwsServerCapabilities() { + return awsServerCapabilities; + } + + public final void setAwsServerCapabilities(final AwsServerCapabilities awsServerCapabilities) { + this.awsServerCapabilities = awsServerCapabilities; + } +} diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsServerCapabilities.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsServerCapabilities.java new file mode 100644 index 00000000..867f3924 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/AwsServerCapabilities.java @@ -0,0 +1,6 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp.model; + +public record AwsServerCapabilities(ChatOptions chatOptions) { } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/ChatOptions.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/ChatOptions.java new file mode 100644 index 00000000..55ceff08 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/ChatOptions.java @@ -0,0 +1,6 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp.model; + +public record ChatOptions(QuickActions quickActions) { } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/Command.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/Command.java new file mode 100644 index 00000000..589aacc8 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/Command.java @@ -0,0 +1,6 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp.model; + +public record Command(String command, String description) { } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActions.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActions.java new file mode 100644 index 00000000..9d776cb0 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActions.java @@ -0,0 +1,8 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp.model; + +import java.util.List; + +public record QuickActions(List quickActionsCommandGroups) { } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActionsCommandGroup.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActionsCommandGroup.java new file mode 100644 index 00000000..35446ff2 --- /dev/null +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/model/QuickActionsCommandGroup.java @@ -0,0 +1,8 @@ +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.eclipse.amazonq.lsp.model; + +import java.util.List; + +public record QuickActionsCommandGroup(List commands) { }