Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deserialization support for AWS LSP extended InitializeResult #49

Merged
merged 2 commits into from
Oct 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugin/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -19,6 +23,9 @@ public class AmazonQLspServerBuilder extends Builder<AmazonQLspServer> {
@Override
public final Launcher<AmazonQLspServer> create() {
super.setRemoteInterface(AmazonQLspServer.class);
super.configureGson(builder -> {
builder.registerTypeAdapterFactory(new QLspTypeAdapterFactory());
});
Launcher<AmazonQLspServer> launcher = super.create();
LspProvider.setServer(AmazonQLspServer.class, launcher.getRemoteProxy());
return launcher;
Expand All @@ -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);
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had everything in this PR ready in a branch except for this class. Thanks for looking into it!

if (type.getRawType() == InitializeResult.class) {
final TypeAdapter<InitializeResult> delegate = (TypeAdapter<InitializeResult>) gson.getDelegateAdapter(this, type);

return (TypeAdapter<T>) new TypeAdapter<InitializeResult>() {
@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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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) { }
Original file line number Diff line number Diff line change
@@ -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) { }
Original file line number Diff line number Diff line change
@@ -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) { }
Original file line number Diff line number Diff line change
@@ -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<QuickActionsCommandGroup> quickActionsCommandGroups) { }
Original file line number Diff line number Diff line change
@@ -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<Command> commands) { }