Internal change
PiperOrigin-RevId: 383873010
Change-Id: Iea5806e6603f3af9c581dda0931afa18190de28f
diff --git a/java/org/eclipse/lsp4j/AbstractTextDocumentRegistrationAndWorkDoneProgressOptions.java b/java/org/eclipse/lsp4j/AbstractTextDocumentRegistrationAndWorkDoneProgressOptions.java
new file mode 100644
index 0000000..bf5de50
--- /dev/null
+++ b/java/org/eclipse/lsp4j/AbstractTextDocumentRegistrationAndWorkDoneProgressOptions.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.DocumentFilter;
+import org.eclipse.lsp4j.TextDocumentRegistrationOptions;
+import org.eclipse.lsp4j.WorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Options to signal work done progress support in server capabilities and TextDocumentRegistrationOptions.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public abstract class AbstractTextDocumentRegistrationAndWorkDoneProgressOptions extends TextDocumentRegistrationOptions implements WorkDoneProgressOptions {
+ private Boolean workDoneProgress;
+
+ public AbstractTextDocumentRegistrationAndWorkDoneProgressOptions() {
+ }
+
+ public AbstractTextDocumentRegistrationAndWorkDoneProgressOptions(final List<DocumentFilter> documentSelector) {
+ super(documentSelector);
+ }
+
+ @Pure
+ @Override
+ public Boolean getWorkDoneProgress() {
+ return this.workDoneProgress;
+ }
+
+ public void setWorkDoneProgress(final Boolean workDoneProgress) {
+ this.workDoneProgress = workDoneProgress;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", this.workDoneProgress);
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ AbstractTextDocumentRegistrationAndWorkDoneProgressOptions other = (AbstractTextDocumentRegistrationAndWorkDoneProgressOptions) obj;
+ if (this.workDoneProgress == null) {
+ if (other.workDoneProgress != null)
+ return false;
+ } else if (!this.workDoneProgress.equals(other.workDoneProgress))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.workDoneProgress== null) ? 0 : this.workDoneProgress.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/AbstractWorkDoneProgressOptions.java b/java/org/eclipse/lsp4j/AbstractWorkDoneProgressOptions.java
new file mode 100644
index 0000000..f32ff60
--- /dev/null
+++ b/java/org/eclipse/lsp4j/AbstractWorkDoneProgressOptions.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Options to signal work done progress support in server capabilities.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public abstract class AbstractWorkDoneProgressOptions implements WorkDoneProgressOptions {
+ private Boolean workDoneProgress;
+
+ @Pure
+ @Override
+ public Boolean getWorkDoneProgress() {
+ return this.workDoneProgress;
+ }
+
+ public void setWorkDoneProgress(final Boolean workDoneProgress) {
+ this.workDoneProgress = workDoneProgress;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", this.workDoneProgress);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ AbstractWorkDoneProgressOptions other = (AbstractWorkDoneProgressOptions) obj;
+ if (this.workDoneProgress == null) {
+ if (other.workDoneProgress != null)
+ return false;
+ } else if (!this.workDoneProgress.equals(other.workDoneProgress))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.workDoneProgress== null) ? 0 : this.workDoneProgress.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/AnnotatedTextEdit.java b/java/org/eclipse/lsp4j/AnnotatedTextEdit.java
new file mode 100644
index 0000000..89f3e1f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/AnnotatedTextEdit.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A special text edit with an additional change annotation.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class AnnotatedTextEdit extends TextEdit {
+ /**
+ * The actual annotation identifier
+ */
+ @NonNull
+ private String annotationId;
+
+ public AnnotatedTextEdit() {
+ }
+
+ public AnnotatedTextEdit(@NonNull final Range range, @NonNull final String newText, @NonNull final String annotationId) {
+ super(range, newText);
+ this.annotationId = Preconditions.<String>checkNotNull(annotationId, "annotationId");
+ }
+
+ /**
+ * The actual annotation identifier
+ */
+ @Pure
+ @NonNull
+ public String getAnnotationId() {
+ return this.annotationId;
+ }
+
+ /**
+ * The actual annotation identifier
+ */
+ public void setAnnotationId(@NonNull final String annotationId) {
+ this.annotationId = Preconditions.checkNotNull(annotationId, "annotationId");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("annotationId", this.annotationId);
+ b.add("range", getRange());
+ b.add("newText", getNewText());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ AnnotatedTextEdit other = (AnnotatedTextEdit) obj;
+ if (this.annotationId == null) {
+ if (other.annotationId != null)
+ return false;
+ } else if (!this.annotationId.equals(other.annotationId))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.annotationId== null) ? 0 : this.annotationId.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ApplyWorkspaceEditParams.java b/java/org/eclipse/lsp4j/ApplyWorkspaceEditParams.java
new file mode 100644
index 0000000..8396542
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ApplyWorkspaceEditParams.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkspaceEdit;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The workspace/applyEdit request is sent from the server to the client to modify resource on the client side.
+ */
+@SuppressWarnings("all")
+public class ApplyWorkspaceEditParams {
+ /**
+ * The edits to apply.
+ */
+ @NonNull
+ private WorkspaceEdit edit;
+
+ /**
+ * An optional label of the workspace edit. This label is
+ * presented in the user interface for example on an undo
+ * stack to undo the workspace edit.
+ */
+ private String label;
+
+ public ApplyWorkspaceEditParams() {
+ }
+
+ public ApplyWorkspaceEditParams(@NonNull final WorkspaceEdit edit) {
+ this.edit = Preconditions.<WorkspaceEdit>checkNotNull(edit, "edit");
+ }
+
+ public ApplyWorkspaceEditParams(@NonNull final WorkspaceEdit edit, final String label) {
+ this(edit);
+ this.label = label;
+ }
+
+ /**
+ * The edits to apply.
+ */
+ @Pure
+ @NonNull
+ public WorkspaceEdit getEdit() {
+ return this.edit;
+ }
+
+ /**
+ * The edits to apply.
+ */
+ public void setEdit(@NonNull final WorkspaceEdit edit) {
+ this.edit = Preconditions.checkNotNull(edit, "edit");
+ }
+
+ /**
+ * An optional label of the workspace edit. This label is
+ * presented in the user interface for example on an undo
+ * stack to undo the workspace edit.
+ */
+ @Pure
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * An optional label of the workspace edit. This label is
+ * presented in the user interface for example on an undo
+ * stack to undo the workspace edit.
+ */
+ public void setLabel(final String label) {
+ this.label = label;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("edit", this.edit);
+ b.add("label", this.label);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ApplyWorkspaceEditParams other = (ApplyWorkspaceEditParams) obj;
+ if (this.edit == null) {
+ if (other.edit != null)
+ return false;
+ } else if (!this.edit.equals(other.edit))
+ return false;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.edit== null) ? 0 : this.edit.hashCode());
+ return prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ApplyWorkspaceEditResponse.java b/java/org/eclipse/lsp4j/ApplyWorkspaceEditResponse.java
new file mode 100644
index 0000000..134c195
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ApplyWorkspaceEditResponse.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ApplyWorkspaceEditResponse {
+ /**
+ * Indicates whether the edit was applied or not.
+ */
+ private boolean applied;
+
+ /**
+ * An optional textual description for why the edit was not applied.
+ * This may be used by the server for diagnostic logging or to provide
+ * a suitable error for a request that triggered the edit.
+ */
+ private String failureReason;
+
+ /**
+ * Depending on the client's failure handling strategy `failedChange`
+ * might contain the index of the change that failed. This property is
+ * only available if the client signals a {@link WorkspaceEditCapabilities#failureHandling}
+ * strategy in its client capabilities.
+ */
+ private Integer failedChange;
+
+ public ApplyWorkspaceEditResponse() {
+ }
+
+ public ApplyWorkspaceEditResponse(final boolean applied) {
+ this.applied = applied;
+ }
+
+ /**
+ * Indicates whether the edit was applied or not.
+ */
+ @Pure
+ public boolean isApplied() {
+ return this.applied;
+ }
+
+ /**
+ * Indicates whether the edit was applied or not.
+ */
+ public void setApplied(final boolean applied) {
+ this.applied = applied;
+ }
+
+ /**
+ * An optional textual description for why the edit was not applied.
+ * This may be used by the server for diagnostic logging or to provide
+ * a suitable error for a request that triggered the edit.
+ */
+ @Pure
+ public String getFailureReason() {
+ return this.failureReason;
+ }
+
+ /**
+ * An optional textual description for why the edit was not applied.
+ * This may be used by the server for diagnostic logging or to provide
+ * a suitable error for a request that triggered the edit.
+ */
+ public void setFailureReason(final String failureReason) {
+ this.failureReason = failureReason;
+ }
+
+ /**
+ * Depending on the client's failure handling strategy `failedChange`
+ * might contain the index of the change that failed. This property is
+ * only available if the client signals a {@link WorkspaceEditCapabilities#failureHandling}
+ * strategy in its client capabilities.
+ */
+ @Pure
+ public Integer getFailedChange() {
+ return this.failedChange;
+ }
+
+ /**
+ * Depending on the client's failure handling strategy `failedChange`
+ * might contain the index of the change that failed. This property is
+ * only available if the client signals a {@link WorkspaceEditCapabilities#failureHandling}
+ * strategy in its client capabilities.
+ */
+ public void setFailedChange(final Integer failedChange) {
+ this.failedChange = failedChange;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("applied", this.applied);
+ b.add("failureReason", this.failureReason);
+ b.add("failedChange", this.failedChange);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ApplyWorkspaceEditResponse other = (ApplyWorkspaceEditResponse) obj;
+ if (other.applied != this.applied)
+ return false;
+ if (this.failureReason == null) {
+ if (other.failureReason != null)
+ return false;
+ } else if (!this.failureReason.equals(other.failureReason))
+ return false;
+ if (this.failedChange == null) {
+ if (other.failedChange != null)
+ return false;
+ } else if (!this.failedChange.equals(other.failedChange))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (this.applied ? 1231 : 1237);
+ result = prime * result + ((this.failureReason== null) ? 0 : this.failureReason.hashCode());
+ return prime * result + ((this.failedChange== null) ? 0 : this.failedChange.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyCapabilities.java b/java/org/eclipse/lsp4j/CallHierarchyCapabilities.java
new file mode 100644
index 0000000..2044f67
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyCapabilities.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the {@code textDocument/prepareCallHierarchy}.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyCapabilities extends DynamicRegistrationCapabilities {
+ public CallHierarchyCapabilities() {
+ }
+
+ public CallHierarchyCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyIncomingCall.java b/java/org/eclipse/lsp4j/CallHierarchyIncomingCall.java
new file mode 100644
index 0000000..6067078
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyIncomingCall.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.CallHierarchyItem;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents an incoming call, e.g. a caller of a method or constructor.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyIncomingCall {
+ /**
+ * The item that makes the call.
+ */
+ @NonNull
+ private CallHierarchyItem from;
+
+ /**
+ * The range at which at which the calls appears. This is relative to the caller
+ * denoted by {@link #from}.
+ */
+ @NonNull
+ private List<Range> fromRanges;
+
+ public CallHierarchyIncomingCall() {
+ }
+
+ public CallHierarchyIncomingCall(@NonNull final CallHierarchyItem from, @NonNull final List<Range> fromRanges) {
+ this.from = Preconditions.<CallHierarchyItem>checkNotNull(from, "from");
+ this.fromRanges = Preconditions.<List<Range>>checkNotNull(fromRanges, "fromRanges");
+ }
+
+ /**
+ * The item that makes the call.
+ */
+ @Pure
+ @NonNull
+ public CallHierarchyItem getFrom() {
+ return this.from;
+ }
+
+ /**
+ * The item that makes the call.
+ */
+ public void setFrom(@NonNull final CallHierarchyItem from) {
+ this.from = Preconditions.checkNotNull(from, "from");
+ }
+
+ /**
+ * The range at which at which the calls appears. This is relative to the caller
+ * denoted by {@link #from}.
+ */
+ @Pure
+ @NonNull
+ public List<Range> getFromRanges() {
+ return this.fromRanges;
+ }
+
+ /**
+ * The range at which at which the calls appears. This is relative to the caller
+ * denoted by {@link #from}.
+ */
+ public void setFromRanges(@NonNull final List<Range> fromRanges) {
+ this.fromRanges = Preconditions.checkNotNull(fromRanges, "fromRanges");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("from", this.from);
+ b.add("fromRanges", this.fromRanges);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CallHierarchyIncomingCall other = (CallHierarchyIncomingCall) obj;
+ if (this.from == null) {
+ if (other.from != null)
+ return false;
+ } else if (!this.from.equals(other.from))
+ return false;
+ if (this.fromRanges == null) {
+ if (other.fromRanges != null)
+ return false;
+ } else if (!this.fromRanges.equals(other.fromRanges))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.from== null) ? 0 : this.from.hashCode());
+ return prime * result + ((this.fromRanges== null) ? 0 : this.fromRanges.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyIncomingCallsParams.java b/java/org/eclipse/lsp4j/CallHierarchyIncomingCallsParams.java
new file mode 100644
index 0000000..316831b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyIncomingCallsParams.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CallHierarchyItem;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameter of a `callHierarchy/incomingCalls` request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyIncomingCallsParams extends WorkDoneProgressAndPartialResultParams {
+ @NonNull
+ private CallHierarchyItem item;
+
+ public CallHierarchyIncomingCallsParams() {
+ }
+
+ public CallHierarchyIncomingCallsParams(@NonNull final CallHierarchyItem item) {
+ this.item = Preconditions.<CallHierarchyItem>checkNotNull(item, "item");
+ }
+
+ @Pure
+ @NonNull
+ public CallHierarchyItem getItem() {
+ return this.item;
+ }
+
+ public void setItem(@NonNull final CallHierarchyItem item) {
+ this.item = Preconditions.checkNotNull(item, "item");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("item", this.item);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CallHierarchyIncomingCallsParams other = (CallHierarchyIncomingCallsParams) obj;
+ if (this.item == null) {
+ if (other.item != null)
+ return false;
+ } else if (!this.item.equals(other.item))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.item== null) ? 0 : this.item.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyItem.java b/java/org/eclipse/lsp4j/CallHierarchyItem.java
new file mode 100644
index 0000000..87108fd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyItem.java
@@ -0,0 +1,297 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.SymbolKind;
+import org.eclipse.lsp4j.SymbolTag;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The result of a {@code textDocument/prepareCallHierarchy} request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyItem {
+ /**
+ * The name of the item targeted by the call hierarchy request.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * More detail for this item, e.g the signature of a function.
+ */
+ private String detail;
+
+ /**
+ * The kind of this item.
+ */
+ @NonNull
+ private SymbolKind kind;
+
+ /**
+ * Tags for this item.
+ */
+ private List<SymbolTag> tags;
+
+ /**
+ * The resource identifier of this item.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the the {@link CallHierarchyItem#getRange range}.
+ */
+ @NonNull
+ private Range selectionRange;
+
+ /**
+ * A data entry field that is preserved between a call hierarchy prepare and
+ * incoming calls or outgoing calls requests.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ /**
+ * The name of the item targeted by the call hierarchy request.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the item targeted by the call hierarchy request.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * More detail for this item, e.g the signature of a function.
+ */
+ @Pure
+ public String getDetail() {
+ return this.detail;
+ }
+
+ /**
+ * More detail for this item, e.g the signature of a function.
+ */
+ public void setDetail(final String detail) {
+ this.detail = detail;
+ }
+
+ /**
+ * The kind of this item.
+ */
+ @Pure
+ @NonNull
+ public SymbolKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of this item.
+ */
+ public void setKind(@NonNull final SymbolKind kind) {
+ this.kind = Preconditions.checkNotNull(kind, "kind");
+ }
+
+ /**
+ * Tags for this item.
+ */
+ @Pure
+ public List<SymbolTag> getTags() {
+ return this.tags;
+ }
+
+ /**
+ * Tags for this item.
+ */
+ public void setTags(final List<SymbolTag> tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * The resource identifier of this item.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The resource identifier of this item.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the the {@link CallHierarchyItem#getRange range}.
+ */
+ @Pure
+ @NonNull
+ public Range getSelectionRange() {
+ return this.selectionRange;
+ }
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the the {@link CallHierarchyItem#getRange range}.
+ */
+ public void setSelectionRange(@NonNull final Range selectionRange) {
+ this.selectionRange = Preconditions.checkNotNull(selectionRange, "selectionRange");
+ }
+
+ /**
+ * A data entry field that is preserved between a call hierarchy prepare and
+ * incoming calls or outgoing calls requests.
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * A data entry field that is preserved between a call hierarchy prepare and
+ * incoming calls or outgoing calls requests.
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("detail", this.detail);
+ b.add("kind", this.kind);
+ b.add("tags", this.tags);
+ b.add("uri", this.uri);
+ b.add("range", this.range);
+ b.add("selectionRange", this.selectionRange);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CallHierarchyItem other = (CallHierarchyItem) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.detail == null) {
+ if (other.detail != null)
+ return false;
+ } else if (!this.detail.equals(other.detail))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.tags == null) {
+ if (other.tags != null)
+ return false;
+ } else if (!this.tags.equals(other.tags))
+ return false;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.selectionRange == null) {
+ if (other.selectionRange != null)
+ return false;
+ } else if (!this.selectionRange.equals(other.selectionRange))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.detail== null) ? 0 : this.detail.hashCode());
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.tags== null) ? 0 : this.tags.hashCode());
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.selectionRange== null) ? 0 : this.selectionRange.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyOptions.java b/java/org/eclipse/lsp4j/CallHierarchyOptions.java
new file mode 100644
index 0000000..f081f33
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyOptions.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyOutgoingCall.java b/java/org/eclipse/lsp4j/CallHierarchyOutgoingCall.java
new file mode 100644
index 0000000..f506a70
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyOutgoingCall.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.CallHierarchyItem;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyOutgoingCall {
+ /**
+ * The item that is called.
+ */
+ @NonNull
+ private CallHierarchyItem to;
+
+ /**
+ * The range at which this item is called. This is the range relative to the caller, i.e. the {@link CallHierarchyOutgoingCallsParams#item}.
+ */
+ @NonNull
+ private List<Range> fromRanges;
+
+ public CallHierarchyOutgoingCall() {
+ }
+
+ public CallHierarchyOutgoingCall(@NonNull final CallHierarchyItem to, @NonNull final List<Range> fromRanges) {
+ this.to = Preconditions.<CallHierarchyItem>checkNotNull(to, "to");
+ this.fromRanges = Preconditions.<List<Range>>checkNotNull(fromRanges, "fromRanges");
+ }
+
+ /**
+ * The item that is called.
+ */
+ @Pure
+ @NonNull
+ public CallHierarchyItem getTo() {
+ return this.to;
+ }
+
+ /**
+ * The item that is called.
+ */
+ public void setTo(@NonNull final CallHierarchyItem to) {
+ this.to = Preconditions.checkNotNull(to, "to");
+ }
+
+ /**
+ * The range at which this item is called. This is the range relative to the caller, i.e. the {@link CallHierarchyOutgoingCallsParams#item}.
+ */
+ @Pure
+ @NonNull
+ public List<Range> getFromRanges() {
+ return this.fromRanges;
+ }
+
+ /**
+ * The range at which this item is called. This is the range relative to the caller, i.e. the {@link CallHierarchyOutgoingCallsParams#item}.
+ */
+ public void setFromRanges(@NonNull final List<Range> fromRanges) {
+ this.fromRanges = Preconditions.checkNotNull(fromRanges, "fromRanges");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("to", this.to);
+ b.add("fromRanges", this.fromRanges);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CallHierarchyOutgoingCall other = (CallHierarchyOutgoingCall) obj;
+ if (this.to == null) {
+ if (other.to != null)
+ return false;
+ } else if (!this.to.equals(other.to))
+ return false;
+ if (this.fromRanges == null) {
+ if (other.fromRanges != null)
+ return false;
+ } else if (!this.fromRanges.equals(other.fromRanges))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.to== null) ? 0 : this.to.hashCode());
+ return prime * result + ((this.fromRanges== null) ? 0 : this.fromRanges.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyOutgoingCallsParams.java b/java/org/eclipse/lsp4j/CallHierarchyOutgoingCallsParams.java
new file mode 100644
index 0000000..32a4af7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyOutgoingCallsParams.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CallHierarchyItem;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameter of a `callHierarchy/outgoingCalls` request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyOutgoingCallsParams extends WorkDoneProgressAndPartialResultParams {
+ @NonNull
+ private CallHierarchyItem item;
+
+ public CallHierarchyOutgoingCallsParams() {
+ }
+
+ public CallHierarchyOutgoingCallsParams(@NonNull final CallHierarchyItem item) {
+ this.item = Preconditions.<CallHierarchyItem>checkNotNull(item, "item");
+ }
+
+ @Pure
+ @NonNull
+ public CallHierarchyItem getItem() {
+ return this.item;
+ }
+
+ public void setItem(@NonNull final CallHierarchyItem item) {
+ this.item = Preconditions.checkNotNull(item, "item");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("item", this.item);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CallHierarchyOutgoingCallsParams other = (CallHierarchyOutgoingCallsParams) obj;
+ if (this.item == null) {
+ if (other.item != null)
+ return false;
+ } else if (!this.item.equals(other.item))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.item== null) ? 0 : this.item.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyPrepareParams.java b/java/org/eclipse/lsp4j/CallHierarchyPrepareParams.java
new file mode 100644
index 0000000..a5570ae
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyPrepareParams.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameter of a `textDocument/prepareCallHierarchy` request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyPrepareParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CallHierarchyRegistrationOptions.java b/java/org/eclipse/lsp4j/CallHierarchyRegistrationOptions.java
new file mode 100644
index 0000000..006963b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CallHierarchyRegistrationOptions.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CallHierarchyRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public CallHierarchyRegistrationOptions() {
+ }
+
+ public CallHierarchyRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CallHierarchyRegistrationOptions other = (CallHierarchyRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ChangeAnnotation.java b/java/org/eclipse/lsp4j/ChangeAnnotation.java
new file mode 100644
index 0000000..1d2cf02
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ChangeAnnotation.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Additional information that describes document changes.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class ChangeAnnotation {
+ /**
+ * A human-readable string describing the actual change. The string
+ * is rendered prominent in the user interface.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * A flag which indicates that user confirmation is needed
+ * before applying the change.
+ */
+ private Boolean needsConfirmation;
+
+ /**
+ * A human-readable string which is rendered less prominent in
+ * the user interface.
+ */
+ private String description;
+
+ public ChangeAnnotation() {
+ }
+
+ public ChangeAnnotation(@NonNull final String label) {
+ this.label = Preconditions.<String>checkNotNull(label, "label");
+ }
+
+ /**
+ * A human-readable string describing the actual change. The string
+ * is rendered prominent in the user interface.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * A human-readable string describing the actual change. The string
+ * is rendered prominent in the user interface.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * A flag which indicates that user confirmation is needed
+ * before applying the change.
+ */
+ @Pure
+ public Boolean getNeedsConfirmation() {
+ return this.needsConfirmation;
+ }
+
+ /**
+ * A flag which indicates that user confirmation is needed
+ * before applying the change.
+ */
+ public void setNeedsConfirmation(final Boolean needsConfirmation) {
+ this.needsConfirmation = needsConfirmation;
+ }
+
+ /**
+ * A human-readable string which is rendered less prominent in
+ * the user interface.
+ */
+ @Pure
+ public String getDescription() {
+ return this.description;
+ }
+
+ /**
+ * A human-readable string which is rendered less prominent in
+ * the user interface.
+ */
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("needsConfirmation", this.needsConfirmation);
+ b.add("description", this.description);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ChangeAnnotation other = (ChangeAnnotation) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.needsConfirmation == null) {
+ if (other.needsConfirmation != null)
+ return false;
+ } else if (!this.needsConfirmation.equals(other.needsConfirmation))
+ return false;
+ if (this.description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!this.description.equals(other.description))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.needsConfirmation== null) ? 0 : this.needsConfirmation.hashCode());
+ return prime * result + ((this.description== null) ? 0 : this.description.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ClientCapabilities.java b/java/org/eclipse/lsp4j/ClientCapabilities.java
new file mode 100644
index 0000000..2089726
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ClientCapabilities.java
@@ -0,0 +1,222 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.GeneralClientCapabilities;
+import org.eclipse.lsp4j.TextDocumentClientCapabilities;
+import org.eclipse.lsp4j.WindowClientCapabilities;
+import org.eclipse.lsp4j.WorkspaceClientCapabilities;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * `ClientCapabilities` now define capabilities for dynamic registration, workspace and text document features the client supports.
+ * The {@link #experimental} can be used to pass experimental capabilities under development.
+ * For future compatibility a `ClientCapabilities` object literal can have more properties set than currently defined.
+ * Servers receiving a `ClientCapabilities` object literal with unknown properties should ignore these properties.
+ * A missing property should be interpreted as an absence of the capability.
+ * If a property is missing that defines sub properties all sub properties should be interpreted as an absence of the capability.
+ * <p>
+ * Client capabilities got introduced with the version 3.0 of the protocol. They therefore only describe capabilities that got introduced in 3.x or later.
+ * Capabilities that existed in the 2.x version of the protocol are still mandatory for clients. Clients cannot opt out of providing them.
+ * So even if a client omits the {@link TextDocumentClientCapabilities#synchronization}
+ * it is still required that the client provides text document synchronization (e.g. open, changed and close notifications).
+ */
+@SuppressWarnings("all")
+public class ClientCapabilities {
+ /**
+ * Workspace specific client capabilities.
+ */
+ private WorkspaceClientCapabilities workspace;
+
+ /**
+ * Text document specific client capabilities.
+ */
+ private TextDocumentClientCapabilities textDocument;
+
+ /**
+ * Window specific client capabilities.
+ */
+ private WindowClientCapabilities window;
+
+ /**
+ * General client capabilities.
+ * <p>
+ * Since 3.16.0
+ */
+ private GeneralClientCapabilities general;
+
+ /**
+ * Experimental client capabilities.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object experimental;
+
+ public ClientCapabilities() {
+ }
+
+ public ClientCapabilities(final WorkspaceClientCapabilities workspace, final TextDocumentClientCapabilities textDocument, final Object experimental) {
+ this.workspace = workspace;
+ this.textDocument = textDocument;
+ this.experimental = experimental;
+ }
+
+ public ClientCapabilities(final WorkspaceClientCapabilities workspace, final TextDocumentClientCapabilities textDocument, final WindowClientCapabilities window, final Object experimental) {
+ this.workspace = workspace;
+ this.textDocument = textDocument;
+ this.window = window;
+ this.experimental = experimental;
+ }
+
+ /**
+ * Workspace specific client capabilities.
+ */
+ @Pure
+ public WorkspaceClientCapabilities getWorkspace() {
+ return this.workspace;
+ }
+
+ /**
+ * Workspace specific client capabilities.
+ */
+ public void setWorkspace(final WorkspaceClientCapabilities workspace) {
+ this.workspace = workspace;
+ }
+
+ /**
+ * Text document specific client capabilities.
+ */
+ @Pure
+ public TextDocumentClientCapabilities getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * Text document specific client capabilities.
+ */
+ public void setTextDocument(final TextDocumentClientCapabilities textDocument) {
+ this.textDocument = textDocument;
+ }
+
+ /**
+ * Window specific client capabilities.
+ */
+ @Pure
+ public WindowClientCapabilities getWindow() {
+ return this.window;
+ }
+
+ /**
+ * Window specific client capabilities.
+ */
+ public void setWindow(final WindowClientCapabilities window) {
+ this.window = window;
+ }
+
+ /**
+ * General client capabilities.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public GeneralClientCapabilities getGeneral() {
+ return this.general;
+ }
+
+ /**
+ * General client capabilities.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setGeneral(final GeneralClientCapabilities general) {
+ this.general = general;
+ }
+
+ /**
+ * Experimental client capabilities.
+ */
+ @Pure
+ public Object getExperimental() {
+ return this.experimental;
+ }
+
+ /**
+ * Experimental client capabilities.
+ */
+ public void setExperimental(final Object experimental) {
+ this.experimental = experimental;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workspace", this.workspace);
+ b.add("textDocument", this.textDocument);
+ b.add("window", this.window);
+ b.add("general", this.general);
+ b.add("experimental", this.experimental);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ClientCapabilities other = (ClientCapabilities) obj;
+ if (this.workspace == null) {
+ if (other.workspace != null)
+ return false;
+ } else if (!this.workspace.equals(other.workspace))
+ return false;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.window == null) {
+ if (other.window != null)
+ return false;
+ } else if (!this.window.equals(other.window))
+ return false;
+ if (this.general == null) {
+ if (other.general != null)
+ return false;
+ } else if (!this.general.equals(other.general))
+ return false;
+ if (this.experimental == null) {
+ if (other.experimental != null)
+ return false;
+ } else if (!this.experimental.equals(other.experimental))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workspace== null) ? 0 : this.workspace.hashCode());
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ result = prime * result + ((this.window== null) ? 0 : this.window.hashCode());
+ result = prime * result + ((this.general== null) ? 0 : this.general.hashCode());
+ return prime * result + ((this.experimental== null) ? 0 : this.experimental.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ClientInfo.java b/java/org/eclipse/lsp4j/ClientInfo.java
new file mode 100644
index 0000000..5611ae6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ClientInfo.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Information about the client
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class ClientInfo {
+ /**
+ * The name of the client as defined by the client.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The client's version as defined by the client.
+ */
+ private String version;
+
+ public ClientInfo() {
+ }
+
+ public ClientInfo(@NonNull final String name) {
+ this.name = Preconditions.<String>checkNotNull(name, "name");
+ }
+
+ public ClientInfo(@NonNull final String name, final String version) {
+ this(name);
+ this.version = version;
+ }
+
+ /**
+ * The name of the client as defined by the client.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the client as defined by the client.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The client's version as defined by the client.
+ */
+ @Pure
+ public String getVersion() {
+ return this.version;
+ }
+
+ /**
+ * The client's version as defined by the client.
+ */
+ public void setVersion(final String version) {
+ this.version = version;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("version", this.version);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ClientInfo other = (ClientInfo) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ return prime * result + ((this.version== null) ? 0 : this.version.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeAction.java b/java/org/eclipse/lsp4j/CodeAction.java
new file mode 100644
index 0000000..67b94c1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeAction.java
@@ -0,0 +1,362 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.CodeActionDisabled;
+import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.Diagnostic;
+import org.eclipse.lsp4j.WorkspaceEdit;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A code action represents a change that can be performed in code, e.g. to fix a problem or
+ * to refactor code.
+ * <p>
+ * A CodeAction must set either {@link #edit} and/or a {@link #command}.
+ * If both are supplied, the {@link #edit} is applied first, then the {@link #command} is executed.
+ */
+@SuppressWarnings("all")
+public class CodeAction {
+ /**
+ * A short, human-readable, title for this code action.
+ */
+ @NonNull
+ private String title;
+
+ /**
+ * The kind of the code action.
+ * <p>
+ * Used to filter code actions.
+ */
+ private String kind;
+
+ /**
+ * The diagnostics that this code action resolves.
+ */
+ private List<Diagnostic> diagnostics;
+
+ /**
+ * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
+ * by keybindings.
+ * <p>
+ * A quick fix should be marked preferred if it properly addresses the underlying error.
+ * A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
+ * <p>
+ * Since 3.15.0
+ */
+ private Boolean isPreferred;
+
+ /**
+ * Marks that the code action cannot currently be applied.
+ * <p>
+ * Clients should follow the following guidelines regarding disabled code actions:
+ * <ul>
+ * <li>Disabled code actions are not shown in automatic <a href="https://code.visualstudio.com/docs/editor/editingevolved#_code-action">lightbulb</a>
+ * code action menu.
+ * <li>Disabled actions are shown as faded out in the code action menu when the user request a more specific type
+ * of code action, such as refactorings.
+ * <li>If the user has a <a href="https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions">keybinding</a>
+ * that auto applies a code action and only a disabled code actions are returned, the client should show the user an
+ * error message with {@link CodeActionDisabled#reason} in the editor.
+ * </ul><p>
+ * Since 3.16.0
+ */
+ private CodeActionDisabled disabled;
+
+ /**
+ * The workspace edit this code action performs.
+ */
+ private WorkspaceEdit edit;
+
+ /**
+ * A command this code action executes. If a code action
+ * provides a edit and a command, first the edit is
+ * executed and then the command.
+ */
+ private Command command;
+
+ /**
+ * A data entry field that is preserved on a code action between
+ * a `textDocument/codeAction` and a `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ public CodeAction() {
+ }
+
+ public CodeAction(@NonNull final String title) {
+ this.title = Preconditions.<String>checkNotNull(title, "title");
+ }
+
+ /**
+ * A short, human-readable, title for this code action.
+ */
+ @Pure
+ @NonNull
+ public String getTitle() {
+ return this.title;
+ }
+
+ /**
+ * A short, human-readable, title for this code action.
+ */
+ public void setTitle(@NonNull final String title) {
+ this.title = Preconditions.checkNotNull(title, "title");
+ }
+
+ /**
+ * The kind of the code action.
+ * <p>
+ * Used to filter code actions.
+ */
+ @Pure
+ public String getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of the code action.
+ * <p>
+ * Used to filter code actions.
+ */
+ public void setKind(final String kind) {
+ this.kind = kind;
+ }
+
+ /**
+ * The diagnostics that this code action resolves.
+ */
+ @Pure
+ public List<Diagnostic> getDiagnostics() {
+ return this.diagnostics;
+ }
+
+ /**
+ * The diagnostics that this code action resolves.
+ */
+ public void setDiagnostics(final List<Diagnostic> diagnostics) {
+ this.diagnostics = diagnostics;
+ }
+
+ /**
+ * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
+ * by keybindings.
+ * <p>
+ * A quick fix should be marked preferred if it properly addresses the underlying error.
+ * A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Boolean getIsPreferred() {
+ return this.isPreferred;
+ }
+
+ /**
+ * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
+ * by keybindings.
+ * <p>
+ * A quick fix should be marked preferred if it properly addresses the underlying error.
+ * A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setIsPreferred(final Boolean isPreferred) {
+ this.isPreferred = isPreferred;
+ }
+
+ /**
+ * Marks that the code action cannot currently be applied.
+ * <p>
+ * Clients should follow the following guidelines regarding disabled code actions:
+ * <ul>
+ * <li>Disabled code actions are not shown in automatic <a href="https://code.visualstudio.com/docs/editor/editingevolved#_code-action">lightbulb</a>
+ * code action menu.
+ * <li>Disabled actions are shown as faded out in the code action menu when the user request a more specific type
+ * of code action, such as refactorings.
+ * <li>If the user has a <a href="https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions">keybinding</a>
+ * that auto applies a code action and only a disabled code actions are returned, the client should show the user an
+ * error message with {@link CodeActionDisabled#reason} in the editor.
+ * </ul><p>
+ * Since 3.16.0
+ */
+ @Pure
+ public CodeActionDisabled getDisabled() {
+ return this.disabled;
+ }
+
+ /**
+ * Marks that the code action cannot currently be applied.
+ * <p>
+ * Clients should follow the following guidelines regarding disabled code actions:
+ * <ul>
+ * <li>Disabled code actions are not shown in automatic <a href="https://code.visualstudio.com/docs/editor/editingevolved#_code-action">lightbulb</a>
+ * code action menu.
+ * <li>Disabled actions are shown as faded out in the code action menu when the user request a more specific type
+ * of code action, such as refactorings.
+ * <li>If the user has a <a href="https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions">keybinding</a>
+ * that auto applies a code action and only a disabled code actions are returned, the client should show the user an
+ * error message with {@link CodeActionDisabled#reason} in the editor.
+ * </ul><p>
+ * Since 3.16.0
+ */
+ public void setDisabled(final CodeActionDisabled disabled) {
+ this.disabled = disabled;
+ }
+
+ /**
+ * The workspace edit this code action performs.
+ */
+ @Pure
+ public WorkspaceEdit getEdit() {
+ return this.edit;
+ }
+
+ /**
+ * The workspace edit this code action performs.
+ */
+ public void setEdit(final WorkspaceEdit edit) {
+ this.edit = edit;
+ }
+
+ /**
+ * A command this code action executes. If a code action
+ * provides a edit and a command, first the edit is
+ * executed and then the command.
+ */
+ @Pure
+ public Command getCommand() {
+ return this.command;
+ }
+
+ /**
+ * A command this code action executes. If a code action
+ * provides a edit and a command, first the edit is
+ * executed and then the command.
+ */
+ public void setCommand(final Command command) {
+ this.command = command;
+ }
+
+ /**
+ * A data entry field that is preserved on a code action between
+ * a `textDocument/codeAction` and a `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * A data entry field that is preserved on a code action between
+ * a `textDocument/codeAction` and a `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("title", this.title);
+ b.add("kind", this.kind);
+ b.add("diagnostics", this.diagnostics);
+ b.add("isPreferred", this.isPreferred);
+ b.add("disabled", this.disabled);
+ b.add("edit", this.edit);
+ b.add("command", this.command);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeAction other = (CodeAction) obj;
+ if (this.title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!this.title.equals(other.title))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.diagnostics == null) {
+ if (other.diagnostics != null)
+ return false;
+ } else if (!this.diagnostics.equals(other.diagnostics))
+ return false;
+ if (this.isPreferred == null) {
+ if (other.isPreferred != null)
+ return false;
+ } else if (!this.isPreferred.equals(other.isPreferred))
+ return false;
+ if (this.disabled == null) {
+ if (other.disabled != null)
+ return false;
+ } else if (!this.disabled.equals(other.disabled))
+ return false;
+ if (this.edit == null) {
+ if (other.edit != null)
+ return false;
+ } else if (!this.edit.equals(other.edit))
+ return false;
+ if (this.command == null) {
+ if (other.command != null)
+ return false;
+ } else if (!this.command.equals(other.command))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.title== null) ? 0 : this.title.hashCode());
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.diagnostics== null) ? 0 : this.diagnostics.hashCode());
+ result = prime * result + ((this.isPreferred== null) ? 0 : this.isPreferred.hashCode());
+ result = prime * result + ((this.disabled== null) ? 0 : this.disabled.hashCode());
+ result = prime * result + ((this.edit== null) ? 0 : this.edit.hashCode());
+ result = prime * result + ((this.command== null) ? 0 : this.command.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionCapabilities.java b/java/org/eclipse/lsp4j/CodeActionCapabilities.java
new file mode 100644
index 0000000..e0ecbed
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionCapabilities.java
@@ -0,0 +1,287 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CodeActionLiteralSupportCapabilities;
+import org.eclipse.lsp4j.CodeActionResolveSupportCapabilities;
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/codeAction`
+ */
+@SuppressWarnings("all")
+public class CodeActionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client support code action literals as a valid
+ * response of the `textDocument/codeAction` request.
+ */
+ private CodeActionLiteralSupportCapabilities codeActionLiteralSupport;
+
+ /**
+ * Whether code action supports the {@link CodeAction#isPreferred} property.
+ * <p>
+ * Since 3.15.0
+ */
+ private Boolean isPreferredSupport;
+
+ /**
+ * Whether code action supports the {@link CodeAction#disabled} property.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean disabledSupport;
+
+ /**
+ * Whether code action supports the {@link CodeAction#data} property which is
+ * preserved between a `textDocument/codeAction` and a
+ * `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean dataSupport;
+
+ /**
+ * Whether the client supports resolving additional code action
+ * properties via a separate `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ private CodeActionResolveSupportCapabilities resolveSupport;
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * {@link CodeAction#edit} property by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean honorsChangeAnnotations;
+
+ public CodeActionCapabilities() {
+ }
+
+ public CodeActionCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public CodeActionCapabilities(final CodeActionLiteralSupportCapabilities codeActionLiteralSupport, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.codeActionLiteralSupport = codeActionLiteralSupport;
+ }
+
+ public CodeActionCapabilities(final CodeActionLiteralSupportCapabilities codeActionLiteralSupport, final Boolean dynamicRegistration, final Boolean isPreferredSupport) {
+ this(codeActionLiteralSupport, dynamicRegistration);
+ this.isPreferredSupport = isPreferredSupport;
+ }
+
+ /**
+ * The client support code action literals as a valid
+ * response of the `textDocument/codeAction` request.
+ */
+ @Pure
+ public CodeActionLiteralSupportCapabilities getCodeActionLiteralSupport() {
+ return this.codeActionLiteralSupport;
+ }
+
+ /**
+ * The client support code action literals as a valid
+ * response of the `textDocument/codeAction` request.
+ */
+ public void setCodeActionLiteralSupport(final CodeActionLiteralSupportCapabilities codeActionLiteralSupport) {
+ this.codeActionLiteralSupport = codeActionLiteralSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link CodeAction#isPreferred} property.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Boolean getIsPreferredSupport() {
+ return this.isPreferredSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link CodeAction#isPreferred} property.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setIsPreferredSupport(final Boolean isPreferredSupport) {
+ this.isPreferredSupport = isPreferredSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link CodeAction#disabled} property.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getDisabledSupport() {
+ return this.disabledSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link CodeAction#disabled} property.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setDisabledSupport(final Boolean disabledSupport) {
+ this.disabledSupport = disabledSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link CodeAction#data} property which is
+ * preserved between a `textDocument/codeAction` and a
+ * `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getDataSupport() {
+ return this.dataSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link CodeAction#data} property which is
+ * preserved between a `textDocument/codeAction` and a
+ * `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setDataSupport(final Boolean dataSupport) {
+ this.dataSupport = dataSupport;
+ }
+
+ /**
+ * Whether the client supports resolving additional code action
+ * properties via a separate `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public CodeActionResolveSupportCapabilities getResolveSupport() {
+ return this.resolveSupport;
+ }
+
+ /**
+ * Whether the client supports resolving additional code action
+ * properties via a separate `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setResolveSupport(final CodeActionResolveSupportCapabilities resolveSupport) {
+ this.resolveSupport = resolveSupport;
+ }
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * {@link CodeAction#edit} property by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getHonorsChangeAnnotations() {
+ return this.honorsChangeAnnotations;
+ }
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * {@link CodeAction#edit} property by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setHonorsChangeAnnotations(final Boolean honorsChangeAnnotations) {
+ this.honorsChangeAnnotations = honorsChangeAnnotations;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("codeActionLiteralSupport", this.codeActionLiteralSupport);
+ b.add("isPreferredSupport", this.isPreferredSupport);
+ b.add("disabledSupport", this.disabledSupport);
+ b.add("dataSupport", this.dataSupport);
+ b.add("resolveSupport", this.resolveSupport);
+ b.add("honorsChangeAnnotations", this.honorsChangeAnnotations);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeActionCapabilities other = (CodeActionCapabilities) obj;
+ if (this.codeActionLiteralSupport == null) {
+ if (other.codeActionLiteralSupport != null)
+ return false;
+ } else if (!this.codeActionLiteralSupport.equals(other.codeActionLiteralSupport))
+ return false;
+ if (this.isPreferredSupport == null) {
+ if (other.isPreferredSupport != null)
+ return false;
+ } else if (!this.isPreferredSupport.equals(other.isPreferredSupport))
+ return false;
+ if (this.disabledSupport == null) {
+ if (other.disabledSupport != null)
+ return false;
+ } else if (!this.disabledSupport.equals(other.disabledSupport))
+ return false;
+ if (this.dataSupport == null) {
+ if (other.dataSupport != null)
+ return false;
+ } else if (!this.dataSupport.equals(other.dataSupport))
+ return false;
+ if (this.resolveSupport == null) {
+ if (other.resolveSupport != null)
+ return false;
+ } else if (!this.resolveSupport.equals(other.resolveSupport))
+ return false;
+ if (this.honorsChangeAnnotations == null) {
+ if (other.honorsChangeAnnotations != null)
+ return false;
+ } else if (!this.honorsChangeAnnotations.equals(other.honorsChangeAnnotations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.codeActionLiteralSupport== null) ? 0 : this.codeActionLiteralSupport.hashCode());
+ result = prime * result + ((this.isPreferredSupport== null) ? 0 : this.isPreferredSupport.hashCode());
+ result = prime * result + ((this.disabledSupport== null) ? 0 : this.disabledSupport.hashCode());
+ result = prime * result + ((this.dataSupport== null) ? 0 : this.dataSupport.hashCode());
+ result = prime * result + ((this.resolveSupport== null) ? 0 : this.resolveSupport.hashCode());
+ return prime * result + ((this.honorsChangeAnnotations== null) ? 0 : this.honorsChangeAnnotations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionContext.java b/java/org/eclipse/lsp4j/CodeActionContext.java
new file mode 100644
index 0000000..ad4425d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionContext.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.Diagnostic;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Contains additional diagnostic information about the context in which a code action is run.
+ */
+@SuppressWarnings("all")
+public class CodeActionContext {
+ /**
+ * An array of diagnostics.
+ */
+ @NonNull
+ private List<Diagnostic> diagnostics;
+
+ /**
+ * Requested kind of actions to return.
+ * <p>
+ * Actions not of this kind are filtered out by the client before being shown. So servers
+ * can omit computing them.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ private List<String> only;
+
+ public CodeActionContext() {
+ }
+
+ public CodeActionContext(@NonNull final List<Diagnostic> diagnostics) {
+ this.diagnostics = Preconditions.<List<Diagnostic>>checkNotNull(diagnostics, "diagnostics");
+ }
+
+ public CodeActionContext(@NonNull final List<Diagnostic> diagnostics, final List<String> only) {
+ this(diagnostics);
+ this.only = only;
+ }
+
+ /**
+ * An array of diagnostics.
+ */
+ @Pure
+ @NonNull
+ public List<Diagnostic> getDiagnostics() {
+ return this.diagnostics;
+ }
+
+ /**
+ * An array of diagnostics.
+ */
+ public void setDiagnostics(@NonNull final List<Diagnostic> diagnostics) {
+ this.diagnostics = Preconditions.checkNotNull(diagnostics, "diagnostics");
+ }
+
+ /**
+ * Requested kind of actions to return.
+ * <p>
+ * Actions not of this kind are filtered out by the client before being shown. So servers
+ * can omit computing them.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ @Pure
+ public List<String> getOnly() {
+ return this.only;
+ }
+
+ /**
+ * Requested kind of actions to return.
+ * <p>
+ * Actions not of this kind are filtered out by the client before being shown. So servers
+ * can omit computing them.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ public void setOnly(final List<String> only) {
+ this.only = only;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("diagnostics", this.diagnostics);
+ b.add("only", this.only);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeActionContext other = (CodeActionContext) obj;
+ if (this.diagnostics == null) {
+ if (other.diagnostics != null)
+ return false;
+ } else if (!this.diagnostics.equals(other.diagnostics))
+ return false;
+ if (this.only == null) {
+ if (other.only != null)
+ return false;
+ } else if (!this.only.equals(other.only))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.diagnostics== null) ? 0 : this.diagnostics.hashCode());
+ return prime * result + ((this.only== null) ? 0 : this.only.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionDisabled.java b/java/org/eclipse/lsp4j/CodeActionDisabled.java
new file mode 100644
index 0000000..abbc341
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionDisabled.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Marks that the code action cannot currently be applied.
+ * <p>
+ * Clients should follow the following guidelines regarding disabled code actions:
+ * <ul>
+ * <li>Disabled code actions are not shown in automatic <a href="https://code.visualstudio.com/docs/editor/editingevolved#_code-action">lightbulb</a>
+ * code action menu.
+ * <li>Disabled actions are shown as faded out in the code action menu when the user request a more specific type
+ * of code action, such as refactorings.
+ * <li>If the user has a <a href="https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions">keybinding</a>
+ * that auto applies a code action and only a disabled code actions are returned, the client should show the user an
+ * error message with {@link #reason} in the editor.
+ * </ul><p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CodeActionDisabled {
+ /**
+ * Human readable description of why the code action is currently disabled.
+ * <p>
+ * This is displayed in the code actions UI.
+ */
+ @NonNull
+ private String reason;
+
+ public CodeActionDisabled() {
+ }
+
+ public CodeActionDisabled(@NonNull final String reason) {
+ this.reason = Preconditions.<String>checkNotNull(reason, "reason");
+ }
+
+ /**
+ * Human readable description of why the code action is currently disabled.
+ * <p>
+ * This is displayed in the code actions UI.
+ */
+ @Pure
+ @NonNull
+ public String getReason() {
+ return this.reason;
+ }
+
+ /**
+ * Human readable description of why the code action is currently disabled.
+ * <p>
+ * This is displayed in the code actions UI.
+ */
+ public void setReason(@NonNull final String reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("reason", this.reason);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeActionDisabled other = (CodeActionDisabled) obj;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.reason== null) ? 0 : this.reason.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionKind.java b/java/org/eclipse/lsp4j/CodeActionKind.java
new file mode 100644
index 0000000..d672fd7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionKind.java
@@ -0,0 +1,80 @@
+/******************************************************************************
+ * Copyright (c) 2018 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * The kind of a code action.
+ *
+ * Kinds are a hierarchical list of identifiers separated by `.`, e.g.
+ * `"refactor.extract.function"`.
+ *
+ * The set of kinds is open and client needs to announce the kinds it supports
+ * to the server during initialization.
+ */
+
+public final class CodeActionKind {
+
+ private CodeActionKind() {
+ }
+
+ /**
+ * Base kind for quickfix actions: 'quickfix'
+ */
+ public static final String QuickFix = "quickfix";
+
+ /**
+ * Base kind for refactoring actions: 'refactor'
+ */
+ public static final String Refactor = "refactor";
+
+ /**
+ * Base kind for refactoring extraction actions: 'refactor.extract'
+ *
+ * Example extract actions:
+ *
+ * - Extract method - Extract function - Extract variable - Extract interface
+ * from class - ...
+ */
+ public static final String RefactorExtract = "refactor.extract";
+
+ /**
+ * Base kind for refactoring inline actions: 'refactor.inline'
+ *
+ * Example inline actions:
+ *
+ * - Inline function - Inline variable - Inline constant - ...
+ */
+ public static final String RefactorInline = "refactor.inline";
+
+ /**
+ * Base kind for refactoring rewrite actions: 'refactor.rewrite'
+ *
+ * Example rewrite actions:
+ *
+ * - Convert JavaScript function to class - Add or remove parameter -
+ * Encapsulate field - Make method static - Move method to base class - ...
+ */
+ public static final String RefactorRewrite = "refactor.rewrite";
+
+ /**
+ * Base kind for source actions: `source`
+ *
+ * Source code actions apply to the entire file.
+ */
+ public static final String Source = "source";
+
+ /**
+ * Base kind for an organize imports source action: `source.organizeImports`
+ */
+ public static final String SourceOrganizeImports = "source.organizeImports";
+}
+
diff --git a/java/org/eclipse/lsp4j/CodeActionKindCapabilities.java b/java/org/eclipse/lsp4j/CodeActionKindCapabilities.java
new file mode 100644
index 0000000..27ea9d7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionKindCapabilities.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class CodeActionKindCapabilities {
+ /**
+ * The code action kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ @NonNull
+ private List<String> valueSet;
+
+ public CodeActionKindCapabilities() {
+ ArrayList<String> _arrayList = new ArrayList<String>();
+ this.valueSet = _arrayList;
+ }
+
+ public CodeActionKindCapabilities(@NonNull final List<String> valueSet) {
+ this.valueSet = Preconditions.<List<String>>checkNotNull(valueSet, "valueSet");
+ }
+
+ /**
+ * The code action kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ @Pure
+ @NonNull
+ public List<String> getValueSet() {
+ return this.valueSet;
+ }
+
+ /**
+ * The code action kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ public void setValueSet(@NonNull final List<String> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, "valueSet");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeActionKindCapabilities other = (CodeActionKindCapabilities) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionLiteralSupportCapabilities.java b/java/org/eclipse/lsp4j/CodeActionLiteralSupportCapabilities.java
new file mode 100644
index 0000000..d75b47d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionLiteralSupportCapabilities.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CodeActionKindCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class CodeActionLiteralSupportCapabilities {
+ /**
+ * The code action kind is support with the following value
+ * set.
+ */
+ private CodeActionKindCapabilities codeActionKind;
+
+ public CodeActionLiteralSupportCapabilities() {
+ }
+
+ public CodeActionLiteralSupportCapabilities(final CodeActionKindCapabilities codeActionKind) {
+ this.codeActionKind = codeActionKind;
+ }
+
+ /**
+ * The code action kind is support with the following value
+ * set.
+ */
+ @Pure
+ public CodeActionKindCapabilities getCodeActionKind() {
+ return this.codeActionKind;
+ }
+
+ /**
+ * The code action kind is support with the following value
+ * set.
+ */
+ public void setCodeActionKind(final CodeActionKindCapabilities codeActionKind) {
+ this.codeActionKind = codeActionKind;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("codeActionKind", this.codeActionKind);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeActionLiteralSupportCapabilities other = (CodeActionLiteralSupportCapabilities) obj;
+ if (this.codeActionKind == null) {
+ if (other.codeActionKind != null)
+ return false;
+ } else if (!this.codeActionKind.equals(other.codeActionKind))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.codeActionKind== null) ? 0 : this.codeActionKind.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionOptions.java b/java/org/eclipse/lsp4j/CodeActionOptions.java
new file mode 100644
index 0000000..c4ba37f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionOptions.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Code Action options.
+ */
+@SuppressWarnings("all")
+public class CodeActionOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ private List<String> codeActionKinds;
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean resolveProvider;
+
+ public CodeActionOptions() {
+ }
+
+ public CodeActionOptions(final List<String> codeActionKinds) {
+ this.codeActionKinds = codeActionKinds;
+ }
+
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ @Pure
+ public List<String> getCodeActionKinds() {
+ return this.codeActionKinds;
+ }
+
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ public void setCodeActionKinds(final List<String> codeActionKinds) {
+ this.codeActionKinds = codeActionKinds;
+ }
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("codeActionKinds", this.codeActionKinds);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeActionOptions other = (CodeActionOptions) obj;
+ if (this.codeActionKinds == null) {
+ if (other.codeActionKinds != null)
+ return false;
+ } else if (!this.codeActionKinds.equals(other.codeActionKinds))
+ return false;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.codeActionKinds== null) ? 0 : this.codeActionKinds.hashCode());
+ return prime * result + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionParams.java b/java/org/eclipse/lsp4j/CodeActionParams.java
new file mode 100644
index 0000000..5f94688
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionParams.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CodeActionContext;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The code action request is sent from the client to the server to compute commands for a given text document and range.
+ * These commands are typically code fixes to either fix problems or to beautify/refactor code.
+ */
+@SuppressWarnings("all")
+public class CodeActionParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The document in which the command was invoked.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The range for which the command was invoked.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * Context carrying additional information.
+ */
+ @NonNull
+ private CodeActionContext context;
+
+ public CodeActionParams() {
+ }
+
+ public CodeActionParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Range range, @NonNull final CodeActionContext context) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.context = Preconditions.<CodeActionContext>checkNotNull(context, "context");
+ }
+
+ /**
+ * The document in which the command was invoked.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document in which the command was invoked.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The range for which the command was invoked.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range for which the command was invoked.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * Context carrying additional information.
+ */
+ @Pure
+ @NonNull
+ public CodeActionContext getContext() {
+ return this.context;
+ }
+
+ /**
+ * Context carrying additional information.
+ */
+ public void setContext(@NonNull final CodeActionContext context) {
+ this.context = Preconditions.checkNotNull(context, "context");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("range", this.range);
+ b.add("context", this.context);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeActionParams other = (CodeActionParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.context == null) {
+ if (other.context != null)
+ return false;
+ } else if (!this.context.equals(other.context))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.context== null) ? 0 : this.context.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionRegistrationOptions.java b/java/org/eclipse/lsp4j/CodeActionRegistrationOptions.java
new file mode 100644
index 0000000..c7c5a95
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionRegistrationOptions.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Code Action registration options.
+ */
+@SuppressWarnings("all")
+public class CodeActionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ private List<String> codeActionKinds;
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean resolveProvider;
+
+ public CodeActionRegistrationOptions() {
+ }
+
+ public CodeActionRegistrationOptions(final List<String> codeActionKinds) {
+ this.codeActionKinds = codeActionKinds;
+ }
+
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ @Pure
+ public List<String> getCodeActionKinds() {
+ return this.codeActionKinds;
+ }
+
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ public void setCodeActionKinds(final List<String> codeActionKinds) {
+ this.codeActionKinds = codeActionKinds;
+ }
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("codeActionKinds", this.codeActionKinds);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeActionRegistrationOptions other = (CodeActionRegistrationOptions) obj;
+ if (this.codeActionKinds == null) {
+ if (other.codeActionKinds != null)
+ return false;
+ } else if (!this.codeActionKinds.equals(other.codeActionKinds))
+ return false;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.codeActionKinds== null) ? 0 : this.codeActionKinds.hashCode());
+ return prime * result + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeActionResolveSupportCapabilities.java b/java/org/eclipse/lsp4j/CodeActionResolveSupportCapabilities.java
new file mode 100644
index 0000000..0a57d39
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeActionResolveSupportCapabilities.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Whether the client supports resolving additional code action
+ * properties via a separate `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CodeActionResolveSupportCapabilities {
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ @NonNull
+ private List<String> properties;
+
+ public CodeActionResolveSupportCapabilities() {
+ ArrayList<String> _arrayList = new ArrayList<String>();
+ this.properties = _arrayList;
+ }
+
+ public CodeActionResolveSupportCapabilities(@NonNull final List<String> properties) {
+ this.properties = Preconditions.<List<String>>checkNotNull(properties, "properties");
+ }
+
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ @Pure
+ @NonNull
+ public List<String> getProperties() {
+ return this.properties;
+ }
+
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ public void setProperties(@NonNull final List<String> properties) {
+ this.properties = Preconditions.checkNotNull(properties, "properties");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("properties", this.properties);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeActionResolveSupportCapabilities other = (CodeActionResolveSupportCapabilities) obj;
+ if (this.properties == null) {
+ if (other.properties != null)
+ return false;
+ } else if (!this.properties.equals(other.properties))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.properties== null) ? 0 : this.properties.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeLens.java b/java/org/eclipse/lsp4j/CodeLens.java
new file mode 100644
index 0000000..68ef8ae
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeLens.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A code lens represents a command that should be shown along with source text, like the number of references,
+ * a way to run tests, etc.
+ * <p>
+ * A code lens is <em>unresolved</em> when no command is associated to it. For performance reasons the creation of a
+ * code lens and resolving should be done to two stages.
+ */
+@SuppressWarnings("all")
+public class CodeLens {
+ /**
+ * The range in which this code lens is valid. Should only span a single line.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The command this code lens represents.
+ */
+ private Command command;
+
+ /**
+ * A data entry field that is preserved on a code lens item between a code lens and a code lens resolve request.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ public CodeLens() {
+ }
+
+ public CodeLens(@NonNull final Range range) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ public CodeLens(@NonNull final Range range, final Command command, final Object data) {
+ this(range);
+ this.command = command;
+ this.data = data;
+ }
+
+ /**
+ * The range in which this code lens is valid. Should only span a single line.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range in which this code lens is valid. Should only span a single line.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The command this code lens represents.
+ */
+ @Pure
+ public Command getCommand() {
+ return this.command;
+ }
+
+ /**
+ * The command this code lens represents.
+ */
+ public void setCommand(final Command command) {
+ this.command = command;
+ }
+
+ /**
+ * A data entry field that is preserved on a code lens item between a code lens and a code lens resolve request.
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * A data entry field that is preserved on a code lens item between a code lens and a code lens resolve request.
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("command", this.command);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeLens other = (CodeLens) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.command == null) {
+ if (other.command != null)
+ return false;
+ } else if (!this.command.equals(other.command))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.command== null) ? 0 : this.command.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeLensCapabilities.java b/java/org/eclipse/lsp4j/CodeLensCapabilities.java
new file mode 100644
index 0000000..6b30772
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeLensCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/codeLens`
+ */
+@SuppressWarnings("all")
+public class CodeLensCapabilities extends DynamicRegistrationCapabilities {
+ public CodeLensCapabilities() {
+ }
+
+ public CodeLensCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeLensOptions.java b/java/org/eclipse/lsp4j/CodeLensOptions.java
new file mode 100644
index 0000000..d951863
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeLensOptions.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Code Lens options.
+ */
+@SuppressWarnings("all")
+public class CodeLensOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ private Boolean resolveProvider;
+
+ public CodeLensOptions() {
+ }
+
+ public CodeLensOptions(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeLensOptions other = (CodeLensOptions) obj;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeLensParams.java b/java/org/eclipse/lsp4j/CodeLensParams.java
new file mode 100644
index 0000000..3585bd7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeLensParams.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The code lens request is sent from the client to the server to compute code lenses for a given text document.
+ */
+@SuppressWarnings("all")
+public class CodeLensParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The document to request code lens for.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public CodeLensParams() {
+ }
+
+ public CodeLensParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The document to request code lens for.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document to request code lens for.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeLensParams other = (CodeLensParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeLensRegistrationOptions.java b/java/org/eclipse/lsp4j/CodeLensRegistrationOptions.java
new file mode 100644
index 0000000..96cc359
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeLensRegistrationOptions.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class CodeLensRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ private Boolean resolveProvider;
+
+ public CodeLensRegistrationOptions() {
+ }
+
+ public CodeLensRegistrationOptions(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CodeLensRegistrationOptions other = (CodeLensRegistrationOptions) obj;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CodeLensWorkspaceCapabilities.java b/java/org/eclipse/lsp4j/CodeLensWorkspaceCapabilities.java
new file mode 100644
index 0000000..7353fc7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CodeLensWorkspaceCapabilities.java
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the code lens requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CodeLensWorkspaceCapabilities {
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * code lenses currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ private Boolean refreshSupport;
+
+ public CodeLensWorkspaceCapabilities() {
+ }
+
+ public CodeLensWorkspaceCapabilities(final Boolean refreshSupport) {
+ this.refreshSupport = refreshSupport;
+ }
+
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * code lenses currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ @Pure
+ public Boolean getRefreshSupport() {
+ return this.refreshSupport;
+ }
+
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * code lenses currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ public void setRefreshSupport(final Boolean refreshSupport) {
+ this.refreshSupport = refreshSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("refreshSupport", this.refreshSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CodeLensWorkspaceCapabilities other = (CodeLensWorkspaceCapabilities) obj;
+ if (this.refreshSupport == null) {
+ if (other.refreshSupport != null)
+ return false;
+ } else if (!this.refreshSupport.equals(other.refreshSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.refreshSupport== null) ? 0 : this.refreshSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Color.java b/java/org/eclipse/lsp4j/Color.java
new file mode 100644
index 0000000..5ad37f8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Color.java
@@ -0,0 +1,154 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a color in RGBA space.
+ */
+@SuppressWarnings("all")
+public class Color {
+ /**
+ * The red component of this color in the range [0-1].
+ */
+ private double red;
+
+ /**
+ * The green component of this color in the range [0-1].
+ */
+ private double green;
+
+ /**
+ * The blue component of this color in the range [0-1].
+ */
+ private double blue;
+
+ /**
+ * The alpha component of this color in the range [0-1].
+ */
+ private double alpha;
+
+ public Color() {
+ }
+
+ public Color(final double red, final double green, final double blue, final double alpha) {
+ this.red = red;
+ this.green = green;
+ this.blue = blue;
+ this.alpha = alpha;
+ }
+
+ /**
+ * The red component of this color in the range [0-1].
+ */
+ @Pure
+ public double getRed() {
+ return this.red;
+ }
+
+ /**
+ * The red component of this color in the range [0-1].
+ */
+ public void setRed(final double red) {
+ this.red = red;
+ }
+
+ /**
+ * The green component of this color in the range [0-1].
+ */
+ @Pure
+ public double getGreen() {
+ return this.green;
+ }
+
+ /**
+ * The green component of this color in the range [0-1].
+ */
+ public void setGreen(final double green) {
+ this.green = green;
+ }
+
+ /**
+ * The blue component of this color in the range [0-1].
+ */
+ @Pure
+ public double getBlue() {
+ return this.blue;
+ }
+
+ /**
+ * The blue component of this color in the range [0-1].
+ */
+ public void setBlue(final double blue) {
+ this.blue = blue;
+ }
+
+ /**
+ * The alpha component of this color in the range [0-1].
+ */
+ @Pure
+ public double getAlpha() {
+ return this.alpha;
+ }
+
+ /**
+ * The alpha component of this color in the range [0-1].
+ */
+ public void setAlpha(final double alpha) {
+ this.alpha = alpha;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("red", this.red);
+ b.add("green", this.green);
+ b.add("blue", this.blue);
+ b.add("alpha", this.alpha);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Color other = (Color) obj;
+ if (Double.doubleToLongBits(other.red) != Double.doubleToLongBits(this.red))
+ return false;
+ if (Double.doubleToLongBits(other.green) != Double.doubleToLongBits(this.green))
+ return false;
+ if (Double.doubleToLongBits(other.blue) != Double.doubleToLongBits(this.blue))
+ return false;
+ if (Double.doubleToLongBits(other.alpha) != Double.doubleToLongBits(this.alpha))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (int) (Double.doubleToLongBits(this.red) ^ (Double.doubleToLongBits(this.red) >>> 32));
+ result = prime * result + (int) (Double.doubleToLongBits(this.green) ^ (Double.doubleToLongBits(this.green) >>> 32));
+ result = prime * result + (int) (Double.doubleToLongBits(this.blue) ^ (Double.doubleToLongBits(this.blue) >>> 32));
+ return prime * result + (int) (Double.doubleToLongBits(this.alpha) ^ (Double.doubleToLongBits(this.alpha) >>> 32));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ColorInformation.java b/java/org/eclipse/lsp4j/ColorInformation.java
new file mode 100644
index 0000000..d5d742d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ColorInformation.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Color;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ColorInformation {
+ /**
+ * The range in the document where this color appears.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The actual color value for this color range.
+ */
+ @NonNull
+ private Color color;
+
+ public ColorInformation() {
+ }
+
+ public ColorInformation(@NonNull final Range range, @NonNull final Color color) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.color = Preconditions.<Color>checkNotNull(color, "color");
+ }
+
+ /**
+ * The range in the document where this color appears.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range in the document where this color appears.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The actual color value for this color range.
+ */
+ @Pure
+ @NonNull
+ public Color getColor() {
+ return this.color;
+ }
+
+ /**
+ * The actual color value for this color range.
+ */
+ public void setColor(@NonNull final Color color) {
+ this.color = Preconditions.checkNotNull(color, "color");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("color", this.color);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ColorInformation other = (ColorInformation) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.color == null) {
+ if (other.color != null)
+ return false;
+ } else if (!this.color.equals(other.color))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.color== null) ? 0 : this.color.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ColorPresentation.java b/java/org/eclipse/lsp4j/ColorPresentation.java
new file mode 100644
index 0000000..6703a85
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ColorPresentation.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ColorPresentation {
+ /**
+ * The label of this color presentation. It will be shown on the color
+ * picker header. By default this is also the text that is inserted when selecting
+ * this color presentation.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * An edit which is applied to a document when selecting
+ * this presentation for the color. When `null` the label is used.
+ */
+ private TextEdit textEdit;
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this color presentation. Edits must not overlap with the main edit nor with themselves.
+ */
+ private List<TextEdit> additionalTextEdits;
+
+ public ColorPresentation() {
+ }
+
+ public ColorPresentation(@NonNull final String label) {
+ this.label = Preconditions.<String>checkNotNull(label, "label");
+ }
+
+ public ColorPresentation(@NonNull final String label, final TextEdit textEdit) {
+ this(label);
+ this.textEdit = textEdit;
+ }
+
+ public ColorPresentation(@NonNull final String label, final TextEdit textEdit, final List<TextEdit> additionalTextEdits) {
+ this(label);
+ this.textEdit = textEdit;
+ this.additionalTextEdits = additionalTextEdits;
+ }
+
+ /**
+ * The label of this color presentation. It will be shown on the color
+ * picker header. By default this is also the text that is inserted when selecting
+ * this color presentation.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The label of this color presentation. It will be shown on the color
+ * picker header. By default this is also the text that is inserted when selecting
+ * this color presentation.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * An edit which is applied to a document when selecting
+ * this presentation for the color. When `null` the label is used.
+ */
+ @Pure
+ public TextEdit getTextEdit() {
+ return this.textEdit;
+ }
+
+ /**
+ * An edit which is applied to a document when selecting
+ * this presentation for the color. When `null` the label is used.
+ */
+ public void setTextEdit(final TextEdit textEdit) {
+ this.textEdit = textEdit;
+ }
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this color presentation. Edits must not overlap with the main edit nor with themselves.
+ */
+ @Pure
+ public List<TextEdit> getAdditionalTextEdits() {
+ return this.additionalTextEdits;
+ }
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this color presentation. Edits must not overlap with the main edit nor with themselves.
+ */
+ public void setAdditionalTextEdits(final List<TextEdit> additionalTextEdits) {
+ this.additionalTextEdits = additionalTextEdits;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("textEdit", this.textEdit);
+ b.add("additionalTextEdits", this.additionalTextEdits);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ColorPresentation other = (ColorPresentation) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.textEdit == null) {
+ if (other.textEdit != null)
+ return false;
+ } else if (!this.textEdit.equals(other.textEdit))
+ return false;
+ if (this.additionalTextEdits == null) {
+ if (other.additionalTextEdits != null)
+ return false;
+ } else if (!this.additionalTextEdits.equals(other.additionalTextEdits))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.textEdit== null) ? 0 : this.textEdit.hashCode());
+ return prime * result + ((this.additionalTextEdits== null) ? 0 : this.additionalTextEdits.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ColorPresentationParams.java b/java/org/eclipse/lsp4j/ColorPresentationParams.java
new file mode 100644
index 0000000..3e6f5b1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ColorPresentationParams.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Color;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The color presentation request is sent from the client to the server to obtain a list of presentations
+ * for a color value at a given location.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class ColorPresentationParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The color information to request presentations for.
+ */
+ @NonNull
+ private Color color;
+
+ /**
+ * The range where the color would be inserted. Serves as a context.
+ */
+ @NonNull
+ private Range range;
+
+ public ColorPresentationParams() {
+ }
+
+ public ColorPresentationParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Color color, @NonNull final Range range) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.color = Preconditions.<Color>checkNotNull(color, "color");
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The color information to request presentations for.
+ */
+ @Pure
+ @NonNull
+ public Color getColor() {
+ return this.color;
+ }
+
+ /**
+ * The color information to request presentations for.
+ */
+ public void setColor(@NonNull final Color color) {
+ this.color = Preconditions.checkNotNull(color, "color");
+ }
+
+ /**
+ * The range where the color would be inserted. Serves as a context.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range where the color would be inserted. Serves as a context.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("color", this.color);
+ b.add("range", this.range);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ColorPresentationParams other = (ColorPresentationParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.color == null) {
+ if (other.color != null)
+ return false;
+ } else if (!this.color.equals(other.color))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ result = prime * result + ((this.color== null) ? 0 : this.color.hashCode());
+ return prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ColorProviderCapabilities.java b/java/org/eclipse/lsp4j/ColorProviderCapabilities.java
new file mode 100644
index 0000000..9c9447f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ColorProviderCapabilities.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/documentColor` and the
+ * `textDocument/colorPresentation` request.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class ColorProviderCapabilities extends DynamicRegistrationCapabilities {
+ public ColorProviderCapabilities() {
+ }
+
+ public ColorProviderCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ColorProviderOptions.java b/java/org/eclipse/lsp4j/ColorProviderOptions.java
new file mode 100644
index 0000000..642459c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ColorProviderOptions.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Document color options
+ */
+@SuppressWarnings("all")
+public class ColorProviderOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public ColorProviderOptions() {
+ }
+
+ public ColorProviderOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ColorProviderOptions other = (ColorProviderOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Command.java b/java/org/eclipse/lsp4j/Command.java
new file mode 100644
index 0000000..1a8bed0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Command.java
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a reference to a command. Provides a title which will be used to represent a command in the UI and,
+ * optionally, an array of arguments which will be passed to the command handler function when invoked.
+ */
+@SuppressWarnings("all")
+public class Command {
+ /**
+ * Title of the command, like `save`.
+ */
+ @NonNull
+ private String title;
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ @NonNull
+ private String command;
+
+ /**
+ * Arguments that the command handler should be invoked with.
+ */
+ private List<Object> arguments;
+
+ public Command() {
+ }
+
+ public Command(@NonNull final String title, @NonNull final String command) {
+ this.title = Preconditions.<String>checkNotNull(title, "title");
+ this.command = Preconditions.<String>checkNotNull(command, "command");
+ }
+
+ public Command(@NonNull final String title, @NonNull final String command, final List<Object> arguments) {
+ this(title, command);
+ this.arguments = arguments;
+ }
+
+ /**
+ * Title of the command, like `save`.
+ */
+ @Pure
+ @NonNull
+ public String getTitle() {
+ return this.title;
+ }
+
+ /**
+ * Title of the command, like `save`.
+ */
+ public void setTitle(@NonNull final String title) {
+ this.title = Preconditions.checkNotNull(title, "title");
+ }
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ @Pure
+ @NonNull
+ public String getCommand() {
+ return this.command;
+ }
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ public void setCommand(@NonNull final String command) {
+ this.command = Preconditions.checkNotNull(command, "command");
+ }
+
+ /**
+ * Arguments that the command handler should be invoked with.
+ */
+ @Pure
+ public List<Object> getArguments() {
+ return this.arguments;
+ }
+
+ /**
+ * Arguments that the command handler should be invoked with.
+ */
+ public void setArguments(final List<Object> arguments) {
+ this.arguments = arguments;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("title", this.title);
+ b.add("command", this.command);
+ b.add("arguments", this.arguments);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Command other = (Command) obj;
+ if (this.title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!this.title.equals(other.title))
+ return false;
+ if (this.command == null) {
+ if (other.command != null)
+ return false;
+ } else if (!this.command.equals(other.command))
+ return false;
+ if (this.arguments == null) {
+ if (other.arguments != null)
+ return false;
+ } else if (!this.arguments.equals(other.arguments))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.title== null) ? 0 : this.title.hashCode());
+ result = prime * result + ((this.command== null) ? 0 : this.command.hashCode());
+ return prime * result + ((this.arguments== null) ? 0 : this.arguments.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionCapabilities.java b/java/org/eclipse/lsp4j/CompletionCapabilities.java
new file mode 100644
index 0000000..cf81ce4
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionCapabilities.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CompletionItemCapabilities;
+import org.eclipse.lsp4j.CompletionItemKindCapabilities;
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/completion`
+ */
+@SuppressWarnings("all")
+public class CompletionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports the following {@link CompletionItem} specific
+ * capabilities.
+ */
+ private CompletionItemCapabilities completionItem;
+
+ /**
+ * The client supports the following {@link CompletionItemKind} specific
+ * capabilities.
+ */
+ private CompletionItemKindCapabilities completionItemKind;
+
+ /**
+ * The client supports sending additional context information for a
+ * `textDocument/completion` request.
+ */
+ private Boolean contextSupport;
+
+ public CompletionCapabilities() {
+ }
+
+ public CompletionCapabilities(final CompletionItemCapabilities completionItem) {
+ this.completionItem = completionItem;
+ }
+
+ public CompletionCapabilities(final CompletionItemKindCapabilities completionItemKind) {
+ this.completionItemKind = completionItemKind;
+ }
+
+ public CompletionCapabilities(final Boolean contextSupport) {
+ this.contextSupport = contextSupport;
+ }
+
+ /**
+ * The client supports the following {@link CompletionItem} specific
+ * capabilities.
+ */
+ @Pure
+ public CompletionItemCapabilities getCompletionItem() {
+ return this.completionItem;
+ }
+
+ /**
+ * The client supports the following {@link CompletionItem} specific
+ * capabilities.
+ */
+ public void setCompletionItem(final CompletionItemCapabilities completionItem) {
+ this.completionItem = completionItem;
+ }
+
+ /**
+ * The client supports the following {@link CompletionItemKind} specific
+ * capabilities.
+ */
+ @Pure
+ public CompletionItemKindCapabilities getCompletionItemKind() {
+ return this.completionItemKind;
+ }
+
+ /**
+ * The client supports the following {@link CompletionItemKind} specific
+ * capabilities.
+ */
+ public void setCompletionItemKind(final CompletionItemKindCapabilities completionItemKind) {
+ this.completionItemKind = completionItemKind;
+ }
+
+ /**
+ * The client supports sending additional context information for a
+ * `textDocument/completion` request.
+ */
+ @Pure
+ public Boolean getContextSupport() {
+ return this.contextSupport;
+ }
+
+ /**
+ * The client supports sending additional context information for a
+ * `textDocument/completion` request.
+ */
+ public void setContextSupport(final Boolean contextSupport) {
+ this.contextSupport = contextSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("completionItem", this.completionItem);
+ b.add("completionItemKind", this.completionItemKind);
+ b.add("contextSupport", this.contextSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CompletionCapabilities other = (CompletionCapabilities) obj;
+ if (this.completionItem == null) {
+ if (other.completionItem != null)
+ return false;
+ } else if (!this.completionItem.equals(other.completionItem))
+ return false;
+ if (this.completionItemKind == null) {
+ if (other.completionItemKind != null)
+ return false;
+ } else if (!this.completionItemKind.equals(other.completionItemKind))
+ return false;
+ if (this.contextSupport == null) {
+ if (other.contextSupport != null)
+ return false;
+ } else if (!this.contextSupport.equals(other.contextSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.completionItem== null) ? 0 : this.completionItem.hashCode());
+ result = prime * result + ((this.completionItemKind== null) ? 0 : this.completionItemKind.hashCode());
+ return prime * result + ((this.contextSupport== null) ? 0 : this.contextSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionContext.java b/java/org/eclipse/lsp4j/CompletionContext.java
new file mode 100644
index 0000000..f4db969
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionContext.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CompletionTriggerKind;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class CompletionContext {
+ /**
+ * How the completion was triggered.
+ */
+ @NonNull
+ private CompletionTriggerKind triggerKind;
+
+ /**
+ * The trigger character (a single character) that has trigger code complete.
+ * Is undefined if {@link #triggerKind} is not {@link CompletionTriggerKind#TriggerCharacter}.
+ */
+ private String triggerCharacter;
+
+ public CompletionContext() {
+ }
+
+ public CompletionContext(@NonNull final CompletionTriggerKind triggerKind) {
+ this.triggerKind = Preconditions.<CompletionTriggerKind>checkNotNull(triggerKind, "triggerKind");
+ }
+
+ public CompletionContext(@NonNull final CompletionTriggerKind triggerKind, final String triggerCharacter) {
+ this(triggerKind);
+ this.triggerCharacter = triggerCharacter;
+ }
+
+ /**
+ * How the completion was triggered.
+ */
+ @Pure
+ @NonNull
+ public CompletionTriggerKind getTriggerKind() {
+ return this.triggerKind;
+ }
+
+ /**
+ * How the completion was triggered.
+ */
+ public void setTriggerKind(@NonNull final CompletionTriggerKind triggerKind) {
+ this.triggerKind = Preconditions.checkNotNull(triggerKind, "triggerKind");
+ }
+
+ /**
+ * The trigger character (a single character) that has trigger code complete.
+ * Is undefined if {@link #triggerKind} is not {@link CompletionTriggerKind#TriggerCharacter}.
+ */
+ @Pure
+ public String getTriggerCharacter() {
+ return this.triggerCharacter;
+ }
+
+ /**
+ * The trigger character (a single character) that has trigger code complete.
+ * Is undefined if {@link #triggerKind} is not {@link CompletionTriggerKind#TriggerCharacter}.
+ */
+ public void setTriggerCharacter(final String triggerCharacter) {
+ this.triggerCharacter = triggerCharacter;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("triggerKind", this.triggerKind);
+ b.add("triggerCharacter", this.triggerCharacter);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionContext other = (CompletionContext) obj;
+ if (this.triggerKind == null) {
+ if (other.triggerKind != null)
+ return false;
+ } else if (!this.triggerKind.equals(other.triggerKind))
+ return false;
+ if (this.triggerCharacter == null) {
+ if (other.triggerCharacter != null)
+ return false;
+ } else if (!this.triggerCharacter.equals(other.triggerCharacter))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.triggerKind== null) ? 0 : this.triggerKind.hashCode());
+ return prime * result + ((this.triggerCharacter== null) ? 0 : this.triggerCharacter.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItem.java b/java/org/eclipse/lsp4j/CompletionItem.java
new file mode 100644
index 0000000..7909b4f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItem.java
@@ -0,0 +1,687 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.CompletionItemKind;
+import org.eclipse.lsp4j.CompletionItemTag;
+import org.eclipse.lsp4j.InsertReplaceEdit;
+import org.eclipse.lsp4j.InsertTextFormat;
+import org.eclipse.lsp4j.InsertTextMode;
+import org.eclipse.lsp4j.MarkupContent;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.adapters.CompletionItemTextEditTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The Completion request is sent from the client to the server to compute completion items at a given cursor position.
+ * Completion items are presented in the IntelliSense user class. If computing complete completion items is expensive
+ * servers can additional provide a handler for the resolve completion item request. This request is send when a
+ * completion item is selected in the user class.
+ */
+@SuppressWarnings("all")
+public class CompletionItem {
+ /**
+ * The label of this completion item. By default also the text that is inserted when selecting this completion.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * The kind of this completion item. Based of the kind an icon is chosen by the editor.
+ */
+ private CompletionItemKind kind;
+
+ /**
+ * Tags for this completion item.
+ * <p>
+ * Since 3.15.0
+ */
+ private List<CompletionItemTag> tags;
+
+ /**
+ * A human-readable string with additional information about this item, like type or symbol information.
+ */
+ private String detail;
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ private Either<String, MarkupContent> documentation;
+
+ /**
+ * Indicates if this item is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ private Boolean deprecated;
+
+ /**
+ * Select this item when showing.
+ * <p>
+ * <em>Note</em> that only one completion item can be selected and that the
+ * tool / client decides which item that is. The rule is that the <em>first</em>
+ * item of those that match best is selected.
+ */
+ private Boolean preselect;
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ */
+ private String sortText;
+
+ /**
+ * A string that should be used when filtering a set of completion items. When `falsy` the label is used.
+ */
+ private String filterText;
+
+ /**
+ * A string that should be inserted a document when selecting this completion. When `falsy` the label is used.
+ */
+ private String insertText;
+
+ /**
+ * The format of the insert text. The format applies to both the {@link #insertText} property
+ * and the {@code newText} property of a provided {@link #textEdit}.
+ */
+ private InsertTextFormat insertTextFormat;
+
+ /**
+ * How whitespace and indentation is handled during completion item
+ * insertion. If not provided, the client's default value is used.
+ * <p>
+ * Since 3.16.0
+ */
+ private InsertTextMode insertTextMode;
+
+ /**
+ * An edit which is applied to a document when selecting this completion.
+ * When an edit is provided the value of {@link #insertText} is ignored.
+ * <p>
+ * <em>Note:</em> The range of the edit must be a single line range and it must
+ * contain the position at which completion has been requested.
+ * <p>
+ * Most editors support two different operations when accepting a completion
+ * item. One is to insert a completion text and the other is to replace an
+ * existing text with a completion text. Since this can usually not be
+ * predetermined by a server it can report both ranges. Clients need to
+ * signal support for {@link InsertReplaceEdit}s via the
+ * {@link CompletionItemCapabilities#insertReplaceSupport} client capability
+ * property.
+ * <p>
+ * <em>Note 1:</em> The text edit's range as well as both ranges from an insert
+ * replace edit must be a [single line] and they must contain the position
+ * at which completion has been requested.
+ * <p>
+ * <em>Note 2:</em> If an {@link InsertReplaceEdit} is returned the edit's insert range
+ * must be a prefix of the edit's replace range, that means it must be
+ * contained and starting at the same position.
+ * <p>
+ * Since 3.16.0 additional type {@link InsertReplaceEdit}
+ */
+ @JsonAdapter(CompletionItemTextEditTypeAdapter.class)
+ private Either<TextEdit, InsertReplaceEdit> textEdit;
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap (including the same insert position)
+ * with the main edit nor with themselves.
+ * <p>
+ * Additional text edits should be used to change text unrelated to the current cursor position
+ * (for example adding an import statement at the top of the file if the completion item will
+ * insert an unqualified type).
+ */
+ private List<TextEdit> additionalTextEdits;
+
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. <em>Note</em> that all commit characters should have {@code length=1} and that superfluous
+ * characters will be ignored.
+ */
+ private List<String> commitCharacters;
+
+ /**
+ * An optional command that is executed <em>after</em> inserting this completion. <em>Note</em> that
+ * additional modifications to the current document should be described with the
+ * {@link #additionalTextEdits} property.
+ */
+ private Command command;
+
+ /**
+ * A data entry field that is preserved on a completion item between a completion and a completion resolve request.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ public CompletionItem() {
+ }
+
+ public CompletionItem(@NonNull final String label) {
+ this.label = Preconditions.<String>checkNotNull(label, "label");
+ }
+
+ /**
+ * The label of this completion item. By default also the text that is inserted when selecting this completion.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The label of this completion item. By default also the text that is inserted when selecting this completion.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * The kind of this completion item. Based of the kind an icon is chosen by the editor.
+ */
+ @Pure
+ public CompletionItemKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of this completion item. Based of the kind an icon is chosen by the editor.
+ */
+ public void setKind(final CompletionItemKind kind) {
+ this.kind = kind;
+ }
+
+ /**
+ * Tags for this completion item.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public List<CompletionItemTag> getTags() {
+ return this.tags;
+ }
+
+ /**
+ * Tags for this completion item.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setTags(final List<CompletionItemTag> tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * A human-readable string with additional information about this item, like type or symbol information.
+ */
+ @Pure
+ public String getDetail() {
+ return this.detail;
+ }
+
+ /**
+ * A human-readable string with additional information about this item, like type or symbol information.
+ */
+ public void setDetail(final String detail) {
+ this.detail = detail;
+ }
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ @Pure
+ public Either<String, MarkupContent> getDocumentation() {
+ return this.documentation;
+ }
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ public void setDocumentation(final Either<String, MarkupContent> documentation) {
+ this.documentation = documentation;
+ }
+
+ public void setDocumentation(final String documentation) {
+ if (documentation == null) {
+ this.documentation = null;
+ return;
+ }
+ this.documentation = Either.forLeft(documentation);
+ }
+
+ public void setDocumentation(final MarkupContent documentation) {
+ if (documentation == null) {
+ this.documentation = null;
+ return;
+ }
+ this.documentation = Either.forRight(documentation);
+ }
+
+ /**
+ * Indicates if this item is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Pure
+ @Deprecated
+ public Boolean getDeprecated() {
+ return this.deprecated;
+ }
+
+ /**
+ * Indicates if this item is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ public void setDeprecated(final Boolean deprecated) {
+ this.deprecated = deprecated;
+ }
+
+ /**
+ * Select this item when showing.
+ * <p>
+ * <em>Note</em> that only one completion item can be selected and that the
+ * tool / client decides which item that is. The rule is that the <em>first</em>
+ * item of those that match best is selected.
+ */
+ @Pure
+ public Boolean getPreselect() {
+ return this.preselect;
+ }
+
+ /**
+ * Select this item when showing.
+ * <p>
+ * <em>Note</em> that only one completion item can be selected and that the
+ * tool / client decides which item that is. The rule is that the <em>first</em>
+ * item of those that match best is selected.
+ */
+ public void setPreselect(final Boolean preselect) {
+ this.preselect = preselect;
+ }
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ */
+ @Pure
+ public String getSortText() {
+ return this.sortText;
+ }
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ */
+ public void setSortText(final String sortText) {
+ this.sortText = sortText;
+ }
+
+ /**
+ * A string that should be used when filtering a set of completion items. When `falsy` the label is used.
+ */
+ @Pure
+ public String getFilterText() {
+ return this.filterText;
+ }
+
+ /**
+ * A string that should be used when filtering a set of completion items. When `falsy` the label is used.
+ */
+ public void setFilterText(final String filterText) {
+ this.filterText = filterText;
+ }
+
+ /**
+ * A string that should be inserted a document when selecting this completion. When `falsy` the label is used.
+ */
+ @Pure
+ public String getInsertText() {
+ return this.insertText;
+ }
+
+ /**
+ * A string that should be inserted a document when selecting this completion. When `falsy` the label is used.
+ */
+ public void setInsertText(final String insertText) {
+ this.insertText = insertText;
+ }
+
+ /**
+ * The format of the insert text. The format applies to both the {@link #insertText} property
+ * and the {@code newText} property of a provided {@link #textEdit}.
+ */
+ @Pure
+ public InsertTextFormat getInsertTextFormat() {
+ return this.insertTextFormat;
+ }
+
+ /**
+ * The format of the insert text. The format applies to both the {@link #insertText} property
+ * and the {@code newText} property of a provided {@link #textEdit}.
+ */
+ public void setInsertTextFormat(final InsertTextFormat insertTextFormat) {
+ this.insertTextFormat = insertTextFormat;
+ }
+
+ /**
+ * How whitespace and indentation is handled during completion item
+ * insertion. If not provided, the client's default value is used.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public InsertTextMode getInsertTextMode() {
+ return this.insertTextMode;
+ }
+
+ /**
+ * How whitespace and indentation is handled during completion item
+ * insertion. If not provided, the client's default value is used.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setInsertTextMode(final InsertTextMode insertTextMode) {
+ this.insertTextMode = insertTextMode;
+ }
+
+ /**
+ * An edit which is applied to a document when selecting this completion.
+ * When an edit is provided the value of {@link #insertText} is ignored.
+ * <p>
+ * <em>Note:</em> The range of the edit must be a single line range and it must
+ * contain the position at which completion has been requested.
+ * <p>
+ * Most editors support two different operations when accepting a completion
+ * item. One is to insert a completion text and the other is to replace an
+ * existing text with a completion text. Since this can usually not be
+ * predetermined by a server it can report both ranges. Clients need to
+ * signal support for {@link InsertReplaceEdit}s via the
+ * {@link CompletionItemCapabilities#insertReplaceSupport} client capability
+ * property.
+ * <p>
+ * <em>Note 1:</em> The text edit's range as well as both ranges from an insert
+ * replace edit must be a [single line] and they must contain the position
+ * at which completion has been requested.
+ * <p>
+ * <em>Note 2:</em> If an {@link InsertReplaceEdit} is returned the edit's insert range
+ * must be a prefix of the edit's replace range, that means it must be
+ * contained and starting at the same position.
+ * <p>
+ * Since 3.16.0 additional type {@link InsertReplaceEdit}
+ */
+ @Pure
+ public Either<TextEdit, InsertReplaceEdit> getTextEdit() {
+ return this.textEdit;
+ }
+
+ /**
+ * An edit which is applied to a document when selecting this completion.
+ * When an edit is provided the value of {@link #insertText} is ignored.
+ * <p>
+ * <em>Note:</em> The range of the edit must be a single line range and it must
+ * contain the position at which completion has been requested.
+ * <p>
+ * Most editors support two different operations when accepting a completion
+ * item. One is to insert a completion text and the other is to replace an
+ * existing text with a completion text. Since this can usually not be
+ * predetermined by a server it can report both ranges. Clients need to
+ * signal support for {@link InsertReplaceEdit}s via the
+ * {@link CompletionItemCapabilities#insertReplaceSupport} client capability
+ * property.
+ * <p>
+ * <em>Note 1:</em> The text edit's range as well as both ranges from an insert
+ * replace edit must be a [single line] and they must contain the position
+ * at which completion has been requested.
+ * <p>
+ * <em>Note 2:</em> If an {@link InsertReplaceEdit} is returned the edit's insert range
+ * must be a prefix of the edit's replace range, that means it must be
+ * contained and starting at the same position.
+ * <p>
+ * Since 3.16.0 additional type {@link InsertReplaceEdit}
+ */
+ public void setTextEdit(final Either<TextEdit, InsertReplaceEdit> textEdit) {
+ this.textEdit = textEdit;
+ }
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap (including the same insert position)
+ * with the main edit nor with themselves.
+ * <p>
+ * Additional text edits should be used to change text unrelated to the current cursor position
+ * (for example adding an import statement at the top of the file if the completion item will
+ * insert an unqualified type).
+ */
+ @Pure
+ public List<TextEdit> getAdditionalTextEdits() {
+ return this.additionalTextEdits;
+ }
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap (including the same insert position)
+ * with the main edit nor with themselves.
+ * <p>
+ * Additional text edits should be used to change text unrelated to the current cursor position
+ * (for example adding an import statement at the top of the file if the completion item will
+ * insert an unqualified type).
+ */
+ public void setAdditionalTextEdits(final List<TextEdit> additionalTextEdits) {
+ this.additionalTextEdits = additionalTextEdits;
+ }
+
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. <em>Note</em> that all commit characters should have {@code length=1} and that superfluous
+ * characters will be ignored.
+ */
+ @Pure
+ public List<String> getCommitCharacters() {
+ return this.commitCharacters;
+ }
+
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. <em>Note</em> that all commit characters should have {@code length=1} and that superfluous
+ * characters will be ignored.
+ */
+ public void setCommitCharacters(final List<String> commitCharacters) {
+ this.commitCharacters = commitCharacters;
+ }
+
+ /**
+ * An optional command that is executed <em>after</em> inserting this completion. <em>Note</em> that
+ * additional modifications to the current document should be described with the
+ * {@link #additionalTextEdits} property.
+ */
+ @Pure
+ public Command getCommand() {
+ return this.command;
+ }
+
+ /**
+ * An optional command that is executed <em>after</em> inserting this completion. <em>Note</em> that
+ * additional modifications to the current document should be described with the
+ * {@link #additionalTextEdits} property.
+ */
+ public void setCommand(final Command command) {
+ this.command = command;
+ }
+
+ /**
+ * A data entry field that is preserved on a completion item between a completion and a completion resolve request.
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * A data entry field that is preserved on a completion item between a completion and a completion resolve request.
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("kind", this.kind);
+ b.add("tags", this.tags);
+ b.add("detail", this.detail);
+ b.add("documentation", this.documentation);
+ b.add("deprecated", this.deprecated);
+ b.add("preselect", this.preselect);
+ b.add("sortText", this.sortText);
+ b.add("filterText", this.filterText);
+ b.add("insertText", this.insertText);
+ b.add("insertTextFormat", this.insertTextFormat);
+ b.add("insertTextMode", this.insertTextMode);
+ b.add("textEdit", this.textEdit);
+ b.add("additionalTextEdits", this.additionalTextEdits);
+ b.add("commitCharacters", this.commitCharacters);
+ b.add("command", this.command);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItem other = (CompletionItem) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.tags == null) {
+ if (other.tags != null)
+ return false;
+ } else if (!this.tags.equals(other.tags))
+ return false;
+ if (this.detail == null) {
+ if (other.detail != null)
+ return false;
+ } else if (!this.detail.equals(other.detail))
+ return false;
+ if (this.documentation == null) {
+ if (other.documentation != null)
+ return false;
+ } else if (!this.documentation.equals(other.documentation))
+ return false;
+ if (this.deprecated == null) {
+ if (other.deprecated != null)
+ return false;
+ } else if (!this.deprecated.equals(other.deprecated))
+ return false;
+ if (this.preselect == null) {
+ if (other.preselect != null)
+ return false;
+ } else if (!this.preselect.equals(other.preselect))
+ return false;
+ if (this.sortText == null) {
+ if (other.sortText != null)
+ return false;
+ } else if (!this.sortText.equals(other.sortText))
+ return false;
+ if (this.filterText == null) {
+ if (other.filterText != null)
+ return false;
+ } else if (!this.filterText.equals(other.filterText))
+ return false;
+ if (this.insertText == null) {
+ if (other.insertText != null)
+ return false;
+ } else if (!this.insertText.equals(other.insertText))
+ return false;
+ if (this.insertTextFormat == null) {
+ if (other.insertTextFormat != null)
+ return false;
+ } else if (!this.insertTextFormat.equals(other.insertTextFormat))
+ return false;
+ if (this.insertTextMode == null) {
+ if (other.insertTextMode != null)
+ return false;
+ } else if (!this.insertTextMode.equals(other.insertTextMode))
+ return false;
+ if (this.textEdit == null) {
+ if (other.textEdit != null)
+ return false;
+ } else if (!this.textEdit.equals(other.textEdit))
+ return false;
+ if (this.additionalTextEdits == null) {
+ if (other.additionalTextEdits != null)
+ return false;
+ } else if (!this.additionalTextEdits.equals(other.additionalTextEdits))
+ return false;
+ if (this.commitCharacters == null) {
+ if (other.commitCharacters != null)
+ return false;
+ } else if (!this.commitCharacters.equals(other.commitCharacters))
+ return false;
+ if (this.command == null) {
+ if (other.command != null)
+ return false;
+ } else if (!this.command.equals(other.command))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.tags== null) ? 0 : this.tags.hashCode());
+ result = prime * result + ((this.detail== null) ? 0 : this.detail.hashCode());
+ result = prime * result + ((this.documentation== null) ? 0 : this.documentation.hashCode());
+ result = prime * result + ((this.deprecated== null) ? 0 : this.deprecated.hashCode());
+ result = prime * result + ((this.preselect== null) ? 0 : this.preselect.hashCode());
+ result = prime * result + ((this.sortText== null) ? 0 : this.sortText.hashCode());
+ result = prime * result + ((this.filterText== null) ? 0 : this.filterText.hashCode());
+ result = prime * result + ((this.insertText== null) ? 0 : this.insertText.hashCode());
+ result = prime * result + ((this.insertTextFormat== null) ? 0 : this.insertTextFormat.hashCode());
+ result = prime * result + ((this.insertTextMode== null) ? 0 : this.insertTextMode.hashCode());
+ result = prime * result + ((this.textEdit== null) ? 0 : this.textEdit.hashCode());
+ result = prime * result + ((this.additionalTextEdits== null) ? 0 : this.additionalTextEdits.hashCode());
+ result = prime * result + ((this.commitCharacters== null) ? 0 : this.commitCharacters.hashCode());
+ result = prime * result + ((this.command== null) ? 0 : this.command.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItemCapabilities.java b/java/org/eclipse/lsp4j/CompletionItemCapabilities.java
new file mode 100644
index 0000000..4dfe81b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemCapabilities.java
@@ -0,0 +1,368 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.CompletionItemInsertTextModeSupportCapabilities;
+import org.eclipse.lsp4j.CompletionItemResolveSupportCapabilities;
+import org.eclipse.lsp4j.CompletionItemTagSupportCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client supports the following {@link CompletionItem} specific capabilities.
+ */
+@SuppressWarnings("all")
+public class CompletionItemCapabilities {
+ /**
+ * Client supports snippets as insert text.
+ * <p>
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Placeholders with equal identifiers are linked,
+ * that is typing in one will update others too.
+ */
+ private Boolean snippetSupport;
+
+ /**
+ * Client supports commit characters on a completion item.
+ */
+ private Boolean commitCharactersSupport;
+
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ */
+ private List<String> documentationFormat;
+
+ /**
+ * Client supports the deprecated property on a completion item.
+ */
+ private Boolean deprecatedSupport;
+
+ /**
+ * Client supports the preselect property on a completion item.
+ */
+ private Boolean preselectSupport;
+
+ /**
+ * Client supports the tag property on a completion item. Clients supporting
+ * tags have to handle unknown tags gracefully. Clients especially need to
+ * preserve unknown tags when sending a completion item back to the server in
+ * a resolve call.
+ * <p>
+ * Since 3.15.0
+ */
+ private CompletionItemTagSupportCapabilities tagSupport;
+
+ /**
+ * Client support insert replace edit to control different behavior if a
+ * completion item is inserted in the text or should replace text.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean insertReplaceSupport;
+
+ /**
+ * Indicates which properties a client can resolve lazily on a completion
+ * item. Before version 3.16.0 only the predefined properties {@link CompletionItem#documentation}
+ * and {@link CompletionItem#detail} could be resolved lazily.
+ * <p>
+ * Since 3.16.0
+ */
+ private CompletionItemResolveSupportCapabilities resolveSupport;
+
+ /**
+ * The client supports the {@link CompletionItem#insertTextMode} property on
+ * a completion item to override the whitespace handling mode
+ * as defined by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ private CompletionItemInsertTextModeSupportCapabilities insertTextModeSupport;
+
+ public CompletionItemCapabilities() {
+ }
+
+ public CompletionItemCapabilities(final Boolean snippetSupport) {
+ this.snippetSupport = snippetSupport;
+ }
+
+ /**
+ * Client supports snippets as insert text.
+ * <p>
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Placeholders with equal identifiers are linked,
+ * that is typing in one will update others too.
+ */
+ @Pure
+ public Boolean getSnippetSupport() {
+ return this.snippetSupport;
+ }
+
+ /**
+ * Client supports snippets as insert text.
+ * <p>
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Placeholders with equal identifiers are linked,
+ * that is typing in one will update others too.
+ */
+ public void setSnippetSupport(final Boolean snippetSupport) {
+ this.snippetSupport = snippetSupport;
+ }
+
+ /**
+ * Client supports commit characters on a completion item.
+ */
+ @Pure
+ public Boolean getCommitCharactersSupport() {
+ return this.commitCharactersSupport;
+ }
+
+ /**
+ * Client supports commit characters on a completion item.
+ */
+ public void setCommitCharactersSupport(final Boolean commitCharactersSupport) {
+ this.commitCharactersSupport = commitCharactersSupport;
+ }
+
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ */
+ @Pure
+ public List<String> getDocumentationFormat() {
+ return this.documentationFormat;
+ }
+
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ */
+ public void setDocumentationFormat(final List<String> documentationFormat) {
+ this.documentationFormat = documentationFormat;
+ }
+
+ /**
+ * Client supports the deprecated property on a completion item.
+ */
+ @Pure
+ public Boolean getDeprecatedSupport() {
+ return this.deprecatedSupport;
+ }
+
+ /**
+ * Client supports the deprecated property on a completion item.
+ */
+ public void setDeprecatedSupport(final Boolean deprecatedSupport) {
+ this.deprecatedSupport = deprecatedSupport;
+ }
+
+ /**
+ * Client supports the preselect property on a completion item.
+ */
+ @Pure
+ public Boolean getPreselectSupport() {
+ return this.preselectSupport;
+ }
+
+ /**
+ * Client supports the preselect property on a completion item.
+ */
+ public void setPreselectSupport(final Boolean preselectSupport) {
+ this.preselectSupport = preselectSupport;
+ }
+
+ /**
+ * Client supports the tag property on a completion item. Clients supporting
+ * tags have to handle unknown tags gracefully. Clients especially need to
+ * preserve unknown tags when sending a completion item back to the server in
+ * a resolve call.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public CompletionItemTagSupportCapabilities getTagSupport() {
+ return this.tagSupport;
+ }
+
+ /**
+ * Client supports the tag property on a completion item. Clients supporting
+ * tags have to handle unknown tags gracefully. Clients especially need to
+ * preserve unknown tags when sending a completion item back to the server in
+ * a resolve call.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setTagSupport(final CompletionItemTagSupportCapabilities tagSupport) {
+ this.tagSupport = tagSupport;
+ }
+
+ /**
+ * Client support insert replace edit to control different behavior if a
+ * completion item is inserted in the text or should replace text.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getInsertReplaceSupport() {
+ return this.insertReplaceSupport;
+ }
+
+ /**
+ * Client support insert replace edit to control different behavior if a
+ * completion item is inserted in the text or should replace text.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setInsertReplaceSupport(final Boolean insertReplaceSupport) {
+ this.insertReplaceSupport = insertReplaceSupport;
+ }
+
+ /**
+ * Indicates which properties a client can resolve lazily on a completion
+ * item. Before version 3.16.0 only the predefined properties {@link CompletionItem#documentation}
+ * and {@link CompletionItem#detail} could be resolved lazily.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public CompletionItemResolveSupportCapabilities getResolveSupport() {
+ return this.resolveSupport;
+ }
+
+ /**
+ * Indicates which properties a client can resolve lazily on a completion
+ * item. Before version 3.16.0 only the predefined properties {@link CompletionItem#documentation}
+ * and {@link CompletionItem#detail} could be resolved lazily.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setResolveSupport(final CompletionItemResolveSupportCapabilities resolveSupport) {
+ this.resolveSupport = resolveSupport;
+ }
+
+ /**
+ * The client supports the {@link CompletionItem#insertTextMode} property on
+ * a completion item to override the whitespace handling mode
+ * as defined by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public CompletionItemInsertTextModeSupportCapabilities getInsertTextModeSupport() {
+ return this.insertTextModeSupport;
+ }
+
+ /**
+ * The client supports the {@link CompletionItem#insertTextMode} property on
+ * a completion item to override the whitespace handling mode
+ * as defined by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setInsertTextModeSupport(final CompletionItemInsertTextModeSupportCapabilities insertTextModeSupport) {
+ this.insertTextModeSupport = insertTextModeSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("snippetSupport", this.snippetSupport);
+ b.add("commitCharactersSupport", this.commitCharactersSupport);
+ b.add("documentationFormat", this.documentationFormat);
+ b.add("deprecatedSupport", this.deprecatedSupport);
+ b.add("preselectSupport", this.preselectSupport);
+ b.add("tagSupport", this.tagSupport);
+ b.add("insertReplaceSupport", this.insertReplaceSupport);
+ b.add("resolveSupport", this.resolveSupport);
+ b.add("insertTextModeSupport", this.insertTextModeSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItemCapabilities other = (CompletionItemCapabilities) obj;
+ if (this.snippetSupport == null) {
+ if (other.snippetSupport != null)
+ return false;
+ } else if (!this.snippetSupport.equals(other.snippetSupport))
+ return false;
+ if (this.commitCharactersSupport == null) {
+ if (other.commitCharactersSupport != null)
+ return false;
+ } else if (!this.commitCharactersSupport.equals(other.commitCharactersSupport))
+ return false;
+ if (this.documentationFormat == null) {
+ if (other.documentationFormat != null)
+ return false;
+ } else if (!this.documentationFormat.equals(other.documentationFormat))
+ return false;
+ if (this.deprecatedSupport == null) {
+ if (other.deprecatedSupport != null)
+ return false;
+ } else if (!this.deprecatedSupport.equals(other.deprecatedSupport))
+ return false;
+ if (this.preselectSupport == null) {
+ if (other.preselectSupport != null)
+ return false;
+ } else if (!this.preselectSupport.equals(other.preselectSupport))
+ return false;
+ if (this.tagSupport == null) {
+ if (other.tagSupport != null)
+ return false;
+ } else if (!this.tagSupport.equals(other.tagSupport))
+ return false;
+ if (this.insertReplaceSupport == null) {
+ if (other.insertReplaceSupport != null)
+ return false;
+ } else if (!this.insertReplaceSupport.equals(other.insertReplaceSupport))
+ return false;
+ if (this.resolveSupport == null) {
+ if (other.resolveSupport != null)
+ return false;
+ } else if (!this.resolveSupport.equals(other.resolveSupport))
+ return false;
+ if (this.insertTextModeSupport == null) {
+ if (other.insertTextModeSupport != null)
+ return false;
+ } else if (!this.insertTextModeSupport.equals(other.insertTextModeSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.snippetSupport== null) ? 0 : this.snippetSupport.hashCode());
+ result = prime * result + ((this.commitCharactersSupport== null) ? 0 : this.commitCharactersSupport.hashCode());
+ result = prime * result + ((this.documentationFormat== null) ? 0 : this.documentationFormat.hashCode());
+ result = prime * result + ((this.deprecatedSupport== null) ? 0 : this.deprecatedSupport.hashCode());
+ result = prime * result + ((this.preselectSupport== null) ? 0 : this.preselectSupport.hashCode());
+ result = prime * result + ((this.tagSupport== null) ? 0 : this.tagSupport.hashCode());
+ result = prime * result + ((this.insertReplaceSupport== null) ? 0 : this.insertReplaceSupport.hashCode());
+ result = prime * result + ((this.resolveSupport== null) ? 0 : this.resolveSupport.hashCode());
+ return prime * result + ((this.insertTextModeSupport== null) ? 0 : this.insertTextModeSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItemInsertTextModeSupportCapabilities.java b/java/org/eclipse/lsp4j/CompletionItemInsertTextModeSupportCapabilities.java
new file mode 100644
index 0000000..3596bb3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemInsertTextModeSupportCapabilities.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.InsertTextMode;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client supports the {@link CompletionItem#insertTextMode} property on
+ * a completion item to override the whitespace handling mode
+ * as defined by the client.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CompletionItemInsertTextModeSupportCapabilities {
+ @NonNull
+ private List<InsertTextMode> valueSet;
+
+ public CompletionItemInsertTextModeSupportCapabilities() {
+ ArrayList<InsertTextMode> _arrayList = new ArrayList<InsertTextMode>();
+ this.valueSet = _arrayList;
+ }
+
+ public CompletionItemInsertTextModeSupportCapabilities(@NonNull final List<InsertTextMode> valueSet) {
+ this.valueSet = Preconditions.<List<InsertTextMode>>checkNotNull(valueSet, "valueSet");
+ }
+
+ @Pure
+ @NonNull
+ public List<InsertTextMode> getValueSet() {
+ return this.valueSet;
+ }
+
+ public void setValueSet(@NonNull final List<InsertTextMode> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, "valueSet");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItemInsertTextModeSupportCapabilities other = (CompletionItemInsertTextModeSupportCapabilities) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItemKind.java b/java/org/eclipse/lsp4j/CompletionItemKind.java
new file mode 100644
index 0000000..2840f81
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemKind.java
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * The kind of a completion entry.
+ */
+public enum CompletionItemKind {
+
+ Text(1),
+
+ Method(2),
+
+ Function(3),
+
+ Constructor(4),
+
+ Field(5),
+
+ Variable(6),
+
+ Class(7),
+
+ Interface(8),
+
+ Module(9),
+
+ Property(10),
+
+ Unit(11),
+
+ Value(12),
+
+ Enum(13),
+
+ Keyword(14),
+
+ Snippet(15),
+
+ Color(16),
+
+ File(17),
+
+ Reference(18),
+
+ Folder(19),
+
+ EnumMember(20),
+
+ Constant(21),
+
+ Struct(22),
+
+ Event(23),
+
+ Operator(24),
+
+ TypeParameter(25);
+
+ private final int value;
+
+ CompletionItemKind(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static CompletionItemKind forValue(int value) {
+ CompletionItemKind[] allValues = CompletionItemKind.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItemKindCapabilities.java b/java/org/eclipse/lsp4j/CompletionItemKindCapabilities.java
new file mode 100644
index 0000000..e93bb9f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemKindCapabilities.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.CompletionItemKind;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client supports the following {@link CompletionItemKind} specific
+ * capabilities.
+ */
+@SuppressWarnings("all")
+public class CompletionItemKindCapabilities {
+ /**
+ * The completion item kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the completion items kinds from {@link CompletionItemKind#Text} to
+ * {@link CompletionItemKind#Reference} as defined in the initial version of the protocol.
+ */
+ private List<CompletionItemKind> valueSet;
+
+ public CompletionItemKindCapabilities() {
+ }
+
+ public CompletionItemKindCapabilities(final List<CompletionItemKind> valueSet) {
+ this.valueSet = valueSet;
+ }
+
+ /**
+ * The completion item kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the completion items kinds from {@link CompletionItemKind#Text} to
+ * {@link CompletionItemKind#Reference} as defined in the initial version of the protocol.
+ */
+ @Pure
+ public List<CompletionItemKind> getValueSet() {
+ return this.valueSet;
+ }
+
+ /**
+ * The completion item kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the completion items kinds from {@link CompletionItemKind#Text} to
+ * {@link CompletionItemKind#Reference} as defined in the initial version of the protocol.
+ */
+ public void setValueSet(final List<CompletionItemKind> valueSet) {
+ this.valueSet = valueSet;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItemKindCapabilities other = (CompletionItemKindCapabilities) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItemResolveSupportCapabilities.java b/java/org/eclipse/lsp4j/CompletionItemResolveSupportCapabilities.java
new file mode 100644
index 0000000..e80ed7c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemResolveSupportCapabilities.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Indicates which properties a client can resolve lazily on a completion
+ * item. Before version 3.16.0 only the predefined properties {@link CompletionItem#documentation}
+ * and {@link CompletionItem#detail} could be resolved lazily.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CompletionItemResolveSupportCapabilities {
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ @NonNull
+ private List<String> properties;
+
+ public CompletionItemResolveSupportCapabilities() {
+ ArrayList<String> _arrayList = new ArrayList<String>();
+ this.properties = _arrayList;
+ }
+
+ public CompletionItemResolveSupportCapabilities(@NonNull final List<String> properties) {
+ this.properties = Preconditions.<List<String>>checkNotNull(properties, "properties");
+ }
+
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ @Pure
+ @NonNull
+ public List<String> getProperties() {
+ return this.properties;
+ }
+
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ public void setProperties(@NonNull final List<String> properties) {
+ this.properties = Preconditions.checkNotNull(properties, "properties");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("properties", this.properties);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItemResolveSupportCapabilities other = (CompletionItemResolveSupportCapabilities) obj;
+ if (this.properties == null) {
+ if (other.properties != null)
+ return false;
+ } else if (!this.properties.equals(other.properties))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.properties== null) ? 0 : this.properties.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionItemTag.java b/java/org/eclipse/lsp4j/CompletionItemTag.java
new file mode 100644
index 0000000..4ed1288
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemTag.java
@@ -0,0 +1,44 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j;
+
+/**
+ * Completion item tags are extra annotations that tweak the rendering of a completion
+ * item.
+ *
+ * Since 3.15.0
+ */
+public enum CompletionItemTag {
+
+ /**
+ * Render a completion as obsolete, usually using a strike-out.
+ */
+ Deprecated(1);
+
+ private final int value;
+
+ CompletionItemTag(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static CompletionItemTag forValue(int value) {
+ CompletionItemTag[] allValues = CompletionItemTag.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/CompletionItemTagSupportCapabilities.java b/java/org/eclipse/lsp4j/CompletionItemTagSupportCapabilities.java
new file mode 100644
index 0000000..05f5294
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionItemTagSupportCapabilities.java
@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.CompletionItemTag;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Client supports the tag property on a completion item. Clients supporting
+ * tags have to handle unknown tags gracefully. Clients especially need to
+ * preserve unknown tags when sending a completion item back to the server in
+ * a resolve call.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class CompletionItemTagSupportCapabilities {
+ /**
+ * The tags supported by the client.
+ */
+ @NonNull
+ private List<CompletionItemTag> valueSet;
+
+ public CompletionItemTagSupportCapabilities() {
+ ArrayList<CompletionItemTag> _arrayList = new ArrayList<CompletionItemTag>();
+ this.valueSet = _arrayList;
+ }
+
+ public CompletionItemTagSupportCapabilities(@NonNull final List<CompletionItemTag> valueSet) {
+ this.valueSet = Preconditions.<List<CompletionItemTag>>checkNotNull(valueSet, "valueSet");
+ }
+
+ /**
+ * The tags supported by the client.
+ */
+ @Pure
+ @NonNull
+ public List<CompletionItemTag> getValueSet() {
+ return this.valueSet;
+ }
+
+ /**
+ * The tags supported by the client.
+ */
+ public void setValueSet(@NonNull final List<CompletionItemTag> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, "valueSet");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItemTagSupportCapabilities other = (CompletionItemTagSupportCapabilities) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionList.java b/java/org/eclipse/lsp4j/CompletionList.java
new file mode 100644
index 0000000..249a348
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionList.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.CompletionItem;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a collection of completion items to be presented in the editor.
+ */
+@SuppressWarnings("all")
+public class CompletionList {
+ /**
+ * This list it not complete. Further typing should result in recomputing this list.
+ */
+ private boolean isIncomplete;
+
+ /**
+ * The completion items.
+ */
+ @NonNull
+ private List<CompletionItem> items;
+
+ public CompletionList() {
+ this(new ArrayList<CompletionItem>());
+ }
+
+ public CompletionList(@NonNull final List<CompletionItem> items) {
+ this.items = Preconditions.<List<CompletionItem>>checkNotNull(items, "items");
+ }
+
+ public CompletionList(final boolean isIncomplete, @NonNull final List<CompletionItem> items) {
+ this(items);
+ this.isIncomplete = isIncomplete;
+ }
+
+ /**
+ * This list it not complete. Further typing should result in recomputing this list.
+ */
+ @Pure
+ public boolean isIncomplete() {
+ return this.isIncomplete;
+ }
+
+ /**
+ * This list it not complete. Further typing should result in recomputing this list.
+ */
+ public void setIsIncomplete(final boolean isIncomplete) {
+ this.isIncomplete = isIncomplete;
+ }
+
+ /**
+ * The completion items.
+ */
+ @Pure
+ @NonNull
+ public List<CompletionItem> getItems() {
+ return this.items;
+ }
+
+ /**
+ * The completion items.
+ */
+ public void setItems(@NonNull final List<CompletionItem> items) {
+ this.items = Preconditions.checkNotNull(items, "items");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("isIncomplete", this.isIncomplete);
+ b.add("items", this.items);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionList other = (CompletionList) obj;
+ if (other.isIncomplete != this.isIncomplete)
+ return false;
+ if (this.items == null) {
+ if (other.items != null)
+ return false;
+ } else if (!this.items.equals(other.items))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (this.isIncomplete ? 1231 : 1237);
+ return prime * result + ((this.items== null) ? 0 : this.items.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionOptions.java b/java/org/eclipse/lsp4j/CompletionOptions.java
new file mode 100644
index 0000000..c678a6b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionOptions.java
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Completion options.
+ */
+@SuppressWarnings("all")
+public class CompletionOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ private Boolean resolveProvider;
+
+ /**
+ * The characters that trigger completion automatically.
+ */
+ private List<String> triggerCharacters;
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ private List<String> allCommitCharacters;
+
+ public CompletionOptions() {
+ }
+
+ public CompletionOptions(final Boolean resolveProvider, final List<String> triggerCharacters) {
+ this.resolveProvider = resolveProvider;
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * The characters that trigger completion automatically.
+ */
+ @Pure
+ public List<String> getTriggerCharacters() {
+ return this.triggerCharacters;
+ }
+
+ /**
+ * The characters that trigger completion automatically.
+ */
+ public void setTriggerCharacters(final List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ @Pure
+ public List<String> getAllCommitCharacters() {
+ return this.allCommitCharacters;
+ }
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ public void setAllCommitCharacters(final List<String> allCommitCharacters) {
+ this.allCommitCharacters = allCommitCharacters;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("triggerCharacters", this.triggerCharacters);
+ b.add("allCommitCharacters", this.allCommitCharacters);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CompletionOptions other = (CompletionOptions) obj;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ if (this.triggerCharacters == null) {
+ if (other.triggerCharacters != null)
+ return false;
+ } else if (!this.triggerCharacters.equals(other.triggerCharacters))
+ return false;
+ if (this.allCommitCharacters == null) {
+ if (other.allCommitCharacters != null)
+ return false;
+ } else if (!this.allCommitCharacters.equals(other.allCommitCharacters))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ result = prime * result + ((this.triggerCharacters== null) ? 0 : this.triggerCharacters.hashCode());
+ return prime * result + ((this.allCommitCharacters== null) ? 0 : this.allCommitCharacters.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionParams.java b/java/org/eclipse/lsp4j/CompletionParams.java
new file mode 100644
index 0000000..700ba55
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionParams.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CompletionContext;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The Completion request is sent from the client to the server to compute completion items at a given cursor position.
+ */
+@SuppressWarnings("all")
+public class CompletionParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ /**
+ * The completion context. This is only available if the client specifies
+ * to send this using {@link CompletionCapabilities#contextSupport} as true.
+ */
+ private CompletionContext context;
+
+ public CompletionParams() {
+ }
+
+ public CompletionParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ public CompletionParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position, final CompletionContext context) {
+ this(textDocument, position);
+ this.context = context;
+ }
+
+ /**
+ * The completion context. This is only available if the client specifies
+ * to send this using {@link CompletionCapabilities#contextSupport} as true.
+ */
+ @Pure
+ public CompletionContext getContext() {
+ return this.context;
+ }
+
+ /**
+ * The completion context. This is only available if the client specifies
+ * to send this using {@link CompletionCapabilities#contextSupport} as true.
+ */
+ public void setContext(final CompletionContext context) {
+ this.context = context;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("context", this.context);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CompletionParams other = (CompletionParams) obj;
+ if (this.context == null) {
+ if (other.context != null)
+ return false;
+ } else if (!this.context.equals(other.context))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.context== null) ? 0 : this.context.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionRegistrationOptions.java b/java/org/eclipse/lsp4j/CompletionRegistrationOptions.java
new file mode 100644
index 0000000..70edeca
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionRegistrationOptions.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class CompletionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * Most tools trigger completion request automatically without explicitly requesting
+ * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
+ * starts to type an identifier. For example if the user types `c` in a JavaScript file
+ * code complete will automatically pop up present `console` besides others as a
+ * completion item. Characters that make up identifiers don't need to be listed here.
+ * <p>
+ * If code complete should automatically be trigger on characters not being valid inside
+ * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+ */
+ private List<String> triggerCharacters;
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ private Boolean resolveProvider;
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ private List<String> allCommitCharacters;
+
+ public CompletionRegistrationOptions() {
+ }
+
+ public CompletionRegistrationOptions(final List<String> triggerCharacters, final Boolean resolveProvider) {
+ this.triggerCharacters = triggerCharacters;
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * Most tools trigger completion request automatically without explicitly requesting
+ * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
+ * starts to type an identifier. For example if the user types `c` in a JavaScript file
+ * code complete will automatically pop up present `console` besides others as a
+ * completion item. Characters that make up identifiers don't need to be listed here.
+ * <p>
+ * If code complete should automatically be trigger on characters not being valid inside
+ * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+ */
+ @Pure
+ public List<String> getTriggerCharacters() {
+ return this.triggerCharacters;
+ }
+
+ /**
+ * Most tools trigger completion request automatically without explicitly requesting
+ * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
+ * starts to type an identifier. For example if the user types `c` in a JavaScript file
+ * code complete will automatically pop up present `console` besides others as a
+ * completion item. Characters that make up identifiers don't need to be listed here.
+ * <p>
+ * If code complete should automatically be trigger on characters not being valid inside
+ * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+ */
+ public void setTriggerCharacters(final List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ @Pure
+ public List<String> getAllCommitCharacters() {
+ return this.allCommitCharacters;
+ }
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ public void setAllCommitCharacters(final List<String> allCommitCharacters) {
+ this.allCommitCharacters = allCommitCharacters;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("triggerCharacters", this.triggerCharacters);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("allCommitCharacters", this.allCommitCharacters);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CompletionRegistrationOptions other = (CompletionRegistrationOptions) obj;
+ if (this.triggerCharacters == null) {
+ if (other.triggerCharacters != null)
+ return false;
+ } else if (!this.triggerCharacters.equals(other.triggerCharacters))
+ return false;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ if (this.allCommitCharacters == null) {
+ if (other.allCommitCharacters != null)
+ return false;
+ } else if (!this.allCommitCharacters.equals(other.allCommitCharacters))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.triggerCharacters== null) ? 0 : this.triggerCharacters.hashCode());
+ result = prime * result + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ return prime * result + ((this.allCommitCharacters== null) ? 0 : this.allCommitCharacters.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CompletionTriggerKind.java b/java/org/eclipse/lsp4j/CompletionTriggerKind.java
new file mode 100644
index 0000000..02bb99d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CompletionTriggerKind.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * How a completion was triggered
+ */
+public enum CompletionTriggerKind {
+
+ /**
+ * Completion was triggered by typing an identifier (24x7 code
+ * complete), manual invocation (e.g Ctrl+Space) or via API.
+ */
+ Invoked(1),
+
+ /**
+ * Completion was triggered by a trigger character specified by
+ * the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+ */
+ TriggerCharacter(2),
+
+ /**
+ * Completion was re-triggered as the current completion list is incomplete.
+ */
+ TriggerForIncompleteCompletions(3);
+
+ private final int value;
+
+ CompletionTriggerKind(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static CompletionTriggerKind forValue(int value) {
+ CompletionTriggerKind[] allValues = CompletionTriggerKind.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/ConfigurationItem.java b/java/org/eclipse/lsp4j/ConfigurationItem.java
new file mode 100644
index 0000000..14b8c6f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ConfigurationItem.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A ConfigurationItem consist of the configuration section to ask for and an additional scope URI.
+ * The configuration section asked for is defined by the server and doesn’t necessarily need to
+ * correspond to the configuration store used by the client. So a server might ask for a configuration
+ * {@code cpp.formatterOptions} but the client stores the configuration in an XML store layout differently.
+ * It is up to the client to do the necessary conversion. If a scope URI is provided the client
+ * should return the setting scoped to the provided resource. If the client for example uses
+ * EditorConfig to manage its settings the configuration should be returned for the passed resource
+ * URI. If the client can't provide a configuration setting for a given scope then null needs to be
+ * present in the returned array.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class ConfigurationItem {
+ /**
+ * The scope to get the configuration section for.
+ */
+ private String scopeUri;
+
+ /**
+ * The configuration section asked for.
+ */
+ private String section;
+
+ /**
+ * The scope to get the configuration section for.
+ */
+ @Pure
+ public String getScopeUri() {
+ return this.scopeUri;
+ }
+
+ /**
+ * The scope to get the configuration section for.
+ */
+ public void setScopeUri(final String scopeUri) {
+ this.scopeUri = scopeUri;
+ }
+
+ /**
+ * The configuration section asked for.
+ */
+ @Pure
+ public String getSection() {
+ return this.section;
+ }
+
+ /**
+ * The configuration section asked for.
+ */
+ public void setSection(final String section) {
+ this.section = section;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("scopeUri", this.scopeUri);
+ b.add("section", this.section);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ConfigurationItem other = (ConfigurationItem) obj;
+ if (this.scopeUri == null) {
+ if (other.scopeUri != null)
+ return false;
+ } else if (!this.scopeUri.equals(other.scopeUri))
+ return false;
+ if (this.section == null) {
+ if (other.section != null)
+ return false;
+ } else if (!this.section.equals(other.section))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.scopeUri== null) ? 0 : this.scopeUri.hashCode());
+ return prime * result + ((this.section== null) ? 0 : this.section.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ConfigurationParams.java b/java/org/eclipse/lsp4j/ConfigurationParams.java
new file mode 100644
index 0000000..e4fc656
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ConfigurationParams.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.ConfigurationItem;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The workspace/configuration request is sent from the server to the client to fetch configuration
+ * settings from the client. The request can fetch several configuration settings in one roundtrip.
+ * The order of the returned configuration settings correspond to the order of the passed
+ * {@link ConfigurationItem}s (e.g. the first item in the response is the result for the first
+ * configuration item in the params).
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class ConfigurationParams {
+ @NonNull
+ private List<ConfigurationItem> items;
+
+ public ConfigurationParams() {
+ }
+
+ public ConfigurationParams(@NonNull final List<ConfigurationItem> items) {
+ this.items = Preconditions.<List<ConfigurationItem>>checkNotNull(items, "items");
+ }
+
+ @Pure
+ @NonNull
+ public List<ConfigurationItem> getItems() {
+ return this.items;
+ }
+
+ public void setItems(@NonNull final List<ConfigurationItem> items) {
+ this.items = Preconditions.checkNotNull(items, "items");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("items", this.items);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ConfigurationParams other = (ConfigurationParams) obj;
+ if (this.items == null) {
+ if (other.items != null)
+ return false;
+ } else if (!this.items.equals(other.items))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.items== null) ? 0 : this.items.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CreateFile.java b/java/org/eclipse/lsp4j/CreateFile.java
new file mode 100644
index 0000000..7494ee5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CreateFile.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CreateFileOptions;
+import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.ResourceOperationKind;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Create file operation
+ */
+@SuppressWarnings("all")
+public class CreateFile extends ResourceOperation {
+ /**
+ * The resource to create.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * Additional options
+ */
+ private CreateFileOptions options;
+
+ public CreateFile() {
+ super(ResourceOperationKind.Create);
+ }
+
+ public CreateFile(@NonNull final String uri) {
+ super(ResourceOperationKind.Create);
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ public CreateFile(@NonNull final String uri, final CreateFileOptions options) {
+ this(uri);
+ this.options = options;
+ }
+
+ /**
+ * The resource to create.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The resource to create.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * Additional options
+ */
+ @Pure
+ public CreateFileOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * Additional options
+ */
+ public void setOptions(final CreateFileOptions options) {
+ this.options = options;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("options", this.options);
+ b.add("kind", getKind());
+ b.add("annotationId", getAnnotationId());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ CreateFile other = (CreateFile) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CreateFileOptions.java b/java/org/eclipse/lsp4j/CreateFileOptions.java
new file mode 100644
index 0000000..5deb7ee
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CreateFileOptions.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Options to create a file.
+ */
+@SuppressWarnings("all")
+public class CreateFileOptions {
+ /**
+ * Overwrite existing file. Overwrite wins over {@link #ignoreIfExists}
+ */
+ private Boolean overwrite;
+
+ /**
+ * Ignore if exists.
+ */
+ private Boolean ignoreIfExists;
+
+ public CreateFileOptions() {
+ }
+
+ public CreateFileOptions(final Boolean overwrite, final Boolean ignoreIfExists) {
+ this.overwrite = overwrite;
+ this.ignoreIfExists = ignoreIfExists;
+ }
+
+ /**
+ * Overwrite existing file. Overwrite wins over {@link #ignoreIfExists}
+ */
+ @Pure
+ public Boolean getOverwrite() {
+ return this.overwrite;
+ }
+
+ /**
+ * Overwrite existing file. Overwrite wins over {@link #ignoreIfExists}
+ */
+ public void setOverwrite(final Boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+ /**
+ * Ignore if exists.
+ */
+ @Pure
+ public Boolean getIgnoreIfExists() {
+ return this.ignoreIfExists;
+ }
+
+ /**
+ * Ignore if exists.
+ */
+ public void setIgnoreIfExists(final Boolean ignoreIfExists) {
+ this.ignoreIfExists = ignoreIfExists;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("overwrite", this.overwrite);
+ b.add("ignoreIfExists", this.ignoreIfExists);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CreateFileOptions other = (CreateFileOptions) obj;
+ if (this.overwrite == null) {
+ if (other.overwrite != null)
+ return false;
+ } else if (!this.overwrite.equals(other.overwrite))
+ return false;
+ if (this.ignoreIfExists == null) {
+ if (other.ignoreIfExists != null)
+ return false;
+ } else if (!this.ignoreIfExists.equals(other.ignoreIfExists))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.overwrite== null) ? 0 : this.overwrite.hashCode());
+ return prime * result + ((this.ignoreIfExists== null) ? 0 : this.ignoreIfExists.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/CreateFilesParams.java b/java/org/eclipse/lsp4j/CreateFilesParams.java
new file mode 100644
index 0000000..cba17ab
--- /dev/null
+++ b/java/org/eclipse/lsp4j/CreateFilesParams.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.FileCreate;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameters sent in notifications/requests for user-initiated creation
+ * of files.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class CreateFilesParams {
+ /**
+ * An array of all files/folders created in this operation.
+ */
+ @NonNull
+ private List<FileCreate> files = new ArrayList<FileCreate>();
+
+ public CreateFilesParams() {
+ }
+
+ public CreateFilesParams(@NonNull final List<FileCreate> files) {
+ this.files = Preconditions.<List<FileCreate>>checkNotNull(files, "files");
+ }
+
+ /**
+ * An array of all files/folders created in this operation.
+ */
+ @Pure
+ @NonNull
+ public List<FileCreate> getFiles() {
+ return this.files;
+ }
+
+ /**
+ * An array of all files/folders created in this operation.
+ */
+ public void setFiles(@NonNull final List<FileCreate> files) {
+ this.files = Preconditions.checkNotNull(files, "files");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("files", this.files);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CreateFilesParams other = (CreateFilesParams) obj;
+ if (this.files == null) {
+ if (other.files != null)
+ return false;
+ } else if (!this.files.equals(other.files))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.files== null) ? 0 : this.files.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeclarationCapabilities.java b/java/org/eclipse/lsp4j/DeclarationCapabilities.java
new file mode 100644
index 0000000..13c9184
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeclarationCapabilities.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/declaration`
+ * <p>
+ * Since 3.14.0
+ */
+@SuppressWarnings("all")
+public class DeclarationCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of declaration links.
+ */
+ private Boolean linkSupport;
+
+ public DeclarationCapabilities() {
+ }
+
+ public DeclarationCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public DeclarationCapabilities(final Boolean dynamicRegistration, final Boolean linkSupport) {
+ super(dynamicRegistration);
+ this.linkSupport = linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of declaration links.
+ */
+ @Pure
+ public Boolean getLinkSupport() {
+ return this.linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of declaration links.
+ */
+ public void setLinkSupport(final Boolean linkSupport) {
+ this.linkSupport = linkSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("linkSupport", this.linkSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DeclarationCapabilities other = (DeclarationCapabilities) obj;
+ if (this.linkSupport == null) {
+ if (other.linkSupport != null)
+ return false;
+ } else if (!this.linkSupport.equals(other.linkSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.linkSupport== null) ? 0 : this.linkSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeclarationOptions.java b/java/org/eclipse/lsp4j/DeclarationOptions.java
new file mode 100644
index 0000000..a2dddfa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeclarationOptions.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DeclarationOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeclarationParams.java b/java/org/eclipse/lsp4j/DeclarationParams.java
new file mode 100644
index 0000000..e64c062
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeclarationParams.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The go to declaration request is sent from the client to the server to resolve the declaration
+ * location of a symbol at a given text document position.
+ */
+@SuppressWarnings("all")
+public class DeclarationParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ public DeclarationParams() {
+ }
+
+ public DeclarationParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeclarationRegistrationOptions.java b/java/org/eclipse/lsp4j/DeclarationRegistrationOptions.java
new file mode 100644
index 0000000..7445755
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeclarationRegistrationOptions.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DeclarationRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public DeclarationRegistrationOptions() {
+ }
+
+ public DeclarationRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DeclarationRegistrationOptions other = (DeclarationRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DefinitionCapabilities.java b/java/org/eclipse/lsp4j/DefinitionCapabilities.java
new file mode 100644
index 0000000..c2099a5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DefinitionCapabilities.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/definition`
+ * <p>
+ * Since 3.14.0
+ */
+@SuppressWarnings("all")
+public class DefinitionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of definition links.
+ */
+ private Boolean linkSupport;
+
+ public DefinitionCapabilities() {
+ }
+
+ public DefinitionCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public DefinitionCapabilities(final Boolean dynamicRegistration, final Boolean linkSupport) {
+ super(dynamicRegistration);
+ this.linkSupport = linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of definition links.
+ */
+ @Pure
+ public Boolean getLinkSupport() {
+ return this.linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of definition links.
+ */
+ public void setLinkSupport(final Boolean linkSupport) {
+ this.linkSupport = linkSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("linkSupport", this.linkSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DefinitionCapabilities other = (DefinitionCapabilities) obj;
+ if (this.linkSupport == null) {
+ if (other.linkSupport != null)
+ return false;
+ } else if (!this.linkSupport.equals(other.linkSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.linkSupport== null) ? 0 : this.linkSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DefinitionOptions.java b/java/org/eclipse/lsp4j/DefinitionOptions.java
new file mode 100644
index 0000000..7e77640
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DefinitionOptions.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DefinitionOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DefinitionParams.java b/java/org/eclipse/lsp4j/DefinitionParams.java
new file mode 100644
index 0000000..d289a9f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DefinitionParams.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The go to definition request is sent from the client to the server to resolve the definition
+ * location of a symbol at a given text document position.
+ */
+@SuppressWarnings("all")
+public class DefinitionParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ public DefinitionParams() {
+ }
+
+ public DefinitionParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DefinitionRegistrationOptions.java b/java/org/eclipse/lsp4j/DefinitionRegistrationOptions.java
new file mode 100644
index 0000000..c480a26
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DefinitionRegistrationOptions.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DefinitionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeleteFile.java b/java/org/eclipse/lsp4j/DeleteFile.java
new file mode 100644
index 0000000..904a317
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeleteFile.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DeleteFileOptions;
+import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.ResourceOperationKind;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Delete file operation
+ */
+@SuppressWarnings("all")
+public class DeleteFile extends ResourceOperation {
+ /**
+ * The file to delete.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * Delete options.
+ */
+ private DeleteFileOptions options;
+
+ public DeleteFile() {
+ super(ResourceOperationKind.Delete);
+ }
+
+ public DeleteFile(@NonNull final String uri) {
+ super(ResourceOperationKind.Delete);
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ public DeleteFile(@NonNull final String uri, final DeleteFileOptions options) {
+ this(uri);
+ this.options = options;
+ }
+
+ /**
+ * The file to delete.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The file to delete.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * Delete options.
+ */
+ @Pure
+ public DeleteFileOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * Delete options.
+ */
+ public void setOptions(final DeleteFileOptions options) {
+ this.options = options;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("options", this.options);
+ b.add("kind", getKind());
+ b.add("annotationId", getAnnotationId());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DeleteFile other = (DeleteFile) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeleteFileOptions.java b/java/org/eclipse/lsp4j/DeleteFileOptions.java
new file mode 100644
index 0000000..2934b84
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeleteFileOptions.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Delete file options
+ */
+@SuppressWarnings("all")
+public class DeleteFileOptions {
+ /**
+ * Delete the content recursively if a folder is denoted.
+ */
+ private Boolean recursive;
+
+ /**
+ * Ignore the operation if the file doesn't exist.
+ */
+ private Boolean ignoreIfNotExists;
+
+ public DeleteFileOptions() {
+ }
+
+ public DeleteFileOptions(final Boolean recursive, final Boolean ignoreIfNotExists) {
+ this.recursive = recursive;
+ this.ignoreIfNotExists = ignoreIfNotExists;
+ }
+
+ /**
+ * Delete the content recursively if a folder is denoted.
+ */
+ @Pure
+ public Boolean getRecursive() {
+ return this.recursive;
+ }
+
+ /**
+ * Delete the content recursively if a folder is denoted.
+ */
+ public void setRecursive(final Boolean recursive) {
+ this.recursive = recursive;
+ }
+
+ /**
+ * Ignore the operation if the file doesn't exist.
+ */
+ @Pure
+ public Boolean getIgnoreIfNotExists() {
+ return this.ignoreIfNotExists;
+ }
+
+ /**
+ * Ignore the operation if the file doesn't exist.
+ */
+ public void setIgnoreIfNotExists(final Boolean ignoreIfNotExists) {
+ this.ignoreIfNotExists = ignoreIfNotExists;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("recursive", this.recursive);
+ b.add("ignoreIfNotExists", this.ignoreIfNotExists);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DeleteFileOptions other = (DeleteFileOptions) obj;
+ if (this.recursive == null) {
+ if (other.recursive != null)
+ return false;
+ } else if (!this.recursive.equals(other.recursive))
+ return false;
+ if (this.ignoreIfNotExists == null) {
+ if (other.ignoreIfNotExists != null)
+ return false;
+ } else if (!this.ignoreIfNotExists.equals(other.ignoreIfNotExists))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.recursive== null) ? 0 : this.recursive.hashCode());
+ return prime * result + ((this.ignoreIfNotExists== null) ? 0 : this.ignoreIfNotExists.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DeleteFilesParams.java b/java/org/eclipse/lsp4j/DeleteFilesParams.java
new file mode 100644
index 0000000..aa9b9da
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DeleteFilesParams.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.FileDelete;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameters sent in notifications/requests for user-initiated deletes
+ * of files.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class DeleteFilesParams {
+ /**
+ * An array of all files/folders deleted in this operation.
+ */
+ @NonNull
+ private List<FileDelete> files = new ArrayList<FileDelete>();
+
+ public DeleteFilesParams() {
+ }
+
+ public DeleteFilesParams(@NonNull final List<FileDelete> files) {
+ this.files = Preconditions.<List<FileDelete>>checkNotNull(files, "files");
+ }
+
+ /**
+ * An array of all files/folders deleted in this operation.
+ */
+ @Pure
+ @NonNull
+ public List<FileDelete> getFiles() {
+ return this.files;
+ }
+
+ /**
+ * An array of all files/folders deleted in this operation.
+ */
+ public void setFiles(@NonNull final List<FileDelete> files) {
+ this.files = Preconditions.checkNotNull(files, "files");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("files", this.files);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DeleteFilesParams other = (DeleteFilesParams) obj;
+ if (this.files == null) {
+ if (other.files != null)
+ return false;
+ } else if (!this.files.equals(other.files))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.files== null) ? 0 : this.files.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Diagnostic.java b/java/org/eclipse/lsp4j/Diagnostic.java
new file mode 100644
index 0000000..cf2c396
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Diagnostic.java
@@ -0,0 +1,375 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.DiagnosticCodeDescription;
+import org.eclipse.lsp4j.DiagnosticRelatedInformation;
+import org.eclipse.lsp4j.DiagnosticSeverity;
+import org.eclipse.lsp4j.DiagnosticTag;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects are only valid in the scope of a resource.
+ */
+@SuppressWarnings("all")
+public class Diagnostic {
+ /**
+ * The range at which the message applies
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The diagnostic's severity. Can be omitted. If omitted it is up to the client to interpret diagnostics as error,
+ * warning, info or hint.
+ */
+ private DiagnosticSeverity severity;
+
+ /**
+ * The diagnostic's code. Can be omitted.
+ */
+ private Either<String, Integer> code;
+
+ /**
+ * An optional property to describe the error code.
+ * <p>
+ * Since 3.16.0
+ */
+ private DiagnosticCodeDescription codeDescription;
+
+ /**
+ * A human-readable string describing the source of this diagnostic, e.g. 'typescript' or 'super lint'.
+ */
+ private String source;
+
+ /**
+ * The diagnostic's message.
+ */
+ @NonNull
+ private String message;
+
+ /**
+ * Additional metadata about the diagnostic.
+ * <p>
+ * Since 3.15.0
+ */
+ private List<DiagnosticTag> tags;
+
+ /**
+ * An array of related diagnostic information, e.g. when symbol-names within a scope collide
+ * all definitions can be marked via this property.
+ * <p>
+ * Since 3.7.0
+ */
+ private List<DiagnosticRelatedInformation> relatedInformation;
+
+ /**
+ * A data entry field that is preserved between a `textDocument/publishDiagnostics`
+ * notification and `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ public Diagnostic() {
+ }
+
+ public Diagnostic(@NonNull final Range range, @NonNull final String message) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.message = Preconditions.<String>checkNotNull(message, "message");
+ }
+
+ public Diagnostic(@NonNull final Range range, @NonNull final String message, final DiagnosticSeverity severity, final String source) {
+ this(range, message);
+ this.severity = severity;
+ this.source = source;
+ }
+
+ public Diagnostic(@NonNull final Range range, @NonNull final String message, final DiagnosticSeverity severity, final String source, final String code) {
+ this(range, message, severity, source);
+ this.setCode(code);
+ }
+
+ /**
+ * The range at which the message applies
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range at which the message applies
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The diagnostic's severity. Can be omitted. If omitted it is up to the client to interpret diagnostics as error,
+ * warning, info or hint.
+ */
+ @Pure
+ public DiagnosticSeverity getSeverity() {
+ return this.severity;
+ }
+
+ /**
+ * The diagnostic's severity. Can be omitted. If omitted it is up to the client to interpret diagnostics as error,
+ * warning, info or hint.
+ */
+ public void setSeverity(final DiagnosticSeverity severity) {
+ this.severity = severity;
+ }
+
+ /**
+ * The diagnostic's code. Can be omitted.
+ */
+ @Pure
+ public Either<String, Integer> getCode() {
+ return this.code;
+ }
+
+ /**
+ * The diagnostic's code. Can be omitted.
+ */
+ public void setCode(final Either<String, Integer> code) {
+ this.code = code;
+ }
+
+ public void setCode(final String code) {
+ if (code == null) {
+ this.code = null;
+ return;
+ }
+ this.code = Either.forLeft(code);
+ }
+
+ public void setCode(final Integer code) {
+ if (code == null) {
+ this.code = null;
+ return;
+ }
+ this.code = Either.forRight(code);
+ }
+
+ /**
+ * An optional property to describe the error code.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public DiagnosticCodeDescription getCodeDescription() {
+ return this.codeDescription;
+ }
+
+ /**
+ * An optional property to describe the error code.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setCodeDescription(final DiagnosticCodeDescription codeDescription) {
+ this.codeDescription = codeDescription;
+ }
+
+ /**
+ * A human-readable string describing the source of this diagnostic, e.g. 'typescript' or 'super lint'.
+ */
+ @Pure
+ public String getSource() {
+ return this.source;
+ }
+
+ /**
+ * A human-readable string describing the source of this diagnostic, e.g. 'typescript' or 'super lint'.
+ */
+ public void setSource(final String source) {
+ this.source = source;
+ }
+
+ /**
+ * The diagnostic's message.
+ */
+ @Pure
+ @NonNull
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * The diagnostic's message.
+ */
+ public void setMessage(@NonNull final String message) {
+ this.message = Preconditions.checkNotNull(message, "message");
+ }
+
+ /**
+ * Additional metadata about the diagnostic.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public List<DiagnosticTag> getTags() {
+ return this.tags;
+ }
+
+ /**
+ * Additional metadata about the diagnostic.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setTags(final List<DiagnosticTag> tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * An array of related diagnostic information, e.g. when symbol-names within a scope collide
+ * all definitions can be marked via this property.
+ * <p>
+ * Since 3.7.0
+ */
+ @Pure
+ public List<DiagnosticRelatedInformation> getRelatedInformation() {
+ return this.relatedInformation;
+ }
+
+ /**
+ * An array of related diagnostic information, e.g. when symbol-names within a scope collide
+ * all definitions can be marked via this property.
+ * <p>
+ * Since 3.7.0
+ */
+ public void setRelatedInformation(final List<DiagnosticRelatedInformation> relatedInformation) {
+ this.relatedInformation = relatedInformation;
+ }
+
+ /**
+ * A data entry field that is preserved between a `textDocument/publishDiagnostics`
+ * notification and `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * A data entry field that is preserved between a `textDocument/publishDiagnostics`
+ * notification and `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("severity", this.severity);
+ b.add("code", this.code);
+ b.add("codeDescription", this.codeDescription);
+ b.add("source", this.source);
+ b.add("message", this.message);
+ b.add("tags", this.tags);
+ b.add("relatedInformation", this.relatedInformation);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Diagnostic other = (Diagnostic) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.severity == null) {
+ if (other.severity != null)
+ return false;
+ } else if (!this.severity.equals(other.severity))
+ return false;
+ if (this.code == null) {
+ if (other.code != null)
+ return false;
+ } else if (!this.code.equals(other.code))
+ return false;
+ if (this.codeDescription == null) {
+ if (other.codeDescription != null)
+ return false;
+ } else if (!this.codeDescription.equals(other.codeDescription))
+ return false;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.tags == null) {
+ if (other.tags != null)
+ return false;
+ } else if (!this.tags.equals(other.tags))
+ return false;
+ if (this.relatedInformation == null) {
+ if (other.relatedInformation != null)
+ return false;
+ } else if (!this.relatedInformation.equals(other.relatedInformation))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.severity== null) ? 0 : this.severity.hashCode());
+ result = prime * result + ((this.code== null) ? 0 : this.code.hashCode());
+ result = prime * result + ((this.codeDescription== null) ? 0 : this.codeDescription.hashCode());
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ result = prime * result + ((this.tags== null) ? 0 : this.tags.hashCode());
+ result = prime * result + ((this.relatedInformation== null) ? 0 : this.relatedInformation.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DiagnosticCodeDescription.java b/java/org/eclipse/lsp4j/DiagnosticCodeDescription.java
new file mode 100644
index 0000000..8b52598
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DiagnosticCodeDescription.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Structure to capture a description for an error code.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class DiagnosticCodeDescription {
+ /**
+ * A URI to open with more information about the diagnostic error.
+ */
+ @NonNull
+ private String href;
+
+ public DiagnosticCodeDescription() {
+ }
+
+ public DiagnosticCodeDescription(@NonNull final String href) {
+ this.href = Preconditions.<String>checkNotNull(href, "href");
+ }
+
+ /**
+ * A URI to open with more information about the diagnostic error.
+ */
+ @Pure
+ @NonNull
+ public String getHref() {
+ return this.href;
+ }
+
+ /**
+ * A URI to open with more information about the diagnostic error.
+ */
+ public void setHref(@NonNull final String href) {
+ this.href = Preconditions.checkNotNull(href, "href");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("href", this.href);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DiagnosticCodeDescription other = (DiagnosticCodeDescription) obj;
+ if (this.href == null) {
+ if (other.href != null)
+ return false;
+ } else if (!this.href.equals(other.href))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.href== null) ? 0 : this.href.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DiagnosticRelatedInformation.java b/java/org/eclipse/lsp4j/DiagnosticRelatedInformation.java
new file mode 100644
index 0000000..5d0dea1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DiagnosticRelatedInformation.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Location;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a related message and source code location for a diagnostic. This should be
+ * used to point to code locations that cause or related to a diagnostics, e.g when duplicating
+ * a symbol in a scope.
+ * <p>
+ * Since 3.7.0
+ */
+@SuppressWarnings("all")
+public class DiagnosticRelatedInformation {
+ /**
+ * The location of this related diagnostic information.
+ */
+ @NonNull
+ private Location location;
+
+ /**
+ * The message of this related diagnostic information.
+ */
+ @NonNull
+ private String message;
+
+ public DiagnosticRelatedInformation() {
+ }
+
+ public DiagnosticRelatedInformation(@NonNull final Location location, @NonNull final String message) {
+ this.location = Preconditions.<Location>checkNotNull(location, "location");
+ this.message = Preconditions.<String>checkNotNull(message, "message");
+ }
+
+ /**
+ * The location of this related diagnostic information.
+ */
+ @Pure
+ @NonNull
+ public Location getLocation() {
+ return this.location;
+ }
+
+ /**
+ * The location of this related diagnostic information.
+ */
+ public void setLocation(@NonNull final Location location) {
+ this.location = Preconditions.checkNotNull(location, "location");
+ }
+
+ /**
+ * The message of this related diagnostic information.
+ */
+ @Pure
+ @NonNull
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * The message of this related diagnostic information.
+ */
+ public void setMessage(@NonNull final String message) {
+ this.message = Preconditions.checkNotNull(message, "message");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("location", this.location);
+ b.add("message", this.message);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DiagnosticRelatedInformation other = (DiagnosticRelatedInformation) obj;
+ if (this.location == null) {
+ if (other.location != null)
+ return false;
+ } else if (!this.location.equals(other.location))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.location== null) ? 0 : this.location.hashCode());
+ return prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DiagnosticSeverity.java b/java/org/eclipse/lsp4j/DiagnosticSeverity.java
new file mode 100644
index 0000000..4e57b3c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DiagnosticSeverity.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+public enum DiagnosticSeverity {
+
+ /**
+ * Reports an error.
+ */
+ Error(1),
+
+ /**
+ * Reports a warning.
+ */
+ Warning(2),
+
+ /**
+ * Reports an information.
+ */
+ Information(3),
+
+ /**
+ * Reports a hint.
+ */
+ Hint(4);
+
+ private final int value;
+
+ DiagnosticSeverity(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static DiagnosticSeverity forValue(int value) {
+ DiagnosticSeverity[] allValues = DiagnosticSeverity.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/DiagnosticTag.java b/java/org/eclipse/lsp4j/DiagnosticTag.java
new file mode 100644
index 0000000..f205e77
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DiagnosticTag.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2019 Microsoft.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j;
+
+/**
+ * The diagnostic tags.
+ *
+ * Since 3.15.0
+ */
+public enum DiagnosticTag {
+
+ /**
+ * Unused or unnecessary code.
+ *
+ * Clients are allowed to render diagnostics with this tag faded out instead of having
+ * an error squiggle.
+ */
+ Unnecessary(1),
+
+ /**
+ * Deprecated or obsolete code.
+ *
+ * Clients are allowed to rendered diagnostics with this tag strike through.
+ */
+ Deprecated(2);
+
+ private final int value;
+
+ DiagnosticTag(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static DiagnosticTag forValue(int value) {
+ DiagnosticTag[] allValues = DiagnosticTag.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/DiagnosticsTagSupport.java b/java/org/eclipse/lsp4j/DiagnosticsTagSupport.java
new file mode 100644
index 0000000..e580ea6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DiagnosticsTagSupport.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.DiagnosticTag;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DiagnosticsTagSupport {
+ /**
+ * The tags supported by the client.
+ */
+ @NonNull
+ private List<DiagnosticTag> valueSet;
+
+ public DiagnosticsTagSupport() {
+ ArrayList<DiagnosticTag> _arrayList = new ArrayList<DiagnosticTag>();
+ this.valueSet = _arrayList;
+ }
+
+ public DiagnosticsTagSupport(@NonNull final List<DiagnosticTag> valueSet) {
+ this.valueSet = Preconditions.<List<DiagnosticTag>>checkNotNull(valueSet, "valueSet");
+ }
+
+ /**
+ * The tags supported by the client.
+ */
+ @Pure
+ @NonNull
+ public List<DiagnosticTag> getValueSet() {
+ return this.valueSet;
+ }
+
+ /**
+ * The tags supported by the client.
+ */
+ public void setValueSet(@NonNull final List<DiagnosticTag> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, "valueSet");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DiagnosticsTagSupport other = (DiagnosticsTagSupport) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeConfigurationCapabilities.java b/java/org/eclipse/lsp4j/DidChangeConfigurationCapabilities.java
new file mode 100644
index 0000000..59a8a91
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeConfigurationCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+ */
+@SuppressWarnings("all")
+public class DidChangeConfigurationCapabilities extends DynamicRegistrationCapabilities {
+ public DidChangeConfigurationCapabilities() {
+ }
+
+ public DidChangeConfigurationCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeConfigurationParams.java b/java/org/eclipse/lsp4j/DidChangeConfigurationParams.java
new file mode 100644
index 0000000..fc1121f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeConfigurationParams.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A notification sent from the client to the server to signal the change of configuration settings.
+ */
+@SuppressWarnings("all")
+public class DidChangeConfigurationParams {
+ /**
+ * The actual changed settings.
+ */
+ @NonNull
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object settings;
+
+ public DidChangeConfigurationParams() {
+ }
+
+ public DidChangeConfigurationParams(@NonNull final Object settings) {
+ this.settings = Preconditions.<Object>checkNotNull(settings, "settings");
+ }
+
+ /**
+ * The actual changed settings.
+ */
+ @Pure
+ @NonNull
+ public Object getSettings() {
+ return this.settings;
+ }
+
+ /**
+ * The actual changed settings.
+ */
+ public void setSettings(@NonNull final Object settings) {
+ this.settings = Preconditions.checkNotNull(settings, "settings");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("settings", this.settings);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidChangeConfigurationParams other = (DidChangeConfigurationParams) obj;
+ if (this.settings == null) {
+ if (other.settings != null)
+ return false;
+ } else if (!this.settings.equals(other.settings))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.settings== null) ? 0 : this.settings.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeTextDocumentParams.java b/java/org/eclipse/lsp4j/DidChangeTextDocumentParams.java
new file mode 100644
index 0000000..a1741d7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeTextDocumentParams.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.TextDocumentContentChangeEvent;
+import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document change notification is sent from the client to the server to signal changes to a text document.
+ */
+@SuppressWarnings("all")
+public class DidChangeTextDocumentParams {
+ /**
+ * The document that did change. The version number points to the version after all provided content changes have
+ * been applied.
+ */
+ @NonNull
+ private VersionedTextDocumentIdentifier textDocument;
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ private String uri;
+
+ /**
+ * The actual content changes.
+ */
+ @NonNull
+ private List<TextDocumentContentChangeEvent> contentChanges = new ArrayList<TextDocumentContentChangeEvent>();
+
+ public DidChangeTextDocumentParams() {
+ }
+
+ public DidChangeTextDocumentParams(@NonNull final VersionedTextDocumentIdentifier textDocument, @NonNull final List<TextDocumentContentChangeEvent> contentChanges) {
+ this.textDocument = Preconditions.<VersionedTextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.contentChanges = Preconditions.<List<TextDocumentContentChangeEvent>>checkNotNull(contentChanges, "contentChanges");
+ }
+
+ @Deprecated
+ public DidChangeTextDocumentParams(@NonNull final VersionedTextDocumentIdentifier textDocument, final String uri, @NonNull final List<TextDocumentContentChangeEvent> contentChanges) {
+ this(textDocument, contentChanges);
+ this.uri = uri;
+ }
+
+ /**
+ * The document that did change. The version number points to the version after all provided content changes have
+ * been applied.
+ */
+ @Pure
+ @NonNull
+ public VersionedTextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document that did change. The version number points to the version after all provided content changes have
+ * been applied.
+ */
+ public void setTextDocument(@NonNull final VersionedTextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Pure
+ @Deprecated
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ public void setUri(final String uri) {
+ this.uri = uri;
+ }
+
+ /**
+ * The actual content changes.
+ */
+ @Pure
+ @NonNull
+ public List<TextDocumentContentChangeEvent> getContentChanges() {
+ return this.contentChanges;
+ }
+
+ /**
+ * The actual content changes.
+ */
+ public void setContentChanges(@NonNull final List<TextDocumentContentChangeEvent> contentChanges) {
+ this.contentChanges = Preconditions.checkNotNull(contentChanges, "contentChanges");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("uri", this.uri);
+ b.add("contentChanges", this.contentChanges);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidChangeTextDocumentParams other = (DidChangeTextDocumentParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.contentChanges == null) {
+ if (other.contentChanges != null)
+ return false;
+ } else if (!this.contentChanges.equals(other.contentChanges))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.contentChanges== null) ? 0 : this.contentChanges.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeWatchedFilesCapabilities.java b/java/org/eclipse/lsp4j/DidChangeWatchedFilesCapabilities.java
new file mode 100644
index 0000000..1e78628
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeWatchedFilesCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+ */
+@SuppressWarnings("all")
+public class DidChangeWatchedFilesCapabilities extends DynamicRegistrationCapabilities {
+ public DidChangeWatchedFilesCapabilities() {
+ }
+
+ public DidChangeWatchedFilesCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeWatchedFilesParams.java b/java/org/eclipse/lsp4j/DidChangeWatchedFilesParams.java
new file mode 100644
index 0000000..1d442e6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeWatchedFilesParams.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.FileEvent;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The watched files notification is sent from the client to the server when the client detects changes
+ * to file watched by the language client.
+ */
+@SuppressWarnings("all")
+public class DidChangeWatchedFilesParams {
+ /**
+ * The actual file events.
+ */
+ @NonNull
+ private List<FileEvent> changes;
+
+ public DidChangeWatchedFilesParams() {
+ this(new ArrayList<FileEvent>());
+ }
+
+ public DidChangeWatchedFilesParams(@NonNull final List<FileEvent> changes) {
+ this.changes = Preconditions.<List<FileEvent>>checkNotNull(changes, "changes");
+ }
+
+ /**
+ * The actual file events.
+ */
+ @Pure
+ @NonNull
+ public List<FileEvent> getChanges() {
+ return this.changes;
+ }
+
+ /**
+ * The actual file events.
+ */
+ public void setChanges(@NonNull final List<FileEvent> changes) {
+ this.changes = Preconditions.checkNotNull(changes, "changes");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("changes", this.changes);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidChangeWatchedFilesParams other = (DidChangeWatchedFilesParams) obj;
+ if (this.changes == null) {
+ if (other.changes != null)
+ return false;
+ } else if (!this.changes.equals(other.changes))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.changes== null) ? 0 : this.changes.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeWatchedFilesRegistrationOptions.java b/java/org/eclipse/lsp4j/DidChangeWatchedFilesRegistrationOptions.java
new file mode 100644
index 0000000..ba37cfa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeWatchedFilesRegistrationOptions.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.FileSystemWatcher;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DidChangeWatchedFilesRegistrationOptions {
+ /**
+ * The watchers to register.
+ */
+ @NonNull
+ private List<FileSystemWatcher> watchers;
+
+ public DidChangeWatchedFilesRegistrationOptions() {
+ }
+
+ public DidChangeWatchedFilesRegistrationOptions(@NonNull final List<FileSystemWatcher> watchers) {
+ this.watchers = Preconditions.<List<FileSystemWatcher>>checkNotNull(watchers, "watchers");
+ }
+
+ /**
+ * The watchers to register.
+ */
+ @Pure
+ @NonNull
+ public List<FileSystemWatcher> getWatchers() {
+ return this.watchers;
+ }
+
+ /**
+ * The watchers to register.
+ */
+ public void setWatchers(@NonNull final List<FileSystemWatcher> watchers) {
+ this.watchers = Preconditions.checkNotNull(watchers, "watchers");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("watchers", this.watchers);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidChangeWatchedFilesRegistrationOptions other = (DidChangeWatchedFilesRegistrationOptions) obj;
+ if (this.watchers == null) {
+ if (other.watchers != null)
+ return false;
+ } else if (!this.watchers.equals(other.watchers))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.watchers== null) ? 0 : this.watchers.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidChangeWorkspaceFoldersParams.java b/java/org/eclipse/lsp4j/DidChangeWorkspaceFoldersParams.java
new file mode 100644
index 0000000..a071529
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidChangeWorkspaceFoldersParams.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkspaceFoldersChangeEvent;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The workspace/didChangeWorkspaceFolders notification is sent from the client to the server to
+ * inform the server about workspace folder configuration changes. The notification is sent by
+ * default if both ServerCapabilities/workspace/workspaceFolders and
+ * ClientCapabilities/workspace/workspaceFolders are true; or if the server has registered to
+ * receive this notification it first.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class DidChangeWorkspaceFoldersParams {
+ /**
+ * The actual workspace folder change event.
+ */
+ @NonNull
+ private WorkspaceFoldersChangeEvent event;
+
+ public DidChangeWorkspaceFoldersParams() {
+ }
+
+ public DidChangeWorkspaceFoldersParams(@NonNull final WorkspaceFoldersChangeEvent event) {
+ this.event = Preconditions.<WorkspaceFoldersChangeEvent>checkNotNull(event, "event");
+ }
+
+ /**
+ * The actual workspace folder change event.
+ */
+ @Pure
+ @NonNull
+ public WorkspaceFoldersChangeEvent getEvent() {
+ return this.event;
+ }
+
+ /**
+ * The actual workspace folder change event.
+ */
+ public void setEvent(@NonNull final WorkspaceFoldersChangeEvent event) {
+ this.event = Preconditions.checkNotNull(event, "event");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("event", this.event);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidChangeWorkspaceFoldersParams other = (DidChangeWorkspaceFoldersParams) obj;
+ if (this.event == null) {
+ if (other.event != null)
+ return false;
+ } else if (!this.event.equals(other.event))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.event== null) ? 0 : this.event.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidCloseTextDocumentParams.java b/java/org/eclipse/lsp4j/DidCloseTextDocumentParams.java
new file mode 100644
index 0000000..5bae096
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidCloseTextDocumentParams.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document close notification is sent from the client to the server when the document got closed in the client.
+ * The document's truth now exists where the document's uri points to (e.g. if the document's uri is a file uri the
+ * truth now exists on disk).
+ */
+@SuppressWarnings("all")
+public class DidCloseTextDocumentParams {
+ /**
+ * The document that was closed.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public DidCloseTextDocumentParams() {
+ }
+
+ public DidCloseTextDocumentParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The document that was closed.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document that was closed.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidCloseTextDocumentParams other = (DidCloseTextDocumentParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidOpenTextDocumentParams.java b/java/org/eclipse/lsp4j/DidOpenTextDocumentParams.java
new file mode 100644
index 0000000..b1a8565
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidOpenTextDocumentParams.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentItem;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document open notification is sent from the client to the server to signal newly opened text documents.
+ * The document's truth is now managed by the client and the server must not try to read the document's truth using
+ * the document's uri.
+ */
+@SuppressWarnings("all")
+public class DidOpenTextDocumentParams {
+ /**
+ * The document that was opened.
+ */
+ @NonNull
+ private TextDocumentItem textDocument;
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ private String text;
+
+ public DidOpenTextDocumentParams() {
+ }
+
+ public DidOpenTextDocumentParams(@NonNull final TextDocumentItem textDocument) {
+ this.textDocument = Preconditions.<TextDocumentItem>checkNotNull(textDocument, "textDocument");
+ }
+
+ @Deprecated
+ public DidOpenTextDocumentParams(@NonNull final TextDocumentItem textDocument, final String text) {
+ this(textDocument);
+ this.text = text;
+ }
+
+ /**
+ * The document that was opened.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentItem getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document that was opened.
+ */
+ public void setTextDocument(@NonNull final TextDocumentItem textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Pure
+ @Deprecated
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ public void setText(final String text) {
+ this.text = text;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("text", this.text);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidOpenTextDocumentParams other = (DidOpenTextDocumentParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DidSaveTextDocumentParams.java b/java/org/eclipse/lsp4j/DidSaveTextDocumentParams.java
new file mode 100644
index 0000000..8dbf122
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DidSaveTextDocumentParams.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document save notification is sent from the client to the server when the document was saved in the client.
+ */
+@SuppressWarnings("all")
+public class DidSaveTextDocumentParams {
+ /**
+ * The document that was closed.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * Optional the content when saved. Depends on the includeText value
+ * when the save notification was requested.
+ */
+ private String text;
+
+ public DidSaveTextDocumentParams() {
+ }
+
+ public DidSaveTextDocumentParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ public DidSaveTextDocumentParams(@NonNull final TextDocumentIdentifier textDocument, final String text) {
+ this(textDocument);
+ this.text = text;
+ }
+
+ /**
+ * The document that was closed.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document that was closed.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * Optional the content when saved. Depends on the includeText value
+ * when the save notification was requested.
+ */
+ @Pure
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * Optional the content when saved. Depends on the includeText value
+ * when the save notification was requested.
+ */
+ public void setText(final String text) {
+ this.text = text;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("text", this.text);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DidSaveTextDocumentParams other = (DidSaveTextDocumentParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentColorParams.java b/java/org/eclipse/lsp4j/DocumentColorParams.java
new file mode 100644
index 0000000..45dc221
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentColorParams.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document color request is sent from the client to the server to list all color references
+ * found in a given text document. Along with the range, a color value in RGB is returned.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class DocumentColorParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public DocumentColorParams() {
+ }
+
+ public DocumentColorParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentColorParams other = (DocumentColorParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentFilter.java b/java/org/eclipse/lsp4j/DocumentFilter.java
new file mode 100644
index 0000000..c1fc34b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentFilter.java
@@ -0,0 +1,138 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A document filter denotes a document through properties like language, schema or pattern.
+ */
+@SuppressWarnings("all")
+public class DocumentFilter {
+ /**
+ * A language id, like `typescript`.
+ */
+ private String language;
+
+ /**
+ * A uri scheme, like `file` or `untitled`.
+ */
+ private String scheme;
+
+ /**
+ * A glob pattern, like `*.{ts,js}`.
+ */
+ private String pattern;
+
+ public DocumentFilter() {
+ }
+
+ public DocumentFilter(final String language, final String scheme, final String pattern) {
+ this.language = language;
+ this.scheme = scheme;
+ this.pattern = pattern;
+ }
+
+ /**
+ * A language id, like `typescript`.
+ */
+ @Pure
+ public String getLanguage() {
+ return this.language;
+ }
+
+ /**
+ * A language id, like `typescript`.
+ */
+ public void setLanguage(final String language) {
+ this.language = language;
+ }
+
+ /**
+ * A uri scheme, like `file` or `untitled`.
+ */
+ @Pure
+ public String getScheme() {
+ return this.scheme;
+ }
+
+ /**
+ * A uri scheme, like `file` or `untitled`.
+ */
+ public void setScheme(final String scheme) {
+ this.scheme = scheme;
+ }
+
+ /**
+ * A glob pattern, like `*.{ts,js}`.
+ */
+ @Pure
+ public String getPattern() {
+ return this.pattern;
+ }
+
+ /**
+ * A glob pattern, like `*.{ts,js}`.
+ */
+ public void setPattern(final String pattern) {
+ this.pattern = pattern;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("language", this.language);
+ b.add("scheme", this.scheme);
+ b.add("pattern", this.pattern);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentFilter other = (DocumentFilter) obj;
+ if (this.language == null) {
+ if (other.language != null)
+ return false;
+ } else if (!this.language.equals(other.language))
+ return false;
+ if (this.scheme == null) {
+ if (other.scheme != null)
+ return false;
+ } else if (!this.scheme.equals(other.scheme))
+ return false;
+ if (this.pattern == null) {
+ if (other.pattern != null)
+ return false;
+ } else if (!this.pattern.equals(other.pattern))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.language== null) ? 0 : this.language.hashCode());
+ result = prime * result + ((this.scheme== null) ? 0 : this.scheme.hashCode());
+ return prime * result + ((this.pattern== null) ? 0 : this.pattern.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentFormattingOptions.java b/java/org/eclipse/lsp4j/DocumentFormattingOptions.java
new file mode 100644
index 0000000..d6f14ad
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentFormattingOptions.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Document formatting options.
+ */
+@SuppressWarnings("all")
+public class DocumentFormattingOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentFormattingParams.java b/java/org/eclipse/lsp4j/DocumentFormattingParams.java
new file mode 100644
index 0000000..dcc2913
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentFormattingParams.java
@@ -0,0 +1,164 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FormattingOptions;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document formatting request is sent from the server to the client to format a whole document.
+ */
+@SuppressWarnings("all")
+public class DocumentFormattingParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ private Either<String, Integer> workDoneToken;
+
+ /**
+ * The document to format.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The format options
+ */
+ @NonNull
+ private FormattingOptions options;
+
+ public DocumentFormattingParams() {
+ }
+
+ public DocumentFormattingParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final FormattingOptions options) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.options = Preconditions.<FormattingOptions>checkNotNull(options, "options");
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getWorkDoneToken() {
+ return this.workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ public void setWorkDoneToken(final Either<String, Integer> workDoneToken) {
+ this.workDoneToken = workDoneToken;
+ }
+
+ public void setWorkDoneToken(final String workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forLeft(workDoneToken);
+ }
+
+ public void setWorkDoneToken(final Integer workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forRight(workDoneToken);
+ }
+
+ /**
+ * The document to format.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document to format.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The format options
+ */
+ @Pure
+ @NonNull
+ public FormattingOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * The format options
+ */
+ public void setOptions(@NonNull final FormattingOptions options) {
+ this.options = Preconditions.checkNotNull(options, "options");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", this.workDoneToken);
+ b.add("textDocument", this.textDocument);
+ b.add("options", this.options);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentFormattingParams other = (DocumentFormattingParams) obj;
+ if (this.workDoneToken == null) {
+ if (other.workDoneToken != null)
+ return false;
+ } else if (!this.workDoneToken.equals(other.workDoneToken))
+ return false;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workDoneToken== null) ? 0 : this.workDoneToken.hashCode());
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentFormattingRegistrationOptions.java b/java/org/eclipse/lsp4j/DocumentFormattingRegistrationOptions.java
new file mode 100644
index 0000000..a9eeb45
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentFormattingRegistrationOptions.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Document formatting registration options.
+ */
+@SuppressWarnings("all")
+public class DocumentFormattingRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentHighlight.java b/java/org/eclipse/lsp4j/DocumentHighlight.java
new file mode 100644
index 0000000..63bcd3f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentHighlight.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DocumentHighlightKind;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A document highlight is a range inside a text document which deserves special attention. Usually a document highlight
+ * is visualized by changing the background color of its range.
+ */
+@SuppressWarnings("all")
+public class DocumentHighlight {
+ /**
+ * The range this highlight applies to.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The highlight kind, default is {@link DocumentHighlightKind#Text}.
+ */
+ private DocumentHighlightKind kind;
+
+ public DocumentHighlight() {
+ }
+
+ public DocumentHighlight(@NonNull final Range range) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ public DocumentHighlight(@NonNull final Range range, final DocumentHighlightKind kind) {
+ this(range);
+ this.kind = kind;
+ }
+
+ /**
+ * The range this highlight applies to.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range this highlight applies to.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The highlight kind, default is {@link DocumentHighlightKind#Text}.
+ */
+ @Pure
+ public DocumentHighlightKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The highlight kind, default is {@link DocumentHighlightKind#Text}.
+ */
+ public void setKind(final DocumentHighlightKind kind) {
+ this.kind = kind;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("kind", this.kind);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentHighlight other = (DocumentHighlight) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentHighlightCapabilities.java b/java/org/eclipse/lsp4j/DocumentHighlightCapabilities.java
new file mode 100644
index 0000000..0e347b0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentHighlightCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/documentHighlight`
+ */
+@SuppressWarnings("all")
+public class DocumentHighlightCapabilities extends DynamicRegistrationCapabilities {
+ public DocumentHighlightCapabilities() {
+ }
+
+ public DocumentHighlightCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentHighlightKind.java b/java/org/eclipse/lsp4j/DocumentHighlightKind.java
new file mode 100644
index 0000000..db787ef
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentHighlightKind.java
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * A document highlight kind.
+ */
+public enum DocumentHighlightKind {
+
+ /**
+ * A textual occurrence.
+ */
+ Text(1),
+
+ /**
+ * Read-access of a symbol, like reading a variable.
+ */
+ Read(2),
+
+ /**
+ * Write-access of a symbol, like writing to a variable.
+ */
+ Write(3);
+
+ private final int value;
+
+ DocumentHighlightKind(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static DocumentHighlightKind forValue(int value) {
+ DocumentHighlightKind[] allValues = DocumentHighlightKind.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/DocumentHighlightOptions.java b/java/org/eclipse/lsp4j/DocumentHighlightOptions.java
new file mode 100644
index 0000000..ba2f6fb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentHighlightOptions.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DocumentHighlightOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentHighlightParams.java b/java/org/eclipse/lsp4j/DocumentHighlightParams.java
new file mode 100644
index 0000000..ef75886
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentHighlightParams.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document highlight request is sent from the client to the server to resolve a document highlights
+ * for a given text document position.
+ */
+@SuppressWarnings("all")
+public class DocumentHighlightParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ public DocumentHighlightParams() {
+ }
+
+ public DocumentHighlightParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentHighlightRegistrationOptions.java b/java/org/eclipse/lsp4j/DocumentHighlightRegistrationOptions.java
new file mode 100644
index 0000000..885376e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentHighlightRegistrationOptions.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DocumentHighlightRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentLink.java b/java/org/eclipse/lsp4j/DocumentLink.java
new file mode 100644
index 0000000..bf3566e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentLink.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A document link is a range in a text document that links to an internal or external resource, like another
+ * text document or a web site.
+ */
+@SuppressWarnings("all")
+public class DocumentLink {
+ /**
+ * The range this link applies to.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The uri this link points to. If missing a resolve request is sent later.
+ */
+ private String target;
+
+ /**
+ * The tooltip text when you hover over this link.
+ * <p>
+ * If a tooltip is provided, is will be displayed in a string that includes instructions on how to
+ * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
+ * user settings, and localization.
+ * <p>
+ * Since 3.15.0
+ */
+ private String tooltip;
+
+ /**
+ * A data entry field that is preserved on a document link between a
+ * DocumentLinkRequest and a DocumentLinkResolveRequest.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ public DocumentLink() {
+ }
+
+ public DocumentLink(@NonNull final Range range) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ public DocumentLink(@NonNull final Range range, final String target) {
+ this(range);
+ this.target = target;
+ }
+
+ public DocumentLink(@NonNull final Range range, final String target, final Object data) {
+ this(range, target);
+ this.data = data;
+ }
+
+ public DocumentLink(@NonNull final Range range, final String target, final Object data, final String tooltip) {
+ this(range, target, data);
+ this.tooltip = tooltip;
+ }
+
+ /**
+ * The range this link applies to.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range this link applies to.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The uri this link points to. If missing a resolve request is sent later.
+ */
+ @Pure
+ public String getTarget() {
+ return this.target;
+ }
+
+ /**
+ * The uri this link points to. If missing a resolve request is sent later.
+ */
+ public void setTarget(final String target) {
+ this.target = target;
+ }
+
+ /**
+ * The tooltip text when you hover over this link.
+ * <p>
+ * If a tooltip is provided, is will be displayed in a string that includes instructions on how to
+ * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
+ * user settings, and localization.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public String getTooltip() {
+ return this.tooltip;
+ }
+
+ /**
+ * The tooltip text when you hover over this link.
+ * <p>
+ * If a tooltip is provided, is will be displayed in a string that includes instructions on how to
+ * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
+ * user settings, and localization.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setTooltip(final String tooltip) {
+ this.tooltip = tooltip;
+ }
+
+ /**
+ * A data entry field that is preserved on a document link between a
+ * DocumentLinkRequest and a DocumentLinkResolveRequest.
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * A data entry field that is preserved on a document link between a
+ * DocumentLinkRequest and a DocumentLinkResolveRequest.
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("target", this.target);
+ b.add("tooltip", this.tooltip);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentLink other = (DocumentLink) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.target == null) {
+ if (other.target != null)
+ return false;
+ } else if (!this.target.equals(other.target))
+ return false;
+ if (this.tooltip == null) {
+ if (other.tooltip != null)
+ return false;
+ } else if (!this.tooltip.equals(other.tooltip))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.target== null) ? 0 : this.target.hashCode());
+ result = prime * result + ((this.tooltip== null) ? 0 : this.tooltip.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentLinkCapabilities.java b/java/org/eclipse/lsp4j/DocumentLinkCapabilities.java
new file mode 100644
index 0000000..e213bf6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentLinkCapabilities.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/documentLink`
+ */
+@SuppressWarnings("all")
+public class DocumentLinkCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Whether the client supports the {@link DocumentLink#tooltip} property.
+ * <p>
+ * Since 3.15.0
+ */
+ private Boolean tooltipSupport;
+
+ public DocumentLinkCapabilities() {
+ }
+
+ public DocumentLinkCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public DocumentLinkCapabilities(final Boolean dynamicRegistration, final Boolean tooltipSupport) {
+ super(dynamicRegistration);
+ this.tooltipSupport = tooltipSupport;
+ }
+
+ /**
+ * Whether the client supports the {@link DocumentLink#tooltip} property.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Boolean getTooltipSupport() {
+ return this.tooltipSupport;
+ }
+
+ /**
+ * Whether the client supports the {@link DocumentLink#tooltip} property.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setTooltipSupport(final Boolean tooltipSupport) {
+ this.tooltipSupport = tooltipSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("tooltipSupport", this.tooltipSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentLinkCapabilities other = (DocumentLinkCapabilities) obj;
+ if (this.tooltipSupport == null) {
+ if (other.tooltipSupport != null)
+ return false;
+ } else if (!this.tooltipSupport.equals(other.tooltipSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.tooltipSupport== null) ? 0 : this.tooltipSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentLinkOptions.java b/java/org/eclipse/lsp4j/DocumentLinkOptions.java
new file mode 100644
index 0000000..4e1ff5e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentLinkOptions.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Document link options
+ */
+@SuppressWarnings("all")
+public class DocumentLinkOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * Document links have a resolve provider as well.
+ */
+ private Boolean resolveProvider;
+
+ public DocumentLinkOptions() {
+ }
+
+ public DocumentLinkOptions(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * Document links have a resolve provider as well.
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * Document links have a resolve provider as well.
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentLinkOptions other = (DocumentLinkOptions) obj;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentLinkParams.java b/java/org/eclipse/lsp4j/DocumentLinkParams.java
new file mode 100644
index 0000000..f45aafe
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentLinkParams.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document links request is sent from the client to the server to request the location of links in a document.
+ */
+@SuppressWarnings("all")
+public class DocumentLinkParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The document to provide document links for.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public DocumentLinkParams() {
+ }
+
+ public DocumentLinkParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The document to provide document links for.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document to provide document links for.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentLinkParams other = (DocumentLinkParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentLinkRegistrationOptions.java b/java/org/eclipse/lsp4j/DocumentLinkRegistrationOptions.java
new file mode 100644
index 0000000..97922fc
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentLinkRegistrationOptions.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DocumentLinkRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * Document links have a resolve provider as well.
+ */
+ private Boolean resolveProvider;
+
+ public DocumentLinkRegistrationOptions() {
+ }
+
+ public DocumentLinkRegistrationOptions(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ /**
+ * Document links have a resolve provider as well.
+ */
+ @Pure
+ public Boolean getResolveProvider() {
+ return this.resolveProvider;
+ }
+
+ /**
+ * Document links have a resolve provider as well.
+ */
+ public void setResolveProvider(final Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resolveProvider", this.resolveProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentLinkRegistrationOptions other = (DocumentLinkRegistrationOptions) obj;
+ if (this.resolveProvider == null) {
+ if (other.resolveProvider != null)
+ return false;
+ } else if (!this.resolveProvider.equals(other.resolveProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.resolveProvider== null) ? 0 : this.resolveProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentOnTypeFormattingOptions.java b/java/org/eclipse/lsp4j/DocumentOnTypeFormattingOptions.java
new file mode 100644
index 0000000..3d4fddb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentOnTypeFormattingOptions.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Format document on type options
+ */
+@SuppressWarnings("all")
+public class DocumentOnTypeFormattingOptions {
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ @NonNull
+ private String firstTriggerCharacter;
+
+ /**
+ * More trigger characters.
+ */
+ private List<String> moreTriggerCharacter;
+
+ public DocumentOnTypeFormattingOptions() {
+ }
+
+ public DocumentOnTypeFormattingOptions(@NonNull final String firstTriggerCharacter) {
+ this.firstTriggerCharacter = firstTriggerCharacter;
+ }
+
+ public DocumentOnTypeFormattingOptions(@NonNull final String firstTriggerCharacter, final List<String> moreTriggerCharacter) {
+ this.firstTriggerCharacter = Preconditions.<String>checkNotNull(firstTriggerCharacter, "firstTriggerCharacter");
+ this.moreTriggerCharacter = moreTriggerCharacter;
+ }
+
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ @Pure
+ @NonNull
+ public String getFirstTriggerCharacter() {
+ return this.firstTriggerCharacter;
+ }
+
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ public void setFirstTriggerCharacter(@NonNull final String firstTriggerCharacter) {
+ this.firstTriggerCharacter = Preconditions.checkNotNull(firstTriggerCharacter, "firstTriggerCharacter");
+ }
+
+ /**
+ * More trigger characters.
+ */
+ @Pure
+ public List<String> getMoreTriggerCharacter() {
+ return this.moreTriggerCharacter;
+ }
+
+ /**
+ * More trigger characters.
+ */
+ public void setMoreTriggerCharacter(final List<String> moreTriggerCharacter) {
+ this.moreTriggerCharacter = moreTriggerCharacter;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("firstTriggerCharacter", this.firstTriggerCharacter);
+ b.add("moreTriggerCharacter", this.moreTriggerCharacter);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentOnTypeFormattingOptions other = (DocumentOnTypeFormattingOptions) obj;
+ if (this.firstTriggerCharacter == null) {
+ if (other.firstTriggerCharacter != null)
+ return false;
+ } else if (!this.firstTriggerCharacter.equals(other.firstTriggerCharacter))
+ return false;
+ if (this.moreTriggerCharacter == null) {
+ if (other.moreTriggerCharacter != null)
+ return false;
+ } else if (!this.moreTriggerCharacter.equals(other.moreTriggerCharacter))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.firstTriggerCharacter== null) ? 0 : this.firstTriggerCharacter.hashCode());
+ return prime * result + ((this.moreTriggerCharacter== null) ? 0 : this.moreTriggerCharacter.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentOnTypeFormattingParams.java b/java/org/eclipse/lsp4j/DocumentOnTypeFormattingParams.java
new file mode 100644
index 0000000..fc6957b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentOnTypeFormattingParams.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FormattingOptions;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document on type formatting request is sent from the client to the server to format parts of the document during typing.
+ */
+@SuppressWarnings("all")
+public class DocumentOnTypeFormattingParams extends TextDocumentPositionParams {
+ /**
+ * The format options
+ */
+ @NonNull
+ private FormattingOptions options;
+
+ /**
+ * The character that has been typed.
+ */
+ @NonNull
+ private String ch;
+
+ public DocumentOnTypeFormattingParams() {
+ }
+
+ public DocumentOnTypeFormattingParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final FormattingOptions options, @NonNull final Position position, @NonNull final String ch) {
+ super(textDocument, position);
+ this.options = Preconditions.<FormattingOptions>checkNotNull(options, "options");
+ this.ch = Preconditions.<String>checkNotNull(ch, "ch");
+ }
+
+ @Deprecated
+ public DocumentOnTypeFormattingParams(@NonNull final Position position, @NonNull final String ch) {
+ super.setPosition(position);
+ this.ch = Preconditions.<String>checkNotNull(ch, "ch");
+ }
+
+ /**
+ * The format options
+ */
+ @Pure
+ @NonNull
+ public FormattingOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * The format options
+ */
+ public void setOptions(@NonNull final FormattingOptions options) {
+ this.options = Preconditions.checkNotNull(options, "options");
+ }
+
+ /**
+ * The character that has been typed.
+ */
+ @Pure
+ @NonNull
+ public String getCh() {
+ return this.ch;
+ }
+
+ /**
+ * The character that has been typed.
+ */
+ public void setCh(@NonNull final String ch) {
+ this.ch = Preconditions.checkNotNull(ch, "ch");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("options", this.options);
+ b.add("ch", this.ch);
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentOnTypeFormattingParams other = (DocumentOnTypeFormattingParams) obj;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ if (this.ch == null) {
+ if (other.ch != null)
+ return false;
+ } else if (!this.ch.equals(other.ch))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ return prime * result + ((this.ch== null) ? 0 : this.ch.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentOnTypeFormattingRegistrationOptions.java b/java/org/eclipse/lsp4j/DocumentOnTypeFormattingRegistrationOptions.java
new file mode 100644
index 0000000..385e9c3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentOnTypeFormattingRegistrationOptions.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.TextDocumentRegistrationOptions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ @NonNull
+ private String firstTriggerCharacter;
+
+ /**
+ * More trigger characters.
+ */
+ private List<String> moreTriggerCharacter;
+
+ public DocumentOnTypeFormattingRegistrationOptions() {
+ }
+
+ public DocumentOnTypeFormattingRegistrationOptions(@NonNull final String firstTriggerCharacter) {
+ this.firstTriggerCharacter = Preconditions.<String>checkNotNull(firstTriggerCharacter, "firstTriggerCharacter");
+ }
+
+ public DocumentOnTypeFormattingRegistrationOptions(@NonNull final String firstTriggerCharacter, final List<String> moreTriggerCharacter) {
+ this(firstTriggerCharacter);
+ this.moreTriggerCharacter = moreTriggerCharacter;
+ }
+
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ @Pure
+ @NonNull
+ public String getFirstTriggerCharacter() {
+ return this.firstTriggerCharacter;
+ }
+
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ public void setFirstTriggerCharacter(@NonNull final String firstTriggerCharacter) {
+ this.firstTriggerCharacter = Preconditions.checkNotNull(firstTriggerCharacter, "firstTriggerCharacter");
+ }
+
+ /**
+ * More trigger characters.
+ */
+ @Pure
+ public List<String> getMoreTriggerCharacter() {
+ return this.moreTriggerCharacter;
+ }
+
+ /**
+ * More trigger characters.
+ */
+ public void setMoreTriggerCharacter(final List<String> moreTriggerCharacter) {
+ this.moreTriggerCharacter = moreTriggerCharacter;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("firstTriggerCharacter", this.firstTriggerCharacter);
+ b.add("moreTriggerCharacter", this.moreTriggerCharacter);
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentOnTypeFormattingRegistrationOptions other = (DocumentOnTypeFormattingRegistrationOptions) obj;
+ if (this.firstTriggerCharacter == null) {
+ if (other.firstTriggerCharacter != null)
+ return false;
+ } else if (!this.firstTriggerCharacter.equals(other.firstTriggerCharacter))
+ return false;
+ if (this.moreTriggerCharacter == null) {
+ if (other.moreTriggerCharacter != null)
+ return false;
+ } else if (!this.moreTriggerCharacter.equals(other.moreTriggerCharacter))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.firstTriggerCharacter== null) ? 0 : this.firstTriggerCharacter.hashCode());
+ return prime * result + ((this.moreTriggerCharacter== null) ? 0 : this.moreTriggerCharacter.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentRangeFormattingOptions.java b/java/org/eclipse/lsp4j/DocumentRangeFormattingOptions.java
new file mode 100644
index 0000000..7a9d270
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentRangeFormattingOptions.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Document range formatting options.
+ */
+@SuppressWarnings("all")
+public class DocumentRangeFormattingOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentRangeFormattingParams.java b/java/org/eclipse/lsp4j/DocumentRangeFormattingParams.java
new file mode 100644
index 0000000..a43fb75
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentRangeFormattingParams.java
@@ -0,0 +1,200 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FormattingOptions;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document range formatting request is sent from the client to the server to format a given range in a document.
+ */
+@SuppressWarnings("all")
+public class DocumentRangeFormattingParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ private Either<String, Integer> workDoneToken;
+
+ /**
+ * The document to format.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The format options
+ */
+ @NonNull
+ private FormattingOptions options;
+
+ /**
+ * The range to format
+ */
+ @NonNull
+ private Range range;
+
+ public DocumentRangeFormattingParams() {
+ }
+
+ public DocumentRangeFormattingParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final FormattingOptions options, @NonNull final Range range) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.options = Preconditions.<FormattingOptions>checkNotNull(options, "options");
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ @Deprecated
+ public DocumentRangeFormattingParams(@NonNull final Range range) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getWorkDoneToken() {
+ return this.workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ public void setWorkDoneToken(final Either<String, Integer> workDoneToken) {
+ this.workDoneToken = workDoneToken;
+ }
+
+ public void setWorkDoneToken(final String workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forLeft(workDoneToken);
+ }
+
+ public void setWorkDoneToken(final Integer workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forRight(workDoneToken);
+ }
+
+ /**
+ * The document to format.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document to format.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The format options
+ */
+ @Pure
+ @NonNull
+ public FormattingOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * The format options
+ */
+ public void setOptions(@NonNull final FormattingOptions options) {
+ this.options = Preconditions.checkNotNull(options, "options");
+ }
+
+ /**
+ * The range to format
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range to format
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", this.workDoneToken);
+ b.add("textDocument", this.textDocument);
+ b.add("options", this.options);
+ b.add("range", this.range);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentRangeFormattingParams other = (DocumentRangeFormattingParams) obj;
+ if (this.workDoneToken == null) {
+ if (other.workDoneToken != null)
+ return false;
+ } else if (!this.workDoneToken.equals(other.workDoneToken))
+ return false;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workDoneToken== null) ? 0 : this.workDoneToken.hashCode());
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ result = prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ return prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentRangeFormattingRegistrationOptions.java b/java/org/eclipse/lsp4j/DocumentRangeFormattingRegistrationOptions.java
new file mode 100644
index 0000000..a482db6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentRangeFormattingRegistrationOptions.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Document range formatting registration options.
+ */
+@SuppressWarnings("all")
+public class DocumentRangeFormattingRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentSymbol.java b/java/org/eclipse/lsp4j/DocumentSymbol.java
new file mode 100644
index 0000000..b7b34ea
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentSymbol.java
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.SymbolKind;
+import org.eclipse.lsp4j.SymbolTag;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document symbols can be
+ * hierarchical and they have two ranges: one that encloses its definition and one that points to its most interesting range,
+ * e.g. the range of an identifier.
+ */
+@SuppressWarnings("all")
+public class DocumentSymbol {
+ /**
+ * The name of this symbol.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The kind of this symbol.
+ */
+ @NonNull
+ private SymbolKind kind;
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the {@link #range}.
+ */
+ @NonNull
+ private Range selectionRange;
+
+ /**
+ * More detail for this symbol, e.g the signature of a function. If not provided the
+ * name is used.
+ */
+ private String detail;
+
+ /**
+ * Tags for this document symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ private List<SymbolTag> tags;
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ private Boolean deprecated;
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ private List<DocumentSymbol> children;
+
+ public DocumentSymbol() {
+ }
+
+ public DocumentSymbol(@NonNull final String name, @NonNull final SymbolKind kind, @NonNull final Range range, @NonNull final Range selectionRange) {
+ this.name = Preconditions.<String>checkNotNull(name, "name");
+ this.kind = Preconditions.<SymbolKind>checkNotNull(kind, "kind");
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.selectionRange = Preconditions.<Range>checkNotNull(selectionRange, "selectionRange");
+ }
+
+ public DocumentSymbol(@NonNull final String name, @NonNull final SymbolKind kind, @NonNull final Range range, @NonNull final Range selectionRange, final String detail) {
+ this(name, kind, range, selectionRange);
+ this.detail = detail;
+ }
+
+ public DocumentSymbol(@NonNull final String name, @NonNull final SymbolKind kind, @NonNull final Range range, @NonNull final Range selectionRange, final String detail, final List<DocumentSymbol> children) {
+ this(name, kind, range, selectionRange);
+ this.detail = detail;
+ this.children = children;
+ }
+
+ /**
+ * The name of this symbol.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of this symbol.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The kind of this symbol.
+ */
+ @Pure
+ @NonNull
+ public SymbolKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of this symbol.
+ */
+ public void setKind(@NonNull final SymbolKind kind) {
+ this.kind = Preconditions.checkNotNull(kind, "kind");
+ }
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the {@link #range}.
+ */
+ @Pure
+ @NonNull
+ public Range getSelectionRange() {
+ return this.selectionRange;
+ }
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the {@link #range}.
+ */
+ public void setSelectionRange(@NonNull final Range selectionRange) {
+ this.selectionRange = Preconditions.checkNotNull(selectionRange, "selectionRange");
+ }
+
+ /**
+ * More detail for this symbol, e.g the signature of a function. If not provided the
+ * name is used.
+ */
+ @Pure
+ public String getDetail() {
+ return this.detail;
+ }
+
+ /**
+ * More detail for this symbol, e.g the signature of a function. If not provided the
+ * name is used.
+ */
+ public void setDetail(final String detail) {
+ this.detail = detail;
+ }
+
+ /**
+ * Tags for this document symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public List<SymbolTag> getTags() {
+ return this.tags;
+ }
+
+ /**
+ * Tags for this document symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setTags(final List<SymbolTag> tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Pure
+ @Deprecated
+ public Boolean getDeprecated() {
+ return this.deprecated;
+ }
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ public void setDeprecated(final Boolean deprecated) {
+ this.deprecated = deprecated;
+ }
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ @Pure
+ public List<DocumentSymbol> getChildren() {
+ return this.children;
+ }
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ public void setChildren(final List<DocumentSymbol> children) {
+ this.children = children;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("kind", this.kind);
+ b.add("range", this.range);
+ b.add("selectionRange", this.selectionRange);
+ b.add("detail", this.detail);
+ b.add("tags", this.tags);
+ b.add("deprecated", this.deprecated);
+ b.add("children", this.children);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DocumentSymbol other = (DocumentSymbol) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.selectionRange == null) {
+ if (other.selectionRange != null)
+ return false;
+ } else if (!this.selectionRange.equals(other.selectionRange))
+ return false;
+ if (this.detail == null) {
+ if (other.detail != null)
+ return false;
+ } else if (!this.detail.equals(other.detail))
+ return false;
+ if (this.tags == null) {
+ if (other.tags != null)
+ return false;
+ } else if (!this.tags.equals(other.tags))
+ return false;
+ if (this.deprecated == null) {
+ if (other.deprecated != null)
+ return false;
+ } else if (!this.deprecated.equals(other.deprecated))
+ return false;
+ if (this.children == null) {
+ if (other.children != null)
+ return false;
+ } else if (!this.children.equals(other.children))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.selectionRange== null) ? 0 : this.selectionRange.hashCode());
+ result = prime * result + ((this.detail== null) ? 0 : this.detail.hashCode());
+ result = prime * result + ((this.tags== null) ? 0 : this.tags.hashCode());
+ result = prime * result + ((this.deprecated== null) ? 0 : this.deprecated.hashCode());
+ return prime * result + ((this.children== null) ? 0 : this.children.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentSymbolCapabilities.java b/java/org/eclipse/lsp4j/DocumentSymbolCapabilities.java
new file mode 100644
index 0000000..b31f3e5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentSymbolCapabilities.java
@@ -0,0 +1,205 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.lsp4j.SymbolKindCapabilities;
+import org.eclipse.lsp4j.SymbolTagSupportCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/documentSymbol`
+ */
+@SuppressWarnings("all")
+public class DocumentSymbolCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Specific capabilities for the {@link SymbolKind}.
+ */
+ private SymbolKindCapabilities symbolKind;
+
+ /**
+ * The client support hierarchical document symbols.
+ */
+ private Boolean hierarchicalDocumentSymbolSupport;
+
+ /**
+ * The client supports tags on {@link SymbolInformation}. Tags are supported on
+ * {@link DocumentSymbol} if {@link #hierarchicalDocumentSymbolSupport} is set to true.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ private SymbolTagSupportCapabilities tagSupport;
+
+ /**
+ * The client supports an additional label presented in the UI when
+ * registering a document symbol provider.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean labelSupport;
+
+ public DocumentSymbolCapabilities() {
+ }
+
+ public DocumentSymbolCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public DocumentSymbolCapabilities(final SymbolKindCapabilities symbolKind) {
+ this.symbolKind = symbolKind;
+ }
+
+ public DocumentSymbolCapabilities(final SymbolKindCapabilities symbolKind, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.symbolKind = symbolKind;
+ }
+
+ public DocumentSymbolCapabilities(final SymbolKindCapabilities symbolKind, final Boolean dynamicRegistration, final Boolean hierarchicalDocumentSymbolSupport) {
+ super(dynamicRegistration);
+ this.symbolKind = symbolKind;
+ this.hierarchicalDocumentSymbolSupport = hierarchicalDocumentSymbolSupport;
+ }
+
+ /**
+ * Specific capabilities for the {@link SymbolKind}.
+ */
+ @Pure
+ public SymbolKindCapabilities getSymbolKind() {
+ return this.symbolKind;
+ }
+
+ /**
+ * Specific capabilities for the {@link SymbolKind}.
+ */
+ public void setSymbolKind(final SymbolKindCapabilities symbolKind) {
+ this.symbolKind = symbolKind;
+ }
+
+ /**
+ * The client support hierarchical document symbols.
+ */
+ @Pure
+ public Boolean getHierarchicalDocumentSymbolSupport() {
+ return this.hierarchicalDocumentSymbolSupport;
+ }
+
+ /**
+ * The client support hierarchical document symbols.
+ */
+ public void setHierarchicalDocumentSymbolSupport(final Boolean hierarchicalDocumentSymbolSupport) {
+ this.hierarchicalDocumentSymbolSupport = hierarchicalDocumentSymbolSupport;
+ }
+
+ /**
+ * The client supports tags on {@link SymbolInformation}. Tags are supported on
+ * {@link DocumentSymbol} if {@link #hierarchicalDocumentSymbolSupport} is set to true.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public SymbolTagSupportCapabilities getTagSupport() {
+ return this.tagSupport;
+ }
+
+ /**
+ * The client supports tags on {@link SymbolInformation}. Tags are supported on
+ * {@link DocumentSymbol} if {@link #hierarchicalDocumentSymbolSupport} is set to true.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setTagSupport(final SymbolTagSupportCapabilities tagSupport) {
+ this.tagSupport = tagSupport;
+ }
+
+ /**
+ * The client supports an additional label presented in the UI when
+ * registering a document symbol provider.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getLabelSupport() {
+ return this.labelSupport;
+ }
+
+ /**
+ * The client supports an additional label presented in the UI when
+ * registering a document symbol provider.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setLabelSupport(final Boolean labelSupport) {
+ this.labelSupport = labelSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("symbolKind", this.symbolKind);
+ b.add("hierarchicalDocumentSymbolSupport", this.hierarchicalDocumentSymbolSupport);
+ b.add("tagSupport", this.tagSupport);
+ b.add("labelSupport", this.labelSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentSymbolCapabilities other = (DocumentSymbolCapabilities) obj;
+ if (this.symbolKind == null) {
+ if (other.symbolKind != null)
+ return false;
+ } else if (!this.symbolKind.equals(other.symbolKind))
+ return false;
+ if (this.hierarchicalDocumentSymbolSupport == null) {
+ if (other.hierarchicalDocumentSymbolSupport != null)
+ return false;
+ } else if (!this.hierarchicalDocumentSymbolSupport.equals(other.hierarchicalDocumentSymbolSupport))
+ return false;
+ if (this.tagSupport == null) {
+ if (other.tagSupport != null)
+ return false;
+ } else if (!this.tagSupport.equals(other.tagSupport))
+ return false;
+ if (this.labelSupport == null) {
+ if (other.labelSupport != null)
+ return false;
+ } else if (!this.labelSupport.equals(other.labelSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.symbolKind== null) ? 0 : this.symbolKind.hashCode());
+ result = prime * result + ((this.hierarchicalDocumentSymbolSupport== null) ? 0 : this.hierarchicalDocumentSymbolSupport.hashCode());
+ result = prime * result + ((this.tagSupport== null) ? 0 : this.tagSupport.hashCode());
+ return prime * result + ((this.labelSupport== null) ? 0 : this.labelSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentSymbolOptions.java b/java/org/eclipse/lsp4j/DocumentSymbolOptions.java
new file mode 100644
index 0000000..cff82fd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentSymbolOptions.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DocumentSymbolOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ private String label;
+
+ public DocumentSymbolOptions() {
+ }
+
+ public DocumentSymbolOptions(final String label) {
+ this.label = label;
+ }
+
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setLabel(final String label) {
+ this.label = label;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentSymbolOptions other = (DocumentSymbolOptions) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.label== null) ? 0 : this.label.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentSymbolParams.java b/java/org/eclipse/lsp4j/DocumentSymbolParams.java
new file mode 100644
index 0000000..62b5428
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentSymbolParams.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The document symbol request is sent from the client to the server to list all symbols found in a given text document.
+ */
+@SuppressWarnings("all")
+public class DocumentSymbolParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public DocumentSymbolParams() {
+ }
+
+ public DocumentSymbolParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentSymbolParams other = (DocumentSymbolParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DocumentSymbolRegistrationOptions.java b/java/org/eclipse/lsp4j/DocumentSymbolRegistrationOptions.java
new file mode 100644
index 0000000..e7598b0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DocumentSymbolRegistrationOptions.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DocumentSymbolRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ private String label;
+
+ public DocumentSymbolRegistrationOptions() {
+ }
+
+ public DocumentSymbolRegistrationOptions(final String label) {
+ this.label = label;
+ }
+
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setLabel(final String label) {
+ this.label = label;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DocumentSymbolRegistrationOptions other = (DocumentSymbolRegistrationOptions) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.label== null) ? 0 : this.label.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/DynamicRegistrationCapabilities.java b/java/org/eclipse/lsp4j/DynamicRegistrationCapabilities.java
new file mode 100644
index 0000000..7991906
--- /dev/null
+++ b/java/org/eclipse/lsp4j/DynamicRegistrationCapabilities.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class DynamicRegistrationCapabilities {
+ /**
+ * Supports dynamic registration.
+ */
+ private Boolean dynamicRegistration;
+
+ public DynamicRegistrationCapabilities() {
+ }
+
+ public DynamicRegistrationCapabilities(final Boolean dynamicRegistration) {
+ this.dynamicRegistration = dynamicRegistration;
+ }
+
+ /**
+ * Supports dynamic registration.
+ */
+ @Pure
+ public Boolean getDynamicRegistration() {
+ return this.dynamicRegistration;
+ }
+
+ /**
+ * Supports dynamic registration.
+ */
+ public void setDynamicRegistration(final Boolean dynamicRegistration) {
+ this.dynamicRegistration = dynamicRegistration;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", this.dynamicRegistration);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DynamicRegistrationCapabilities other = (DynamicRegistrationCapabilities) obj;
+ if (this.dynamicRegistration == null) {
+ if (other.dynamicRegistration != null)
+ return false;
+ } else if (!this.dynamicRegistration.equals(other.dynamicRegistration))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.dynamicRegistration== null) ? 0 : this.dynamicRegistration.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ExecuteCommandCapabilities.java b/java/org/eclipse/lsp4j/ExecuteCommandCapabilities.java
new file mode 100644
index 0000000..7782024
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ExecuteCommandCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `workspace/executeCommand` request.
+ */
+@SuppressWarnings("all")
+public class ExecuteCommandCapabilities extends DynamicRegistrationCapabilities {
+ public ExecuteCommandCapabilities() {
+ }
+
+ public ExecuteCommandCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ExecuteCommandOptions.java b/java/org/eclipse/lsp4j/ExecuteCommandOptions.java
new file mode 100644
index 0000000..a1f7527
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ExecuteCommandOptions.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Execute command options.
+ */
+@SuppressWarnings("all")
+public class ExecuteCommandOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * The commands to be executed on the server
+ */
+ @NonNull
+ private List<String> commands;
+
+ public ExecuteCommandOptions() {
+ this(new ArrayList<String>());
+ }
+
+ public ExecuteCommandOptions(@NonNull final List<String> commands) {
+ this.commands = Preconditions.<List<String>>checkNotNull(commands, "commands");
+ }
+
+ /**
+ * The commands to be executed on the server
+ */
+ @Pure
+ @NonNull
+ public List<String> getCommands() {
+ return this.commands;
+ }
+
+ /**
+ * The commands to be executed on the server
+ */
+ public void setCommands(@NonNull final List<String> commands) {
+ this.commands = Preconditions.checkNotNull(commands, "commands");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("commands", this.commands);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ExecuteCommandOptions other = (ExecuteCommandOptions) obj;
+ if (this.commands == null) {
+ if (other.commands != null)
+ return false;
+ } else if (!this.commands.equals(other.commands))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.commands== null) ? 0 : this.commands.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ExecuteCommandParams.java b/java/org/eclipse/lsp4j/ExecuteCommandParams.java
new file mode 100644
index 0000000..70cbb96
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ExecuteCommandParams.java
@@ -0,0 +1,175 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.WorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The workspace/executeCommand request is sent from the client to the server to trigger command
+ * execution on the server. In most cases the server creates a WorkspaceEdit structure and applies
+ * the changes to the workspace using the request workspace/applyEdit which is sent from the server
+ * to the client.
+ */
+@SuppressWarnings("all")
+public class ExecuteCommandParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ private Either<String, Integer> workDoneToken;
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ @NonNull
+ private String command;
+
+ /**
+ * Arguments that the command should be invoked with.
+ * The arguments are typically specified when a command is returned from the server to the client.
+ * Example requests that return a command are textDocument/codeAction or textDocument/codeLens.
+ */
+ private List<Object> arguments;
+
+ public ExecuteCommandParams() {
+ }
+
+ public ExecuteCommandParams(@NonNull final String command, final List<Object> arguments) {
+ this.command = Preconditions.<String>checkNotNull(command, "command");
+ this.arguments = arguments;
+ }
+
+ public ExecuteCommandParams(@NonNull final String command, final List<Object> arguments, final Either<String, Integer> workDoneToken) {
+ this(command, arguments);
+ this.workDoneToken = workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getWorkDoneToken() {
+ return this.workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ public void setWorkDoneToken(final Either<String, Integer> workDoneToken) {
+ this.workDoneToken = workDoneToken;
+ }
+
+ public void setWorkDoneToken(final String workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forLeft(workDoneToken);
+ }
+
+ public void setWorkDoneToken(final Integer workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forRight(workDoneToken);
+ }
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ @Pure
+ @NonNull
+ public String getCommand() {
+ return this.command;
+ }
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ public void setCommand(@NonNull final String command) {
+ this.command = Preconditions.checkNotNull(command, "command");
+ }
+
+ /**
+ * Arguments that the command should be invoked with.
+ * The arguments are typically specified when a command is returned from the server to the client.
+ * Example requests that return a command are textDocument/codeAction or textDocument/codeLens.
+ */
+ @Pure
+ public List<Object> getArguments() {
+ return this.arguments;
+ }
+
+ /**
+ * Arguments that the command should be invoked with.
+ * The arguments are typically specified when a command is returned from the server to the client.
+ * Example requests that return a command are textDocument/codeAction or textDocument/codeLens.
+ */
+ public void setArguments(final List<Object> arguments) {
+ this.arguments = arguments;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", this.workDoneToken);
+ b.add("command", this.command);
+ b.add("arguments", this.arguments);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExecuteCommandParams other = (ExecuteCommandParams) obj;
+ if (this.workDoneToken == null) {
+ if (other.workDoneToken != null)
+ return false;
+ } else if (!this.workDoneToken.equals(other.workDoneToken))
+ return false;
+ if (this.command == null) {
+ if (other.command != null)
+ return false;
+ } else if (!this.command.equals(other.command))
+ return false;
+ if (this.arguments == null) {
+ if (other.arguments != null)
+ return false;
+ } else if (!this.arguments.equals(other.arguments))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workDoneToken== null) ? 0 : this.workDoneToken.hashCode());
+ result = prime * result + ((this.command== null) ? 0 : this.command.hashCode());
+ return prime * result + ((this.arguments== null) ? 0 : this.arguments.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ExecuteCommandRegistrationOptions.java b/java/org/eclipse/lsp4j/ExecuteCommandRegistrationOptions.java
new file mode 100644
index 0000000..d2f2cca
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ExecuteCommandRegistrationOptions.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.ExecuteCommandOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Execute command registration options.
+ */
+@SuppressWarnings("all")
+public class ExecuteCommandRegistrationOptions extends ExecuteCommandOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("commands", getCommands());
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FailureHandlingKind.java b/java/org/eclipse/lsp4j/FailureHandlingKind.java
new file mode 100644
index 0000000..7b0c832
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FailureHandlingKind.java
@@ -0,0 +1,48 @@
+/******************************************************************************
+ * Copyright (c) 2018 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j;
+
+/**
+ * The kind of failure handling supported by the client.
+ */
+public final class FailureHandlingKind {
+
+ private FailureHandlingKind() {
+ }
+
+ /**
+ * Applying the workspace change is simply aborted if one of the changes
+ * provided fails. All operations executed before the failing operation stay
+ * executed.
+ */
+ public static final String Abort = "abort";
+
+ /**
+ * All operations are executed transactional. That means they either all succeed
+ * or no changes at all are applied to the workspace.
+ */
+ public static final String Transactional = "transactional";
+
+ /**
+ * If the workspace edit contains only textual file changes they are executed
+ * transactional. If resource changes (create, rename or delete file) are part
+ * of the change the failure handling strategy is abort.
+ */
+ public static final String TextOnlyTransactional = "textOnlyTransactional";
+
+ /**
+ * The client tries to undo the operations already executed. But there is no
+ * guaruntee that this is succeeding.
+ */
+ public static final String Undo = "undo";
+}
diff --git a/java/org/eclipse/lsp4j/FileChangeType.java b/java/org/eclipse/lsp4j/FileChangeType.java
new file mode 100644
index 0000000..cb242d8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileChangeType.java
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * The file event type.
+ */
+public enum FileChangeType {
+
+ /**
+ * The file got created.
+ */
+ Created(1),
+
+ /**
+ * The file got changed.
+ */
+ Changed(2),
+
+ /**
+ * The file got deleted.
+ */
+ Deleted(3);
+
+ private final int value;
+
+ FileChangeType(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static FileChangeType forValue(int value) {
+ FileChangeType[] allValues = FileChangeType.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/FileCreate.java b/java/org/eclipse/lsp4j/FileCreate.java
new file mode 100644
index 0000000..bbac713
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileCreate.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents information on a file/folder create.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileCreate {
+ /**
+ * A file:// URI for the location of the file/folder being created.
+ */
+ @NonNull
+ private String uri;
+
+ public FileCreate() {
+ }
+
+ public FileCreate(@NonNull final String uri) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ /**
+ * A file:// URI for the location of the file/folder being created.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * A file:// URI for the location of the file/folder being created.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileCreate other = (FileCreate) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.uri== null) ? 0 : this.uri.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileDelete.java b/java/org/eclipse/lsp4j/FileDelete.java
new file mode 100644
index 0000000..dc1762b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileDelete.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents information on a file/folder delete.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileDelete {
+ /**
+ * A file:// URI for the location of the file/folder being deleted.
+ */
+ @NonNull
+ private String uri;
+
+ public FileDelete() {
+ }
+
+ public FileDelete(@NonNull final String uri) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ /**
+ * A file:// URI for the location of the file/folder being deleted.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * A file:// URI for the location of the file/folder being deleted.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileDelete other = (FileDelete) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.uri== null) ? 0 : this.uri.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileEvent.java b/java/org/eclipse/lsp4j/FileEvent.java
new file mode 100644
index 0000000..218d85f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileEvent.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FileChangeType;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An event describing a file change.
+ */
+@SuppressWarnings("all")
+public class FileEvent {
+ /**
+ * The file's uri.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * The change type.
+ */
+ @NonNull
+ private FileChangeType type;
+
+ public FileEvent() {
+ }
+
+ public FileEvent(@NonNull final String uri, @NonNull final FileChangeType type) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ this.type = Preconditions.<FileChangeType>checkNotNull(type, "type");
+ }
+
+ /**
+ * The file's uri.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The file's uri.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The change type.
+ */
+ @Pure
+ @NonNull
+ public FileChangeType getType() {
+ return this.type;
+ }
+
+ /**
+ * The change type.
+ */
+ public void setType(@NonNull final FileChangeType type) {
+ this.type = Preconditions.checkNotNull(type, "type");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("type", this.type);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileEvent other = (FileEvent) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationFilter.java b/java/org/eclipse/lsp4j/FileOperationFilter.java
new file mode 100644
index 0000000..7499af2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationFilter.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FileOperationPattern;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A filter to describe in which file operation requests or notifications
+ * the server is interested in.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileOperationFilter {
+ /**
+ * The actual file operation pattern.
+ */
+ @NonNull
+ private FileOperationPattern pattern;
+
+ /**
+ * A Uri like {@code file} or {@code untitled}.
+ */
+ private String scheme;
+
+ public FileOperationFilter() {
+ }
+
+ public FileOperationFilter(@NonNull final FileOperationPattern pattern) {
+ this.pattern = Preconditions.<FileOperationPattern>checkNotNull(pattern, "pattern");
+ }
+
+ public FileOperationFilter(@NonNull final FileOperationPattern pattern, final String scheme) {
+ this(pattern);
+ this.scheme = scheme;
+ }
+
+ /**
+ * The actual file operation pattern.
+ */
+ @Pure
+ @NonNull
+ public FileOperationPattern getPattern() {
+ return this.pattern;
+ }
+
+ /**
+ * The actual file operation pattern.
+ */
+ public void setPattern(@NonNull final FileOperationPattern pattern) {
+ this.pattern = Preconditions.checkNotNull(pattern, "pattern");
+ }
+
+ /**
+ * A Uri like {@code file} or {@code untitled}.
+ */
+ @Pure
+ public String getScheme() {
+ return this.scheme;
+ }
+
+ /**
+ * A Uri like {@code file} or {@code untitled}.
+ */
+ public void setScheme(final String scheme) {
+ this.scheme = scheme;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("pattern", this.pattern);
+ b.add("scheme", this.scheme);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileOperationFilter other = (FileOperationFilter) obj;
+ if (this.pattern == null) {
+ if (other.pattern != null)
+ return false;
+ } else if (!this.pattern.equals(other.pattern))
+ return false;
+ if (this.scheme == null) {
+ if (other.scheme != null)
+ return false;
+ } else if (!this.scheme.equals(other.scheme))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.pattern== null) ? 0 : this.pattern.hashCode());
+ return prime * result + ((this.scheme== null) ? 0 : this.scheme.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationOptions.java b/java/org/eclipse/lsp4j/FileOperationOptions.java
new file mode 100644
index 0000000..9e59629
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationOptions.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.FileOperationFilter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The options for file operations.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileOperationOptions {
+ /**
+ * The actual filters.
+ */
+ @NonNull
+ private List<FileOperationFilter> filters = new ArrayList<FileOperationFilter>();
+
+ public FileOperationOptions() {
+ }
+
+ public FileOperationOptions(@NonNull final List<FileOperationFilter> filters) {
+ this.filters = Preconditions.<List<FileOperationFilter>>checkNotNull(filters, "filters");
+ }
+
+ /**
+ * The actual filters.
+ */
+ @Pure
+ @NonNull
+ public List<FileOperationFilter> getFilters() {
+ return this.filters;
+ }
+
+ /**
+ * The actual filters.
+ */
+ public void setFilters(@NonNull final List<FileOperationFilter> filters) {
+ this.filters = Preconditions.checkNotNull(filters, "filters");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("filters", this.filters);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileOperationOptions other = (FileOperationOptions) obj;
+ if (this.filters == null) {
+ if (other.filters != null)
+ return false;
+ } else if (!this.filters.equals(other.filters))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.filters== null) ? 0 : this.filters.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationPattern.java b/java/org/eclipse/lsp4j/FileOperationPattern.java
new file mode 100644
index 0000000..3eb5e61
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationPattern.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FileOperationPatternOptions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A pattern to describe in which file operation requests or notifications
+ * the server is interested in.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileOperationPattern {
+ /**
+ * The glob pattern to match. Glob patterns can have the following syntax:
+ * <ul>
+ * <li>`*` to match one or more characters in a path segment
+ * <li>`?` to match on one character in a path segment
+ * <li>`**` to match any number of path segments, including none
+ * <li>`{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
+ * <li>`[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+ * <li>`[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+ * </ul>
+ */
+ @NonNull
+ private String glob;
+
+ /**
+ * Whether to match files or folders with this pattern.
+ * <p>
+ * Matches both if undefined.
+ * <p>
+ * See {@link FileOperationPatternKind} for allowed values.
+ */
+ private String matches;
+
+ /**
+ * Additional options used during matching.
+ */
+ private FileOperationPatternOptions options;
+
+ public FileOperationPattern() {
+ }
+
+ public FileOperationPattern(@NonNull final String glob) {
+ this.glob = Preconditions.<String>checkNotNull(glob, "glob");
+ }
+
+ /**
+ * The glob pattern to match. Glob patterns can have the following syntax:
+ * <ul>
+ * <li>`*` to match one or more characters in a path segment
+ * <li>`?` to match on one character in a path segment
+ * <li>`**` to match any number of path segments, including none
+ * <li>`{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
+ * <li>`[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+ * <li>`[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+ * </ul>
+ */
+ @Pure
+ @NonNull
+ public String getGlob() {
+ return this.glob;
+ }
+
+ /**
+ * The glob pattern to match. Glob patterns can have the following syntax:
+ * <ul>
+ * <li>`*` to match one or more characters in a path segment
+ * <li>`?` to match on one character in a path segment
+ * <li>`**` to match any number of path segments, including none
+ * <li>`{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
+ * <li>`[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+ * <li>`[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+ * </ul>
+ */
+ public void setGlob(@NonNull final String glob) {
+ this.glob = Preconditions.checkNotNull(glob, "glob");
+ }
+
+ /**
+ * Whether to match files or folders with this pattern.
+ * <p>
+ * Matches both if undefined.
+ * <p>
+ * See {@link FileOperationPatternKind} for allowed values.
+ */
+ @Pure
+ public String getMatches() {
+ return this.matches;
+ }
+
+ /**
+ * Whether to match files or folders with this pattern.
+ * <p>
+ * Matches both if undefined.
+ * <p>
+ * See {@link FileOperationPatternKind} for allowed values.
+ */
+ public void setMatches(final String matches) {
+ this.matches = matches;
+ }
+
+ /**
+ * Additional options used during matching.
+ */
+ @Pure
+ public FileOperationPatternOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * Additional options used during matching.
+ */
+ public void setOptions(final FileOperationPatternOptions options) {
+ this.options = options;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("glob", this.glob);
+ b.add("matches", this.matches);
+ b.add("options", this.options);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileOperationPattern other = (FileOperationPattern) obj;
+ if (this.glob == null) {
+ if (other.glob != null)
+ return false;
+ } else if (!this.glob.equals(other.glob))
+ return false;
+ if (this.matches == null) {
+ if (other.matches != null)
+ return false;
+ } else if (!this.matches.equals(other.matches))
+ return false;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.glob== null) ? 0 : this.glob.hashCode());
+ result = prime * result + ((this.matches== null) ? 0 : this.matches.hashCode());
+ return prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationPatternKind.java b/java/org/eclipse/lsp4j/FileOperationPatternKind.java
new file mode 100644
index 0000000..0deda28
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationPatternKind.java
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * A pattern kind describing if a glob pattern matches a file a folder or
+ * both.
+ *
+ * Since 3.16.0
+ */
+public final class FileOperationPatternKind {
+
+ private FileOperationPatternKind() {
+ }
+
+ /**
+ * The pattern matches a file only.
+ */
+ public static final String File = "file";
+
+ /**
+ * The pattern matches a folder only.
+ */
+ public static final String Folder = "folder";
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationPatternOptions.java b/java/org/eclipse/lsp4j/FileOperationPatternOptions.java
new file mode 100644
index 0000000..4000651
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationPatternOptions.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Matching options for the file operation pattern.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileOperationPatternOptions {
+ /**
+ * The pattern should be matched ignoring casing.
+ */
+ private Boolean ignoreCase;
+
+ public FileOperationPatternOptions() {
+ }
+
+ public FileOperationPatternOptions(final Boolean ignoreCase) {
+ this.ignoreCase = ignoreCase;
+ }
+
+ /**
+ * The pattern should be matched ignoring casing.
+ */
+ @Pure
+ public Boolean getIgnoreCase() {
+ return this.ignoreCase;
+ }
+
+ /**
+ * The pattern should be matched ignoring casing.
+ */
+ public void setIgnoreCase(final Boolean ignoreCase) {
+ this.ignoreCase = ignoreCase;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("ignoreCase", this.ignoreCase);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileOperationPatternOptions other = (FileOperationPatternOptions) obj;
+ if (this.ignoreCase == null) {
+ if (other.ignoreCase != null)
+ return false;
+ } else if (!this.ignoreCase.equals(other.ignoreCase))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.ignoreCase== null) ? 0 : this.ignoreCase.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationsServerCapabilities.java b/java/org/eclipse/lsp4j/FileOperationsServerCapabilities.java
new file mode 100644
index 0000000..9c398b9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationsServerCapabilities.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FileOperationOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The server is interested in file notifications/requests.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileOperationsServerCapabilities {
+ /**
+ * The server is interested in receiving didCreateFiles notifications.
+ */
+ private FileOperationOptions didCreate;
+
+ /**
+ * The server is interested in receiving willCreateFiles requests.
+ */
+ private FileOperationOptions willCreate;
+
+ /**
+ * The server is interested in receiving didRenameFiles notifications.
+ */
+ private FileOperationOptions didRename;
+
+ /**
+ * The server is interested in receiving willRenameFiles requests.
+ */
+ private FileOperationOptions willRename;
+
+ /**
+ * The server is interested in receiving didDeleteFiles file notifications.
+ */
+ private FileOperationOptions didDelete;
+
+ /**
+ * The server is interested in receiving willDeleteFiles file requests.
+ */
+ private FileOperationOptions willDelete;
+
+ public FileOperationsServerCapabilities() {
+ }
+
+ /**
+ * The server is interested in receiving didCreateFiles notifications.
+ */
+ @Pure
+ public FileOperationOptions getDidCreate() {
+ return this.didCreate;
+ }
+
+ /**
+ * The server is interested in receiving didCreateFiles notifications.
+ */
+ public void setDidCreate(final FileOperationOptions didCreate) {
+ this.didCreate = didCreate;
+ }
+
+ /**
+ * The server is interested in receiving willCreateFiles requests.
+ */
+ @Pure
+ public FileOperationOptions getWillCreate() {
+ return this.willCreate;
+ }
+
+ /**
+ * The server is interested in receiving willCreateFiles requests.
+ */
+ public void setWillCreate(final FileOperationOptions willCreate) {
+ this.willCreate = willCreate;
+ }
+
+ /**
+ * The server is interested in receiving didRenameFiles notifications.
+ */
+ @Pure
+ public FileOperationOptions getDidRename() {
+ return this.didRename;
+ }
+
+ /**
+ * The server is interested in receiving didRenameFiles notifications.
+ */
+ public void setDidRename(final FileOperationOptions didRename) {
+ this.didRename = didRename;
+ }
+
+ /**
+ * The server is interested in receiving willRenameFiles requests.
+ */
+ @Pure
+ public FileOperationOptions getWillRename() {
+ return this.willRename;
+ }
+
+ /**
+ * The server is interested in receiving willRenameFiles requests.
+ */
+ public void setWillRename(final FileOperationOptions willRename) {
+ this.willRename = willRename;
+ }
+
+ /**
+ * The server is interested in receiving didDeleteFiles file notifications.
+ */
+ @Pure
+ public FileOperationOptions getDidDelete() {
+ return this.didDelete;
+ }
+
+ /**
+ * The server is interested in receiving didDeleteFiles file notifications.
+ */
+ public void setDidDelete(final FileOperationOptions didDelete) {
+ this.didDelete = didDelete;
+ }
+
+ /**
+ * The server is interested in receiving willDeleteFiles file requests.
+ */
+ @Pure
+ public FileOperationOptions getWillDelete() {
+ return this.willDelete;
+ }
+
+ /**
+ * The server is interested in receiving willDeleteFiles file requests.
+ */
+ public void setWillDelete(final FileOperationOptions willDelete) {
+ this.willDelete = willDelete;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("didCreate", this.didCreate);
+ b.add("willCreate", this.willCreate);
+ b.add("didRename", this.didRename);
+ b.add("willRename", this.willRename);
+ b.add("didDelete", this.didDelete);
+ b.add("willDelete", this.willDelete);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileOperationsServerCapabilities other = (FileOperationsServerCapabilities) obj;
+ if (this.didCreate == null) {
+ if (other.didCreate != null)
+ return false;
+ } else if (!this.didCreate.equals(other.didCreate))
+ return false;
+ if (this.willCreate == null) {
+ if (other.willCreate != null)
+ return false;
+ } else if (!this.willCreate.equals(other.willCreate))
+ return false;
+ if (this.didRename == null) {
+ if (other.didRename != null)
+ return false;
+ } else if (!this.didRename.equals(other.didRename))
+ return false;
+ if (this.willRename == null) {
+ if (other.willRename != null)
+ return false;
+ } else if (!this.willRename.equals(other.willRename))
+ return false;
+ if (this.didDelete == null) {
+ if (other.didDelete != null)
+ return false;
+ } else if (!this.didDelete.equals(other.didDelete))
+ return false;
+ if (this.willDelete == null) {
+ if (other.willDelete != null)
+ return false;
+ } else if (!this.willDelete.equals(other.willDelete))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.didCreate== null) ? 0 : this.didCreate.hashCode());
+ result = prime * result + ((this.willCreate== null) ? 0 : this.willCreate.hashCode());
+ result = prime * result + ((this.didRename== null) ? 0 : this.didRename.hashCode());
+ result = prime * result + ((this.willRename== null) ? 0 : this.willRename.hashCode());
+ result = prime * result + ((this.didDelete== null) ? 0 : this.didDelete.hashCode());
+ return prime * result + ((this.willDelete== null) ? 0 : this.willDelete.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileOperationsWorkspaceCapabilities.java b/java/org/eclipse/lsp4j/FileOperationsWorkspaceCapabilities.java
new file mode 100644
index 0000000..444362d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileOperationsWorkspaceCapabilities.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client has support for file requests/notifications.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileOperationsWorkspaceCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client has support for sending didCreateFiles notifications.
+ */
+ private Boolean didCreate;
+
+ /**
+ * The client has support for sending willCreateFiles requests.
+ */
+ private Boolean willCreate;
+
+ /**
+ * The client has support for sending didRenameFiles notifications.
+ */
+ private Boolean didRename;
+
+ /**
+ * The client has support for sending willRenameFiles requests.
+ */
+ private Boolean willRename;
+
+ /**
+ * The client has support for sending didDeleteFiles notifications.
+ */
+ private Boolean didDelete;
+
+ /**
+ * The client has support for sending willDeleteFiles requests.
+ */
+ private Boolean willDelete;
+
+ public FileOperationsWorkspaceCapabilities() {
+ }
+
+ /**
+ * The client has support for sending didCreateFiles notifications.
+ */
+ @Pure
+ public Boolean getDidCreate() {
+ return this.didCreate;
+ }
+
+ /**
+ * The client has support for sending didCreateFiles notifications.
+ */
+ public void setDidCreate(final Boolean didCreate) {
+ this.didCreate = didCreate;
+ }
+
+ /**
+ * The client has support for sending willCreateFiles requests.
+ */
+ @Pure
+ public Boolean getWillCreate() {
+ return this.willCreate;
+ }
+
+ /**
+ * The client has support for sending willCreateFiles requests.
+ */
+ public void setWillCreate(final Boolean willCreate) {
+ this.willCreate = willCreate;
+ }
+
+ /**
+ * The client has support for sending didRenameFiles notifications.
+ */
+ @Pure
+ public Boolean getDidRename() {
+ return this.didRename;
+ }
+
+ /**
+ * The client has support for sending didRenameFiles notifications.
+ */
+ public void setDidRename(final Boolean didRename) {
+ this.didRename = didRename;
+ }
+
+ /**
+ * The client has support for sending willRenameFiles requests.
+ */
+ @Pure
+ public Boolean getWillRename() {
+ return this.willRename;
+ }
+
+ /**
+ * The client has support for sending willRenameFiles requests.
+ */
+ public void setWillRename(final Boolean willRename) {
+ this.willRename = willRename;
+ }
+
+ /**
+ * The client has support for sending didDeleteFiles notifications.
+ */
+ @Pure
+ public Boolean getDidDelete() {
+ return this.didDelete;
+ }
+
+ /**
+ * The client has support for sending didDeleteFiles notifications.
+ */
+ public void setDidDelete(final Boolean didDelete) {
+ this.didDelete = didDelete;
+ }
+
+ /**
+ * The client has support for sending willDeleteFiles requests.
+ */
+ @Pure
+ public Boolean getWillDelete() {
+ return this.willDelete;
+ }
+
+ /**
+ * The client has support for sending willDeleteFiles requests.
+ */
+ public void setWillDelete(final Boolean willDelete) {
+ this.willDelete = willDelete;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("didCreate", this.didCreate);
+ b.add("willCreate", this.willCreate);
+ b.add("didRename", this.didRename);
+ b.add("willRename", this.willRename);
+ b.add("didDelete", this.didDelete);
+ b.add("willDelete", this.willDelete);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ FileOperationsWorkspaceCapabilities other = (FileOperationsWorkspaceCapabilities) obj;
+ if (this.didCreate == null) {
+ if (other.didCreate != null)
+ return false;
+ } else if (!this.didCreate.equals(other.didCreate))
+ return false;
+ if (this.willCreate == null) {
+ if (other.willCreate != null)
+ return false;
+ } else if (!this.willCreate.equals(other.willCreate))
+ return false;
+ if (this.didRename == null) {
+ if (other.didRename != null)
+ return false;
+ } else if (!this.didRename.equals(other.didRename))
+ return false;
+ if (this.willRename == null) {
+ if (other.willRename != null)
+ return false;
+ } else if (!this.willRename.equals(other.willRename))
+ return false;
+ if (this.didDelete == null) {
+ if (other.didDelete != null)
+ return false;
+ } else if (!this.didDelete.equals(other.didDelete))
+ return false;
+ if (this.willDelete == null) {
+ if (other.willDelete != null)
+ return false;
+ } else if (!this.willDelete.equals(other.willDelete))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.didCreate== null) ? 0 : this.didCreate.hashCode());
+ result = prime * result + ((this.willCreate== null) ? 0 : this.willCreate.hashCode());
+ result = prime * result + ((this.didRename== null) ? 0 : this.didRename.hashCode());
+ result = prime * result + ((this.willRename== null) ? 0 : this.willRename.hashCode());
+ result = prime * result + ((this.didDelete== null) ? 0 : this.didDelete.hashCode());
+ return prime * result + ((this.willDelete== null) ? 0 : this.willDelete.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileRename.java b/java/org/eclipse/lsp4j/FileRename.java
new file mode 100644
index 0000000..c68a3c1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileRename.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents information on a file/folder rename.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class FileRename {
+ /**
+ * A file:// URI for the original location of the file/folder being renamed.
+ */
+ @NonNull
+ private String oldUri;
+
+ /**
+ * A file:// URI for the new location of the file/folder being renamed.
+ */
+ @NonNull
+ private String newUri;
+
+ public FileRename() {
+ }
+
+ public FileRename(@NonNull final String oldUri, @NonNull final String newUri) {
+ this.oldUri = Preconditions.<String>checkNotNull(oldUri, "oldUri");
+ this.newUri = Preconditions.<String>checkNotNull(newUri, "newUri");
+ }
+
+ /**
+ * A file:// URI for the original location of the file/folder being renamed.
+ */
+ @Pure
+ @NonNull
+ public String getOldUri() {
+ return this.oldUri;
+ }
+
+ /**
+ * A file:// URI for the original location of the file/folder being renamed.
+ */
+ public void setOldUri(@NonNull final String oldUri) {
+ this.oldUri = Preconditions.checkNotNull(oldUri, "oldUri");
+ }
+
+ /**
+ * A file:// URI for the new location of the file/folder being renamed.
+ */
+ @Pure
+ @NonNull
+ public String getNewUri() {
+ return this.newUri;
+ }
+
+ /**
+ * A file:// URI for the new location of the file/folder being renamed.
+ */
+ public void setNewUri(@NonNull final String newUri) {
+ this.newUri = Preconditions.checkNotNull(newUri, "newUri");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("oldUri", this.oldUri);
+ b.add("newUri", this.newUri);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileRename other = (FileRename) obj;
+ if (this.oldUri == null) {
+ if (other.oldUri != null)
+ return false;
+ } else if (!this.oldUri.equals(other.oldUri))
+ return false;
+ if (this.newUri == null) {
+ if (other.newUri != null)
+ return false;
+ } else if (!this.newUri.equals(other.newUri))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.oldUri== null) ? 0 : this.oldUri.hashCode());
+ return prime * result + ((this.newUri== null) ? 0 : this.newUri.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FileSystemWatcher.java b/java/org/eclipse/lsp4j/FileSystemWatcher.java
new file mode 100644
index 0000000..cb09b12
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FileSystemWatcher.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class FileSystemWatcher {
+ /**
+ * The glob pattern to watch
+ */
+ @NonNull
+ private String globPattern;
+
+ /**
+ * The kind of events of interest. If omitted it defaults
+ * to WatchKind.Create | WatchKind.Change | WatchKind.Delete
+ * which is 7.
+ */
+ private Integer kind;
+
+ public FileSystemWatcher() {
+ }
+
+ public FileSystemWatcher(@NonNull final String globPattern) {
+ this.globPattern = Preconditions.<String>checkNotNull(globPattern, "globPattern");
+ }
+
+ public FileSystemWatcher(@NonNull final String globPattern, final Integer kind) {
+ this(globPattern);
+ this.kind = kind;
+ }
+
+ /**
+ * The glob pattern to watch
+ */
+ @Pure
+ @NonNull
+ public String getGlobPattern() {
+ return this.globPattern;
+ }
+
+ /**
+ * The glob pattern to watch
+ */
+ public void setGlobPattern(@NonNull final String globPattern) {
+ this.globPattern = Preconditions.checkNotNull(globPattern, "globPattern");
+ }
+
+ /**
+ * The kind of events of interest. If omitted it defaults
+ * to WatchKind.Create | WatchKind.Change | WatchKind.Delete
+ * which is 7.
+ */
+ @Pure
+ public Integer getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of events of interest. If omitted it defaults
+ * to WatchKind.Create | WatchKind.Change | WatchKind.Delete
+ * which is 7.
+ */
+ public void setKind(final Integer kind) {
+ this.kind = kind;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("globPattern", this.globPattern);
+ b.add("kind", this.kind);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FileSystemWatcher other = (FileSystemWatcher) obj;
+ if (this.globPattern == null) {
+ if (other.globPattern != null)
+ return false;
+ } else if (!this.globPattern.equals(other.globPattern))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.globPattern== null) ? 0 : this.globPattern.hashCode());
+ return prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FoldingRange.java b/java/org/eclipse/lsp4j/FoldingRange.java
new file mode 100644
index 0000000..488ddb5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FoldingRange.java
@@ -0,0 +1,197 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a folding range.
+ */
+@SuppressWarnings("all")
+public class FoldingRange {
+ /**
+ * The zero-based line number from where the folded range starts.
+ */
+ private int startLine;
+
+ /**
+ * The zero-based line number where the folded range ends.
+ */
+ private int endLine;
+
+ /**
+ * The zero-based character offset from where the folded range starts. If not defined, defaults
+ * to the length of the start line.
+ */
+ private Integer startCharacter;
+
+ /**
+ * The zero-based character offset before the folded range ends. If not defined, defaults to the
+ * length of the end line.
+ */
+ private Integer endCharacter;
+
+ /**
+ * Describes the kind of the folding range such as {@link FoldingRangeKind#Comment} or {@link FoldingRangeKind#Region}.
+ * The kind is used to categorize folding ranges and used by commands like 'Fold all comments'.
+ * See {@link FoldingRangeKind} for an enumeration of standardized kinds.
+ */
+ private String kind;
+
+ public FoldingRange() {
+ }
+
+ public FoldingRange(final int startLine, final int endLine) {
+ this.startLine = startLine;
+ this.endLine = endLine;
+ }
+
+ /**
+ * The zero-based line number from where the folded range starts.
+ */
+ @Pure
+ public int getStartLine() {
+ return this.startLine;
+ }
+
+ /**
+ * The zero-based line number from where the folded range starts.
+ */
+ public void setStartLine(final int startLine) {
+ this.startLine = startLine;
+ }
+
+ /**
+ * The zero-based line number where the folded range ends.
+ */
+ @Pure
+ public int getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * The zero-based line number where the folded range ends.
+ */
+ public void setEndLine(final int endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * The zero-based character offset from where the folded range starts. If not defined, defaults
+ * to the length of the start line.
+ */
+ @Pure
+ public Integer getStartCharacter() {
+ return this.startCharacter;
+ }
+
+ /**
+ * The zero-based character offset from where the folded range starts. If not defined, defaults
+ * to the length of the start line.
+ */
+ public void setStartCharacter(final Integer startCharacter) {
+ this.startCharacter = startCharacter;
+ }
+
+ /**
+ * The zero-based character offset before the folded range ends. If not defined, defaults to the
+ * length of the end line.
+ */
+ @Pure
+ public Integer getEndCharacter() {
+ return this.endCharacter;
+ }
+
+ /**
+ * The zero-based character offset before the folded range ends. If not defined, defaults to the
+ * length of the end line.
+ */
+ public void setEndCharacter(final Integer endCharacter) {
+ this.endCharacter = endCharacter;
+ }
+
+ /**
+ * Describes the kind of the folding range such as {@link FoldingRangeKind#Comment} or {@link FoldingRangeKind#Region}.
+ * The kind is used to categorize folding ranges and used by commands like 'Fold all comments'.
+ * See {@link FoldingRangeKind} for an enumeration of standardized kinds.
+ */
+ @Pure
+ public String getKind() {
+ return this.kind;
+ }
+
+ /**
+ * Describes the kind of the folding range such as {@link FoldingRangeKind#Comment} or {@link FoldingRangeKind#Region}.
+ * The kind is used to categorize folding ranges and used by commands like 'Fold all comments'.
+ * See {@link FoldingRangeKind} for an enumeration of standardized kinds.
+ */
+ public void setKind(final String kind) {
+ this.kind = kind;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("startLine", this.startLine);
+ b.add("endLine", this.endLine);
+ b.add("startCharacter", this.startCharacter);
+ b.add("endCharacter", this.endCharacter);
+ b.add("kind", this.kind);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FoldingRange other = (FoldingRange) obj;
+ if (other.startLine != this.startLine)
+ return false;
+ if (other.endLine != this.endLine)
+ return false;
+ if (this.startCharacter == null) {
+ if (other.startCharacter != null)
+ return false;
+ } else if (!this.startCharacter.equals(other.startCharacter))
+ return false;
+ if (this.endCharacter == null) {
+ if (other.endCharacter != null)
+ return false;
+ } else if (!this.endCharacter.equals(other.endCharacter))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.startLine;
+ result = prime * result + this.endLine;
+ result = prime * result + ((this.startCharacter== null) ? 0 : this.startCharacter.hashCode());
+ result = prime * result + ((this.endCharacter== null) ? 0 : this.endCharacter.hashCode());
+ return prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FoldingRangeCapabilities.java b/java/org/eclipse/lsp4j/FoldingRangeCapabilities.java
new file mode 100644
index 0000000..034cedb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FoldingRangeCapabilities.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to `textDocument/foldingRange` requests.
+ * <p>
+ * Since 3.10.0
+ */
+@SuppressWarnings("all")
+public class FoldingRangeCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+ * hint, servers are free to follow the limit.
+ */
+ private Integer rangeLimit;
+
+ /**
+ * If set, the client signals that it only supports folding complete lines. If set, client will
+ * ignore specified {@link FoldingRange#startCharacter} and {@link FoldingRange#endCharacter} properties.
+ */
+ private Boolean lineFoldingOnly;
+
+ /**
+ * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+ * hint, servers are free to follow the limit.
+ */
+ @Pure
+ public Integer getRangeLimit() {
+ return this.rangeLimit;
+ }
+
+ /**
+ * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+ * hint, servers are free to follow the limit.
+ */
+ public void setRangeLimit(final Integer rangeLimit) {
+ this.rangeLimit = rangeLimit;
+ }
+
+ /**
+ * If set, the client signals that it only supports folding complete lines. If set, client will
+ * ignore specified {@link FoldingRange#startCharacter} and {@link FoldingRange#endCharacter} properties.
+ */
+ @Pure
+ public Boolean getLineFoldingOnly() {
+ return this.lineFoldingOnly;
+ }
+
+ /**
+ * If set, the client signals that it only supports folding complete lines. If set, client will
+ * ignore specified {@link FoldingRange#startCharacter} and {@link FoldingRange#endCharacter} properties.
+ */
+ public void setLineFoldingOnly(final Boolean lineFoldingOnly) {
+ this.lineFoldingOnly = lineFoldingOnly;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("rangeLimit", this.rangeLimit);
+ b.add("lineFoldingOnly", this.lineFoldingOnly);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ FoldingRangeCapabilities other = (FoldingRangeCapabilities) obj;
+ if (this.rangeLimit == null) {
+ if (other.rangeLimit != null)
+ return false;
+ } else if (!this.rangeLimit.equals(other.rangeLimit))
+ return false;
+ if (this.lineFoldingOnly == null) {
+ if (other.lineFoldingOnly != null)
+ return false;
+ } else if (!this.lineFoldingOnly.equals(other.lineFoldingOnly))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.rangeLimit== null) ? 0 : this.rangeLimit.hashCode());
+ return prime * result + ((this.lineFoldingOnly== null) ? 0 : this.lineFoldingOnly.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FoldingRangeKind.java b/java/org/eclipse/lsp4j/FoldingRangeKind.java
new file mode 100644
index 0000000..1838c38
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FoldingRangeKind.java
@@ -0,0 +1,35 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * Enum of known range kinds
+ */
+public final class FoldingRangeKind {
+ private FoldingRangeKind() {}
+
+ /**
+ * Folding range for a comment
+ */
+ public static final String Comment = "comment";
+
+ /**
+ * Folding range for a imports or includes
+ */
+ public static final String Imports = "imports";
+
+ /**
+ * Folding range for a region (e.g. `#region`)
+ */
+ public static final String Region = "region";
+
+}
diff --git a/java/org/eclipse/lsp4j/FoldingRangeProviderOptions.java b/java/org/eclipse/lsp4j/FoldingRangeProviderOptions.java
new file mode 100644
index 0000000..14ce226
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FoldingRangeProviderOptions.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Folding range options.
+ */
+@SuppressWarnings("all")
+public class FoldingRangeProviderOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public FoldingRangeProviderOptions() {
+ }
+
+ public FoldingRangeProviderOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ FoldingRangeProviderOptions other = (FoldingRangeProviderOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FoldingRangeRequestParams.java b/java/org/eclipse/lsp4j/FoldingRangeRequestParams.java
new file mode 100644
index 0000000..263854e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FoldingRangeRequestParams.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The folding range request is sent from the client to the server to return all folding
+ * ranges found in a given text document.
+ */
+@SuppressWarnings("all")
+public class FoldingRangeRequestParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public FoldingRangeRequestParams() {
+ }
+
+ public FoldingRangeRequestParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ FoldingRangeRequestParams other = (FoldingRangeRequestParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FormattingCapabilities.java b/java/org/eclipse/lsp4j/FormattingCapabilities.java
new file mode 100644
index 0000000..852dcbe
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FormattingCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/formatting`
+ */
+@SuppressWarnings("all")
+public class FormattingCapabilities extends DynamicRegistrationCapabilities {
+ public FormattingCapabilities() {
+ }
+
+ public FormattingCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/FormattingOptions.java b/java/org/eclipse/lsp4j/FormattingOptions.java
new file mode 100644
index 0000000..cf4dd89
--- /dev/null
+++ b/java/org/eclipse/lsp4j/FormattingOptions.java
@@ -0,0 +1,230 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.lsp4j.jsonrpc.messages.Either3;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+/**
+ * Value-object describing what options formatting should use.
+ */
+@SuppressWarnings("all")
+public class FormattingOptions extends LinkedHashMap<String, Either3<String, Number, Boolean>> {
+ private static final String TAB_SIZE = "tabSize";
+
+ private static final String INSERT_SPACES = "insertSpaces";
+
+ private static final String TRIM_TRAILING_WHITESPACE = "trimTrailingWhitespace";
+
+ private static final String INSERT_FINAL_NEWLINE = "insertFinalNewline";
+
+ private static final String TRIM_FINAL_NEWLINES = "trimFinalNewlines";
+
+ public FormattingOptions() {
+ }
+
+ public FormattingOptions(final int tabSize, final boolean insertSpaces) {
+ this.setTabSize(tabSize);
+ this.setInsertSpaces(insertSpaces);
+ }
+
+ /**
+ * @deprecated See https://github.com/eclipse/lsp4j/issues/99
+ */
+ @Deprecated
+ public FormattingOptions(final int tabSize, final boolean insertSpaces, final Map<String, String> properties) {
+ this(tabSize, insertSpaces);
+ this.setProperties(properties);
+ }
+
+ public String getString(final String key) {
+ Either3<String, Number, Boolean> _get = this.get(key);
+ String _first = null;
+ if (_get!=null) {
+ _first=_get.getFirst();
+ }
+ return _first;
+ }
+
+ public void putString(final String key, final String value) {
+ this.put(key, Either3.<String, Number, Boolean>forFirst(value));
+ }
+
+ public Number getNumber(final String key) {
+ Either3<String, Number, Boolean> _get = this.get(key);
+ Number _second = null;
+ if (_get!=null) {
+ _second=_get.getSecond();
+ }
+ return _second;
+ }
+
+ public void putNumber(final String key, final Number value) {
+ this.put(key, Either3.<String, Number, Boolean>forSecond(value));
+ }
+
+ public Boolean getBoolean(final String key) {
+ Either3<String, Number, Boolean> _get = this.get(key);
+ Boolean _third = null;
+ if (_get!=null) {
+ _third=_get.getThird();
+ }
+ return _third;
+ }
+
+ public void putBoolean(final String key, final Boolean value) {
+ this.put(key, Either3.<String, Number, Boolean>forThird(value));
+ }
+
+ /**
+ * Size of a tab in spaces.
+ */
+ public int getTabSize() {
+ final Number value = this.getNumber(FormattingOptions.TAB_SIZE);
+ if ((value != null)) {
+ return value.intValue();
+ } else {
+ return 0;
+ }
+ }
+
+ public void setTabSize(final int tabSize) {
+ this.putNumber(FormattingOptions.TAB_SIZE, Integer.valueOf(tabSize));
+ }
+
+ /**
+ * Prefer spaces over tabs.
+ */
+ public boolean isInsertSpaces() {
+ final Boolean value = this.getBoolean(FormattingOptions.INSERT_SPACES);
+ if ((value != null)) {
+ return (value).booleanValue();
+ } else {
+ return false;
+ }
+ }
+
+ public void setInsertSpaces(final boolean insertSpaces) {
+ this.putBoolean(FormattingOptions.INSERT_SPACES, Boolean.valueOf(insertSpaces));
+ }
+
+ /**
+ * Trim trailing whitespace on a line.
+ * <p>
+ * Since 3.15.0
+ */
+ public boolean isTrimTrailingWhitespace() {
+ final Boolean value = this.getBoolean(FormattingOptions.TRIM_TRAILING_WHITESPACE);
+ if ((value != null)) {
+ return (value).booleanValue();
+ } else {
+ return false;
+ }
+ }
+
+ public void setTrimTrailingWhitespace(final boolean trimTrailingWhitespace) {
+ this.putBoolean(FormattingOptions.TRIM_TRAILING_WHITESPACE, Boolean.valueOf(trimTrailingWhitespace));
+ }
+
+ /**
+ * Insert a newline character at the end of the file if one does not exist.
+ * <p>
+ * Since 3.15.0
+ */
+ public boolean isInsertFinalNewline() {
+ final Boolean value = this.getBoolean(FormattingOptions.INSERT_FINAL_NEWLINE);
+ if ((value != null)) {
+ return (value).booleanValue();
+ } else {
+ return false;
+ }
+ }
+
+ public void setInsertFinalNewline(final boolean insertFinalNewline) {
+ this.putBoolean(FormattingOptions.INSERT_FINAL_NEWLINE, Boolean.valueOf(insertFinalNewline));
+ }
+
+ /**
+ * Trim all newlines after the final newline at the end of the file.
+ * <p>
+ * Since 3.15.0
+ */
+ public boolean isTrimFinalNewlines() {
+ final Boolean value = this.getBoolean(FormattingOptions.TRIM_FINAL_NEWLINES);
+ if ((value != null)) {
+ return (value).booleanValue();
+ } else {
+ return false;
+ }
+ }
+
+ public void setTrimFinalNewlines(final boolean trimFinalNewlines) {
+ this.putBoolean(FormattingOptions.TRIM_FINAL_NEWLINES, Boolean.valueOf(trimFinalNewlines));
+ }
+
+ /**
+ * @deprecated See https://github.com/eclipse/lsp4j/issues/99
+ */
+ @Deprecated
+ public Map<String, String> getProperties() {
+ final LinkedHashMap<String, String> properties = CollectionLiterals.<String, String>newLinkedHashMap();
+ Set<Map.Entry<String, Either3<String, Number, Boolean>>> _entrySet = this.entrySet();
+ for (final Map.Entry<String, Either3<String, Number, Boolean>> entry : _entrySet) {
+ {
+ Serializable _switchResult = null;
+ Either3<String, Number, Boolean> _value = entry.getValue();
+ final Either3<String, Number, Boolean> it = _value;
+ boolean _matched = false;
+ boolean _isFirst = it.isFirst();
+ if (_isFirst) {
+ _matched=true;
+ _switchResult = it.getFirst();
+ }
+ if (!_matched) {
+ boolean _isSecond = it.isSecond();
+ if (_isSecond) {
+ _matched=true;
+ _switchResult = it.getSecond();
+ }
+ }
+ if (!_matched) {
+ boolean _isThird = it.isThird();
+ if (_isThird) {
+ _matched=true;
+ _switchResult = it.getThird();
+ }
+ }
+ final Serializable value = _switchResult;
+ if ((value != null)) {
+ properties.put(entry.getKey(), value.toString());
+ }
+ }
+ }
+ return Collections.<String, String>unmodifiableMap(properties);
+ }
+
+ /**
+ * @deprecated See https://github.com/eclipse/lsp4j/issues/99
+ */
+ @Deprecated
+ public void setProperties(final Map<String, String> properties) {
+ Set<Map.Entry<String, String>> _entrySet = properties.entrySet();
+ for (final Map.Entry<String, String> entry : _entrySet) {
+ this.putString(entry.getKey(), entry.getValue());
+ }
+ }
+}
diff --git a/java/org/eclipse/lsp4j/GeneralClientCapabilities.java b/java/org/eclipse/lsp4j/GeneralClientCapabilities.java
new file mode 100644
index 0000000..6607b77
--- /dev/null
+++ b/java/org/eclipse/lsp4j/GeneralClientCapabilities.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.MarkdownCapabilities;
+import org.eclipse.lsp4j.RegularExpressionsCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * General client capabilities.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class GeneralClientCapabilities {
+ /**
+ * Client capabilities specific to regular expressions.
+ * <p>
+ * Since 3.16.0
+ */
+ private RegularExpressionsCapabilities regularExpressions;
+
+ /**
+ * Client capabilities specific to the client's markdown parser.
+ * <p>
+ * Since 3.16.0
+ */
+ private MarkdownCapabilities markdown;
+
+ /**
+ * Client capabilities specific to regular expressions.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public RegularExpressionsCapabilities getRegularExpressions() {
+ return this.regularExpressions;
+ }
+
+ /**
+ * Client capabilities specific to regular expressions.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setRegularExpressions(final RegularExpressionsCapabilities regularExpressions) {
+ this.regularExpressions = regularExpressions;
+ }
+
+ /**
+ * Client capabilities specific to the client's markdown parser.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public MarkdownCapabilities getMarkdown() {
+ return this.markdown;
+ }
+
+ /**
+ * Client capabilities specific to the client's markdown parser.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setMarkdown(final MarkdownCapabilities markdown) {
+ this.markdown = markdown;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("regularExpressions", this.regularExpressions);
+ b.add("markdown", this.markdown);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ GeneralClientCapabilities other = (GeneralClientCapabilities) obj;
+ if (this.regularExpressions == null) {
+ if (other.regularExpressions != null)
+ return false;
+ } else if (!this.regularExpressions.equals(other.regularExpressions))
+ return false;
+ if (this.markdown == null) {
+ if (other.markdown != null)
+ return false;
+ } else if (!this.markdown.equals(other.markdown))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.regularExpressions== null) ? 0 : this.regularExpressions.hashCode());
+ return prime * result + ((this.markdown== null) ? 0 : this.markdown.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Hover.java b/java/org/eclipse/lsp4j/Hover.java
new file mode 100644
index 0000000..9495481
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Hover.java
@@ -0,0 +1,158 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.lsp4j.MarkedString;
+import org.eclipse.lsp4j.MarkupContent;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.adapters.HoverTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The result of a hover request.
+ */
+@JsonAdapter(HoverTypeAdapter.Factory.class)
+@SuppressWarnings("all")
+public class Hover {
+ /**
+ * The hover's content as markdown
+ */
+ @NonNull
+ private Either<List<Either<String, MarkedString>>, MarkupContent> contents;
+
+ /**
+ * An optional range
+ */
+ private Range range;
+
+ public Hover() {
+ }
+
+ public Hover(@NonNull final List<Either<String, MarkedString>> contents) {
+ this.setContents(Preconditions.<List<Either<String, MarkedString>>>checkNotNull(contents, "contents"));
+ }
+
+ public Hover(@NonNull final List<Either<String, MarkedString>> contents, final Range range) {
+ this.setContents(Preconditions.<List<Either<String, MarkedString>>>checkNotNull(contents, "contents"));
+ this.range = range;
+ }
+
+ public Hover(@NonNull final MarkupContent contents) {
+ this.setContents(Preconditions.<MarkupContent>checkNotNull(contents, "contents"));
+ }
+
+ public Hover(@NonNull final MarkupContent contents, final Range range) {
+ this.setContents(Preconditions.<MarkupContent>checkNotNull(contents, "contents"));
+ this.range = range;
+ }
+
+ public Hover(@NonNull final Either<String, MarkedString> contents) {
+ this.setContents(Arrays.<Either<String, MarkedString>>asList(Preconditions.<Either<String, MarkedString>>checkNotNull(contents, "contents")));
+ }
+
+ /**
+ * The hover's content as markdown
+ */
+ @Pure
+ @NonNull
+ public Either<List<Either<String, MarkedString>>, MarkupContent> getContents() {
+ return this.contents;
+ }
+
+ /**
+ * The hover's content as markdown
+ */
+ public void setContents(@NonNull final Either<List<Either<String, MarkedString>>, MarkupContent> contents) {
+ this.contents = Preconditions.checkNotNull(contents, "contents");
+ }
+
+ public void setContents(final List<Either<String, MarkedString>> contents) {
+ if (contents == null) {
+ Preconditions.checkNotNull(contents, "contents");
+ this.contents = null;
+ return;
+ }
+ this.contents = Either.forLeft(contents);
+ }
+
+ public void setContents(final MarkupContent contents) {
+ if (contents == null) {
+ Preconditions.checkNotNull(contents, "contents");
+ this.contents = null;
+ return;
+ }
+ this.contents = Either.forRight(contents);
+ }
+
+ /**
+ * An optional range
+ */
+ @Pure
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * An optional range
+ */
+ public void setRange(final Range range) {
+ this.range = range;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("contents", this.contents);
+ b.add("range", this.range);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Hover other = (Hover) obj;
+ if (this.contents == null) {
+ if (other.contents != null)
+ return false;
+ } else if (!this.contents.equals(other.contents))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.contents== null) ? 0 : this.contents.hashCode());
+ return prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/HoverCapabilities.java b/java/org/eclipse/lsp4j/HoverCapabilities.java
new file mode 100644
index 0000000..423ff5e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/HoverCapabilities.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/hover`
+ */
+@SuppressWarnings("all")
+public class HoverCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Client supports the following content formats if the content
+ * property refers to {@link MarkupContent}.
+ * The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ private List<String> contentFormat;
+
+ public HoverCapabilities() {
+ }
+
+ public HoverCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public HoverCapabilities(final List<String> contentFormat, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.contentFormat = contentFormat;
+ }
+
+ /**
+ * Client supports the following content formats if the content
+ * property refers to {@link MarkupContent}.
+ * The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ @Pure
+ public List<String> getContentFormat() {
+ return this.contentFormat;
+ }
+
+ /**
+ * Client supports the following content formats if the content
+ * property refers to {@link MarkupContent}.
+ * The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ public void setContentFormat(final List<String> contentFormat) {
+ this.contentFormat = contentFormat;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("contentFormat", this.contentFormat);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ HoverCapabilities other = (HoverCapabilities) obj;
+ if (this.contentFormat == null) {
+ if (other.contentFormat != null)
+ return false;
+ } else if (!this.contentFormat.equals(other.contentFormat))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.contentFormat== null) ? 0 : this.contentFormat.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/HoverOptions.java b/java/org/eclipse/lsp4j/HoverOptions.java
new file mode 100644
index 0000000..f6596bd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/HoverOptions.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Hover options.
+ */
+@SuppressWarnings("all")
+public class HoverOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/HoverParams.java b/java/org/eclipse/lsp4j/HoverParams.java
new file mode 100644
index 0000000..d4d9a3c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/HoverParams.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The hover request is sent from the client to the server to request hover information at a given
+ * text document position.
+ */
+@SuppressWarnings("all")
+public class HoverParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ public HoverParams() {
+ }
+
+ public HoverParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/HoverRegistrationOptions.java b/java/org/eclipse/lsp4j/HoverRegistrationOptions.java
new file mode 100644
index 0000000..31c25a5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/HoverRegistrationOptions.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Hover registration options.
+ */
+@SuppressWarnings("all")
+public class HoverRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ImplementationCapabilities.java b/java/org/eclipse/lsp4j/ImplementationCapabilities.java
new file mode 100644
index 0000000..38791a7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ImplementationCapabilities.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/implementation`.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class ImplementationCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ private Boolean linkSupport;
+
+ public ImplementationCapabilities() {
+ }
+
+ public ImplementationCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public ImplementationCapabilities(final Boolean dynamicRegistration, final Boolean linkSupport) {
+ super(dynamicRegistration);
+ this.linkSupport = linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ @Pure
+ public Boolean getLinkSupport() {
+ return this.linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ public void setLinkSupport(final Boolean linkSupport) {
+ this.linkSupport = linkSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("linkSupport", this.linkSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ImplementationCapabilities other = (ImplementationCapabilities) obj;
+ if (this.linkSupport == null) {
+ if (other.linkSupport != null)
+ return false;
+ } else if (!this.linkSupport.equals(other.linkSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.linkSupport== null) ? 0 : this.linkSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ImplementationOptions.java b/java/org/eclipse/lsp4j/ImplementationOptions.java
new file mode 100644
index 0000000..b0245ac
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ImplementationOptions.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ImplementationOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ImplementationParams.java b/java/org/eclipse/lsp4j/ImplementationParams.java
new file mode 100644
index 0000000..7241d23
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ImplementationParams.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The go to implementation request is sent from the client to the server to resolve the implementation
+ * location of a symbol at a given text document position.
+ */
+@SuppressWarnings("all")
+public class ImplementationParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ public ImplementationParams() {
+ }
+
+ public ImplementationParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ImplementationRegistrationOptions.java b/java/org/eclipse/lsp4j/ImplementationRegistrationOptions.java
new file mode 100644
index 0000000..8d026a2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ImplementationRegistrationOptions.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ImplementationRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public ImplementationRegistrationOptions() {
+ }
+
+ public ImplementationRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ImplementationRegistrationOptions other = (ImplementationRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/InitializeError.java b/java/org/eclipse/lsp4j/InitializeError.java
new file mode 100644
index 0000000..dcd0f46
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InitializeError.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class InitializeError {
+ /**
+ * Indicates whether the client executes the following retry logic:
+ * <ol>
+ * <li>Show the message provided by the ResponseError to the user.
+ * <li>User selects retry or cancel.
+ * <li>If user selected retry the initialize method is sent again.
+ * </ol>
+ */
+ private boolean retry;
+
+ public InitializeError() {
+ }
+
+ public InitializeError(final boolean retry) {
+ this.retry = retry;
+ }
+
+ /**
+ * Indicates whether the client executes the following retry logic:
+ * <ol>
+ * <li>Show the message provided by the ResponseError to the user.
+ * <li>User selects retry or cancel.
+ * <li>If user selected retry the initialize method is sent again.
+ * </ol>
+ */
+ @Pure
+ public boolean isRetry() {
+ return this.retry;
+ }
+
+ /**
+ * Indicates whether the client executes the following retry logic:
+ * <ol>
+ * <li>Show the message provided by the ResponseError to the user.
+ * <li>User selects retry or cancel.
+ * <li>If user selected retry the initialize method is sent again.
+ * </ol>
+ */
+ public void setRetry(final boolean retry) {
+ this.retry = retry;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("retry", this.retry);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InitializeError other = (InitializeError) obj;
+ if (other.retry != this.retry)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + (this.retry ? 1231 : 1237);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/InitializeErrorCode.java b/java/org/eclipse/lsp4j/InitializeErrorCode.java
new file mode 100644
index 0000000..031c006
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InitializeErrorCode.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+/**
+ * Known error codes for an {@link InitializeError}
+ */
+@SuppressWarnings("all")
+public interface InitializeErrorCode {
+ /**
+ * If the protocol version provided by the client can't be handled by the server.
+ *
+ * @deprecated This initialize error got replaced by client capabilities.
+ * There is no version handshake in version 3.0x
+ */
+ @Deprecated
+ static final int unknownProtocolVersion = 1;
+}
diff --git a/java/org/eclipse/lsp4j/InitializeParams.java b/java/org/eclipse/lsp4j/InitializeParams.java
new file mode 100644
index 0000000..5a55ee1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InitializeParams.java
@@ -0,0 +1,451 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.ClientInfo;
+import org.eclipse.lsp4j.WorkDoneProgressParams;
+import org.eclipse.lsp4j.WorkspaceFolder;
+import org.eclipse.lsp4j.adapters.InitializeParamsTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The initialize request is sent as the first request from the client to the server.
+ */
+@JsonAdapter(InitializeParamsTypeAdapter.Factory.class)
+@SuppressWarnings("all")
+public class InitializeParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ private Either<String, Integer> workDoneToken;
+
+ /**
+ * The process Id of the parent process that started the server.
+ */
+ private Integer processId;
+
+ /**
+ * The rootPath of the workspace. Is null if no folder is open.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Deprecated
+ private String rootPath;
+
+ /**
+ * The rootUri of the workspace. Is null if no folder is open.
+ * If both {@link #rootPath} and `rootUri` are set, `rootUri` wins.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Deprecated
+ private String rootUri;
+
+ /**
+ * User provided initialization options.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object initializationOptions;
+
+ /**
+ * The capabilities provided by the client (editor)
+ */
+ private ClientCapabilities capabilities;
+
+ /**
+ * An optional extension to the protocol.
+ * To tell the server what client (editor) is talking to it.
+ *
+ * @deprecated Use {@link #clientInfo} instead.
+ */
+ @Deprecated
+ private String clientName;
+
+ /**
+ * Information about the client
+ * <p>
+ * Since 3.15.0
+ */
+ private ClientInfo clientInfo;
+
+ /**
+ * The locale the client is currently showing the user interface
+ * in. This must not necessarily be the locale of the operating
+ * system.
+ * <p>
+ * Uses IETF language tags as the value's syntax
+ * (See https://en.wikipedia.org/wiki/IETF_language_tag)
+ * <p>
+ * Since 3.16.0
+ */
+ private String locale;
+
+ /**
+ * The initial trace setting.
+ * For values, see {@link TraceValue}. If omitted trace is disabled ({@link TraceValue#Off}).
+ */
+ private String trace;
+
+ /**
+ * The workspace folders configured in the client when the server starts.
+ * This property is only available if the client supports workspace folders.
+ * It can be `null` if the client supports workspace folders but none are
+ * configured.
+ * <p>
+ * Since 3.6.0
+ */
+ private List<WorkspaceFolder> workspaceFolders;
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getWorkDoneToken() {
+ return this.workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ public void setWorkDoneToken(final Either<String, Integer> workDoneToken) {
+ this.workDoneToken = workDoneToken;
+ }
+
+ public void setWorkDoneToken(final String workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forLeft(workDoneToken);
+ }
+
+ public void setWorkDoneToken(final Integer workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forRight(workDoneToken);
+ }
+
+ /**
+ * The process Id of the parent process that started the server.
+ */
+ @Pure
+ public Integer getProcessId() {
+ return this.processId;
+ }
+
+ /**
+ * The process Id of the parent process that started the server.
+ */
+ public void setProcessId(final Integer processId) {
+ this.processId = processId;
+ }
+
+ /**
+ * The rootPath of the workspace. Is null if no folder is open.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Pure
+ @Deprecated
+ public String getRootPath() {
+ return this.rootPath;
+ }
+
+ /**
+ * The rootPath of the workspace. Is null if no folder is open.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Deprecated
+ public void setRootPath(final String rootPath) {
+ this.rootPath = rootPath;
+ }
+
+ /**
+ * The rootUri of the workspace. Is null if no folder is open.
+ * If both {@link #rootPath} and `rootUri` are set, `rootUri` wins.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Pure
+ @Deprecated
+ public String getRootUri() {
+ return this.rootUri;
+ }
+
+ /**
+ * The rootUri of the workspace. Is null if no folder is open.
+ * If both {@link #rootPath} and `rootUri` are set, `rootUri` wins.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Deprecated
+ public void setRootUri(final String rootUri) {
+ this.rootUri = rootUri;
+ }
+
+ /**
+ * User provided initialization options.
+ */
+ @Pure
+ public Object getInitializationOptions() {
+ return this.initializationOptions;
+ }
+
+ /**
+ * User provided initialization options.
+ */
+ public void setInitializationOptions(final Object initializationOptions) {
+ this.initializationOptions = initializationOptions;
+ }
+
+ /**
+ * The capabilities provided by the client (editor)
+ */
+ @Pure
+ public ClientCapabilities getCapabilities() {
+ return this.capabilities;
+ }
+
+ /**
+ * The capabilities provided by the client (editor)
+ */
+ public void setCapabilities(final ClientCapabilities capabilities) {
+ this.capabilities = capabilities;
+ }
+
+ /**
+ * An optional extension to the protocol.
+ * To tell the server what client (editor) is talking to it.
+ *
+ * @deprecated Use {@link #clientInfo} instead.
+ */
+ @Pure
+ @Deprecated
+ public String getClientName() {
+ return this.clientName;
+ }
+
+ /**
+ * An optional extension to the protocol.
+ * To tell the server what client (editor) is talking to it.
+ *
+ * @deprecated Use {@link #clientInfo} instead.
+ */
+ @Deprecated
+ public void setClientName(final String clientName) {
+ this.clientName = clientName;
+ }
+
+ /**
+ * Information about the client
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public ClientInfo getClientInfo() {
+ return this.clientInfo;
+ }
+
+ /**
+ * Information about the client
+ * <p>
+ * Since 3.15.0
+ */
+ public void setClientInfo(final ClientInfo clientInfo) {
+ this.clientInfo = clientInfo;
+ }
+
+ /**
+ * The locale the client is currently showing the user interface
+ * in. This must not necessarily be the locale of the operating
+ * system.
+ * <p>
+ * Uses IETF language tags as the value's syntax
+ * (See https://en.wikipedia.org/wiki/IETF_language_tag)
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public String getLocale() {
+ return this.locale;
+ }
+
+ /**
+ * The locale the client is currently showing the user interface
+ * in. This must not necessarily be the locale of the operating
+ * system.
+ * <p>
+ * Uses IETF language tags as the value's syntax
+ * (See https://en.wikipedia.org/wiki/IETF_language_tag)
+ * <p>
+ * Since 3.16.0
+ */
+ public void setLocale(final String locale) {
+ this.locale = locale;
+ }
+
+ /**
+ * The initial trace setting.
+ * For values, see {@link TraceValue}. If omitted trace is disabled ({@link TraceValue#Off}).
+ */
+ @Pure
+ public String getTrace() {
+ return this.trace;
+ }
+
+ /**
+ * The initial trace setting.
+ * For values, see {@link TraceValue}. If omitted trace is disabled ({@link TraceValue#Off}).
+ */
+ public void setTrace(final String trace) {
+ this.trace = trace;
+ }
+
+ /**
+ * The workspace folders configured in the client when the server starts.
+ * This property is only available if the client supports workspace folders.
+ * It can be `null` if the client supports workspace folders but none are
+ * configured.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public List<WorkspaceFolder> getWorkspaceFolders() {
+ return this.workspaceFolders;
+ }
+
+ /**
+ * The workspace folders configured in the client when the server starts.
+ * This property is only available if the client supports workspace folders.
+ * It can be `null` if the client supports workspace folders but none are
+ * configured.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setWorkspaceFolders(final List<WorkspaceFolder> workspaceFolders) {
+ this.workspaceFolders = workspaceFolders;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", this.workDoneToken);
+ b.add("processId", this.processId);
+ b.add("rootPath", this.rootPath);
+ b.add("rootUri", this.rootUri);
+ b.add("initializationOptions", this.initializationOptions);
+ b.add("capabilities", this.capabilities);
+ b.add("clientName", this.clientName);
+ b.add("clientInfo", this.clientInfo);
+ b.add("locale", this.locale);
+ b.add("trace", this.trace);
+ b.add("workspaceFolders", this.workspaceFolders);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InitializeParams other = (InitializeParams) obj;
+ if (this.workDoneToken == null) {
+ if (other.workDoneToken != null)
+ return false;
+ } else if (!this.workDoneToken.equals(other.workDoneToken))
+ return false;
+ if (this.processId == null) {
+ if (other.processId != null)
+ return false;
+ } else if (!this.processId.equals(other.processId))
+ return false;
+ if (this.rootPath == null) {
+ if (other.rootPath != null)
+ return false;
+ } else if (!this.rootPath.equals(other.rootPath))
+ return false;
+ if (this.rootUri == null) {
+ if (other.rootUri != null)
+ return false;
+ } else if (!this.rootUri.equals(other.rootUri))
+ return false;
+ if (this.initializationOptions == null) {
+ if (other.initializationOptions != null)
+ return false;
+ } else if (!this.initializationOptions.equals(other.initializationOptions))
+ return false;
+ if (this.capabilities == null) {
+ if (other.capabilities != null)
+ return false;
+ } else if (!this.capabilities.equals(other.capabilities))
+ return false;
+ if (this.clientName == null) {
+ if (other.clientName != null)
+ return false;
+ } else if (!this.clientName.equals(other.clientName))
+ return false;
+ if (this.clientInfo == null) {
+ if (other.clientInfo != null)
+ return false;
+ } else if (!this.clientInfo.equals(other.clientInfo))
+ return false;
+ if (this.locale == null) {
+ if (other.locale != null)
+ return false;
+ } else if (!this.locale.equals(other.locale))
+ return false;
+ if (this.trace == null) {
+ if (other.trace != null)
+ return false;
+ } else if (!this.trace.equals(other.trace))
+ return false;
+ if (this.workspaceFolders == null) {
+ if (other.workspaceFolders != null)
+ return false;
+ } else if (!this.workspaceFolders.equals(other.workspaceFolders))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workDoneToken== null) ? 0 : this.workDoneToken.hashCode());
+ result = prime * result + ((this.processId== null) ? 0 : this.processId.hashCode());
+ result = prime * result + ((this.rootPath== null) ? 0 : this.rootPath.hashCode());
+ result = prime * result + ((this.rootUri== null) ? 0 : this.rootUri.hashCode());
+ result = prime * result + ((this.initializationOptions== null) ? 0 : this.initializationOptions.hashCode());
+ result = prime * result + ((this.capabilities== null) ? 0 : this.capabilities.hashCode());
+ result = prime * result + ((this.clientName== null) ? 0 : this.clientName.hashCode());
+ result = prime * result + ((this.clientInfo== null) ? 0 : this.clientInfo.hashCode());
+ result = prime * result + ((this.locale== null) ? 0 : this.locale.hashCode());
+ result = prime * result + ((this.trace== null) ? 0 : this.trace.hashCode());
+ return prime * result + ((this.workspaceFolders== null) ? 0 : this.workspaceFolders.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/InitializeResult.java b/java/org/eclipse/lsp4j/InitializeResult.java
new file mode 100644
index 0000000..a6e865c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InitializeResult.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.ServerCapabilities;
+import org.eclipse.lsp4j.ServerInfo;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class InitializeResult {
+ /**
+ * The capabilities the language server provides.
+ */
+ @NonNull
+ private ServerCapabilities capabilities;
+
+ /**
+ * Information about the server.
+ * <p>
+ * Since 3.15.0
+ */
+ private ServerInfo serverInfo;
+
+ public InitializeResult() {
+ }
+
+ public InitializeResult(@NonNull final ServerCapabilities capabilities) {
+ this.capabilities = Preconditions.<ServerCapabilities>checkNotNull(capabilities, "capabilities");
+ }
+
+ public InitializeResult(@NonNull final ServerCapabilities capabilities, final ServerInfo serverInfo) {
+ this(capabilities);
+ this.serverInfo = serverInfo;
+ }
+
+ /**
+ * The capabilities the language server provides.
+ */
+ @Pure
+ @NonNull
+ public ServerCapabilities getCapabilities() {
+ return this.capabilities;
+ }
+
+ /**
+ * The capabilities the language server provides.
+ */
+ public void setCapabilities(@NonNull final ServerCapabilities capabilities) {
+ this.capabilities = Preconditions.checkNotNull(capabilities, "capabilities");
+ }
+
+ /**
+ * Information about the server.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public ServerInfo getServerInfo() {
+ return this.serverInfo;
+ }
+
+ /**
+ * Information about the server.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setServerInfo(final ServerInfo serverInfo) {
+ this.serverInfo = serverInfo;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("capabilities", this.capabilities);
+ b.add("serverInfo", this.serverInfo);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InitializeResult other = (InitializeResult) obj;
+ if (this.capabilities == null) {
+ if (other.capabilities != null)
+ return false;
+ } else if (!this.capabilities.equals(other.capabilities))
+ return false;
+ if (this.serverInfo == null) {
+ if (other.serverInfo != null)
+ return false;
+ } else if (!this.serverInfo.equals(other.serverInfo))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.capabilities== null) ? 0 : this.capabilities.hashCode());
+ return prime * result + ((this.serverInfo== null) ? 0 : this.serverInfo.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/InitializedParams.java b/java/org/eclipse/lsp4j/InitializedParams.java
new file mode 100644
index 0000000..923cd8e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InitializedParams.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class InitializedParams {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 1;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/InsertReplaceEdit.java b/java/org/eclipse/lsp4j/InsertReplaceEdit.java
new file mode 100644
index 0000000..799e247
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InsertReplaceEdit.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A special text edit to provide an insert and a replace operation.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class InsertReplaceEdit {
+ /**
+ * The string to be inserted.
+ */
+ @NonNull
+ private String newText;
+
+ /**
+ * The range if the insert that is requested
+ */
+ @NonNull
+ private Range insert;
+
+ /**
+ * The range if the replace that is requested.
+ */
+ @NonNull
+ private Range replace;
+
+ public InsertReplaceEdit() {
+ }
+
+ public InsertReplaceEdit(@NonNull final String newText, @NonNull final Range insert, @NonNull final Range replace) {
+ this.newText = Preconditions.<String>checkNotNull(newText, "newText");
+ this.insert = Preconditions.<Range>checkNotNull(insert, "insert");
+ this.replace = Preconditions.<Range>checkNotNull(replace, "replace");
+ }
+
+ /**
+ * The string to be inserted.
+ */
+ @Pure
+ @NonNull
+ public String getNewText() {
+ return this.newText;
+ }
+
+ /**
+ * The string to be inserted.
+ */
+ public void setNewText(@NonNull final String newText) {
+ this.newText = Preconditions.checkNotNull(newText, "newText");
+ }
+
+ /**
+ * The range if the insert that is requested
+ */
+ @Pure
+ @NonNull
+ public Range getInsert() {
+ return this.insert;
+ }
+
+ /**
+ * The range if the insert that is requested
+ */
+ public void setInsert(@NonNull final Range insert) {
+ this.insert = Preconditions.checkNotNull(insert, "insert");
+ }
+
+ /**
+ * The range if the replace that is requested.
+ */
+ @Pure
+ @NonNull
+ public Range getReplace() {
+ return this.replace;
+ }
+
+ /**
+ * The range if the replace that is requested.
+ */
+ public void setReplace(@NonNull final Range replace) {
+ this.replace = Preconditions.checkNotNull(replace, "replace");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("newText", this.newText);
+ b.add("insert", this.insert);
+ b.add("replace", this.replace);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InsertReplaceEdit other = (InsertReplaceEdit) obj;
+ if (this.newText == null) {
+ if (other.newText != null)
+ return false;
+ } else if (!this.newText.equals(other.newText))
+ return false;
+ if (this.insert == null) {
+ if (other.insert != null)
+ return false;
+ } else if (!this.insert.equals(other.insert))
+ return false;
+ if (this.replace == null) {
+ if (other.replace != null)
+ return false;
+ } else if (!this.replace.equals(other.replace))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.newText== null) ? 0 : this.newText.hashCode());
+ result = prime * result + ((this.insert== null) ? 0 : this.insert.hashCode());
+ return prime * result + ((this.replace== null) ? 0 : this.replace.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/InsertTextFormat.java b/java/org/eclipse/lsp4j/InsertTextFormat.java
new file mode 100644
index 0000000..3849338
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InsertTextFormat.java
@@ -0,0 +1,52 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * Defines whether the insert text in a completion item should be interpreted as
+ * plain text or a snippet.
+ */
+public enum InsertTextFormat {
+
+ /**
+ * The primary text to be inserted is treated as a plain string.
+ */
+ PlainText(1),
+
+ /**
+ * The primary text to be inserted is treated as a snippet.
+ *
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Placeholders with equal identifiers are linked,
+ * that is typing in one will update others too.
+ */
+ Snippet(2);
+
+ private final int value;
+
+ InsertTextFormat(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static InsertTextFormat forValue(int value) {
+ InsertTextFormat[] allValues = InsertTextFormat.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/InsertTextMode.java b/java/org/eclipse/lsp4j/InsertTextMode.java
new file mode 100644
index 0000000..0bd5384
--- /dev/null
+++ b/java/org/eclipse/lsp4j/InsertTextMode.java
@@ -0,0 +1,59 @@
+/******************************************************************************
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * How whitespace and indentation is handled during completion
+ * item insertion.
+ *
+ * Since 3.16.0
+ */
+public enum InsertTextMode {
+
+ /**
+ * The insertion or replace strings is taken as it is. If the
+ * value is multi line the lines below the cursor will be
+ * inserted using the indentation defined in the string value.
+ * The client will not apply any kind of adjustments to the
+ * string.
+ */
+ AsIs(1),
+
+ /**
+ * The editor adjusts leading whitespace of new lines so that
+ * they match the indentation up to the cursor of the line for
+ * which the item is accepted.
+ *
+ * Consider a line like this: [2tabs][cursor][3tabs]foo. Accepting a
+ * multi line completion item is indented using 2 tabs and all
+ * following lines inserted will be indented using 2 tabs as well.
+ */
+ AdjustIndentation(2);
+
+ private final int value;
+
+ InsertTextMode(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static InsertTextMode forValue(int value) {
+ InsertTextMode[] allValues = InsertTextMode.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/LinkedEditingRangeCapabilities.java b/java/org/eclipse/lsp4j/LinkedEditingRangeCapabilities.java
new file mode 100644
index 0000000..ca1ce59
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LinkedEditingRangeCapabilities.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the {@code textDocument/linkedEditingRange} request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class LinkedEditingRangeCapabilities extends DynamicRegistrationCapabilities {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/LinkedEditingRangeOptions.java b/java/org/eclipse/lsp4j/LinkedEditingRangeOptions.java
new file mode 100644
index 0000000..a3ecd4c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LinkedEditingRangeOptions.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Linked editing range options.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class LinkedEditingRangeOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/LinkedEditingRangeParams.java b/java/org/eclipse/lsp4j/LinkedEditingRangeParams.java
new file mode 100644
index 0000000..70171f9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LinkedEditingRangeParams.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The linked editing range request is sent from the client to the server to return for a given position
+ * in a document the range of the symbol at the position and all ranges that have the same content.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class LinkedEditingRangeParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/LinkedEditingRangeRegistrationOptions.java b/java/org/eclipse/lsp4j/LinkedEditingRangeRegistrationOptions.java
new file mode 100644
index 0000000..89b33c1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LinkedEditingRangeRegistrationOptions.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Linked editing range registration options.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class LinkedEditingRangeRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public LinkedEditingRangeRegistrationOptions() {
+ }
+
+ public LinkedEditingRangeRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ LinkedEditingRangeRegistrationOptions other = (LinkedEditingRangeRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/LinkedEditingRanges.java b/java/org/eclipse/lsp4j/LinkedEditingRanges.java
new file mode 100644
index 0000000..61d478c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LinkedEditingRanges.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The linked editing range response is sent from the server to the client to return the range of the symbol
+ * at the given position and all ranges that have the same content.
+ * <p>
+ * Optionally a word pattern can be returned to describe valid contents.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class LinkedEditingRanges {
+ /**
+ * A list of ranges that can be renamed together. The ranges must have
+ * identical length and contain identical text content. The ranges cannot overlap.
+ */
+ @NonNull
+ private List<Range> ranges;
+
+ /**
+ * An optional word pattern (regular expression) that describes valid contents for
+ * the given ranges. If no pattern is provided, the client configuration's word
+ * pattern will be used.
+ */
+ private String wordPattern;
+
+ public LinkedEditingRanges() {
+ ArrayList<Range> _arrayList = new ArrayList<Range>();
+ this.ranges = _arrayList;
+ }
+
+ public LinkedEditingRanges(@NonNull final List<Range> ranges) {
+ this.ranges = Preconditions.<List<Range>>checkNotNull(ranges, "ranges");
+ }
+
+ public LinkedEditingRanges(@NonNull final List<Range> ranges, final String wordPattern) {
+ this(ranges);
+ this.wordPattern = wordPattern;
+ }
+
+ /**
+ * A list of ranges that can be renamed together. The ranges must have
+ * identical length and contain identical text content. The ranges cannot overlap.
+ */
+ @Pure
+ @NonNull
+ public List<Range> getRanges() {
+ return this.ranges;
+ }
+
+ /**
+ * A list of ranges that can be renamed together. The ranges must have
+ * identical length and contain identical text content. The ranges cannot overlap.
+ */
+ public void setRanges(@NonNull final List<Range> ranges) {
+ this.ranges = Preconditions.checkNotNull(ranges, "ranges");
+ }
+
+ /**
+ * An optional word pattern (regular expression) that describes valid contents for
+ * the given ranges. If no pattern is provided, the client configuration's word
+ * pattern will be used.
+ */
+ @Pure
+ public String getWordPattern() {
+ return this.wordPattern;
+ }
+
+ /**
+ * An optional word pattern (regular expression) that describes valid contents for
+ * the given ranges. If no pattern is provided, the client configuration's word
+ * pattern will be used.
+ */
+ public void setWordPattern(final String wordPattern) {
+ this.wordPattern = wordPattern;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("ranges", this.ranges);
+ b.add("wordPattern", this.wordPattern);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LinkedEditingRanges other = (LinkedEditingRanges) obj;
+ if (this.ranges == null) {
+ if (other.ranges != null)
+ return false;
+ } else if (!this.ranges.equals(other.ranges))
+ return false;
+ if (this.wordPattern == null) {
+ if (other.wordPattern != null)
+ return false;
+ } else if (!this.wordPattern.equals(other.wordPattern))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.ranges== null) ? 0 : this.ranges.hashCode());
+ return prime * result + ((this.wordPattern== null) ? 0 : this.wordPattern.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Location.java b/java/org/eclipse/lsp4j/Location.java
new file mode 100644
index 0000000..7564be3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Location.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a location inside a resource, such as a line inside a text file.
+ */
+@SuppressWarnings("all")
+public class Location {
+ @NonNull
+ private String uri;
+
+ @NonNull
+ private Range range;
+
+ public Location() {
+ }
+
+ public Location(@NonNull final String uri, @NonNull final Range range) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("range", this.range);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Location other = (Location) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/LocationLink.java b/java/org/eclipse/lsp4j/LocationLink.java
new file mode 100644
index 0000000..05910fb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LocationLink.java
@@ -0,0 +1,197 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a link between a source and a target location.
+ */
+@SuppressWarnings("all")
+public class LocationLink {
+ /**
+ * Span of the origin of this link.
+ * <p>
+ * Used as the underlined span for mouse interaction. Defaults to the word range at
+ * the mouse position.
+ */
+ private Range originSelectionRange;
+
+ /**
+ * The target resource identifier of this link.
+ */
+ @NonNull
+ private String targetUri;
+
+ /**
+ * The full target range of this link. If the target for example is a symbol then target range is the
+ * range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to highlight the range in the editor.
+ */
+ @NonNull
+ private Range targetRange;
+
+ /**
+ * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
+ * Must be contained by the the {@link #targetRange}. See also {@link DocumentSymbol#range}
+ */
+ @NonNull
+ private Range targetSelectionRange;
+
+ public LocationLink() {
+ }
+
+ public LocationLink(@NonNull final String targetUri, @NonNull final Range targetRange, @NonNull final Range targetSelectionRange) {
+ this.targetUri = Preconditions.<String>checkNotNull(targetUri, "targetUri");
+ this.targetRange = Preconditions.<Range>checkNotNull(targetRange, "targetRange");
+ this.targetSelectionRange = Preconditions.<Range>checkNotNull(targetSelectionRange, "targetSelectionRange");
+ }
+
+ public LocationLink(@NonNull final String targetUri, @NonNull final Range targetRange, @NonNull final Range targetSelectionRange, final Range originSelectionRange) {
+ this(targetUri, targetRange, targetSelectionRange);
+ this.originSelectionRange = originSelectionRange;
+ }
+
+ /**
+ * Span of the origin of this link.
+ * <p>
+ * Used as the underlined span for mouse interaction. Defaults to the word range at
+ * the mouse position.
+ */
+ @Pure
+ public Range getOriginSelectionRange() {
+ return this.originSelectionRange;
+ }
+
+ /**
+ * Span of the origin of this link.
+ * <p>
+ * Used as the underlined span for mouse interaction. Defaults to the word range at
+ * the mouse position.
+ */
+ public void setOriginSelectionRange(final Range originSelectionRange) {
+ this.originSelectionRange = originSelectionRange;
+ }
+
+ /**
+ * The target resource identifier of this link.
+ */
+ @Pure
+ @NonNull
+ public String getTargetUri() {
+ return this.targetUri;
+ }
+
+ /**
+ * The target resource identifier of this link.
+ */
+ public void setTargetUri(@NonNull final String targetUri) {
+ this.targetUri = Preconditions.checkNotNull(targetUri, "targetUri");
+ }
+
+ /**
+ * The full target range of this link. If the target for example is a symbol then target range is the
+ * range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to highlight the range in the editor.
+ */
+ @Pure
+ @NonNull
+ public Range getTargetRange() {
+ return this.targetRange;
+ }
+
+ /**
+ * The full target range of this link. If the target for example is a symbol then target range is the
+ * range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to highlight the range in the editor.
+ */
+ public void setTargetRange(@NonNull final Range targetRange) {
+ this.targetRange = Preconditions.checkNotNull(targetRange, "targetRange");
+ }
+
+ /**
+ * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
+ * Must be contained by the the {@link #targetRange}. See also {@link DocumentSymbol#range}
+ */
+ @Pure
+ @NonNull
+ public Range getTargetSelectionRange() {
+ return this.targetSelectionRange;
+ }
+
+ /**
+ * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
+ * Must be contained by the the {@link #targetRange}. See also {@link DocumentSymbol#range}
+ */
+ public void setTargetSelectionRange(@NonNull final Range targetSelectionRange) {
+ this.targetSelectionRange = Preconditions.checkNotNull(targetSelectionRange, "targetSelectionRange");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("originSelectionRange", this.originSelectionRange);
+ b.add("targetUri", this.targetUri);
+ b.add("targetRange", this.targetRange);
+ b.add("targetSelectionRange", this.targetSelectionRange);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LocationLink other = (LocationLink) obj;
+ if (this.originSelectionRange == null) {
+ if (other.originSelectionRange != null)
+ return false;
+ } else if (!this.originSelectionRange.equals(other.originSelectionRange))
+ return false;
+ if (this.targetUri == null) {
+ if (other.targetUri != null)
+ return false;
+ } else if (!this.targetUri.equals(other.targetUri))
+ return false;
+ if (this.targetRange == null) {
+ if (other.targetRange != null)
+ return false;
+ } else if (!this.targetRange.equals(other.targetRange))
+ return false;
+ if (this.targetSelectionRange == null) {
+ if (other.targetSelectionRange != null)
+ return false;
+ } else if (!this.targetSelectionRange.equals(other.targetSelectionRange))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.originSelectionRange== null) ? 0 : this.originSelectionRange.hashCode());
+ result = prime * result + ((this.targetUri== null) ? 0 : this.targetUri.hashCode());
+ result = prime * result + ((this.targetRange== null) ? 0 : this.targetRange.hashCode());
+ return prime * result + ((this.targetSelectionRange== null) ? 0 : this.targetSelectionRange.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/LogTraceParams.java b/java/org/eclipse/lsp4j/LogTraceParams.java
new file mode 100644
index 0000000..2d53791
--- /dev/null
+++ b/java/org/eclipse/lsp4j/LogTraceParams.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A notification to log the trace of the server's execution. The amount and content of these notifications
+ * depends on the current trace configuration. If trace is 'off', the server should not send any logTrace
+ * notification. If trace is 'message', the server should not add the 'verbose' field.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class LogTraceParams {
+ /**
+ * The message to be logged.
+ */
+ @NonNull
+ private String message;
+
+ /**
+ * Additional information that can be computed if the {@code trace} configuration
+ * is set to {@link TraceValue#Verbose}
+ */
+ private String verbose;
+
+ public LogTraceParams() {
+ }
+
+ public LogTraceParams(@NonNull final String message) {
+ this.message = Preconditions.<String>checkNotNull(message, "message");
+ }
+
+ public LogTraceParams(@NonNull final String message, final String verbose) {
+ this.message = Preconditions.<String>checkNotNull(message, "message");
+ this.verbose = verbose;
+ }
+
+ /**
+ * The message to be logged.
+ */
+ @Pure
+ @NonNull
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * The message to be logged.
+ */
+ public void setMessage(@NonNull final String message) {
+ this.message = Preconditions.checkNotNull(message, "message");
+ }
+
+ /**
+ * Additional information that can be computed if the {@code trace} configuration
+ * is set to {@link TraceValue#Verbose}
+ */
+ @Pure
+ public String getVerbose() {
+ return this.verbose;
+ }
+
+ /**
+ * Additional information that can be computed if the {@code trace} configuration
+ * is set to {@link TraceValue#Verbose}
+ */
+ public void setVerbose(final String verbose) {
+ this.verbose = verbose;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("message", this.message);
+ b.add("verbose", this.verbose);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LogTraceParams other = (LogTraceParams) obj;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.verbose == null) {
+ if (other.verbose != null)
+ return false;
+ } else if (!this.verbose.equals(other.verbose))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ return prime * result + ((this.verbose== null) ? 0 : this.verbose.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MarkdownCapabilities.java b/java/org/eclipse/lsp4j/MarkdownCapabilities.java
new file mode 100644
index 0000000..d5ea5c0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MarkdownCapabilities.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Client capabilities specific to the used markdown parser.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class MarkdownCapabilities {
+ /**
+ * The name of the parser.
+ */
+ @NonNull
+ private String parser;
+
+ /**
+ * The version of the parser.
+ */
+ private String version;
+
+ public MarkdownCapabilities() {
+ }
+
+ public MarkdownCapabilities(@NonNull final String parser) {
+ this.parser = Preconditions.<String>checkNotNull(parser, "parser");
+ }
+
+ public MarkdownCapabilities(@NonNull final String parser, final String version) {
+ this(parser);
+ this.version = version;
+ }
+
+ /**
+ * The name of the parser.
+ */
+ @Pure
+ @NonNull
+ public String getParser() {
+ return this.parser;
+ }
+
+ /**
+ * The name of the parser.
+ */
+ public void setParser(@NonNull final String parser) {
+ this.parser = Preconditions.checkNotNull(parser, "parser");
+ }
+
+ /**
+ * The version of the parser.
+ */
+ @Pure
+ public String getVersion() {
+ return this.version;
+ }
+
+ /**
+ * The version of the parser.
+ */
+ public void setVersion(final String version) {
+ this.version = version;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("parser", this.parser);
+ b.add("version", this.version);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MarkdownCapabilities other = (MarkdownCapabilities) obj;
+ if (this.parser == null) {
+ if (other.parser != null)
+ return false;
+ } else if (!this.parser.equals(other.parser))
+ return false;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.parser== null) ? 0 : this.parser.hashCode());
+ return prime * result + ((this.version== null) ? 0 : this.version.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MarkedString.java b/java/org/eclipse/lsp4j/MarkedString.java
new file mode 100644
index 0000000..9945434
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MarkedString.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * MarkedString can be used to render human readable text. It is either a markdown string
+ * or a code-block that provides a language and a code snippet. The language identifier
+ * is semantically equal to the optional language identifier in fenced code blocks in GitHub
+ * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ * <p>
+ * The pair of a language and a value is an equivalent to markdown:
+ * <pre>
+ * ```${language}
+ * ${value}
+ * ```
+ * </pre>
+ * <p>
+ * Note that markdown strings will be sanitized - that means html will be escaped.
+ *
+ * @deprecated Use {@link MarkupContent} instead.
+ */
+@Deprecated
+@SuppressWarnings("all")
+public class MarkedString {
+ @NonNull
+ private String language;
+
+ @NonNull
+ private String value;
+
+ public MarkedString() {
+ }
+
+ public MarkedString(@NonNull final String language, @NonNull final String value) {
+ this.language = Preconditions.<String>checkNotNull(language, "language");
+ this.value = Preconditions.<String>checkNotNull(value, "value");
+ }
+
+ @Pure
+ @NonNull
+ public String getLanguage() {
+ return this.language;
+ }
+
+ public void setLanguage(@NonNull final String language) {
+ this.language = Preconditions.checkNotNull(language, "language");
+ }
+
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("language", this.language);
+ b.add("value", this.value);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MarkedString other = (MarkedString) obj;
+ if (this.language == null) {
+ if (other.language != null)
+ return false;
+ } else if (!this.language.equals(other.language))
+ return false;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.language== null) ? 0 : this.language.hashCode());
+ return prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MarkupContent.java b/java/org/eclipse/lsp4j/MarkupContent.java
new file mode 100644
index 0000000..521fd67
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MarkupContent.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A MarkupContent literal represents a string value which content is interpreted based on its
+ * kind flag. Currently the protocol supports {@link MarkupKind#PLAINTEXT plaintext} and
+ * {@link MarkupKind#MARKDOWN markdown} as markup kinds.
+ * <p>
+ * If the kind is {@link MarkupKind#MARKDOWN markdown} then the value can contain fenced code blocks like in GitHub issues.
+ * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ * <p>
+ * Please Note that clients might sanitize the return markdown. A client could decide to
+ * remove HTML from the markdown to avoid script execution.
+ */
+@SuppressWarnings("all")
+public class MarkupContent {
+ /**
+ * The type of the Markup.
+ */
+ @NonNull
+ private String kind;
+
+ /**
+ * The content itself.
+ */
+ @NonNull
+ private String value;
+
+ public MarkupContent() {
+ }
+
+ public MarkupContent(@NonNull final String kind, @NonNull final String value) {
+ this.kind = Preconditions.<String>checkNotNull(kind, "kind");
+ this.value = Preconditions.<String>checkNotNull(value, "value");
+ }
+
+ /**
+ * The type of the Markup.
+ */
+ @Pure
+ @NonNull
+ public String getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The type of the Markup.
+ */
+ public void setKind(@NonNull final String kind) {
+ this.kind = Preconditions.checkNotNull(kind, "kind");
+ }
+
+ /**
+ * The content itself.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The content itself.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("kind", this.kind);
+ b.add("value", this.value);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MarkupContent other = (MarkupContent) obj;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ return prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MarkupKind.java b/java/org/eclipse/lsp4j/MarkupKind.java
new file mode 100644
index 0000000..3f2d353
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MarkupKind.java
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * Describes the content type that a client supports in various
+ * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
+ *
+ * Please note that `MarkupKind`s must not start with a `$`. These kinds
+ * are reserved for internal usage.
+ */
+public final class MarkupKind {
+ private MarkupKind() {}
+
+ /**
+ * Plain text is supported as a content format.
+ */
+ public static final String PLAINTEXT = "plaintext";
+
+ /**
+ * Markdown is supported as a content format.
+ */
+ public static final String MARKDOWN = "markdown";
+}
diff --git a/java/org/eclipse/lsp4j/MessageActionItem.java b/java/org/eclipse/lsp4j/MessageActionItem.java
new file mode 100644
index 0000000..c9cc7ff
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MessageActionItem.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The show message request is sent from a server to a client to ask the client to display a particular message in the
+ * user class. In addition to the show message notification the request allows to pass actions and to wait for an
+ * answer from the client.
+ */
+@SuppressWarnings("all")
+public class MessageActionItem {
+ /**
+ * A short title like 'Retry', 'Open Log' etc.
+ */
+ @NonNull
+ private String title;
+
+ public MessageActionItem() {
+ }
+
+ public MessageActionItem(@NonNull final String title) {
+ this.title = Preconditions.<String>checkNotNull(title, "title");
+ }
+
+ /**
+ * A short title like 'Retry', 'Open Log' etc.
+ */
+ @Pure
+ @NonNull
+ public String getTitle() {
+ return this.title;
+ }
+
+ /**
+ * A short title like 'Retry', 'Open Log' etc.
+ */
+ public void setTitle(@NonNull final String title) {
+ this.title = Preconditions.checkNotNull(title, "title");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("title", this.title);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MessageActionItem other = (MessageActionItem) obj;
+ if (this.title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!this.title.equals(other.title))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.title== null) ? 0 : this.title.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MessageParams.java b/java/org/eclipse/lsp4j/MessageParams.java
new file mode 100644
index 0000000..f648b4a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MessageParams.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.MessageType;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The show message notification is sent from a server to a client to ask the client to display a particular message
+ * in the user class.
+ * <p>
+ * The log message notification is send from the server to the client to ask the client to log a particular message.
+ */
+@SuppressWarnings("all")
+public class MessageParams {
+ /**
+ * The message type.
+ */
+ @NonNull
+ private MessageType type;
+
+ /**
+ * The actual message.
+ */
+ @NonNull
+ private String message;
+
+ public MessageParams() {
+ }
+
+ public MessageParams(@NonNull final MessageType type, @NonNull final String message) {
+ this.type = Preconditions.<MessageType>checkNotNull(type, "type");
+ this.message = Preconditions.<String>checkNotNull(message, "message");
+ }
+
+ /**
+ * The message type.
+ */
+ @Pure
+ @NonNull
+ public MessageType getType() {
+ return this.type;
+ }
+
+ /**
+ * The message type.
+ */
+ public void setType(@NonNull final MessageType type) {
+ this.type = Preconditions.checkNotNull(type, "type");
+ }
+
+ /**
+ * The actual message.
+ */
+ @Pure
+ @NonNull
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * The actual message.
+ */
+ public void setMessage(@NonNull final String message) {
+ this.message = Preconditions.checkNotNull(message, "message");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("type", this.type);
+ b.add("message", this.message);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MessageParams other = (MessageParams) obj;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ return prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MessageType.java b/java/org/eclipse/lsp4j/MessageType.java
new file mode 100644
index 0000000..1db3ac1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MessageType.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+public enum MessageType {
+
+ /**
+ * An error message.
+ */
+ Error(1),
+
+ /**
+ * A warning message.
+ */
+ Warning(2),
+
+ /**
+ * An information message.
+ */
+ Info(3),
+
+ /**
+ * A log message.
+ */
+ Log(4);
+
+ private final int value;
+
+ MessageType(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static MessageType forValue(int value) {
+ MessageType[] allValues = MessageType.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/Moniker.java b/java/org/eclipse/lsp4j/Moniker.java
new file mode 100644
index 0000000..3ff0e9a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Moniker.java
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Moniker definition to match LSIF 0.5 moniker definition.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class Moniker {
+ /**
+ * The scheme of the moniker. For example tsc or .Net
+ */
+ @NonNull
+ private String scheme;
+
+ /**
+ * The identifier of the moniker. The value is opaque in LSIF however
+ * schema owners are allowed to define the structure if they want.
+ */
+ @NonNull
+ private String identifier;
+
+ /**
+ * The scope in which the moniker is unique. Values are taken from {@link UniquenessLevel}.
+ */
+ @NonNull
+ private String unique;
+
+ /**
+ * The moniker kind if known. Values are taken from {@link MonikerKind}.
+ */
+ private String kind;
+
+ public Moniker() {
+ }
+
+ public Moniker(@NonNull final String scheme, @NonNull final String identifier, @NonNull final String unique) {
+ this.scheme = Preconditions.<String>checkNotNull(scheme, "scheme");
+ this.identifier = Preconditions.<String>checkNotNull(identifier, "identifier");
+ this.unique = Preconditions.<String>checkNotNull(unique, "unique");
+ }
+
+ public Moniker(@NonNull final String scheme, @NonNull final String identifier, @NonNull final String unique, final String kind) {
+ this(scheme, identifier, unique);
+ this.kind = kind;
+ }
+
+ /**
+ * The scheme of the moniker. For example tsc or .Net
+ */
+ @Pure
+ @NonNull
+ public String getScheme() {
+ return this.scheme;
+ }
+
+ /**
+ * The scheme of the moniker. For example tsc or .Net
+ */
+ public void setScheme(@NonNull final String scheme) {
+ this.scheme = Preconditions.checkNotNull(scheme, "scheme");
+ }
+
+ /**
+ * The identifier of the moniker. The value is opaque in LSIF however
+ * schema owners are allowed to define the structure if they want.
+ */
+ @Pure
+ @NonNull
+ public String getIdentifier() {
+ return this.identifier;
+ }
+
+ /**
+ * The identifier of the moniker. The value is opaque in LSIF however
+ * schema owners are allowed to define the structure if they want.
+ */
+ public void setIdentifier(@NonNull final String identifier) {
+ this.identifier = Preconditions.checkNotNull(identifier, "identifier");
+ }
+
+ /**
+ * The scope in which the moniker is unique. Values are taken from {@link UniquenessLevel}.
+ */
+ @Pure
+ @NonNull
+ public String getUnique() {
+ return this.unique;
+ }
+
+ /**
+ * The scope in which the moniker is unique. Values are taken from {@link UniquenessLevel}.
+ */
+ public void setUnique(@NonNull final String unique) {
+ this.unique = Preconditions.checkNotNull(unique, "unique");
+ }
+
+ /**
+ * The moniker kind if known. Values are taken from {@link MonikerKind}.
+ */
+ @Pure
+ public String getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The moniker kind if known. Values are taken from {@link MonikerKind}.
+ */
+ public void setKind(final String kind) {
+ this.kind = kind;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("scheme", this.scheme);
+ b.add("identifier", this.identifier);
+ b.add("unique", this.unique);
+ b.add("kind", this.kind);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Moniker other = (Moniker) obj;
+ if (this.scheme == null) {
+ if (other.scheme != null)
+ return false;
+ } else if (!this.scheme.equals(other.scheme))
+ return false;
+ if (this.identifier == null) {
+ if (other.identifier != null)
+ return false;
+ } else if (!this.identifier.equals(other.identifier))
+ return false;
+ if (this.unique == null) {
+ if (other.unique != null)
+ return false;
+ } else if (!this.unique.equals(other.unique))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.scheme== null) ? 0 : this.scheme.hashCode());
+ result = prime * result + ((this.identifier== null) ? 0 : this.identifier.hashCode());
+ result = prime * result + ((this.unique== null) ? 0 : this.unique.hashCode());
+ return prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MonikerCapabilities.java b/java/org/eclipse/lsp4j/MonikerCapabilities.java
new file mode 100644
index 0000000..2e40ec1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MonikerCapabilities.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the {@code textDocument/moniker} request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class MonikerCapabilities extends DynamicRegistrationCapabilities {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MonikerKind.java b/java/org/eclipse/lsp4j/MonikerKind.java
new file mode 100644
index 0000000..d83db5e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MonikerKind.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+
+package org.eclipse.lsp4j;
+
+/**
+ * The moniker kind.
+ *
+ * Since 3.16.0
+ */
+public final class MonikerKind {
+ private MonikerKind() {
+ }
+
+ /**
+ * The moniker represents a symbol that is imported into a project
+ */
+ public static final String Import = "import";
+
+ /**
+ * The moniker represents a symbol that is exported from a project
+ */
+ public static final String Export = "export";
+
+ /**
+ * The moniker represents a symbol that is local to a project (e.g. a local
+ * variable of a function, a class not visible outside the project, ...)
+ */
+ public static final String Local = "local";
+}
diff --git a/java/org/eclipse/lsp4j/MonikerOptions.java b/java/org/eclipse/lsp4j/MonikerOptions.java
new file mode 100644
index 0000000..02c3ea7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MonikerOptions.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Moniker options.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class MonikerOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MonikerParams.java b/java/org/eclipse/lsp4j/MonikerParams.java
new file mode 100644
index 0000000..3e0194d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MonikerParams.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The moniker request is sent from the client to the server to get the symbol monikers for a given text document position.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class MonikerParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/MonikerRegistrationOptions.java b/java/org/eclipse/lsp4j/MonikerRegistrationOptions.java
new file mode 100644
index 0000000..945d426
--- /dev/null
+++ b/java/org/eclipse/lsp4j/MonikerRegistrationOptions.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Moniker registration options.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class MonikerRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/OnTypeFormattingCapabilities.java b/java/org/eclipse/lsp4j/OnTypeFormattingCapabilities.java
new file mode 100644
index 0000000..0f9bb77
--- /dev/null
+++ b/java/org/eclipse/lsp4j/OnTypeFormattingCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/onTypeFormatting`
+ */
+@SuppressWarnings("all")
+public class OnTypeFormattingCapabilities extends DynamicRegistrationCapabilities {
+ public OnTypeFormattingCapabilities() {
+ }
+
+ public OnTypeFormattingCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ParameterInformation.java b/java/org/eclipse/lsp4j/ParameterInformation.java
new file mode 100644
index 0000000..bfbae29
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ParameterInformation.java
@@ -0,0 +1,181 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.MarkupContent;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a parameter of a callable-signature. A parameter can have a label and a doc-comment.
+ */
+@SuppressWarnings("all")
+public class ParameterInformation {
+ /**
+ * The label of this parameter information.
+ * <p>
+ * Either a string or an inclusive start and exclusive end offsets within its containing
+ * signature label (see {@link SignatureInformation#label}). The offsets are based on a UTF-16
+ * string representation as {@link Position} and {@link Range} does.
+ * <p>
+ * <em>Note</em>: a label of type string should be a substring of its containing signature label.
+ * Its intended use case is to highlight the parameter label part in the {@link SignatureInformation#label}.
+ */
+ @NonNull
+ private Either<String, Tuple.Two<Integer, Integer>> label;
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ private Either<String, MarkupContent> documentation;
+
+ public ParameterInformation() {
+ }
+
+ public ParameterInformation(@NonNull final String label) {
+ this.setLabel(Preconditions.<String>checkNotNull(label, "label"));
+ }
+
+ public ParameterInformation(@NonNull final String label, final String documentation) {
+ this(label);
+ this.setDocumentation(documentation);
+ }
+
+ public ParameterInformation(@NonNull final String label, final MarkupContent documentation) {
+ this(label);
+ this.setDocumentation(documentation);
+ }
+
+ /**
+ * The label of this parameter information.
+ * <p>
+ * Either a string or an inclusive start and exclusive end offsets within its containing
+ * signature label (see {@link SignatureInformation#label}). The offsets are based on a UTF-16
+ * string representation as {@link Position} and {@link Range} does.
+ * <p>
+ * <em>Note</em>: a label of type string should be a substring of its containing signature label.
+ * Its intended use case is to highlight the parameter label part in the {@link SignatureInformation#label}.
+ */
+ @Pure
+ @NonNull
+ public Either<String, Tuple.Two<Integer, Integer>> getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The label of this parameter information.
+ * <p>
+ * Either a string or an inclusive start and exclusive end offsets within its containing
+ * signature label (see {@link SignatureInformation#label}). The offsets are based on a UTF-16
+ * string representation as {@link Position} and {@link Range} does.
+ * <p>
+ * <em>Note</em>: a label of type string should be a substring of its containing signature label.
+ * Its intended use case is to highlight the parameter label part in the {@link SignatureInformation#label}.
+ */
+ public void setLabel(@NonNull final Either<String, Tuple.Two<Integer, Integer>> label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ public void setLabel(final String label) {
+ if (label == null) {
+ Preconditions.checkNotNull(label, "label");
+ this.label = null;
+ return;
+ }
+ this.label = Either.forLeft(label);
+ }
+
+ public void setLabel(final Tuple.Two<Integer, Integer> label) {
+ if (label == null) {
+ Preconditions.checkNotNull(label, "label");
+ this.label = null;
+ return;
+ }
+ this.label = Either.forRight(label);
+ }
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ @Pure
+ public Either<String, MarkupContent> getDocumentation() {
+ return this.documentation;
+ }
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ public void setDocumentation(final Either<String, MarkupContent> documentation) {
+ this.documentation = documentation;
+ }
+
+ public void setDocumentation(final String documentation) {
+ if (documentation == null) {
+ this.documentation = null;
+ return;
+ }
+ this.documentation = Either.forLeft(documentation);
+ }
+
+ public void setDocumentation(final MarkupContent documentation) {
+ if (documentation == null) {
+ this.documentation = null;
+ return;
+ }
+ this.documentation = Either.forRight(documentation);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("documentation", this.documentation);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ParameterInformation other = (ParameterInformation) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.documentation == null) {
+ if (other.documentation != null)
+ return false;
+ } else if (!this.documentation.equals(other.documentation))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ return prime * result + ((this.documentation== null) ? 0 : this.documentation.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ParameterInformationCapabilities.java b/java/org/eclipse/lsp4j/ParameterInformationCapabilities.java
new file mode 100644
index 0000000..402c4bc
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ParameterInformationCapabilities.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Client capabilities specific to parameter information.
+ */
+@SuppressWarnings("all")
+public class ParameterInformationCapabilities {
+ /**
+ * The client supports processing label offsets instead of a
+ * simple label string.
+ * <p>
+ * Since 3.14.0
+ */
+ private Boolean labelOffsetSupport;
+
+ public ParameterInformationCapabilities() {
+ }
+
+ public ParameterInformationCapabilities(final Boolean labelOffsetSupport) {
+ this.labelOffsetSupport = labelOffsetSupport;
+ }
+
+ /**
+ * The client supports processing label offsets instead of a
+ * simple label string.
+ * <p>
+ * Since 3.14.0
+ */
+ @Pure
+ public Boolean getLabelOffsetSupport() {
+ return this.labelOffsetSupport;
+ }
+
+ /**
+ * The client supports processing label offsets instead of a
+ * simple label string.
+ * <p>
+ * Since 3.14.0
+ */
+ public void setLabelOffsetSupport(final Boolean labelOffsetSupport) {
+ this.labelOffsetSupport = labelOffsetSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("labelOffsetSupport", this.labelOffsetSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ParameterInformationCapabilities other = (ParameterInformationCapabilities) obj;
+ if (this.labelOffsetSupport == null) {
+ if (other.labelOffsetSupport != null)
+ return false;
+ } else if (!this.labelOffsetSupport.equals(other.labelOffsetSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.labelOffsetSupport== null) ? 0 : this.labelOffsetSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/PartialResultParams.java b/java/org/eclipse/lsp4j/PartialResultParams.java
new file mode 100644
index 0000000..53b79c9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/PartialResultParams.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+/**
+ * A parameter literal used to pass a partial result token.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public interface PartialResultParams {
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ Either<String, Integer> getPartialResultToken();
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ void setPartialResultToken(final Either<String, Integer> token);
+}
diff --git a/java/org/eclipse/lsp4j/Position.java b/java/org/eclipse/lsp4j/Position.java
new file mode 100644
index 0000000..c9f6a34
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Position.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Position in a text document expressed as zero-based line and character offset.
+ */
+@SuppressWarnings("all")
+public class Position {
+ /**
+ * Line position in a document (zero-based).
+ */
+ private int line;
+
+ /**
+ * Character offset on a line in a document (zero-based).
+ */
+ private int character;
+
+ public Position() {
+ }
+
+ public Position(final int line, final int character) {
+ this.line = line;
+ this.character = character;
+ }
+
+ /**
+ * Line position in a document (zero-based).
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * Line position in a document (zero-based).
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * Character offset on a line in a document (zero-based).
+ */
+ @Pure
+ public int getCharacter() {
+ return this.character;
+ }
+
+ /**
+ * Character offset on a line in a document (zero-based).
+ */
+ public void setCharacter(final int character) {
+ this.character = character;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("line", this.line);
+ b.add("character", this.character);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Position other = (Position) obj;
+ if (other.line != this.line)
+ return false;
+ if (other.character != this.character)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.line;
+ return prime * result + this.character;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/PrepareRenameParams.java b/java/org/eclipse/lsp4j/PrepareRenameParams.java
new file mode 100644
index 0000000..3c72caa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/PrepareRenameParams.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The prepare rename request is sent from the client to the server to setup and test the validity of a
+ * rename operation at a given location.
+ */
+@SuppressWarnings("all")
+public class PrepareRenameParams extends TextDocumentPositionParams {
+ public PrepareRenameParams() {
+ }
+
+ public PrepareRenameParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/PrepareRenameResult.java b/java/org/eclipse/lsp4j/PrepareRenameResult.java
new file mode 100644
index 0000000..1786e83
--- /dev/null
+++ b/java/org/eclipse/lsp4j/PrepareRenameResult.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * One of the result types of the `textDocument/prepareRename` request.
+ * Provides the range of the string to rename and a placeholder text of the string content to be renamed.
+ */
+@SuppressWarnings("all")
+public class PrepareRenameResult {
+ /**
+ * The range of the string to rename
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * A placeholder text of the string content to be renamed.
+ */
+ @NonNull
+ private String placeholder;
+
+ public PrepareRenameResult() {
+ }
+
+ public PrepareRenameResult(@NonNull final Range range, @NonNull final String placeholder) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.placeholder = Preconditions.<String>checkNotNull(placeholder, "placeholder");
+ }
+
+ /**
+ * The range of the string to rename
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range of the string to rename
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * A placeholder text of the string content to be renamed.
+ */
+ @Pure
+ @NonNull
+ public String getPlaceholder() {
+ return this.placeholder;
+ }
+
+ /**
+ * A placeholder text of the string content to be renamed.
+ */
+ public void setPlaceholder(@NonNull final String placeholder) {
+ this.placeholder = Preconditions.checkNotNull(placeholder, "placeholder");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("placeholder", this.placeholder);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ PrepareRenameResult other = (PrepareRenameResult) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.placeholder == null) {
+ if (other.placeholder != null)
+ return false;
+ } else if (!this.placeholder.equals(other.placeholder))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.placeholder== null) ? 0 : this.placeholder.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/PrepareSupportDefaultBehavior.java b/java/org/eclipse/lsp4j/PrepareSupportDefaultBehavior.java
new file mode 100644
index 0000000..014f3d7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/PrepareSupportDefaultBehavior.java
@@ -0,0 +1,45 @@
+/******************************************************************************
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * The value indicates the default behavior used by the
+ * client.
+ *
+ * Since version 3.16.0
+ */
+public enum PrepareSupportDefaultBehavior {
+
+ /**
+ * The client's default behavior is to select the identifier
+ * according the to language's syntax rule.
+ */
+ Identifier(1);
+
+ private final int value;
+
+ PrepareSupportDefaultBehavior(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static PrepareSupportDefaultBehavior forValue(int value) {
+ PrepareSupportDefaultBehavior[] allValues = PrepareSupportDefaultBehavior.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/ProgressParams.java b/java/org/eclipse/lsp4j/ProgressParams.java
new file mode 100644
index 0000000..8934492
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ProgressParams.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.adapters.ProgressNotificationAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The base protocol offers also support to report progress in a generic fashion.
+ * This mechanism can be used to report any kind of progress including work done progress
+ * (usually used to report progress in the user interface using a progress bar)
+ * and partial result progress to support streaming of results.
+ * A progress notification has the following properties:
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class ProgressParams {
+ /**
+ * The progress token provided by the client or server.
+ */
+ @NonNull
+ private Either<String, Integer> token;
+
+ /**
+ * The progress data.
+ */
+ @NonNull
+ @JsonAdapter(ProgressNotificationAdapter.class)
+ private Either<WorkDoneProgressNotification, Object> value;
+
+ public ProgressParams() {
+ }
+
+ public ProgressParams(@NonNull final Either<String, Integer> token, @NonNull final Either<WorkDoneProgressNotification, Object> value) {
+ this.token = Preconditions.<Either<String, Integer>>checkNotNull(token, "token");
+ this.value = Preconditions.<Either<WorkDoneProgressNotification, Object>>checkNotNull(value, "value");
+ }
+
+ /**
+ * The progress token provided by the client or server.
+ */
+ @Pure
+ @NonNull
+ public Either<String, Integer> getToken() {
+ return this.token;
+ }
+
+ /**
+ * The progress token provided by the client or server.
+ */
+ public void setToken(@NonNull final Either<String, Integer> token) {
+ this.token = Preconditions.checkNotNull(token, "token");
+ }
+
+ public void setToken(final String token) {
+ if (token == null) {
+ Preconditions.checkNotNull(token, "token");
+ this.token = null;
+ return;
+ }
+ this.token = Either.forLeft(token);
+ }
+
+ public void setToken(final Integer token) {
+ if (token == null) {
+ Preconditions.checkNotNull(token, "token");
+ this.token = null;
+ return;
+ }
+ this.token = Either.forRight(token);
+ }
+
+ /**
+ * The progress data.
+ */
+ @Pure
+ @NonNull
+ public Either<WorkDoneProgressNotification, Object> getValue() {
+ return this.value;
+ }
+
+ /**
+ * The progress data.
+ */
+ public void setValue(@NonNull final Either<WorkDoneProgressNotification, Object> value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("token", this.token);
+ b.add("value", this.value);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ProgressParams other = (ProgressParams) obj;
+ if (this.token == null) {
+ if (other.token != null)
+ return false;
+ } else if (!this.token.equals(other.token))
+ return false;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.token== null) ? 0 : this.token.hashCode());
+ return prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Protocol.xtend b/java/org/eclipse/lsp4j/Protocol.xtend
new file mode 100644
index 0000000..5da70ae
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Protocol.xtend
@@ -0,0 +1,8148 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j
+
+import com.google.common.annotations.Beta
+import com.google.gson.annotations.JsonAdapter
+import java.util.ArrayList
+import java.util.Arrays
+import java.util.LinkedHashMap
+import java.util.List
+import java.util.Map
+import org.eclipse.lsp4j.adapters.CompletionItemTextEditTypeAdapter
+import org.eclipse.lsp4j.adapters.DocumentChangeListAdapter
+import org.eclipse.lsp4j.adapters.HoverTypeAdapter
+import org.eclipse.lsp4j.adapters.InitializeParamsTypeAdapter
+import org.eclipse.lsp4j.adapters.ProgressNotificationAdapter
+import org.eclipse.lsp4j.adapters.ResourceChangeListAdapter
+import org.eclipse.lsp4j.adapters.ResourceOperationTypeAdapter
+import org.eclipse.lsp4j.adapters.SymbolInformationTypeAdapter
+import org.eclipse.lsp4j.adapters.VersionedTextDocumentIdentifierTypeAdapter
+import org.eclipse.lsp4j.generator.JsonRpcData
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter
+import org.eclipse.lsp4j.jsonrpc.messages.Either
+import org.eclipse.lsp4j.jsonrpc.messages.Either3
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull
+import org.eclipse.lsp4j.util.Preconditions
+
+@JsonRpcData
+class DynamicRegistrationCapabilities {
+ /**
+ * Supports dynamic registration.
+ */
+ Boolean dynamicRegistration
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ this.dynamicRegistration = dynamicRegistration
+ }
+}
+
+/**
+ * Capabilities specific to {@link WorkspaceEdit}s
+ */
+@JsonRpcData
+class WorkspaceEditCapabilities {
+ /**
+ * The client supports versioned document changes in {@link WorkspaceEdit}s
+ */
+ Boolean documentChanges
+
+ /**
+ * The client supports resource changes
+ * in {@link WorkspaceEdit}s.
+ *
+ * @deprecated Since LSP introduced resource operations, use {@link #resourceOperations}
+ */
+ @Deprecated
+ @Beta
+ Boolean resourceChanges
+
+ /**
+ * The resource operations the client supports. Clients should at least
+ * support 'create', 'rename' and 'delete' files and folders.
+ * <p>
+ * See {@link ResourceOperationKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ List<String> resourceOperations
+
+ /**
+ * The failure handling strategy of a client if applying the workspace edit
+ * fails.
+ * <p>
+ * See {@link FailureHandlingKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ String failureHandling
+
+ /**
+ * Whether the client normalizes line endings to the client specific
+ * setting.
+ * <p>
+ * If set to {@code true} the client will normalize line ending characters
+ * in a workspace edit to the client specific new line character(s).
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean normalizesLineEndings
+
+ /**
+ * Whether the client in general supports change annotations on text edits,
+ * create file, rename file and delete file changes.
+ * <p>
+ * Since 3.16.0
+ */
+ WorkspaceEditChangeAnnotationSupportCapabilities changeAnnotationSupport
+
+ new() {
+ }
+
+ @Deprecated
+ new(Boolean documentChanges) {
+ this.documentChanges = documentChanges
+ }
+}
+
+/**
+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+ */
+@JsonRpcData
+class DidChangeConfigurationCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+ */
+@JsonRpcData
+class DidChangeWatchedFilesCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `workspace/symbol` request.
+ * Referred to in the spec as WorkspaceSymbolClientCapabilities.
+ */
+@JsonRpcData
+class SymbolCapabilities extends DynamicRegistrationCapabilities {
+
+ /**
+ * Specific capabilities for the {@link SymbolKind} in the `workspace/symbol` request.
+ */
+ SymbolKindCapabilities symbolKind
+
+ /**
+ * The client supports tags on {@link SymbolInformation}.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ SymbolTagSupportCapabilities tagSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(SymbolKindCapabilities symbolKind) {
+ this.symbolKind = symbolKind
+ }
+
+ new(SymbolKindCapabilities symbolKind, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.symbolKind = symbolKind
+ }
+}
+
+/**
+ * Capabilities specific to the `workspace/executeCommand` request.
+ */
+@JsonRpcData
+class ExecuteCommandCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Workspace specific client capabilities.
+ */
+@JsonRpcData
+class WorkspaceClientCapabilities {
+ /**
+ * The client supports applying batch edits to the workspace by supporting
+ * the request 'workspace/applyEdit'.
+ */
+ Boolean applyEdit
+
+ /**
+ * Capabilities specific to {@link WorkspaceEdit}s
+ */
+ WorkspaceEditCapabilities workspaceEdit
+
+ /**
+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+ */
+ DidChangeConfigurationCapabilities didChangeConfiguration
+
+ /**
+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+ */
+ DidChangeWatchedFilesCapabilities didChangeWatchedFiles
+
+ /**
+ * Capabilities specific to the `workspace/symbol` request.
+ */
+ SymbolCapabilities symbol
+
+ /**
+ * Capabilities specific to the `workspace/executeCommand` request.
+ */
+ ExecuteCommandCapabilities executeCommand
+
+ /**
+ * The client has support for workspace folders.
+ * <p>
+ * Since 3.6.0
+ */
+ Boolean workspaceFolders
+
+ /**
+ * The client supports `workspace/configuration` requests.
+ * <p>
+ * Since 3.6.0
+ */
+ Boolean configuration
+
+ /**
+ * Capabilities specific to the semantic token requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ SemanticTokensWorkspaceCapabilities semanticTokens
+
+ /**
+ * Capabilities specific to the code lens requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ CodeLensWorkspaceCapabilities codeLens
+
+ /**
+ * The client has support for file requests/notifications.
+ * <p>
+ * Since 3.16.0
+ */
+ FileOperationsWorkspaceCapabilities fileOperations
+}
+
+@JsonRpcData
+class SynchronizationCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports sending will save notifications.
+ */
+ Boolean willSave
+
+ /**
+ * The client supports sending a will save request and
+ * waits for a response providing text edits which will
+ * be applied to the document before it is saved.
+ */
+ Boolean willSaveWaitUntil
+
+ /**
+ * The client supports did save notifications.
+ */
+ Boolean didSave
+
+ new() {
+ }
+
+ new(Boolean willSave, Boolean willSaveWaitUntil, Boolean didSave) {
+ this.willSave = willSave
+ this.willSaveWaitUntil = willSaveWaitUntil
+ this.didSave = didSave
+ }
+
+ new(Boolean willSave, Boolean willSaveWaitUntil, Boolean didSave, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.willSave = willSave
+ this.willSaveWaitUntil = willSaveWaitUntil
+ this.didSave = didSave
+ }
+}
+
+/**
+ * The client supports the following {@link CompletionItem} specific capabilities.
+ */
+@JsonRpcData
+class CompletionItemCapabilities {
+ /**
+ * Client supports snippets as insert text.
+ * <p>
+ * A snippet can define tab stops and placeholders with `$1`, `$2`
+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+ * the end of the snippet. Placeholders with equal identifiers are linked,
+ * that is typing in one will update others too.
+ */
+ Boolean snippetSupport
+
+ /**
+ * Client supports commit characters on a completion item.
+ */
+ Boolean commitCharactersSupport
+
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ */
+ List<String> documentationFormat
+
+ /**
+ * Client supports the deprecated property on a completion item.
+ */
+ Boolean deprecatedSupport
+
+ /**
+ * Client supports the preselect property on a completion item.
+ */
+ Boolean preselectSupport
+
+ /**
+ * Client supports the tag property on a completion item. Clients supporting
+ * tags have to handle unknown tags gracefully. Clients especially need to
+ * preserve unknown tags when sending a completion item back to the server in
+ * a resolve call.
+ * <p>
+ * Since 3.15.0
+ */
+ CompletionItemTagSupportCapabilities tagSupport
+
+ /**
+ * Client support insert replace edit to control different behavior if a
+ * completion item is inserted in the text or should replace text.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean insertReplaceSupport
+
+ /**
+ * Indicates which properties a client can resolve lazily on a completion
+ * item. Before version 3.16.0 only the predefined properties {@link CompletionItem#documentation}
+ * and {@link CompletionItem#detail} could be resolved lazily.
+ * <p>
+ * Since 3.16.0
+ */
+ CompletionItemResolveSupportCapabilities resolveSupport
+
+ /**
+ * The client supports the {@link CompletionItem#insertTextMode} property on
+ * a completion item to override the whitespace handling mode
+ * as defined by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ CompletionItemInsertTextModeSupportCapabilities insertTextModeSupport
+
+ new() {
+ }
+
+ new(Boolean snippetSupport) {
+ this.snippetSupport = snippetSupport
+ }
+}
+
+/**
+ * Client supports the tag property on a completion item. Clients supporting
+ * tags have to handle unknown tags gracefully. Clients especially need to
+ * preserve unknown tags when sending a completion item back to the server in
+ * a resolve call.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class CompletionItemTagSupportCapabilities {
+ /**
+ * The tags supported by the client.
+ */
+ @NonNull
+ List<CompletionItemTag> valueSet
+
+ new() {
+ this.valueSet = new ArrayList
+ }
+
+ new(@NonNull List<CompletionItemTag> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, 'valueSet')
+ }
+}
+
+/**
+ * Indicates which properties a client can resolve lazily on a completion
+ * item. Before version 3.16.0 only the predefined properties {@link CompletionItem#documentation}
+ * and {@link CompletionItem#detail} could be resolved lazily.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CompletionItemResolveSupportCapabilities {
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ @NonNull
+ List<String> properties
+
+ new() {
+ this.properties = new ArrayList
+ }
+
+ new(@NonNull List<String> properties) {
+ this.properties = Preconditions.checkNotNull(properties, 'properties')
+ }
+}
+
+/**
+ * The client supports the {@link CompletionItem#insertTextMode} property on
+ * a completion item to override the whitespace handling mode
+ * as defined by the client.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CompletionItemInsertTextModeSupportCapabilities {
+ @NonNull
+ List<InsertTextMode> valueSet
+
+ new() {
+ this.valueSet = new ArrayList
+ }
+
+ new(@NonNull List<InsertTextMode> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, 'valueSet')
+ }
+}
+
+/**
+ * The client supports the following {@link CompletionItemKind} specific
+ * capabilities.
+ */
+@JsonRpcData
+class CompletionItemKindCapabilities {
+ /**
+ * The completion item kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the completion items kinds from {@link CompletionItemKind#Text} to
+ * {@link CompletionItemKind#Reference} as defined in the initial version of the protocol.
+ */
+ List<CompletionItemKind> valueSet
+
+ new() {
+ }
+
+ new(List<CompletionItemKind> valueSet) {
+ this.valueSet = valueSet
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/completion`
+ */
+@JsonRpcData
+class CompletionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports the following {@link CompletionItem} specific
+ * capabilities.
+ */
+ CompletionItemCapabilities completionItem
+
+ /**
+ * The client supports the following {@link CompletionItemKind} specific
+ * capabilities.
+ */
+ CompletionItemKindCapabilities completionItemKind
+
+ /**
+ * The client supports sending additional context information for a
+ * `textDocument/completion` request.
+ */
+ Boolean contextSupport
+
+ new() {
+ }
+
+ new(CompletionItemCapabilities completionItem) {
+ this.completionItem = completionItem
+ }
+
+ new(CompletionItemKindCapabilities completionItemKind) {
+ this.completionItemKind = completionItemKind
+ }
+
+ new(Boolean contextSupport) {
+ this.contextSupport = contextSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/hover`
+ */
+@JsonRpcData
+class HoverCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Client supports the following content formats if the content
+ * property refers to {@link MarkupContent}.
+ * The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ List<String> contentFormat
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(List<String> contentFormat, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.contentFormat = contentFormat
+ }
+}
+
+/**
+ * The client supports the following {@link SignatureInformation} specific properties.
+ */
+@JsonRpcData
+class SignatureInformationCapabilities {
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ List<String> documentationFormat
+
+ /**
+ * Client capabilities specific to parameter information.
+ */
+ ParameterInformationCapabilities parameterInformation
+
+ /**
+ * The client supports the {@link SignatureInformation#activeParameter} property.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean activeParameterSupport
+
+ new() {
+ }
+
+ new(List<String> documentationFormat) {
+ this.documentationFormat = documentationFormat
+ }
+}
+
+/**
+ * Client capabilities specific to parameter information.
+ */
+@JsonRpcData
+class ParameterInformationCapabilities {
+ /**
+ * The client supports processing label offsets instead of a
+ * simple label string.
+ * <p>
+ * Since 3.14.0
+ */
+ Boolean labelOffsetSupport
+
+ new() {
+ }
+
+ new(Boolean labelOffsetSupport) {
+ this.labelOffsetSupport = labelOffsetSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/signatureHelp`
+ */
+@JsonRpcData
+class SignatureHelpCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports the following {@link SignatureInformation}
+ * specific properties.
+ */
+ SignatureInformationCapabilities signatureInformation
+
+ /**
+ * The client supports to send additional context information for a
+ * `textDocument/signatureHelp` request. A client that opts into
+ * contextSupport will also support {@link SignatureHelpOptions#retriggerCharacters}.
+ * <p>
+ * Since 3.15.0
+ */
+ Boolean contextSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(SignatureInformationCapabilities signatureInformation, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.signatureInformation = signatureInformation
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/references`
+ */
+@JsonRpcData
+class ReferencesCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/documentHighlight`
+ */
+@JsonRpcData
+class DocumentHighlightCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Specific capabilities for the {@link SymbolKind}.
+ */
+@JsonRpcData
+class SymbolKindCapabilities {
+ /**
+ * The symbol kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the symbol kinds from {@link SymbolKind#File} to
+ * {@link SymbolKind#Array} as defined in the initial version of the protocol.
+ */
+ List<SymbolKind> valueSet
+
+ new() {
+ }
+
+ new(List<SymbolKind> valueSet) {
+ this.valueSet = valueSet
+ }
+}
+
+/**
+ * Specific capabilities for the {@link SymbolTag}.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SymbolTagSupportCapabilities {
+ /**
+ * The tags supported by the client.
+ */
+ @NonNull
+ List<SymbolTag> valueSet
+
+ new() {
+ this.valueSet = new ArrayList
+ }
+
+ new(@NonNull List<SymbolTag> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, 'valueSet')
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/documentSymbol`
+ */
+@JsonRpcData
+class DocumentSymbolCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Specific capabilities for the {@link SymbolKind}.
+ */
+ SymbolKindCapabilities symbolKind
+
+ /**
+ * The client support hierarchical document symbols.
+ */
+ Boolean hierarchicalDocumentSymbolSupport
+
+ /**
+ * The client supports tags on {@link SymbolInformation}. Tags are supported on
+ * {@link DocumentSymbol} if {@link #hierarchicalDocumentSymbolSupport} is set to true.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ SymbolTagSupportCapabilities tagSupport
+
+ /**
+ * The client supports an additional label presented in the UI when
+ * registering a document symbol provider.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean labelSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(SymbolKindCapabilities symbolKind) {
+ this.symbolKind = symbolKind
+ }
+
+ new(SymbolKindCapabilities symbolKind, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.symbolKind = symbolKind
+ }
+
+ new(SymbolKindCapabilities symbolKind, Boolean dynamicRegistration, Boolean hierarchicalDocumentSymbolSupport) {
+ super(dynamicRegistration)
+ this.symbolKind = symbolKind
+ this.hierarchicalDocumentSymbolSupport = hierarchicalDocumentSymbolSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/formatting`
+ */
+@JsonRpcData
+class FormattingCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/rangeFormatting`
+ */
+@JsonRpcData
+class RangeFormattingCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/onTypeFormatting`
+ */
+@JsonRpcData
+class OnTypeFormattingCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/definition`
+ * <p>
+ * Since 3.14.0
+ */
+@JsonRpcData
+class DefinitionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of definition links.
+ */
+ Boolean linkSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(Boolean dynamicRegistration, Boolean linkSupport) {
+ super(dynamicRegistration)
+ this.linkSupport = linkSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/declaration`
+ * <p>
+ * Since 3.14.0
+ */
+@JsonRpcData
+class DeclarationCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of declaration links.
+ */
+ Boolean linkSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(Boolean dynamicRegistration, Boolean linkSupport) {
+ super(dynamicRegistration)
+ this.linkSupport = linkSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/typeDefinition`
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class TypeDefinitionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ Boolean linkSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(Boolean dynamicRegistration, Boolean linkSupport) {
+ super(dynamicRegistration)
+ this.linkSupport = linkSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/implementation`.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class ImplementationCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ Boolean linkSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(Boolean dynamicRegistration, Boolean linkSupport) {
+ super(dynamicRegistration)
+ this.linkSupport = linkSupport
+ }
+}
+
+@JsonRpcData
+class CodeActionKindCapabilities {
+ /**
+ * The code action kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ @NonNull
+ List<String> valueSet
+
+ new() {
+ this.valueSet = new ArrayList
+ }
+
+ new(@NonNull List<String> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, 'valueSet')
+ }
+}
+
+@JsonRpcData
+class CodeActionLiteralSupportCapabilities {
+ /**
+ * The code action kind is support with the following value
+ * set.
+ */
+ CodeActionKindCapabilities codeActionKind
+
+ new() {
+ }
+
+ new(CodeActionKindCapabilities codeActionKind) {
+ this.codeActionKind = codeActionKind
+ }
+}
+
+/**
+ * Whether the client supports resolving additional code action
+ * properties via a separate `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CodeActionResolveSupportCapabilities {
+ /**
+ * The properties that a client can resolve lazily.
+ */
+ @NonNull
+ List<String> properties
+
+ new() {
+ this.properties = new ArrayList
+ }
+
+ new(@NonNull List<String> properties) {
+ this.properties = Preconditions.checkNotNull(properties, 'properties')
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/codeAction`
+ */
+@JsonRpcData
+class CodeActionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client support code action literals as a valid
+ * response of the `textDocument/codeAction` request.
+ */
+ CodeActionLiteralSupportCapabilities codeActionLiteralSupport
+
+ /**
+ * Whether code action supports the {@link CodeAction#isPreferred} property.
+ * <p>
+ * Since 3.15.0
+ */
+ Boolean isPreferredSupport
+
+ /**
+ * Whether code action supports the {@link CodeAction#disabled} property.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean disabledSupport
+
+ /**
+ * Whether code action supports the {@link CodeAction#data} property which is
+ * preserved between a `textDocument/codeAction` and a
+ * `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean dataSupport
+
+ /**
+ * Whether the client supports resolving additional code action
+ * properties via a separate `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ CodeActionResolveSupportCapabilities resolveSupport
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * {@link CodeAction#edit} property by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean honorsChangeAnnotations
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(CodeActionLiteralSupportCapabilities codeActionLiteralSupport, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.codeActionLiteralSupport = codeActionLiteralSupport
+ }
+
+ new(CodeActionLiteralSupportCapabilities codeActionLiteralSupport, Boolean dynamicRegistration, Boolean isPreferredSupport) {
+ this(codeActionLiteralSupport, dynamicRegistration)
+ this.isPreferredSupport = isPreferredSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/codeLens`
+ */
+@JsonRpcData
+class CodeLensCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the code lens requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CodeLensWorkspaceCapabilities {
+
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * code lenses currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ Boolean refreshSupport
+
+ new() {
+ }
+
+ new(Boolean refreshSupport) {
+ this.refreshSupport = refreshSupport
+ }
+}
+
+/**
+ * The client has support for file requests/notifications.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileOperationsWorkspaceCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client has support for sending didCreateFiles notifications.
+ */
+ Boolean didCreate
+
+ /**
+ * The client has support for sending willCreateFiles requests.
+ */
+ Boolean willCreate
+
+ /**
+ * The client has support for sending didRenameFiles notifications.
+ */
+ Boolean didRename
+
+ /**
+ * The client has support for sending willRenameFiles requests.
+ */
+ Boolean willRename
+
+ /**
+ * The client has support for sending didDeleteFiles notifications.
+ */
+ Boolean didDelete
+
+ /**
+ * The client has support for sending willDeleteFiles requests.
+ */
+ Boolean willDelete
+
+ new() {
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/documentLink`
+ */
+@JsonRpcData
+class DocumentLinkCapabilities extends DynamicRegistrationCapabilities {
+
+ /**
+ * Whether the client supports the {@link DocumentLink#tooltip} property.
+ * <p>
+ * Since 3.15.0
+ */
+ Boolean tooltipSupport
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(Boolean dynamicRegistration, Boolean tooltipSupport) {
+ super(dynamicRegistration)
+ this.tooltipSupport = tooltipSupport
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/documentColor` and the
+ * `textDocument/colorPresentation` request.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class ColorProviderCapabilities extends DynamicRegistrationCapabilities {
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Capabilities specific to the `textDocument/rename`
+ */
+@JsonRpcData
+class RenameCapabilities extends DynamicRegistrationCapabilities {
+
+ /**
+ * Client supports testing for validity of rename operations
+ * before execution.
+ * <p>
+ * Since 3.12.0
+ */
+ Boolean prepareSupport
+
+ /**
+ * Client supports the default behavior result ({@code { defaultBehavior: boolean }}).
+ * <p>
+ * The value indicates the default behavior used by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ PrepareSupportDefaultBehavior prepareSupportDefaultBehavior
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * rename request's workspace edit by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean honorsChangeAnnotations
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(Boolean prepareSupport, Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ this.prepareSupport = prepareSupport
+ }
+}
+
+/**
+ * Capabilities specific to `textDocument/publishDiagnostics`.
+ */
+@JsonRpcData
+class PublishDiagnosticsCapabilities {
+ /**
+ * Whether the client accepts diagnostics with related information.
+ */
+ Boolean relatedInformation
+
+ /**
+ * Client supports the tag property to provide meta data about a diagnostic.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * This property had been added and implemented as boolean before it was
+ * added to the specification as {@link DiagnosticsTagSupport}. In order to
+ * keep this implementation compatible with intermediate clients (including
+ * vscode-language-client < 6.0.0) we add an either type here.
+ * <p>
+ * Since 3.15
+ */
+ Either<Boolean, DiagnosticsTagSupport> tagSupport
+
+ /**
+ * Whether the client interprets the version property of the
+ * `textDocument/publishDiagnostics` notification's parameter.
+ * <p>
+ * Since 3.15.0
+ */
+ Boolean versionSupport
+
+ /**
+ * Client supports a codeDescription property
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean codeDescriptionSupport
+
+ /**
+ * Whether code action supports the {@link Diagnostic#data} property which is
+ * preserved between a `textDocument/publishDiagnostics` and
+ * `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean dataSupport
+
+ new() {
+ }
+
+ new(Boolean relatedInformation) {
+ this.relatedInformation = relatedInformation
+ }
+
+ new(Boolean relatedInformation, DiagnosticsTagSupport tagSupport) {
+ this(relatedInformation)
+ this.tagSupport = tagSupport
+ }
+
+ new(Boolean relatedInformation, DiagnosticsTagSupport tagSupport, Boolean versionSupport) {
+ this(relatedInformation, tagSupport)
+ this.versionSupport = versionSupport
+ }
+}
+
+@JsonRpcData
+class DiagnosticsTagSupport {
+ /**
+ * The tags supported by the client.
+ */
+ @NonNull
+ List<DiagnosticTag> valueSet
+
+ new() {
+ this.valueSet = new ArrayList
+ }
+
+ new(@NonNull List<DiagnosticTag> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, 'valueSet')
+ }
+}
+
+/**
+ * Capabilities specific to `textDocument/foldingRange` requests.
+ * <p>
+ * Since 3.10.0
+ */
+@JsonRpcData
+class FoldingRangeCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+ * hint, servers are free to follow the limit.
+ */
+ Integer rangeLimit
+
+ /**
+ * If set, the client signals that it only supports folding complete lines. If set, client will
+ * ignore specified {@link FoldingRange#startCharacter} and {@link FoldingRange#endCharacter} properties.
+ */
+ Boolean lineFoldingOnly
+}
+
+/**
+ * Capabilities specific to the {@code textDocument/typeHierarchy}.
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+@Beta
+@JsonRpcData
+class TypeHierarchyCapabilities extends DynamicRegistrationCapabilities {
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+}
+
+/**
+ * Capabilities specific to the {@code textDocument/prepareCallHierarchy}.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyCapabilities extends DynamicRegistrationCapabilities {
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * Capabilities specific to `textDocument/selectionRange` requests
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class SelectionRangeCapabilities extends DynamicRegistrationCapabilities {
+
+ new() {
+ }
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensClientCapabilitiesRequestsFull {
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full/delta` request if
+ * the server provides a corresponding handler.
+ */
+ Boolean delta
+
+ new() {
+ }
+
+ new(Boolean delta) {
+ this.delta = delta
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensClientCapabilitiesRequests {
+
+ /**
+ * The client will send the `textDocument/semanticTokens/range` request if
+ * the server provides a corresponding handler.
+ */
+ Either<Boolean, Object> range
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full` request if
+ * the server provides a corresponding handler.
+ */
+ Either<Boolean, SemanticTokensClientCapabilitiesRequestsFull> full
+
+ new() {
+ }
+
+ new(Boolean full) {
+ this.full = full
+ }
+
+ new(SemanticTokensClientCapabilitiesRequestsFull full) {
+ this.full = full
+ }
+
+ new(Boolean full, Boolean range) {
+ this.full = full
+ this.range = range
+ }
+
+ new(SemanticTokensClientCapabilitiesRequestsFull full, Boolean range) {
+ this.full = full
+ this.range = range
+ }
+
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensCapabilities extends DynamicRegistrationCapabilities {
+
+ /**
+ * Which requests the client supports and might send to the server.
+ */
+ @NonNull
+ SemanticTokensClientCapabilitiesRequests requests
+
+ /**
+ * The token types that the client supports.
+ */
+ @NonNull
+ List<String> tokenTypes
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ @NonNull
+ List<String> tokenModifiers
+
+ /**
+ * The formats the client supports.
+ * <p>
+ * See {@link TokenFormat} for allowed values.
+ */
+ @NonNull
+ List<String> formats
+
+ /**
+ * Whether the client supports tokens that can overlap each other.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean overlappingTokenSupport
+
+ /**
+ * Whether the client supports tokens that can span multiple lines.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean multilineTokenSupport
+
+ new(Boolean dynamicRegistration) {
+ super(dynamicRegistration)
+ }
+
+ new(@NonNull SemanticTokensClientCapabilitiesRequests requests, @NonNull List<String> tokenTypes, @NonNull List<String> tokenModifiers, @NonNull List<String> formats) {
+ this.requests = Preconditions.checkNotNull(requests, 'requests')
+ this.tokenTypes = Preconditions.checkNotNull(tokenTypes, 'tokenTypes')
+ this.tokenModifiers = Preconditions.checkNotNull(tokenModifiers, 'tokenModifiers')
+ this.formats = Preconditions.checkNotNull(formats, 'formats')
+ }
+
+
+ new(Boolean dynamicRegistration, @NonNull SemanticTokensClientCapabilitiesRequests requests, @NonNull List<String> tokenTypes, @NonNull List<String> tokenModifiers, @NonNull List<String> formats) {
+ super(dynamicRegistration)
+ this.requests = Preconditions.checkNotNull(requests, 'requests')
+ this.tokenTypes = Preconditions.checkNotNull(tokenTypes, 'tokenTypes')
+ this.tokenModifiers = Preconditions.checkNotNull(tokenModifiers, 'tokenModifiers')
+ this.formats = Preconditions.checkNotNull(formats, 'formats')
+ }
+
+}
+
+/**
+ * Capabilities specific to the {@code textDocument/linkedEditingRange} request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class LinkedEditingRangeCapabilities extends DynamicRegistrationCapabilities {
+}
+
+/**
+ * Capabilities specific to the semantic token requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensWorkspaceCapabilities {
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * semantic tokens currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ Boolean refreshSupport
+
+ new() {
+ }
+
+ new(Boolean refreshSupport) {
+ this.refreshSupport = refreshSupport
+ }
+}
+
+/**
+ * Capabilities specific to the {@code textDocument/moniker} request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class MonikerCapabilities extends DynamicRegistrationCapabilities {
+}
+
+/**
+ * Show message request client capabilities
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class WindowShowMessageRequestCapabilities {
+ /**
+ * Capabilities specific to the {@link MessageActionItem} type.
+ */
+ WindowShowMessageRequestActionItemCapabilities messageActionItem
+
+ new() {
+ }
+}
+
+/**
+ * Client capabilities for the show document request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class ShowDocumentCapabilities {
+ /**
+ * The client has support for the show document
+ * request.
+ */
+ boolean support
+
+ new() {
+ }
+
+ new(boolean support) {
+ this.support = support
+ }
+}
+
+/**
+ * Capabilities specific to the {@link MessageActionItem} type of show message request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class WindowShowMessageRequestActionItemCapabilities {
+ /**
+ * Whether the client supports additional attributes which
+ * are preserved and sent back to the server in the
+ * request's response.
+ */
+ Boolean additionalPropertiesSupport
+
+ new() {
+ }
+
+ new(Boolean additionalPropertiesSupport) {
+ this.additionalPropertiesSupport = additionalPropertiesSupport
+ }
+}
+
+/**
+ * Client capabilities specific to regular expressions.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class RegularExpressionsCapabilities {
+ /**
+ * The engine's name.
+ */
+ @NonNull
+ String engine
+
+ /**
+ * The engine's version.
+ */
+ String version
+
+ new() {
+ }
+
+ new(@NonNull String engine) {
+ this.engine = Preconditions.checkNotNull(engine, 'engine')
+ }
+
+ new(@NonNull String engine, String version) {
+ this(engine)
+ this.version = version
+ }
+}
+
+/**
+ * Client capabilities specific to the used markdown parser.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class MarkdownCapabilities {
+ /**
+ * The name of the parser.
+ */
+ @NonNull
+ String parser
+
+ /**
+ * The version of the parser.
+ */
+ String version
+
+ new() {
+ }
+
+ new(@NonNull String parser) {
+ this.parser = Preconditions.checkNotNull(parser, 'parser')
+ }
+
+ new(@NonNull String parser, String version) {
+ this(parser)
+ this.version = version
+ }
+}
+
+/**
+ * Whether the client in general supports change annotations on text edits,
+ * create file, rename file and delete file changes.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class WorkspaceEditChangeAnnotationSupportCapabilities {
+ /**
+ * Whether the client groups edits with equal labels into tree nodes,
+ * for instance all edits labelled with "Changes in Strings" would
+ * be a tree node.
+ */
+ Boolean groupsOnLabel
+
+ new() {
+ }
+
+ new(Boolean groupsOnLabel) {
+ this.groupsOnLabel = groupsOnLabel
+ }
+}
+
+
+/**
+ * Text document specific client capabilities.
+ */
+@JsonRpcData
+class TextDocumentClientCapabilities {
+ SynchronizationCapabilities synchronization
+
+ /**
+ * Capabilities specific to the {@code textDocument/completion}
+ */
+ CompletionCapabilities completion
+
+ /**
+ * Capabilities specific to the {@code textDocument/hover}
+ */
+ HoverCapabilities hover
+
+ /**
+ * Capabilities specific to the {@code textDocument/signatureHelp}
+ */
+ SignatureHelpCapabilities signatureHelp
+
+ /**
+ * Capabilities specific to the {@code textDocument/references}
+ */
+ ReferencesCapabilities references
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentHighlight}
+ */
+ DocumentHighlightCapabilities documentHighlight
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentSymbol}
+ */
+ DocumentSymbolCapabilities documentSymbol
+
+ /**
+ * Capabilities specific to the {@code textDocument/formatting}
+ */
+ FormattingCapabilities formatting
+
+ /**
+ * Capabilities specific to the {@code textDocument/rangeFormatting}
+ */
+ RangeFormattingCapabilities rangeFormatting
+
+ /**
+ * Capabilities specific to the {@code textDocument/onTypeFormatting}
+ */
+ OnTypeFormattingCapabilities onTypeFormatting
+
+ /**
+ * Capabilities specific to the {@code textDocument/declaration}
+ * <p>
+ * Since 3.14.0
+ */
+ DeclarationCapabilities declaration
+
+ /**
+ * Capabilities specific to the {@code textDocument/definition}
+ * <p>
+ * Since 3.14.0
+ */
+ DefinitionCapabilities definition
+
+ /**
+ * Capabilities specific to the {@code textDocument/typeDefinition}
+ * <p>
+ * Since 3.6.0
+ */
+ TypeDefinitionCapabilities typeDefinition
+
+ /**
+ * Capabilities specific to the {@code textDocument/implementation}
+ * <p>
+ * Since 3.6.0
+ */
+ ImplementationCapabilities implementation
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeAction}
+ */
+ CodeActionCapabilities codeAction
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeLens}
+ */
+ CodeLensCapabilities codeLens
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentLink}
+ */
+ DocumentLinkCapabilities documentLink
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentColor} and the
+ * {@code textDocument/colorPresentation} request.
+ * <p>
+ * Since 3.6.0
+ */
+ ColorProviderCapabilities colorProvider
+
+ /**
+ * Capabilities specific to the {@code textDocument/rename}
+ */
+ RenameCapabilities rename
+
+ /**
+ * Capabilities specific to {@code textDocument/publishDiagnostics}.
+ */
+ PublishDiagnosticsCapabilities publishDiagnostics
+
+ /**
+ * Capabilities specific to {@code textDocument/foldingRange} requests.
+ * <p>
+ * Since 3.10.0
+ */
+ FoldingRangeCapabilities foldingRange
+
+ /**
+ * Capabilities specific to {@code textDocument/typeHierarchy}.
+ */
+ @Beta
+ TypeHierarchyCapabilities typeHierarchyCapabilities
+
+ /**
+ * Capabilities specific to {@code textDocument/prepareCallHierarchy}.
+ * <p>
+ * Since 3.16.0
+ */
+ CallHierarchyCapabilities callHierarchy
+
+ /**
+ * Capabilities specific to `textDocument/selectionRange` requests
+ * <p>
+ * Since 3.15.0
+ */
+ SelectionRangeCapabilities selectionRange
+
+ /**
+ * Capabilities specific to {@code textDocument/semanticTokens}.
+ * <p>
+ * Since 3.16.0
+ */
+ SemanticTokensCapabilities semanticTokens
+
+ /**
+ * Capabilities specific to the {@code textDocument/moniker} request.
+ * <p>
+ * Since 3.16.0
+ */
+ MonikerCapabilities moniker
+
+ /**
+ * Capabilities specific to the {@code textDocument/linkedEditingRange} request.
+ * <p>
+ * Since 3.16.0
+ */
+ LinkedEditingRangeCapabilities linkedEditingRange
+}
+
+/**
+ * Window specific client capabilities.
+ */
+@JsonRpcData
+class WindowClientCapabilities {
+ /**
+ * Whether client supports handling progress notifications. If set servers are allowed to
+ * report in `workDoneProgress` property in the request specific server capabilities.
+ * <p>
+ * Since 3.15.0
+ */
+ Boolean workDoneProgress
+
+ /**
+ * Capabilities specific to the showMessage request
+ * <p>
+ * Since 3.16.0
+ */
+ WindowShowMessageRequestCapabilities showMessage
+
+ /**
+ * Client capabilities for the show document request.
+ * <p>
+ * Since 3.16.0
+ */
+ ShowDocumentCapabilities showDocument
+}
+
+/**
+ * General client capabilities.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class GeneralClientCapabilities {
+ /**
+ * Client capabilities specific to regular expressions.
+ * <p>
+ * Since 3.16.0
+ */
+ RegularExpressionsCapabilities regularExpressions
+
+ /**
+ * Client capabilities specific to the client's markdown parser.
+ * <p>
+ * Since 3.16.0
+ */
+ MarkdownCapabilities markdown
+}
+
+/**
+ * `ClientCapabilities` now define capabilities for dynamic registration, workspace and text document features the client supports.
+ * The {@link #experimental} can be used to pass experimental capabilities under development.
+ * For future compatibility a `ClientCapabilities` object literal can have more properties set than currently defined.
+ * Servers receiving a `ClientCapabilities` object literal with unknown properties should ignore these properties.
+ * A missing property should be interpreted as an absence of the capability.
+ * If a property is missing that defines sub properties all sub properties should be interpreted as an absence of the capability.
+ * <p>
+ * Client capabilities got introduced with the version 3.0 of the protocol. They therefore only describe capabilities that got introduced in 3.x or later.
+ * Capabilities that existed in the 2.x version of the protocol are still mandatory for clients. Clients cannot opt out of providing them.
+ * So even if a client omits the {@link TextDocumentClientCapabilities#synchronization}
+ * it is still required that the client provides text document synchronization (e.g. open, changed and close notifications).
+ */
+@JsonRpcData
+class ClientCapabilities {
+ /**
+ * Workspace specific client capabilities.
+ */
+ WorkspaceClientCapabilities workspace
+
+ /**
+ * Text document specific client capabilities.
+ */
+ TextDocumentClientCapabilities textDocument
+
+ /**
+ * Window specific client capabilities.
+ */
+ WindowClientCapabilities window
+
+ /**
+ * General client capabilities.
+ * <p>
+ * Since 3.16.0
+ */
+ GeneralClientCapabilities general
+
+ /**
+ * Experimental client capabilities.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object experimental
+
+ new() {
+ }
+
+ new(WorkspaceClientCapabilities workspace, TextDocumentClientCapabilities textDocument, Object experimental) {
+ this.workspace = workspace
+ this.textDocument = textDocument
+ this.experimental = experimental
+ }
+
+ new(WorkspaceClientCapabilities workspace, TextDocumentClientCapabilities textDocument, WindowClientCapabilities window, Object experimental) {
+ this.workspace = workspace
+ this.textDocument = textDocument
+ this.window = window
+ this.experimental = experimental
+ }
+}
+
+/**
+ * A code action represents a change that can be performed in code, e.g. to fix a problem or
+ * to refactor code.
+ * <p>
+ * A CodeAction must set either {@link #edit} and/or a {@link #command}.
+ * If both are supplied, the {@link #edit} is applied first, then the {@link #command} is executed.
+ */
+@JsonRpcData
+class CodeAction {
+ /**
+ * A short, human-readable, title for this code action.
+ */
+ @NonNull
+ String title
+
+ /**
+ * The kind of the code action.
+ * <p>
+ * Used to filter code actions.
+ */
+ String kind
+
+ /**
+ * The diagnostics that this code action resolves.
+ */
+ List<Diagnostic> diagnostics
+
+ /**
+ * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
+ * by keybindings.
+ * <p>
+ * A quick fix should be marked preferred if it properly addresses the underlying error.
+ * A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
+ * <p>
+ * Since 3.15.0
+ */
+ Boolean isPreferred
+
+ /**
+ * Marks that the code action cannot currently be applied.
+ * <p>
+ * Clients should follow the following guidelines regarding disabled code actions:
+ * <ul>
+ * <li>Disabled code actions are not shown in automatic <a href="https://code.visualstudio.com/docs/editor/editingevolved#_code-action">lightbulb</a>
+ * code action menu.
+ * <li>Disabled actions are shown as faded out in the code action menu when the user request a more specific type
+ * of code action, such as refactorings.
+ * <li>If the user has a <a href="https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions">keybinding</a>
+ * that auto applies a code action and only a disabled code actions are returned, the client should show the user an
+ * error message with {@link CodeActionDisabled#reason} in the editor.
+ * </ul><p>
+ * Since 3.16.0
+ */
+ CodeActionDisabled disabled
+
+ /**
+ * The workspace edit this code action performs.
+ */
+ WorkspaceEdit edit
+
+ /**
+ * A command this code action executes. If a code action
+ * provides a edit and a command, first the edit is
+ * executed and then the command.
+ */
+ Command command
+
+ /**
+ * A data entry field that is preserved on a code action between
+ * a `textDocument/codeAction` and a `codeAction/resolve` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+
+ new() {
+ }
+
+ new(@NonNull String title) {
+ this.title = Preconditions.checkNotNull(title, 'title')
+ }
+}
+
+/**
+ * Marks that the code action cannot currently be applied.
+ * <p>
+ * Clients should follow the following guidelines regarding disabled code actions:
+ * <ul>
+ * <li>Disabled code actions are not shown in automatic <a href="https://code.visualstudio.com/docs/editor/editingevolved#_code-action">lightbulb</a>
+ * code action menu.
+ * <li>Disabled actions are shown as faded out in the code action menu when the user request a more specific type
+ * of code action, such as refactorings.
+ * <li>If the user has a <a href="https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions">keybinding</a>
+ * that auto applies a code action and only a disabled code actions are returned, the client should show the user an
+ * error message with {@link #reason} in the editor.
+ * </ul><p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CodeActionDisabled {
+ /**
+ * Human readable description of why the code action is currently disabled.
+ * <p>
+ * This is displayed in the code actions UI.
+ */
+ @NonNull
+ String reason
+
+ new() {
+ }
+
+ new(@NonNull String reason) {
+ this.reason = Preconditions.checkNotNull(reason, 'reason')
+ }
+}
+
+/**
+ * Contains additional diagnostic information about the context in which a code action is run.
+ */
+@JsonRpcData
+class CodeActionContext {
+ /**
+ * An array of diagnostics.
+ */
+ @NonNull
+ List<Diagnostic> diagnostics
+
+ /**
+ * Requested kind of actions to return.
+ * <p>
+ * Actions not of this kind are filtered out by the client before being shown. So servers
+ * can omit computing them.
+ * <p>
+ * See {@link CodeActionKind} for allowed values.
+ */
+ List<String> only
+
+ new() {
+ }
+
+ new(@NonNull List<Diagnostic> diagnostics) {
+ this.diagnostics = Preconditions.checkNotNull(diagnostics, 'diagnostics')
+ }
+
+ new(@NonNull List<Diagnostic> diagnostics, List<String> only) {
+ this(diagnostics)
+ this.only = only
+ }
+}
+
+/**
+ * The code action request is sent from the client to the server to compute commands for a given text document and range.
+ * These commands are typically code fixes to either fix problems or to beautify/refactor code.
+ */
+@JsonRpcData
+class CodeActionParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The document in which the command was invoked.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The range for which the command was invoked.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * Context carrying additional information.
+ */
+ @NonNull
+ CodeActionContext context
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Range range, @NonNull CodeActionContext context) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.context = Preconditions.checkNotNull(context, 'context')
+ }
+}
+
+/**
+ * A code lens represents a command that should be shown along with source text, like the number of references,
+ * a way to run tests, etc.
+ * <p>
+ * A code lens is <em>unresolved</em> when no command is associated to it. For performance reasons the creation of a
+ * code lens and resolving should be done to two stages.
+ */
+@JsonRpcData
+class CodeLens {
+ /**
+ * The range in which this code lens is valid. Should only span a single line.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The command this code lens represents.
+ */
+ Command command
+
+ /**
+ * A data entry field that is preserved on a code lens item between a code lens and a code lens resolve request.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+
+ new() {
+ }
+
+ new(@NonNull Range range) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+
+ new(@NonNull Range range, Command command, Object data) {
+ this(range)
+ this.command = command
+ this.data = data
+ }
+}
+
+/**
+ * Code Action options.
+ */
+@JsonRpcData
+class CodeActionOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ List<String> codeActionKinds
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean resolveProvider
+
+ new() {
+ }
+
+ new(List<String> codeActionKinds) {
+ this.codeActionKinds = codeActionKinds
+ }
+}
+
+/**
+ * Code Action registration options.
+ */
+@JsonRpcData
+class CodeActionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * CodeActionKinds that this server may return.
+ * <p>
+ * The list of kinds may be generic, such as {@link CodeActionKind#Refactor}, or the server
+ * may list out every specific kind they provide.
+ */
+ List<String> codeActionKinds
+
+ /**
+ * The server provides support to resolve additional
+ * information for a code action.
+ * <p>
+ * Since 3.16.0
+ */
+ Boolean resolveProvider
+
+ new() {
+ }
+
+ new(List<String> codeActionKinds) {
+ this.codeActionKinds = codeActionKinds
+ }
+}
+
+/**
+ * Code Lens options.
+ */
+@JsonRpcData
+class CodeLensOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ Boolean resolveProvider
+
+ new() {
+ }
+
+ new(Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider
+ }
+}
+
+/**
+ * The code lens request is sent from the client to the server to compute code lenses for a given text document.
+ */
+@JsonRpcData
+class CodeLensParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The document to request code lens for.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+/**
+ * Represents a reference to a command. Provides a title which will be used to represent a command in the UI and,
+ * optionally, an array of arguments which will be passed to the command handler function when invoked.
+ */
+@JsonRpcData
+class Command {
+ /**
+ * Title of the command, like `save`.
+ */
+ @NonNull
+ String title
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ @NonNull
+ String command
+
+ /**
+ * Arguments that the command handler should be invoked with.
+ */
+ List<Object> arguments
+
+ new() {
+ }
+
+ new(@NonNull String title, @NonNull String command) {
+ this.title = Preconditions.checkNotNull(title, 'title')
+ this.command = Preconditions.checkNotNull(command, 'command')
+ }
+
+ new(@NonNull String title, @NonNull String command, List<Object> arguments) {
+ this(title, command)
+ this.arguments = arguments
+ }
+}
+
+/**
+ * The Completion request is sent from the client to the server to compute completion items at a given cursor position.
+ * Completion items are presented in the IntelliSense user class. If computing complete completion items is expensive
+ * servers can additional provide a handler for the resolve completion item request. This request is send when a
+ * completion item is selected in the user class.
+ */
+@JsonRpcData
+class CompletionItem {
+ /**
+ * The label of this completion item. By default also the text that is inserted when selecting this completion.
+ */
+ @NonNull
+ String label
+
+ /**
+ * The kind of this completion item. Based of the kind an icon is chosen by the editor.
+ */
+ CompletionItemKind kind
+
+ /**
+ * Tags for this completion item.
+ * <p>
+ * Since 3.15.0
+ */
+ List<CompletionItemTag> tags
+
+ /**
+ * A human-readable string with additional information about this item, like type or symbol information.
+ */
+ String detail
+
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ Either<String, MarkupContent> documentation
+
+ /**
+ * Indicates if this item is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ Boolean deprecated
+
+ /**
+ * Select this item when showing.
+ * <p>
+ * <em>Note</em> that only one completion item can be selected and that the
+ * tool / client decides which item that is. The rule is that the <em>first</em>
+ * item of those that match best is selected.
+ */
+ Boolean preselect
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ */
+ String sortText
+
+ /**
+ * A string that should be used when filtering a set of completion items. When `falsy` the label is used.
+ */
+ String filterText
+
+ /**
+ * A string that should be inserted a document when selecting this completion. When `falsy` the label is used.
+ */
+ String insertText
+
+ /**
+ * The format of the insert text. The format applies to both the {@link #insertText} property
+ * and the {@code newText} property of a provided {@link #textEdit}.
+ */
+ InsertTextFormat insertTextFormat
+
+ /**
+ * How whitespace and indentation is handled during completion item
+ * insertion. If not provided, the client's default value is used.
+ * <p>
+ * Since 3.16.0
+ */
+ InsertTextMode insertTextMode
+
+ /**
+ * An edit which is applied to a document when selecting this completion.
+ * When an edit is provided the value of {@link #insertText} is ignored.
+ * <p>
+ * <em>Note:</em> The range of the edit must be a single line range and it must
+ * contain the position at which completion has been requested.
+ * <p>
+ * Most editors support two different operations when accepting a completion
+ * item. One is to insert a completion text and the other is to replace an
+ * existing text with a completion text. Since this can usually not be
+ * predetermined by a server it can report both ranges. Clients need to
+ * signal support for {@link InsertReplaceEdit}s via the
+ * {@link CompletionItemCapabilities#insertReplaceSupport} client capability
+ * property.
+ * <p>
+ * <em>Note 1:</em> The text edit's range as well as both ranges from an insert
+ * replace edit must be a [single line] and they must contain the position
+ * at which completion has been requested.
+ * <p>
+ * <em>Note 2:</em> If an {@link InsertReplaceEdit} is returned the edit's insert range
+ * must be a prefix of the edit's replace range, that means it must be
+ * contained and starting at the same position.
+ * <p>
+ * Since 3.16.0 additional type {@link InsertReplaceEdit}
+ */
+ @JsonAdapter(CompletionItemTextEditTypeAdapter)
+ Either<TextEdit, InsertReplaceEdit> textEdit
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap (including the same insert position)
+ * with the main edit nor with themselves.
+ * <p>
+ * Additional text edits should be used to change text unrelated to the current cursor position
+ * (for example adding an import statement at the top of the file if the completion item will
+ * insert an unqualified type).
+ */
+ List<TextEdit> additionalTextEdits
+
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. <em>Note</em> that all commit characters should have {@code length=1} and that superfluous
+ * characters will be ignored.
+ */
+ List<String> commitCharacters
+
+ /**
+ * An optional command that is executed <em>after</em> inserting this completion. <em>Note</em> that
+ * additional modifications to the current document should be described with the
+ * {@link #additionalTextEdits} property.
+ */
+ Command command
+
+ /**
+ * A data entry field that is preserved on a completion item between a completion and a completion resolve request.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+
+ new() {
+ }
+
+ new(@NonNull String label) {
+ this.label = Preconditions.checkNotNull(label, 'label')
+ }
+}
+
+/**
+ * Represents a collection of completion items to be presented in the editor.
+ */
+@JsonRpcData
+class CompletionList {
+ /**
+ * This list it not complete. Further typing should result in recomputing this list.
+ */
+ boolean isIncomplete
+
+ /**
+ * The completion items.
+ */
+ @NonNull
+ List<CompletionItem> items
+
+ new() {
+ this(new ArrayList)
+ }
+
+ new(@NonNull List<CompletionItem> items) {
+ this.items = Preconditions.checkNotNull(items, 'items')
+ }
+
+ new(boolean isIncomplete, @NonNull List<CompletionItem> items) {
+ this(items)
+ this.isIncomplete = isIncomplete
+ }
+}
+
+/**
+ * Completion options.
+ */
+@JsonRpcData
+class CompletionOptions extends AbstractWorkDoneProgressOptions {
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ Boolean resolveProvider
+
+ /**
+ * The characters that trigger completion automatically.
+ */
+ List<String> triggerCharacters
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ List<String> allCommitCharacters
+
+ new() {
+ }
+
+ new(Boolean resolveProvider, List<String> triggerCharacters) {
+ this.resolveProvider = resolveProvider
+ this.triggerCharacters = triggerCharacters
+ }
+}
+
+/**
+ * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects are only valid in the scope of a resource.
+ */
+@JsonRpcData
+class Diagnostic {
+ /**
+ * The range at which the message applies
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The diagnostic's severity. Can be omitted. If omitted it is up to the client to interpret diagnostics as error,
+ * warning, info or hint.
+ */
+ DiagnosticSeverity severity
+
+ /**
+ * The diagnostic's code. Can be omitted.
+ */
+ Either<String, Integer> code
+
+ /**
+ * An optional property to describe the error code.
+ * <p>
+ * Since 3.16.0
+ */
+ DiagnosticCodeDescription codeDescription
+
+ /**
+ * A human-readable string describing the source of this diagnostic, e.g. 'typescript' or 'super lint'.
+ */
+ String source
+
+ /**
+ * The diagnostic's message.
+ */
+ @NonNull
+ String message
+
+ /**
+ * Additional metadata about the diagnostic.
+ * <p>
+ * Since 3.15.0
+ */
+ List<DiagnosticTag> tags
+
+ /**
+ * An array of related diagnostic information, e.g. when symbol-names within a scope collide
+ * all definitions can be marked via this property.
+ * <p>
+ * Since 3.7.0
+ */
+ List<DiagnosticRelatedInformation> relatedInformation
+
+ /**
+ * A data entry field that is preserved between a `textDocument/publishDiagnostics`
+ * notification and `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+
+ new() {
+ }
+
+ new(@NonNull Range range, @NonNull String message) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.message = Preconditions.checkNotNull(message, 'message')
+ }
+
+ new(@NonNull Range range, @NonNull String message, DiagnosticSeverity severity, String source) {
+ this(range, message)
+ this.severity = severity
+ this.source = source
+ }
+
+ new(@NonNull Range range, @NonNull String message, DiagnosticSeverity severity, String source, String code) {
+ this(range, message, severity, source)
+ this.code = code
+ }
+}
+
+/**
+ * Represents a related message and source code location for a diagnostic. This should be
+ * used to point to code locations that cause or related to a diagnostics, e.g when duplicating
+ * a symbol in a scope.
+ * <p>
+ * Since 3.7.0
+ */
+@JsonRpcData
+class DiagnosticRelatedInformation {
+ /**
+ * The location of this related diagnostic information.
+ */
+ @NonNull
+ Location location
+
+ /**
+ * The message of this related diagnostic information.
+ */
+ @NonNull
+ String message
+
+ new() {
+ }
+
+ new(@NonNull Location location, @NonNull String message) {
+ this.location = Preconditions.checkNotNull(location, 'location')
+ this.message = Preconditions.checkNotNull(message, 'message')
+ }
+}
+
+/**
+ * Structure to capture a description for an error code.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class DiagnosticCodeDescription {
+ /**
+ * A URI to open with more information about the diagnostic error.
+ */
+ @NonNull
+ String href
+
+ new() {
+ }
+
+ new(@NonNull String href) {
+ this.href = Preconditions.checkNotNull(href, 'href')
+ }
+}
+
+/**
+ * A notification sent from the client to the server to signal the change of configuration settings.
+ */
+@JsonRpcData
+class DidChangeConfigurationParams {
+ /**
+ * The actual changed settings.
+ */
+ @NonNull
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object settings
+
+ new() {
+ }
+
+ new(@NonNull Object settings) {
+ this.settings = Preconditions.checkNotNull(settings, 'settings')
+ }
+}
+
+/**
+ * The document change notification is sent from the client to the server to signal changes to a text document.
+ */
+@JsonRpcData
+class DidChangeTextDocumentParams {
+ /**
+ * The document that did change. The version number points to the version after all provided content changes have
+ * been applied.
+ */
+ @NonNull
+ VersionedTextDocumentIdentifier textDocument
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ String uri
+
+ /**
+ * The actual content changes.
+ */
+ @NonNull
+ List<TextDocumentContentChangeEvent> contentChanges = new ArrayList
+
+ new() {
+ }
+
+ new(@NonNull VersionedTextDocumentIdentifier textDocument,
+ @NonNull List<TextDocumentContentChangeEvent> contentChanges) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.contentChanges = Preconditions.checkNotNull(contentChanges, 'contentChanges')
+ }
+
+ @Deprecated
+ new(@NonNull VersionedTextDocumentIdentifier textDocument, String uri,
+ @NonNull List<TextDocumentContentChangeEvent> contentChanges) {
+ this(textDocument, contentChanges)
+ this.uri = uri
+ }
+}
+
+/**
+ * The watched files notification is sent from the client to the server when the client detects changes
+ * to file watched by the language client.
+ */
+@JsonRpcData
+class DidChangeWatchedFilesParams {
+ /**
+ * The actual file events.
+ */
+ @NonNull
+ List<FileEvent> changes
+
+ new() {
+ this(new ArrayList)
+ }
+
+ new(@NonNull List<FileEvent> changes) {
+ this.changes = Preconditions.checkNotNull(changes, 'changes')
+ }
+}
+
+@JsonRpcData
+class DidChangeWatchedFilesRegistrationOptions {
+ /**
+ * The watchers to register.
+ */
+ @NonNull
+ List<FileSystemWatcher> watchers
+
+ new() {
+ }
+
+ new(@NonNull List<FileSystemWatcher> watchers) {
+ this.watchers = Preconditions.checkNotNull(watchers, 'watchers')
+ }
+}
+
+@JsonRpcData
+class FileSystemWatcher {
+ /**
+ * The glob pattern to watch
+ */
+ @NonNull
+ String globPattern
+
+ /**
+ * The kind of events of interest. If omitted it defaults
+ * to WatchKind.Create | WatchKind.Change | WatchKind.Delete
+ * which is 7.
+ */
+ Integer kind
+
+ new() {
+ }
+
+ new(@NonNull String globPattern) {
+ this.globPattern = Preconditions.checkNotNull(globPattern, 'globPattern')
+ }
+
+ new(@NonNull String globPattern, Integer kind) {
+ this(globPattern)
+ this.kind = kind
+ }
+}
+
+/**
+ * The document close notification is sent from the client to the server when the document got closed in the client.
+ * The document's truth now exists where the document's uri points to (e.g. if the document's uri is a file uri the
+ * truth now exists on disk).
+ */
+@JsonRpcData
+class DidCloseTextDocumentParams {
+ /**
+ * The document that was closed.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+/**
+ * The document open notification is sent from the client to the server to signal newly opened text documents.
+ * The document's truth is now managed by the client and the server must not try to read the document's truth using
+ * the document's uri.
+ */
+@JsonRpcData
+class DidOpenTextDocumentParams {
+ /**
+ * The document that was opened.
+ */
+ @NonNull
+ TextDocumentItem textDocument
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ String text
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentItem textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+
+ @Deprecated
+ new(@NonNull TextDocumentItem textDocument, String text) {
+ this(textDocument)
+ this.text = text
+ }
+}
+
+/**
+ * The document save notification is sent from the client to the server when the document was saved in the client.
+ */
+@JsonRpcData
+class DidSaveTextDocumentParams {
+ /**
+ * The document that was closed.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * Optional the content when saved. Depends on the includeText value
+ * when the save notification was requested.
+ */
+ String text
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, String text) {
+ this(textDocument)
+ this.text = text
+ }
+}
+
+@JsonRpcData
+class WillSaveTextDocumentParams {
+ /**
+ * The document that will be saved.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * A reason why a text document is saved.
+ */
+ @NonNull
+ TextDocumentSaveReason reason
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull TextDocumentSaveReason reason) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.reason = Preconditions.checkNotNull(reason, 'reason')
+ }
+}
+
+/**
+ * The document formatting request is sent from the server to the client to format a whole document.
+ */
+@JsonRpcData
+class DocumentFormattingParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> workDoneToken
+
+ /**
+ * The document to format.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The format options
+ */
+ @NonNull
+ FormattingOptions options
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull FormattingOptions options) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.options = Preconditions.checkNotNull(options, 'options')
+ }
+}
+
+/**
+ * Document formatting options.
+ */
+@JsonRpcData
+class DocumentFormattingOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Document formatting registration options.
+ */
+@JsonRpcData
+class DocumentFormattingRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * A document highlight is a range inside a text document which deserves special attention. Usually a document highlight
+ * is visualized by changing the background color of its range.
+ */
+@JsonRpcData
+class DocumentHighlight {
+ /**
+ * The range this highlight applies to.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The highlight kind, default is {@link DocumentHighlightKind#Text}.
+ */
+ DocumentHighlightKind kind
+
+ new() {
+ }
+
+ new(@NonNull Range range) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+
+ new(@NonNull Range range, DocumentHighlightKind kind) {
+ this(range)
+ this.kind = kind
+ }
+}
+
+/**
+ * A document link is a range in a text document that links to an internal or external resource, like another
+ * text document or a web site.
+ */
+@JsonRpcData
+class DocumentLink {
+ /**
+ * The range this link applies to.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The uri this link points to. If missing a resolve request is sent later.
+ */
+ String target
+
+ /**
+ * The tooltip text when you hover over this link.
+ * <p>
+ * If a tooltip is provided, is will be displayed in a string that includes instructions on how to
+ * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
+ * user settings, and localization.
+ * <p>
+ * Since 3.15.0
+ */
+ String tooltip
+
+ /**
+ * A data entry field that is preserved on a document link between a
+ * DocumentLinkRequest and a DocumentLinkResolveRequest.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+
+ new() {
+ }
+
+ new(@NonNull Range range) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+
+ new(@NonNull Range range, String target) {
+ this(range)
+ this.target = target
+ }
+
+ new(@NonNull Range range, String target, Object data) {
+ this(range, target)
+ this.data = data
+ }
+
+ new(@NonNull Range range, String target, Object data, String tooltip) {
+ this(range, target, data)
+ this.tooltip = tooltip
+ }
+}
+
+/**
+ * The document links request is sent from the client to the server to request the location of links in a document.
+ */
+@JsonRpcData
+class DocumentLinkParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The document to provide document links for.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+/**
+ * Document link options
+ */
+@JsonRpcData
+class DocumentLinkOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * Document links have a resolve provider as well.
+ */
+ Boolean resolveProvider
+
+ new() {
+ }
+
+ new(Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider
+ }
+}
+
+/**
+ * Execute command options.
+ */
+@JsonRpcData
+class ExecuteCommandOptions extends AbstractWorkDoneProgressOptions {
+
+ /**
+ * The commands to be executed on the server
+ */
+ @NonNull
+ List<String> commands
+
+ new() {
+ this(new ArrayList)
+ }
+
+ new(@NonNull List<String> commands) {
+ this.commands = Preconditions.checkNotNull(commands, 'commands')
+ }
+}
+
+/**
+ * Save options.
+ */
+@JsonRpcData
+class SaveOptions {
+ /**
+ * The client is supposed to include the content on save.
+ */
+ Boolean includeText
+
+ new() {
+ }
+
+ new(Boolean includeText) {
+ this.includeText = includeText
+ }
+}
+
+/**
+ * Rename options
+ */
+@JsonRpcData
+class RenameOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ *
+ * @deprecated This options object is not specified for StaticRegistrationOptions
+ */
+ @Deprecated
+ String id
+
+ /**
+ * Renames should be checked and tested before being executed.
+ */
+ Boolean prepareProvider
+
+ new() {
+ }
+
+ @Deprecated
+ new(String id) {
+ this.id = id
+ }
+
+ new(Boolean prepareProvider) {
+ this.prepareProvider = prepareProvider
+ }
+}
+
+/**
+ * Document color options
+ */
+@JsonRpcData
+class ColorProviderOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * Folding range options.
+ */
+@JsonRpcData
+class FoldingRangeProviderOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+@JsonRpcData
+class TextDocumentSyncOptions {
+ /**
+ * Open and close notifications are sent to the server.
+ */
+ Boolean openClose
+ /**
+ * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ TextDocumentSyncKind change
+ /**
+ * Will save notifications are sent to the server.
+ */
+ Boolean willSave
+ /**
+ * Will save wait until requests are sent to the server.
+ */
+ Boolean willSaveWaitUntil
+ /**
+ * Save notifications are sent to the server.
+ */
+ Either<Boolean, SaveOptions> save
+}
+
+/**
+ * Static registration options to be returned in the initialize request.
+ */
+@JsonRpcData
+class StaticRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * Format document on type options
+ */
+@JsonRpcData
+class DocumentOnTypeFormattingOptions {
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ @NonNull
+ String firstTriggerCharacter
+
+ /**
+ * More trigger characters.
+ */
+ List<String> moreTriggerCharacter
+
+ new() {
+ }
+
+ new(@NonNull String firstTriggerCharacter) {
+ this.firstTriggerCharacter = firstTriggerCharacter
+ }
+
+ new(@NonNull String firstTriggerCharacter, List<String> moreTriggerCharacter) {
+ this.firstTriggerCharacter = Preconditions.checkNotNull(firstTriggerCharacter, 'firstTriggerCharacter')
+ this.moreTriggerCharacter = moreTriggerCharacter
+ }
+}
+
+/**
+ * The document on type formatting request is sent from the client to the server to format parts of the document during typing.
+ */
+@JsonRpcData
+class DocumentOnTypeFormattingParams extends TextDocumentPositionParams {
+ /**
+ * The format options
+ */
+ @NonNull
+ FormattingOptions options
+
+ /**
+ * The character that has been typed.
+ */
+ @NonNull
+ String ch
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull FormattingOptions options, @NonNull Position position, @NonNull String ch) {
+ super(textDocument, position)
+ this.options = Preconditions.checkNotNull(options, 'options')
+ this.ch = Preconditions.checkNotNull(ch, 'ch')
+ }
+
+ @Deprecated
+ new(@NonNull Position position, @NonNull String ch) {
+ super.setPosition(position)
+ this.ch = Preconditions.checkNotNull(ch, 'ch')
+ }
+}
+
+/**
+ * The document range formatting request is sent from the client to the server to format a given range in a document.
+ */
+@JsonRpcData
+class DocumentRangeFormattingParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> workDoneToken
+
+ /**
+ * The document to format.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The format options
+ */
+ @NonNull
+ FormattingOptions options
+
+ /**
+ * The range to format
+ */
+ @NonNull
+ Range range
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull FormattingOptions options, @NonNull Range range) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.options = Preconditions.checkNotNull(options, 'options')
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+
+ @Deprecated
+ new(@NonNull Range range) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+}
+
+/**
+ * Document range formatting options.
+ */
+@JsonRpcData
+class DocumentRangeFormattingOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Document range formatting registration options.
+ */
+@JsonRpcData
+class DocumentRangeFormattingRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * The type hierarchy request is sent from the client resolve a {@link TypeHierarchyItem type hierarchy item} for
+ * a give cursor location in the text document. The request would also allow to specify if the item should be resolved
+ * and whether sub- or supertypes are to be resolved.
+ */
+@Beta
+@JsonRpcData
+class TypeHierarchyParams extends TextDocumentPositionParams {
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level. It defaults to {@code 0}.
+ */
+ int resolve
+
+ /**
+ * The direction of the type hierarchy resolution. If not defined, defaults to {@link TypeHierarchyDirection#Children Children}.
+ */
+ TypeHierarchyDirection direction
+}
+
+/**
+ * Request to resolve an unresolved {@link TypeHierarchyItem type hierarchy item} which is indicated if the
+ * {@link TypeHierarchyItem#getParents parents} or the {@link TypeHierarchyItem#getChildren children} is not
+ * defined. If resolved and no {@code parents} or {@code children} are available then an empty list is returned.
+ */
+@Beta
+@JsonRpcData
+class ResolveTypeHierarchyItemParams {
+ /**
+ * The hierarchy item to resolve.
+ */
+ @NonNull
+ TypeHierarchyItem item
+
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level.
+ */
+ int resolve
+
+ /**
+ * The direction of the type hierarchy resolution.
+ */
+ @NonNull
+ TypeHierarchyDirection direction
+
+ new() {
+ }
+
+ new(@NonNull TypeHierarchyItem item, int resolve, @NonNull TypeHierarchyDirection direction) {
+ this.item = Preconditions.checkNotNull(item, 'item')
+ this.resolve = resolve
+ this.direction = Preconditions.checkNotNull(direction, 'direction')
+ }
+}
+
+@JsonRpcData
+class DocumentSymbolOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ String label
+
+ new() {
+ }
+
+ new(String label) {
+ this.label = label
+ }
+}
+
+@JsonRpcData
+class DocumentSymbolRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * A human-readable string that is shown when multiple outlines trees
+ * are shown for the same document.
+ * <p>
+ * Since 3.16.0
+ */
+ String label
+
+ new() {
+ }
+
+ new(String label) {
+ this.label = label
+ }
+}
+
+/**
+ * The document symbol request is sent from the client to the server to list all symbols found in a given text document.
+ */
+@JsonRpcData
+class DocumentSymbolParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+/**
+ * An event describing a file change.
+ */
+@JsonRpcData
+class FileEvent {
+ /**
+ * The file's uri.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * The change type.
+ */
+ @NonNull
+ FileChangeType type
+
+ new() {
+ }
+
+ new(@NonNull String uri, @NonNull FileChangeType type) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ this.type = Preconditions.checkNotNull(type, 'type')
+ }
+}
+
+/**
+ * Value-object describing what options formatting should use.
+ */
+class FormattingOptions extends LinkedHashMap<String, Either3<String, Number, Boolean>> {
+
+ static val TAB_SIZE = 'tabSize'
+ static val INSERT_SPACES = 'insertSpaces'
+ static val TRIM_TRAILING_WHITESPACE = 'trimTrailingWhitespace'
+ static val INSERT_FINAL_NEWLINE = 'insertFinalNewline'
+ static val TRIM_FINAL_NEWLINES = 'trimFinalNewlines'
+
+ new() {
+ }
+
+ new(int tabSize, boolean insertSpaces) {
+ this.tabSize = tabSize
+ this.insertSpaces = insertSpaces
+ }
+
+ /**
+ * @deprecated See https://github.com/eclipse/lsp4j/issues/99
+ */
+ @Deprecated
+ new(int tabSize, boolean insertSpaces, Map<String, String> properties) {
+ this(tabSize, insertSpaces)
+ setProperties(properties)
+ }
+
+ def String getString(String key) {
+ get(key)?.getFirst
+ }
+
+ def void putString(String key, String value) {
+ put(key, Either3.forFirst(value))
+ }
+
+ def Number getNumber(String key) {
+ get(key)?.getSecond
+ }
+
+ def void putNumber(String key, Number value) {
+ put(key, Either3.forSecond(value))
+ }
+
+ def Boolean getBoolean(String key) {
+ get(key)?.getThird
+ }
+
+ def void putBoolean(String key, Boolean value) {
+ put(key, Either3.forThird(value))
+ }
+
+ /**
+ * Size of a tab in spaces.
+ */
+ def int getTabSize() {
+ val value = getNumber(TAB_SIZE)
+ if (value !== null)
+ return value.intValue
+ else
+ return 0
+ }
+
+ def void setTabSize(int tabSize) {
+ putNumber(TAB_SIZE, tabSize)
+ }
+
+ /**
+ * Prefer spaces over tabs.
+ */
+ def boolean isInsertSpaces() {
+ val value = getBoolean(INSERT_SPACES)
+ if (value !== null)
+ return value
+ else
+ return false
+ }
+
+ def void setInsertSpaces(boolean insertSpaces) {
+ putBoolean(INSERT_SPACES, insertSpaces)
+ }
+
+ /**
+ * Trim trailing whitespace on a line.
+ * <p>
+ * Since 3.15.0
+ */
+ def boolean isTrimTrailingWhitespace() {
+ val value = getBoolean(TRIM_TRAILING_WHITESPACE)
+ if (value !== null)
+ return value
+ else
+ return false
+ }
+
+ def void setTrimTrailingWhitespace(boolean trimTrailingWhitespace) {
+ putBoolean(TRIM_TRAILING_WHITESPACE, trimTrailingWhitespace)
+ }
+
+ /**
+ * Insert a newline character at the end of the file if one does not exist.
+ * <p>
+ * Since 3.15.0
+ */
+ def boolean isInsertFinalNewline() {
+ val value = getBoolean(INSERT_FINAL_NEWLINE)
+ if (value !== null)
+ return value
+ else
+ return false
+ }
+
+ def void setInsertFinalNewline(boolean insertFinalNewline) {
+ putBoolean(INSERT_FINAL_NEWLINE, insertFinalNewline)
+ }
+
+ /**
+ * Trim all newlines after the final newline at the end of the file.
+ * <p>
+ * Since 3.15.0
+ */
+ def boolean isTrimFinalNewlines() {
+ val value = getBoolean(TRIM_FINAL_NEWLINES)
+ if (value !== null)
+ return value
+ else
+ return false
+ }
+
+ def void setTrimFinalNewlines(boolean trimFinalNewlines) {
+ putBoolean(TRIM_FINAL_NEWLINES, trimFinalNewlines)
+ }
+
+ /**
+ * @deprecated See https://github.com/eclipse/lsp4j/issues/99
+ */
+ @Deprecated
+ def Map<String, String> getProperties() {
+ val properties = newLinkedHashMap
+ for (entry : entrySet) {
+ val value = switch it: entry.value {
+ case isFirst: getFirst
+ case isSecond: getSecond
+ case isThird: getThird
+ }
+ if (value !== null)
+ properties.put(entry.key, value.toString)
+ }
+ return properties.unmodifiableView
+ }
+
+ /**
+ * @deprecated See https://github.com/eclipse/lsp4j/issues/99
+ */
+ @Deprecated
+ def void setProperties(Map<String, String> properties) {
+ for (entry : properties.entrySet) {
+ putString(entry.key, entry.value)
+ }
+ }
+
+}
+
+/**
+ * A MarkupContent literal represents a string value which content is interpreted based on its
+ * kind flag. Currently the protocol supports {@link MarkupKind#PLAINTEXT plaintext} and
+ * {@link MarkupKind#MARKDOWN markdown} as markup kinds.
+ * <p>
+ * If the kind is {@link MarkupKind#MARKDOWN markdown} then the value can contain fenced code blocks like in GitHub issues.
+ * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ * <p>
+ * Please Note that clients might sanitize the return markdown. A client could decide to
+ * remove HTML from the markdown to avoid script execution.
+ */
+@JsonRpcData
+class MarkupContent {
+ /**
+ * The type of the Markup.
+ */
+ @NonNull
+ String kind
+
+ /**
+ * The content itself.
+ */
+ @NonNull
+ String value
+
+ new() {
+ }
+
+ new(@NonNull String kind, @NonNull String value) {
+ this.kind = Preconditions.checkNotNull(kind, 'kind')
+ this.value = Preconditions.checkNotNull(value, 'value')
+ }
+}
+
+/**
+ * The result of a hover request.
+ */
+@JsonRpcData
+@JsonAdapter(HoverTypeAdapter.Factory)
+class Hover {
+ /**
+ * The hover's content as markdown
+ */
+ @NonNull
+ Either<List<Either<String, MarkedString>>, MarkupContent> contents
+
+ /**
+ * An optional range
+ */
+ Range range
+
+ new() {
+ }
+
+ new(@NonNull List<Either<String, MarkedString>> contents) {
+ this.contents = Preconditions.checkNotNull(contents, 'contents')
+ }
+
+ new(@NonNull List<Either<String, MarkedString>> contents, Range range) {
+ this.contents = Preconditions.checkNotNull(contents, 'contents')
+ this.range = range
+ }
+
+ new(@NonNull MarkupContent contents) {
+ this.contents = Preconditions.checkNotNull(contents, 'contents')
+ }
+
+ new(@NonNull MarkupContent contents, Range range) {
+ this.contents = Preconditions.checkNotNull(contents, 'contents')
+ this.range = range
+ }
+
+ new(@NonNull Either<String, MarkedString> contents) {
+ this.contents = Arrays.asList(Preconditions.checkNotNull(contents, 'contents'))
+ }
+}
+
+/**
+ * MarkedString can be used to render human readable text. It is either a markdown string
+ * or a code-block that provides a language and a code snippet. The language identifier
+ * is semantically equal to the optional language identifier in fenced code blocks in GitHub
+ * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ * <p>
+ * The pair of a language and a value is an equivalent to markdown:
+ * <pre>
+ * ```${language}
+ * ${value}
+ * ```
+ * </pre>
+ * <p>
+ * Note that markdown strings will be sanitized - that means html will be escaped.
+ *
+ * @deprecated Use {@link MarkupContent} instead.
+ */
+@JsonRpcData
+@Deprecated
+class MarkedString {
+ @NonNull
+ String language
+
+ @NonNull
+ String value
+
+ new() {
+ }
+
+ new(@NonNull String language, @NonNull String value) {
+ this.language = Preconditions.checkNotNull(language, 'language')
+ this.value = Preconditions.checkNotNull(value, 'value')
+ }
+}
+
+/**
+ * The $/progress notification payload interface.
+ * <p>
+ * Since 3.15.0
+ */
+interface WorkDoneProgressNotification {
+ def WorkDoneProgressKind getKind()
+}
+
+/**
+ * The $/progress notification payload to start progress reporting.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class WorkDoneProgressBegin implements WorkDoneProgressNotification {
+
+ /**
+ * Always return begin
+ */
+ override WorkDoneProgressKind getKind() {
+ WorkDoneProgressKind.begin
+ }
+
+ /**
+ * Mandatory title of the progress operation. Used to briefly inform about
+ * the kind of operation being performed.
+ * <p>
+ * Examples: "Indexing" or "Linking dependencies".
+ */
+ @NonNull
+ String title
+
+ /**
+ * Controls if a cancel button should show to allow the user to cancel the
+ * long running operation. Clients that don't support cancellation are allowed
+ * to ignore the setting.
+ */
+ Boolean cancellable
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link #title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ String message
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ Integer percentage
+}
+
+/**
+ * The notification payload about progress reporting.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class WorkDoneProgressReport implements WorkDoneProgressNotification {
+
+ /**
+ * Always return report
+ */
+ override WorkDoneProgressKind getKind() {
+ WorkDoneProgressKind.report
+ }
+
+ /**
+ * Controls enablement state of a cancel button. This property is only valid if a cancel
+ * button got requested in the {@link WorkDoneProgressBegin} payload.
+ * <p>
+ * Clients that don't support cancellation or don't support control the button's
+ * enablement state are allowed to ignore the setting.
+ */
+ Boolean cancellable
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link WorkDoneProgressBegin#title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ String message
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ Integer percentage
+}
+
+/**
+ * The notification payload about progress reporting.
+ * Signaling the end of a progress reporting is done using the following payload:
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class WorkDoneProgressEnd implements WorkDoneProgressNotification {
+
+ /**
+ * Always return end
+ */
+ override WorkDoneProgressKind getKind() {
+ WorkDoneProgressKind.end
+ }
+
+ /**
+ * Optional, a final message indicating to for example indicate the outcome
+ * of the operation.
+ */
+ String message
+}
+
+/**
+ * The base protocol offers also support to report progress in a generic fashion.
+ * This mechanism can be used to report any kind of progress including work done progress
+ * (usually used to report progress in the user interface using a progress bar)
+ * and partial result progress to support streaming of results.
+ * A progress notification has the following properties:
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class ProgressParams {
+ /**
+ * The progress token provided by the client or server.
+ */
+ @NonNull
+ Either<String, Integer> token
+
+ /**
+ * The progress data.
+ */
+ @NonNull
+ @JsonAdapter(ProgressNotificationAdapter)
+ Either<WorkDoneProgressNotification, Object> value
+
+ new() {
+ }
+
+ new(@NonNull Either<String, Integer> token, @NonNull Either<WorkDoneProgressNotification, Object> value) {
+ this.token = Preconditions.checkNotNull(token, 'token')
+ this.value = Preconditions.checkNotNull(value, 'value')
+ }
+}
+
+
+/**
+ * A parameter literal used to pass a work done progress token.
+ * <p>
+ * Since 3.15.0
+ */
+interface WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ def Either<String, Integer> getWorkDoneToken()
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ def void setWorkDoneToken(Either<String, Integer> token)
+}
+
+/**
+ * Options to signal work done progress support in server capabilities.
+ * <p>
+ * Since 3.15.0
+ */
+interface WorkDoneProgressOptions {
+
+ def Boolean getWorkDoneProgress()
+
+ def void setWorkDoneProgress(Boolean workDoneProgress)
+
+}
+
+/**
+ * Options to signal work done progress support in server capabilities.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+abstract class AbstractWorkDoneProgressOptions implements WorkDoneProgressOptions {
+ Boolean workDoneProgress
+}
+
+/**
+ * Options to signal work done progress support in server capabilities and TextDocumentRegistrationOptions.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+abstract class AbstractTextDocumentRegistrationAndWorkDoneProgressOptions extends TextDocumentRegistrationOptions implements WorkDoneProgressOptions {
+ Boolean workDoneProgress
+
+ new() {
+ }
+
+ new(List<DocumentFilter> documentSelector) {
+ super(documentSelector)
+ }
+}
+
+/**
+ * A parameter literal used to pass a partial result token.
+ * <p>
+ * Since 3.15.0
+ */
+interface PartialResultParams {
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ def Either<String, Integer> getPartialResultToken()
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ def void setPartialResultToken(Either<String, Integer> token)
+}
+
+/**
+ * Abstract class which implements work done progress and partial result request parameter.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+abstract class WorkDoneProgressAndPartialResultParams implements WorkDoneProgressParams, PartialResultParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> workDoneToken
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ Either<String, Integer> partialResultToken
+}
+
+/**
+ * Abstract class which extends TextDocumentPosition and implements work done progress request parameter.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+abstract class TextDocumentPositionAndWorkDoneProgressParams extends TextDocumentPositionParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> workDoneToken
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+/**
+ * Abstract class which extends TextDocumentPosition and implements work done progress and partial result request parameter.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+abstract class TextDocumentPositionAndWorkDoneProgressAndPartialResultParams extends TextDocumentPositionAndWorkDoneProgressParams implements PartialResultParams {
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ Either<String, Integer> partialResultToken
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+@JsonRpcData
+class InitializeError {
+ /**
+ * Indicates whether the client executes the following retry logic:
+ * <ol>
+ * <li>Show the message provided by the ResponseError to the user.
+ * <li>User selects retry or cancel.
+ * <li>If user selected retry the initialize method is sent again.
+ * </ol>
+ */
+ boolean retry
+
+ new() {
+ }
+
+ new(boolean retry) {
+ this.retry = retry
+ }
+}
+
+/**
+ * Known error codes for an {@link InitializeError}
+ */
+interface InitializeErrorCode {
+ /**
+ * If the protocol version provided by the client can't be handled by the server.
+ *
+ * @deprecated This initialize error got replaced by client capabilities.
+ * There is no version handshake in version 3.0x
+ */
+ @Deprecated
+ val unknownProtocolVersion = 1
+}
+
+/**
+ * The initialize request is sent as the first request from the client to the server.
+ */
+@JsonRpcData
+@JsonAdapter(InitializeParamsTypeAdapter.Factory)
+class InitializeParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> workDoneToken
+
+ /**
+ * The process Id of the parent process that started the server.
+ */
+ Integer processId
+
+ /**
+ * The rootPath of the workspace. Is null if no folder is open.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Deprecated
+ String rootPath
+
+ /**
+ * The rootUri of the workspace. Is null if no folder is open.
+ * If both {@link #rootPath} and `rootUri` are set, `rootUri` wins.
+ *
+ * @deprecated Use {@link #workspaceFolders} instead.
+ */
+ @Deprecated
+ String rootUri
+
+ /**
+ * User provided initialization options.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object initializationOptions
+
+ /**
+ * The capabilities provided by the client (editor)
+ */
+ ClientCapabilities capabilities
+
+ /**
+ * An optional extension to the protocol.
+ * To tell the server what client (editor) is talking to it.
+ *
+ * @deprecated Use {@link #clientInfo} instead.
+ */
+ @Deprecated
+ String clientName
+
+ /**
+ * Information about the client
+ * <p>
+ * Since 3.15.0
+ */
+ ClientInfo clientInfo
+
+ /**
+ * The locale the client is currently showing the user interface
+ * in. This must not necessarily be the locale of the operating
+ * system.
+ * <p>
+ * Uses IETF language tags as the value's syntax
+ * (See https://en.wikipedia.org/wiki/IETF_language_tag)
+ * <p>
+ * Since 3.16.0
+ */
+ String locale
+
+ /**
+ * The initial trace setting.
+ * For values, see {@link TraceValue}. If omitted trace is disabled ({@link TraceValue#Off}).
+ */
+ String trace
+
+ /**
+ * The workspace folders configured in the client when the server starts.
+ * This property is only available if the client supports workspace folders.
+ * It can be `null` if the client supports workspace folders but none are
+ * configured.
+ * <p>
+ * Since 3.6.0
+ */
+ List<WorkspaceFolder> workspaceFolders
+}
+
+@JsonRpcData
+class InitializeResult {
+ /**
+ * The capabilities the language server provides.
+ */
+ @NonNull
+ ServerCapabilities capabilities
+
+ /**
+ * Information about the server.
+ * <p>
+ * Since 3.15.0
+ */
+ ServerInfo serverInfo
+
+ new() {
+ }
+
+ new(@NonNull ServerCapabilities capabilities) {
+ this.capabilities = Preconditions.checkNotNull(capabilities, 'capabilities')
+ }
+
+ new(@NonNull ServerCapabilities capabilities, ServerInfo serverInfo) {
+ this(capabilities)
+ this.serverInfo = serverInfo
+ }
+}
+
+@JsonRpcData
+class InitializedParams {
+}
+
+/**
+ * Information about the client
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class ClientInfo {
+ /**
+ * The name of the client as defined by the client.
+ */
+ @NonNull
+ String name
+
+ /**
+ * The client's version as defined by the client.
+ */
+ String version
+
+ new() {
+ }
+
+ new(@NonNull String name) {
+ this.name = Preconditions.checkNotNull(name, 'name')
+ }
+
+ new(@NonNull String name, String version) {
+ this(name)
+ this.version = version
+ }
+}
+
+/**
+ * Information about the server.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class ServerInfo {
+ /**
+ * The name of the server as defined by the server.
+ */
+ @NonNull
+ String name
+
+ /**
+ * The server's version as defined by the server.
+ */
+ String version
+
+ new() {
+ }
+
+ new(@NonNull String name) {
+ this.name = Preconditions.checkNotNull(name, 'name')
+ }
+
+ new(@NonNull String name, String version) {
+ this(name)
+ this.version = version
+ }
+}
+
+/**
+ * Represents a location inside a resource, such as a line inside a text file.
+ */
+@JsonRpcData
+class Location {
+ @NonNull
+ String uri
+
+ @NonNull
+ Range range
+
+ new() {
+ }
+
+ new(@NonNull String uri, @NonNull Range range) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+}
+
+/**
+ * Represents a link between a source and a target location.
+ */
+@JsonRpcData
+class LocationLink {
+ /**
+ * Span of the origin of this link.
+ * <p>
+ * Used as the underlined span for mouse interaction. Defaults to the word range at
+ * the mouse position.
+ */
+ Range originSelectionRange
+
+ /**
+ * The target resource identifier of this link.
+ */
+ @NonNull
+ String targetUri
+
+ /**
+ * The full target range of this link. If the target for example is a symbol then target range is the
+ * range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to highlight the range in the editor.
+ */
+ @NonNull
+ Range targetRange
+
+ /**
+ * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
+ * Must be contained by the the {@link #targetRange}. See also {@link DocumentSymbol#range}
+ */
+ @NonNull
+ Range targetSelectionRange
+
+ new() {
+ }
+
+ new(@NonNull String targetUri, @NonNull Range targetRange, @NonNull Range targetSelectionRange) {
+ this.targetUri = Preconditions.checkNotNull(targetUri, 'targetUri')
+ this.targetRange = Preconditions.checkNotNull(targetRange, 'targetRange')
+ this.targetSelectionRange = Preconditions.checkNotNull(targetSelectionRange, 'targetSelectionRange')
+ }
+
+ new(@NonNull String targetUri, @NonNull Range targetRange, @NonNull Range targetSelectionRange, Range originSelectionRange) {
+ this(targetUri, targetRange, targetSelectionRange)
+ this.originSelectionRange = originSelectionRange
+ }
+}
+
+/**
+ * The show message request is sent from a server to a client to ask the client to display a particular message in the
+ * user class. In addition to the show message notification the request allows to pass actions and to wait for an
+ * answer from the client.
+ */
+@JsonRpcData
+class MessageActionItem {
+ /**
+ * A short title like 'Retry', 'Open Log' etc.
+ */
+ @NonNull
+ String title
+
+ new() {
+ }
+
+ new(@NonNull String title) {
+ this.title = Preconditions.checkNotNull(title, 'title')
+ }
+}
+
+/**
+ * The show message notification is sent from a server to a client to ask the client to display a particular message
+ * in the user class.
+ * <p>
+ * The log message notification is send from the server to the client to ask the client to log a particular message.
+ */
+@JsonRpcData
+class MessageParams {
+ /**
+ * The message type.
+ */
+ @NonNull
+ MessageType type
+
+ /**
+ * The actual message.
+ */
+ @NonNull
+ String message
+
+ new() {
+ }
+
+ new(@NonNull MessageType type, @NonNull String message) {
+ this.type = Preconditions.checkNotNull(type, 'type')
+ this.message = Preconditions.checkNotNull(message, 'message')
+ }
+}
+
+/**
+ * A notification to log the trace of the server's execution. The amount and content of these notifications
+ * depends on the current trace configuration. If trace is 'off', the server should not send any logTrace
+ * notification. If trace is 'message', the server should not add the 'verbose' field.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class LogTraceParams {
+ /**
+ * The message to be logged.
+ */
+ @NonNull
+ String message
+
+ /**
+ * Additional information that can be computed if the {@code trace} configuration
+ * is set to {@link TraceValue#Verbose}
+ */
+ String verbose
+
+ new() {
+ }
+
+ new(@NonNull String message) {
+ this.message = Preconditions.checkNotNull(message, 'message')
+ }
+
+ new(@NonNull String message, String verbose) {
+ this.message = Preconditions.checkNotNull(message, 'message')
+ this.verbose = verbose
+ }
+}
+
+/**
+ * A notification that should be used by the client to modify the trace setting of the server.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SetTraceParams {
+ /**
+ * The new value that should be assigned to the trace setting.
+ * For values, see {@link TraceValue}.
+ */
+ @NonNull
+ String value
+
+ new() {
+ }
+
+ new(@NonNull String value) {
+ this.value = Preconditions.checkNotNull(value, 'value')
+ }
+}
+
+/**
+ * Represents a parameter of a callable-signature. A parameter can have a label and a doc-comment.
+ */
+@JsonRpcData
+class ParameterInformation {
+ /**
+ * The label of this parameter information.
+ * <p>
+ * Either a string or an inclusive start and exclusive end offsets within its containing
+ * signature label (see {@link SignatureInformation#label}). The offsets are based on a UTF-16
+ * string representation as {@link Position} and {@link Range} does.
+ * <p>
+ * <em>Note</em>: a label of type string should be a substring of its containing signature label.
+ * Its intended use case is to highlight the parameter label part in the {@link SignatureInformation#label}.
+ */
+ @NonNull
+ Either<String, Tuple.Two<Integer, Integer>> label
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ Either<String, MarkupContent> documentation
+
+ new() {
+ }
+
+ new(@NonNull String label) {
+ this.label = Preconditions.checkNotNull(label, 'label')
+ }
+
+ new(@NonNull String label, String documentation) {
+ this(label)
+ this.documentation = documentation
+ }
+
+ new(@NonNull String label, MarkupContent documentation) {
+ this(label)
+ this.documentation = documentation
+ }
+}
+
+/**
+ * Position in a text document expressed as zero-based line and character offset.
+ */
+@JsonRpcData
+class Position {
+ /**
+ * Line position in a document (zero-based).
+ */
+ int line
+
+ /**
+ * Character offset on a line in a document (zero-based).
+ */
+ int character
+
+ new() {
+ }
+
+ new(int line, int character) {
+ this.line = line
+ this.character = character
+ }
+}
+
+/**
+ * Diagnostics notification are sent from the server to the client to signal results of validation runs.
+ */
+@JsonRpcData
+class PublishDiagnosticsParams {
+ /**
+ * The URI for which diagnostic information is reported.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * An array of diagnostic information items.
+ */
+ @NonNull
+ List<Diagnostic> diagnostics
+
+ /**
+ * Optional the version number of the document the diagnostics are published for.
+ * <p>
+ * Since 3.15.0
+ */
+ Integer version
+
+ new() {
+ this.diagnostics = new ArrayList
+ }
+
+ new(@NonNull String uri, @NonNull List<Diagnostic> diagnostics) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ this.diagnostics = Preconditions.checkNotNull(diagnostics, 'diagnostics')
+ }
+
+ new(@NonNull String uri, @NonNull List<Diagnostic> diagnostics, Integer version) {
+ this(uri, diagnostics)
+ this.version = version
+ }
+}
+
+/**
+ * A range in a text document expressed as (zero-based) start and end positions.
+ */
+@JsonRpcData
+class Range {
+ /**
+ * The range's start position
+ */
+ @NonNull
+ Position start
+
+ /**
+ * The range's end position
+ */
+ @NonNull
+ Position end
+
+ new() {
+ }
+
+ new(@NonNull Position start, @NonNull Position end) {
+ this.start = Preconditions.checkNotNull(start, 'start')
+ this.end = Preconditions.checkNotNull(end, 'end')
+ }
+}
+
+/**
+ * The references request is sent from the client to the server to resolve project-wide references for the symbol
+ * denoted by the given text document position.
+ */
+@JsonRpcData
+class ReferenceContext {
+ /**
+ * Include the declaration of the current symbol.
+ */
+ boolean includeDeclaration
+
+ new() {
+ }
+
+ new(boolean includeDeclaration) {
+ this.includeDeclaration = includeDeclaration
+ }
+}
+
+@JsonRpcData
+class ReferenceOptions extends AbstractWorkDoneProgressOptions {
+}
+
+@JsonRpcData
+class ReferenceRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * The references request is sent from the client to the server to resolve project-wide references for the symbol
+ * denoted by the given text document position.
+ */
+@JsonRpcData
+class ReferenceParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ @NonNull
+ ReferenceContext context
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position, @NonNull ReferenceContext context) {
+ super(textDocument, position)
+ this.context = Preconditions.checkNotNull(context, 'context')
+ }
+
+ @Deprecated
+ new(@NonNull ReferenceContext context) {
+ this.context = Preconditions.checkNotNull(context, 'context')
+ }
+}
+
+/**
+ * One of the result types of the `textDocument/prepareRename` request.
+ * Provides the range of the string to rename and a placeholder text of the string content to be renamed.
+ */
+@JsonRpcData
+class PrepareRenameResult {
+ /**
+ * The range of the string to rename
+ */
+ @NonNull
+ Range range
+
+ /*
+ * A placeholder text of the string content to be renamed.
+ */
+ @NonNull
+ String placeholder
+
+ new() {
+ }
+
+ new(@NonNull Range range, @NonNull String placeholder) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.placeholder = Preconditions.checkNotNull(placeholder, 'placeholder')
+ }
+}
+
+/**
+ * The rename request is sent from the client to the server to do a workspace wide rename of a symbol.
+ */
+@JsonRpcData
+class RenameParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ /**
+ * The new name of the symbol. If the given name is not valid the request must return a
+ * ResponseError with an appropriate message set.
+ */
+ @NonNull
+ String newName
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position, @NonNull String newName) {
+ super(textDocument, position)
+ this.newName = Preconditions.checkNotNull(newName, 'newName')
+ }
+}
+
+/**
+ * The linked editing range request is sent from the client to the server to return for a given position
+ * in a document the range of the symbol at the position and all ranges that have the same content.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class LinkedEditingRangeParams extends TextDocumentPositionAndWorkDoneProgressParams {
+}
+
+/**
+ * Linked editing range options.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class LinkedEditingRangeOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Linked editing range registration options.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class LinkedEditingRangeRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * The linked editing range response is sent from the server to the client to return the range of the symbol
+ * at the given position and all ranges that have the same content.
+ * <p>
+ * Optionally a word pattern can be returned to describe valid contents.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class LinkedEditingRanges {
+ /**
+ * A list of ranges that can be renamed together. The ranges must have
+ * identical length and contain identical text content. The ranges cannot overlap.
+ */
+ @NonNull
+ List<Range> ranges
+
+ /**
+ * An optional word pattern (regular expression) that describes valid contents for
+ * the given ranges. If no pattern is provided, the client configuration's word
+ * pattern will be used.
+ */
+ String wordPattern
+
+ new() {
+ this.ranges = new ArrayList
+ }
+
+ new(@NonNull List<Range> ranges) {
+ this.ranges = Preconditions.checkNotNull(ranges, 'ranges')
+ }
+
+ new(@NonNull List<Range> ranges, String wordPattern) {
+ this(ranges)
+ this.wordPattern = wordPattern
+ }
+}
+
+/**
+ * The legend used by the server
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensLegend {
+
+ /**
+ * The token types that the client supports.
+ */
+ @NonNull
+ List<String> tokenTypes
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ @NonNull
+ List<String> tokenModifiers
+
+ new(@NonNull List<String> tokenTypes, @NonNull List<String> tokenModifiers) {
+ this.tokenTypes = Preconditions.checkNotNull(tokenTypes, 'tokenTypes')
+ this.tokenModifiers = Preconditions.checkNotNull(tokenModifiers, 'tokenModifiers')
+ }
+
+}
+
+/**
+ * Server supports providing semantic tokens for a full document.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensServerFull {
+
+ /**
+ * The server supports deltas for full documents.
+ */
+ Boolean delta
+
+ new() {
+ }
+
+ new(Boolean delta) {
+ this.delta = delta
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensWithRegistrationOptions extends AbstractWorkDoneProgressOptions {
+
+ /**
+ * The legend used by the server
+ */
+ @NonNull
+ SemanticTokensLegend legend
+
+ /**
+ * Server supports providing semantic tokens for a specific range
+ * of a document.
+ */
+ Either<Boolean, Object> range
+
+ /**
+ * Server supports providing semantic tokens for a full document.
+ */
+ Either<Boolean, SemanticTokensServerFull> full
+
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ List<DocumentFilter> documentSelector
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(@NonNull SemanticTokensLegend legend) {
+ this.legend = Preconditions.checkNotNull(legend, 'legend')
+ }
+
+ new(@NonNull SemanticTokensLegend legend, Boolean full) {
+ this(legend)
+ this.full = full
+ }
+
+ new(@NonNull SemanticTokensLegend legend, SemanticTokensServerFull full) {
+ this(legend)
+ this.full = full
+ }
+
+ new(@NonNull SemanticTokensLegend legend, Boolean full, Boolean range) {
+ this(legend)
+ this.full = full
+ this.range = range
+ }
+
+ new(@NonNull SemanticTokensLegend legend, SemanticTokensServerFull full, Boolean range) {
+ this(legend)
+ this.full = full
+ this.range = range
+ }
+
+ new(@NonNull SemanticTokensLegend legend, SemanticTokensServerFull full, Boolean range, List<DocumentFilter> documentSelector) {
+ this(legend)
+ this.full = full
+ this.range = range
+ this.documentSelector = documentSelector
+ }
+
+}
+
+/**
+ * The server can signal these capabilities
+ */
+@JsonRpcData
+class ServerCapabilities {
+ /**
+ * Defines how text documents are synced. Is either a detailed structure defining each notification or
+ * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to
+ * {@link TextDocumentSyncKind#None}
+ */
+ Either<TextDocumentSyncKind, TextDocumentSyncOptions> textDocumentSync
+
+ /**
+ * The server provides hover support.
+ */
+ Either<Boolean, HoverOptions> hoverProvider
+
+ /**
+ * The server provides completion support.
+ */
+ CompletionOptions completionProvider
+
+ /**
+ * The server provides signature help support.
+ */
+ SignatureHelpOptions signatureHelpProvider
+
+ /**
+ * The server provides goto definition support.
+ */
+ Either<Boolean, DefinitionOptions> definitionProvider
+
+ /**
+ * The server provides Goto Type Definition support.
+ * <p>
+ * Since 3.6.0
+ */
+ Either<Boolean, TypeDefinitionRegistrationOptions> typeDefinitionProvider
+
+ /**
+ * The server provides Goto Implementation support.
+ * <p>
+ * Since 3.6.0
+ */
+ Either<Boolean, ImplementationRegistrationOptions> implementationProvider
+
+ /**
+ * The server provides find references support.
+ */
+ Either<Boolean, ReferenceOptions> referencesProvider
+
+ /**
+ * The server provides document highlight support.
+ */
+ Either<Boolean, DocumentHighlightOptions> documentHighlightProvider
+
+ /**
+ * The server provides document symbol support.
+ */
+ Either<Boolean, DocumentSymbolOptions> documentSymbolProvider
+
+ /**
+ * The server provides workspace symbol support.
+ */
+ Either<Boolean, WorkspaceSymbolOptions> workspaceSymbolProvider
+
+ /**
+ * The server provides code actions. The {@link CodeActionOptions} return type is only
+ * valid if the client signals code action literal support via the property
+ * {@link CodeActionCapabilities#codeActionLiteralSupport}.
+ */
+ Either<Boolean, CodeActionOptions> codeActionProvider
+
+ /**
+ * The server provides code lens.
+ */
+ CodeLensOptions codeLensProvider
+
+ /**
+ * The server provides document formatting.
+ */
+ Either<Boolean, DocumentFormattingOptions> documentFormattingProvider
+
+ /**
+ * The server provides document range formatting.
+ */
+ Either<Boolean, DocumentRangeFormattingOptions> documentRangeFormattingProvider
+
+ /**
+ * The server provides document formatting on typing.
+ */
+ DocumentOnTypeFormattingOptions documentOnTypeFormattingProvider
+
+ /**
+ * The server provides rename support.
+ */
+ Either<Boolean, RenameOptions> renameProvider
+
+ /**
+ * The server provides document link support.
+ */
+ DocumentLinkOptions documentLinkProvider
+
+ /**
+ * The server provides color provider support.
+ * <p>
+ * Since 3.6.0
+ */
+ Either<Boolean, ColorProviderOptions> colorProvider
+
+ /**
+ * The server provides folding provider support.
+ * <p>
+ * Since 3.10.0
+ */
+ Either<Boolean, FoldingRangeProviderOptions> foldingRangeProvider
+
+ /**
+ * The server provides go to declaration support.
+ * <p>
+ * Since 3.14.0
+ */
+ Either<Boolean, DeclarationRegistrationOptions> declarationProvider
+
+ /**
+ * The server provides execute command support.
+ */
+ ExecuteCommandOptions executeCommandProvider
+
+ /**
+ * Workspace specific server capabilities
+ */
+ WorkspaceServerCapabilities workspace
+
+ /**
+ * Server capability for calculating super- and subtype hierarchies.
+ * The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+ @Beta
+ Either<Boolean, StaticRegistrationOptions> typeHierarchyProvider
+
+ /**
+ * The server provides Call Hierarchy support.
+ * <p>
+ * Since 3.16.0
+ */
+ Either<Boolean, CallHierarchyRegistrationOptions> callHierarchyProvider
+
+ /**
+ * The server provides selection range support.
+ * <p>
+ * Since 3.15.0
+ */
+ Either<Boolean, SelectionRangeRegistrationOptions> selectionRangeProvider
+
+ /**
+ * The server provides linked editing range support.
+ * <p>
+ * Since 3.16.0
+ */
+ Either<Boolean, LinkedEditingRangeRegistrationOptions> linkedEditingRangeProvider
+
+ /**
+ * The server provides semantic tokens support.
+ * <p>
+ * Since 3.16.0
+ */
+ SemanticTokensWithRegistrationOptions semanticTokensProvider
+
+ /**
+ * Whether server provides moniker support.
+ * <p>
+ * Since 3.16.0
+ */
+ Either<Boolean, MonikerRegistrationOptions> monikerProvider
+
+ /**
+ * Experimental server capabilities.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object experimental
+
+}
+
+/**
+ * Workspace specific server capabilities
+ */
+@JsonRpcData
+class WorkspaceServerCapabilities {
+ /**
+ * The server supports workspace folder.
+ * <p>
+ * Since 3.6.0
+ */
+ WorkspaceFoldersOptions workspaceFolders
+
+ /**
+ * The server is interested in file notifications/requests.
+ * <p>
+ * Since 3.16.0
+ */
+ FileOperationsServerCapabilities fileOperations
+
+ new() {
+ }
+
+ new(WorkspaceFoldersOptions workspaceFolders) {
+ this.workspaceFolders = workspaceFolders
+ }
+}
+
+/**
+ * The show message request is sent from a server to a client to ask the client to display a particular message in the
+ * user class. In addition to the show message notification the request allows to pass actions and to wait for an
+ * answer from the client.
+ */
+@JsonRpcData
+class ShowMessageRequestParams extends MessageParams {
+ /**
+ * The message action items to present.
+ */
+ List<MessageActionItem> actions
+
+ new() {
+ }
+
+ new(List<MessageActionItem> actions) {
+ this.actions = actions
+ }
+}
+
+/**
+ * The signature help request is sent from the client to the server to request signature information at a given cursor position.
+ */
+@JsonRpcData
+class SignatureHelpParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ /**
+ * The signature help context. This is only available if the client specifies
+ * to send this using the client capability {@link SignatureHelpCapabilities#contextSupport} as true.
+ * <p>
+ * Since 3.15.0
+ */
+ SignatureHelpContext context
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position, SignatureHelpContext context) {
+ this(textDocument, position)
+ this.context = context
+ }
+}
+
+/**
+ * The request is sent from the client to the server to resolve semantic tokens for a given whole file.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokens {
+
+ /**
+ * An optional result id. If provided and clients support delta updating
+ * the client will include the result id in the next semantic token request.
+ * A server can then instead of computing all semantic tokens again simply
+ * send a delta.
+ */
+ String resultId
+
+ /**
+ * The actual tokens.
+ */
+ @NonNull
+ List<Integer> data
+
+ new(@NonNull List<Integer> data) {
+ this.data = Preconditions.checkNotNull(data, 'data')
+ }
+
+ new(String resultId, @NonNull List<Integer> data) {
+ this(data)
+ this.resultId = resultId
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensPartialResult {
+
+ @NonNull
+ List<Integer> data
+
+ new(@NonNull List<Integer> data) {
+ this.data = Preconditions.checkNotNull(data, 'data')
+ }
+}
+
+/**
+ * The request is sent from the client to the server to resolve semantic token deltas for a given whole file.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensDeltaParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The result id of a previous response. The result Id can either point to a full response
+ * or a delta response depending on what was received last.
+ */
+ @NonNull
+ String previousResultId
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull String previousResultId) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.previousResultId = Preconditions.checkNotNull(previousResultId, 'previousResultId')
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensEdit {
+
+ /**
+ * The start offset of the edit.
+ */
+ int start
+
+ /**
+ * The count of elements to remove.
+ */
+ int deleteCount
+
+ /**
+ * The elements to insert.
+ */
+ List<Integer> data
+
+ new(int start, int deleteCount, List<Integer> data) {
+ this.start = start
+ this.deleteCount = deleteCount
+ this.data = data
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensDelta {
+
+ String resultId
+
+ /**
+ * The semantic token edits to transform a previous result into a new result.
+ */
+ @NonNull
+ List<SemanticTokensEdit> edits
+
+ new(@NonNull List<SemanticTokensEdit> edits) {
+ this.edits = Preconditions.checkNotNull(edits, 'edits')
+ }
+
+ new(@NonNull List<SemanticTokensEdit> edits, String resultId) {
+ this.edits = Preconditions.checkNotNull(edits, 'edits')
+ this.resultId = resultId
+ }
+}
+
+/**
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensDeltaPartialResult {
+
+ @NonNull
+ List<SemanticTokensEdit> edits
+
+ new(@NonNull List<SemanticTokensEdit> edits) {
+ this.edits = Preconditions.checkNotNull(edits, 'edits')
+ }
+}
+
+/**
+ * The request is sent from the client to the server to resolve semantic tokens for a range in a given file.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class SemanticTokensRangeParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The range the semantic tokens are requested for.
+ */
+ @NonNull
+ Range range
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Range range) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+}
+
+/**
+ * Additional information about the context in which a signature help request was triggered.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class SignatureHelpContext {
+ /**
+ * Action that caused signature help to be triggered.
+ */
+ @NonNull
+ SignatureHelpTriggerKind triggerKind
+
+ /**
+ * Character that caused signature help to be triggered.
+ * <p>
+ * This is undefined when {@link #triggerKind} is not {@link SignatureHelpTriggerKind#TriggerCharacter}
+ */
+ String triggerCharacter
+
+ /**
+ * {@code true} if signature help was already showing when it was triggered.
+ * <p>
+ * Retriggers occur when the signature help is already active and can be caused by actions such as
+ * typing a trigger character, a cursor move, or document content changes.
+ */
+ boolean isRetrigger
+
+ /**
+ * The currently active {@link SignatureHelp}.
+ * <p>
+ * The `activeSignatureHelp` has its {@link SignatureHelp#activeSignature} field updated based on
+ * the user navigating through available signatures.
+ */
+ SignatureHelp activeSignatureHelp
+
+ new() {
+ }
+
+ new(@NonNull SignatureHelpTriggerKind triggerKind, boolean isRetrigger) {
+ this.triggerKind = Preconditions.checkNotNull(triggerKind, 'triggerKind')
+ this.isRetrigger = isRetrigger
+ }
+}
+
+/**
+ * Signature help represents the signature of something callable. There can be multiple signature but only one
+ * active and only one active parameter.
+ */
+@JsonRpcData
+class SignatureHelp {
+ /**
+ * One or more signatures.
+ */
+ @NonNull
+ List<SignatureInformation> signatures
+
+ /**
+ * The active signature. If omitted or the value lies outside the
+ * range of {@link #signatures} the value defaults to zero or is ignored if
+ * the {@code SignatureHelp} has no signatures. Whenever possible implementors should
+ * make an active decision about the active signature and shouldn't
+ * rely on a default value.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express this.
+ */
+ Integer activeSignature
+
+ /**
+ * The active parameter of the active signature. If omitted or the value
+ * lies outside the range of {@code signatures[activeSignature].parameters}
+ * defaults to 0 if the active signature has parameters. If
+ * the active signature has no parameters it is ignored.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express the active parameter if the
+ * active signature does have any.
+ */
+ Integer activeParameter
+
+ new() {
+ this.signatures = new ArrayList
+ }
+
+ new(@NonNull List<SignatureInformation> signatures, Integer activeSignature, Integer activeParameter) {
+ this.signatures = Preconditions.checkNotNull(signatures, 'signatures')
+ this.activeSignature = activeSignature
+ this.activeParameter = activeParameter
+ }
+}
+
+/**
+ * Signature help options.
+ */
+@JsonRpcData
+class SignatureHelpOptions extends AbstractWorkDoneProgressOptions {
+
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ List<String> triggerCharacters
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ List<String> retriggerCharacters
+
+ new() {
+ }
+
+ new(List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters
+ }
+
+ new(List<String> triggerCharacters, List<String> retriggerCharacters) {
+ this(triggerCharacters)
+ this.retriggerCharacters = retriggerCharacters
+ }
+}
+
+/**
+ * Represents the signature of something callable. A signature can have a label, like a function-name, a doc-comment, and
+ * a set of parameters.
+ */
+@JsonRpcData
+class SignatureInformation {
+ /**
+ * The label of this signature. Will be shown in the UI.
+ */
+ @NonNull
+ String label
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ Either<String, MarkupContent> documentation
+
+ /**
+ * The parameters of this signature.
+ */
+ List<ParameterInformation> parameters
+
+ /**
+ * The index of the active parameter.
+ * <p>
+ * If provided, this is used in place of {@link SignatureHelp#activeParameter}.
+ * <p>
+ * Since 3.16.0
+ */
+ Integer activeParameter
+
+ new() {
+ }
+
+ new(@NonNull String label) {
+ this.label = Preconditions.checkNotNull(label, 'label')
+ }
+
+ new(@NonNull String label, String documentation, List<ParameterInformation> parameters) {
+ this(label)
+ this.documentation = documentation
+ this.parameters = parameters
+ }
+
+ new(@NonNull String label, MarkupContent documentation, List<ParameterInformation> parameters) {
+ this(label)
+ this.documentation = documentation
+ this.parameters = parameters
+ }
+}
+
+/**
+ * Representation of an item that carries type information (such as class, interface, enumeration, etc) with additional parentage details.
+ */
+@Beta
+@JsonRpcData
+class TypeHierarchyItem {
+
+ /**
+ * The human readable name of the hierarchy item.
+ */
+ @NonNull
+ String name
+
+ /**
+ * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method.
+ */
+ String detail
+
+ /**
+ * The kind of the hierarchy item. For instance, class or interface.
+ */
+ @NonNull
+ SymbolKind kind
+
+ /**
+ * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default.
+ */
+ Boolean deprecated
+
+ /**
+ * The URI of the text document where this type hierarchy item belongs to.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is inside the type
+ * hierarchy item to reveal in the symbol in the UI.
+ *
+ * @see TypeHierarchyItem#selectionRange
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function.
+ * Must be contained by the the {@link TypeHierarchyItem#getRange range}.
+ *
+ * @see TypeHierarchyItem#range
+ */
+ @NonNull
+ Range selectionRange
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any
+ * direct parents. If not defined, the parents have not been resolved yet.
+ */
+ List<TypeHierarchyItem> parents
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct children of the current item.
+ * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved.
+ */
+ List<TypeHierarchyItem> children
+
+ /**
+ * An optional data field can be used to identify a type hierarchy item in a resolve request.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+
+}
+
+/**
+ * Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document symbols can be
+ * hierarchical and they have two ranges: one that encloses its definition and one that points to its most interesting range,
+ * e.g. the range of an identifier.
+ */
+@JsonRpcData
+class DocumentSymbol {
+
+ /**
+ * The name of this symbol.
+ */
+ @NonNull
+ String name
+
+ /**
+ * The kind of this symbol.
+ */
+ @NonNull
+ SymbolKind kind
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the {@link #range}.
+ */
+ @NonNull
+ Range selectionRange
+
+ /**
+ * More detail for this symbol, e.g the signature of a function. If not provided the
+ * name is used.
+ */
+ String detail
+
+ /**
+ * Tags for this document symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ List<SymbolTag> tags
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ Boolean deprecated
+
+ /**
+ * Children of this symbol, e.g. properties of a class.
+ */
+ List<DocumentSymbol> children
+
+ new() {
+ }
+
+ new(@NonNull String name, @NonNull SymbolKind kind, @NonNull Range range, @NonNull Range selectionRange) {
+ this.name = Preconditions.checkNotNull(name, 'name')
+ this.kind = Preconditions.checkNotNull(kind, 'kind')
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.selectionRange = Preconditions.checkNotNull(selectionRange, 'selectionRange')
+ }
+
+ new(@NonNull String name, @NonNull SymbolKind kind, @NonNull Range range, @NonNull Range selectionRange,
+ String detail) {
+ this(name, kind, range, selectionRange)
+ this.detail = detail
+ }
+
+ new(@NonNull String name, @NonNull SymbolKind kind, @NonNull Range range, @NonNull Range selectionRange,
+ String detail, List<DocumentSymbol> children) {
+ this(name, kind, range, selectionRange)
+ this.detail = detail
+ this.children = children
+ }
+}
+
+/**
+ * Represents information about programming constructs like variables, classes, interfaces etc.
+ */
+@JsonRpcData
+@JsonAdapter(SymbolInformationTypeAdapter.Factory)
+class SymbolInformation {
+ /**
+ * The name of this symbol.
+ */
+ @NonNull
+ String name
+
+ /**
+ * The kind of this symbol.
+ */
+ @NonNull
+ SymbolKind kind
+
+ /**
+ * Tags for this symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ List<SymbolTag> tags
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ Boolean deprecated
+
+ /**
+ * The location of this symbol. The location's range is used by a tool
+ * to reveal the location in the editor. If the symbol is selected in the
+ * tool the range's start information is used to position the cursor. So
+ * the range usually spans more then the actual symbol's name and does
+ * normally include things like visibility modifiers.
+ * <p>
+ * The range doesn't have to denote a node range in the sense of a abstract
+ * syntax tree. It can therefore not be used to re-construct a hierarchy of
+ * the symbols.
+ */
+ @NonNull
+ Location location
+
+ /**
+ * The name of the symbol containing this symbol. This information is for
+ * user interface purposes (e.g. to render a qualifier in the user interface
+ * if necessary). It can't be used to re-infer a hierarchy for the document
+ * symbols.
+ */
+ String containerName
+
+ new() {
+ }
+
+ new(@NonNull String name, @NonNull SymbolKind kind, @NonNull Location location) {
+ this.name = Preconditions.checkNotNull(name, 'name')
+ this.kind = Preconditions.checkNotNull(kind, 'kind')
+ this.location = Preconditions.checkNotNull(location, 'location')
+ }
+
+ new(@NonNull String name, @NonNull SymbolKind kind, @NonNull Location location, String containerName) {
+ this(name, kind, location)
+ this.containerName = containerName
+ }
+}
+
+/**
+ * An event describing a change to a text document. If range and rangeLength are omitted the new text is considered
+ * to be the full content of the document.
+ */
+@JsonRpcData
+class TextDocumentContentChangeEvent {
+ /**
+ * The range of the document that changed.
+ */
+ Range range
+
+ /**
+ * The length of the range that got replaced.
+ *
+ * @deprecated Use range instead.
+ */
+ @Deprecated
+ Integer rangeLength
+
+ /**
+ * The new text of the range/document.
+ */
+ @NonNull
+ String text
+
+ new() {
+ }
+
+ new(@NonNull String text) {
+ this.text = Preconditions.checkNotNull(text, 'text')
+ }
+
+ new(Range range, Integer rangeLength, @NonNull String text) {
+ this(text)
+ this.range = range
+ this.rangeLength = rangeLength
+ }
+}
+
+/**
+ * Text documents are identified using an URI. On the protocol level URI's are passed as strings.
+ */
+@JsonRpcData
+class TextDocumentIdentifier {
+ /**
+ * The text document's uri.
+ */
+ @NonNull
+ String uri
+
+ new() {
+ }
+
+ new(@NonNull String uri) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+}
+
+/**
+ * An item to transfer a text document from the client to the server.
+ */
+@JsonRpcData
+class TextDocumentItem {
+ /**
+ * The text document's uri.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * The text document's language identifier
+ */
+ @NonNull
+ String languageId
+
+ /**
+ * The version number of this document (it will strictly increase after each change, including undo/redo).
+ */
+ int version
+
+ /**
+ * The content of the opened text document.
+ */
+ @NonNull
+ String text
+
+ new() {
+ }
+
+ new(@NonNull String uri, @NonNull String languageId, int version, @NonNull String text) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ this.languageId = Preconditions.checkNotNull(languageId, 'languageId')
+ this.version = version
+ this.text = Preconditions.checkNotNull(text, 'text')
+ }
+}
+
+/**
+ * A parameter literal used in requests to pass a text document and a position inside that document.
+ */
+@JsonRpcData
+class TextDocumentPositionParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ String uri
+
+ /**
+ * The position inside the text document.
+ */
+ @NonNull
+ Position position
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.position = Preconditions.checkNotNull(position, 'position')
+ }
+
+ @Deprecated
+ new(@NonNull TextDocumentIdentifier textDocument, String uri, @NonNull Position position) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.uri = uri
+ this.position = Preconditions.checkNotNull(position, 'position')
+ }
+}
+
+
+/**
+ * The Completion request is sent from the client to the server to compute completion items at a given cursor position.
+ */
+@JsonRpcData
+class CompletionParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ /**
+ * The completion context. This is only available if the client specifies
+ * to send this using {@link CompletionCapabilities#contextSupport} as true.
+ */
+ CompletionContext context
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position, CompletionContext context) {
+ this(textDocument, position)
+ this.context = context
+ }
+}
+
+@JsonRpcData
+class CompletionContext {
+ /**
+ * How the completion was triggered.
+ */
+ @NonNull
+ CompletionTriggerKind triggerKind
+
+ /**
+ * The trigger character (a single character) that has trigger code complete.
+ * Is undefined if {@link #triggerKind} is not {@link CompletionTriggerKind#TriggerCharacter}.
+ */
+ String triggerCharacter
+
+ new() {
+ }
+
+ new(@NonNull CompletionTriggerKind triggerKind) {
+ this.triggerKind = Preconditions.checkNotNull(triggerKind, 'triggerKind')
+ }
+
+ new(@NonNull CompletionTriggerKind triggerKind, String triggerCharacter) {
+ this(triggerKind)
+ this.triggerCharacter = triggerCharacter
+ }
+}
+
+/**
+ * A textual edit applicable to a text document.
+ */
+@JsonRpcData
+class TextEdit {
+ /**
+ * The range of the text document to be manipulated. To insert text into a document create a range where start === end.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The string to be inserted. For delete operations use an empty string.
+ */
+ @NonNull
+ String newText
+
+ new() {
+ }
+
+ new(@NonNull Range range, @NonNull String newText) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.newText = Preconditions.checkNotNull(newText, 'newText')
+ }
+}
+
+/**
+ * Additional information that describes document changes.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class ChangeAnnotation {
+ /**
+ * A human-readable string describing the actual change. The string
+ * is rendered prominent in the user interface.
+ */
+ @NonNull
+ String label
+
+ /**
+ * A flag which indicates that user confirmation is needed
+ * before applying the change.
+ */
+ Boolean needsConfirmation
+
+ /**
+ * A human-readable string which is rendered less prominent in
+ * the user interface.
+ */
+ String description
+
+ new() {
+ }
+
+ new(@NonNull String label) {
+ this.label = Preconditions.checkNotNull(label, 'label')
+ }
+}
+
+/**
+ * A special text edit with an additional change annotation.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class AnnotatedTextEdit extends TextEdit {
+ /**
+ * The actual annotation identifier
+ */
+ @NonNull
+ String annotationId
+
+ new() {
+ }
+
+ new(@NonNull Range range, @NonNull String newText, @NonNull String annotationId) {
+ super(range, newText)
+ this.annotationId = Preconditions.checkNotNull(annotationId, 'annotationId')
+ }
+}
+
+/**
+ * A special text edit to provide an insert and a replace operation.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class InsertReplaceEdit {
+ /**
+ * The string to be inserted.
+ */
+ @NonNull
+ String newText
+
+ /**
+ * The range if the insert that is requested
+ */
+ @NonNull
+ Range insert
+
+ /**
+ * The range if the replace that is requested.
+ */
+ @NonNull
+ Range replace
+
+ new() {
+ }
+
+ new(@NonNull String newText, @NonNull Range insert, @NonNull Range replace) {
+ this.newText = Preconditions.checkNotNull(newText, 'newText')
+ this.insert = Preconditions.checkNotNull(insert, 'insert')
+ this.replace = Preconditions.checkNotNull(replace, 'replace')
+ }
+}
+
+/**
+ * An identifier to denote a specific version of a text document. This information usually flows from the client to the server.
+ */
+@JsonRpcData
+@JsonAdapter(VersionedTextDocumentIdentifierTypeAdapter.Factory)
+class VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
+ /**
+ * The version number of this document. If a versioned text document identifier
+ * is sent from the server to the client and the file is not open in the editor
+ * (the server has not received an open notification before) the server can send
+ * `null` to indicate that the version is known and the content on disk is the
+ * truth (as specified with document content ownership).
+ */
+ Integer version
+
+ new() {
+ }
+
+ new(@NonNull String uri, Integer version) {
+ super(uri)
+ this.version = version
+ }
+
+ @Deprecated
+ new(Integer version) {
+ this.version = version
+ }
+}
+
+/**
+ * Describes textual changes on a single text document.
+ * The text document is referred to as a {@link VersionedTextDocumentIdentifier}
+ * to allow clients to check the text document version before an edit is applied.
+ */
+@JsonRpcData
+class TextDocumentEdit {
+ /**
+ * The text document to change.
+ */
+ @NonNull
+ VersionedTextDocumentIdentifier textDocument
+
+ /**
+ * The edits to be applied
+ */
+ @NonNull
+ List<TextEdit> edits
+
+ new() {
+ }
+
+ new(@NonNull VersionedTextDocumentIdentifier textDocument, @NonNull List<TextEdit> edits) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.edits = Preconditions.checkNotNull(edits, 'edits')
+ }
+}
+
+@JsonRpcData
+@JsonAdapter(ResourceOperationTypeAdapter)
+abstract class ResourceOperation {
+ /**
+ * The kind of resource operation. For allowed values, see {@link ResourceOperationKind}
+ */
+ @NonNull
+ String kind
+
+ /**
+ * An optional annotation identifer describing the operation.
+ * <p>
+ * Since 3.16.0
+ */
+ String annotationId
+
+ new() {
+ }
+
+ new(@NonNull String kind) {
+ this.kind = Preconditions.checkNotNull(kind, 'kind')
+ }
+}
+
+/**
+ * Options to create a file.
+ */
+@JsonRpcData
+class CreateFileOptions {
+ /**
+ * Overwrite existing file. Overwrite wins over {@link #ignoreIfExists}
+ */
+ Boolean overwrite
+
+ /**
+ * Ignore if exists.
+ */
+ Boolean ignoreIfExists
+
+ new() {
+ }
+
+ new(Boolean overwrite, Boolean ignoreIfExists) {
+ this.overwrite = overwrite
+ this.ignoreIfExists = ignoreIfExists
+ }
+}
+
+/**
+ * Create file operation
+ */
+@JsonRpcData
+class CreateFile extends ResourceOperation {
+ /**
+ * The resource to create.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * Additional options
+ */
+ CreateFileOptions options
+
+ new() {
+ super(ResourceOperationKind.Create)
+ }
+
+ new(@NonNull String uri) {
+ super(ResourceOperationKind.Create)
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+
+ new(@NonNull String uri, CreateFileOptions options) {
+ this(uri)
+ this.options = options
+ }
+}
+
+/**
+ * Rename file options
+ */
+@JsonRpcData
+class RenameFileOptions {
+ /**
+ * Overwrite target if existing. Overwrite wins over {@link #ignoreIfExists}
+ */
+ Boolean overwrite
+
+ /**
+ * Ignores if target exists.
+ */
+ Boolean ignoreIfExists
+
+ new() {
+ }
+
+ new(Boolean overwrite, Boolean ignoreIfExists) {
+ this.overwrite = overwrite
+ this.ignoreIfExists = ignoreIfExists
+ }
+}
+
+/**
+ * Rename file operation
+ */
+@JsonRpcData
+class RenameFile extends ResourceOperation {
+ /**
+ * The old (existing) location.
+ */
+ @NonNull
+ String oldUri
+
+ /**
+ * The new location.
+ */
+ @NonNull
+ String newUri
+
+ /**
+ * Rename options.
+ */
+ RenameFileOptions options
+
+ new() {
+ super(ResourceOperationKind.Rename)
+ }
+
+ new(@NonNull String oldUri, @NonNull String newUri) {
+ super(ResourceOperationKind.Rename)
+ this.oldUri = Preconditions.checkNotNull(oldUri, 'oldUri')
+ this.newUri = Preconditions.checkNotNull(newUri, 'newUri')
+ }
+
+ new(@NonNull String oldUri, @NonNull String newUri, RenameFileOptions options) {
+ this(oldUri, newUri)
+ this.options = options
+ }
+}
+
+/**
+ * Delete file options
+ */
+@JsonRpcData
+class DeleteFileOptions {
+ /**
+ * Delete the content recursively if a folder is denoted.
+ */
+ Boolean recursive
+
+ /**
+ * Ignore the operation if the file doesn't exist.
+ */
+ Boolean ignoreIfNotExists
+
+ new() {
+ }
+
+ new(Boolean recursive, Boolean ignoreIfNotExists) {
+ this.recursive = recursive
+ this.ignoreIfNotExists = ignoreIfNotExists
+ }
+}
+
+/**
+ * Delete file operation
+ */
+@JsonRpcData
+class DeleteFile extends ResourceOperation {
+ /**
+ * The file to delete.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * Delete options.
+ */
+ DeleteFileOptions options
+
+ new() {
+ super(ResourceOperationKind.Delete)
+ }
+
+ new(@NonNull String uri) {
+ super(ResourceOperationKind.Delete)
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+
+ new(@NonNull String uri, DeleteFileOptions options) {
+ this(uri)
+ this.options = options
+ }
+}
+
+/**
+ * A resource change.
+ * <p><ul>
+ * <li>If both current and newUri has valid values this is considered to be a move operation.
+ * <li>If current has a valid value while newUri is null it is treated as a delete operation.
+ * <li>If current is null and newUri has a valid value a create operation is executed.
+ * </ul>
+ *
+ * @deprecated As LSP introduces resource operation, use the {@link ResourceOperation} instead.
+ */
+@JsonRpcData
+@Beta
+@Deprecated
+class ResourceChange {
+
+ /**
+ * The Uri for current resource. Required for delete and move operations
+ * otherwise it is null.
+ */
+ String current
+
+ /**
+ * The new uri for the resource. Required for create and move operations.
+ * otherwise null.
+ * <p>
+ * Must be compatible with the current uri ie. must be a file
+ * uri if current is not null and is a file uri.
+ */
+ String newUri
+
+}
+
+/**
+ * A workspace edit represents changes to many resources managed in the workspace.
+ * The edit should either provide {@link #changes} or {@link #documentChanges}.
+ * If documentChanges are present they are preferred over changes
+ * if the client can handle versioned document edits.
+ */
+@JsonRpcData
+class WorkspaceEdit {
+ /**
+ * Holds changes to existing resources.
+ */
+ Map<String, List<TextEdit>> changes
+
+ /**
+ * Depending on the client capability
+ * {@link WorkspaceEditCapabilities#resourceOperations} document changes are either
+ * an array of {@link TextDocumentEdit}s to express changes to n different text
+ * documents where each text document edit addresses a specific version of
+ * a text document. Or it can contain above {@link TextDocumentEdit}s mixed with
+ * create, rename and delete file / folder operations.
+ * <p>
+ * Whether a client supports versioned document edits is expressed via
+ * {@link WorkspaceEditCapabilities#documentChanges} client capability.
+ * <p>
+ * If a client neither supports {@link WorkspaceEditCapabilities#documentChanges} nor
+ * {@link WorkspaceEditCapabilities#resourceOperations} then only plain {@link TextEdit}s
+ * using the {@link #changes} property are supported.
+ */
+ @JsonAdapter(DocumentChangeListAdapter)
+ List<Either<TextDocumentEdit, ResourceOperation>> documentChanges
+
+ /**
+ * If resource changes are supported the `WorkspaceEdit`
+ * uses the property `resourceChanges` which are either a
+ * rename, move, delete or content change.
+ * <p>
+ * These changes are applied in the order that they are supplied,
+ * however clients may group the changes for optimization
+ *
+ * @deprecated Since LSP introduces resource operations, use the {@link #documentChanges} instead
+ */
+ @Beta
+ @JsonAdapter(ResourceChangeListAdapter)
+ @Deprecated
+ List<Either<ResourceChange, TextDocumentEdit>> resourceChanges
+
+ /**
+ * A map of change annotations that can be referenced in
+ * {@link AnnotatedTextEdit}s or {@link ResourceOperation}s.
+ * <p>
+ * Client support depends on {@link WorkspaceEditCapabilities#changeAnnotationSupport}.
+ * <p>
+ * Since 3.16.0
+ */
+ Map<String, ChangeAnnotation> changeAnnotations
+
+ new() {
+ this.changes = new LinkedHashMap
+ }
+
+ new(Map<String, List<TextEdit>> changes) {
+ this.changes = changes
+ }
+
+ new(List<Either<TextDocumentEdit, ResourceOperation>> documentChanges) {
+ this.documentChanges = documentChanges
+ }
+}
+
+
+/**
+ * The options of a Workspace Symbol Request.
+ */
+@JsonRpcData
+class WorkspaceSymbolOptions extends AbstractWorkDoneProgressOptions {
+
+}
+
+/**
+ * The options of a Workspace Symbol Registration Request.
+ */
+@JsonRpcData
+class WorkspaceSymbolRegistrationOptions extends WorkspaceSymbolOptions {
+}
+
+
+/**
+ * The parameters of a Workspace Symbol Request.
+ */
+@JsonRpcData
+class WorkspaceSymbolParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * A query string to filter symbols by. Clients may send an empty
+ * string here to request all symbols.
+ */
+ @NonNull
+ String query
+
+ new() {
+ }
+
+ new(@NonNull String query) {
+ this.query = Preconditions.checkNotNull(query, 'query')
+ }
+}
+
+/**
+ * General parameters to register for a capability.
+ */
+@JsonRpcData
+class Registration {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again.
+ */
+ @NonNull
+ String id
+
+ /**
+ * The method / capability to register for.
+ */
+ @NonNull
+ String method
+
+ /**
+ * Options necessary for the registration.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object registerOptions
+
+ new() {
+ }
+
+ new(@NonNull String id, @NonNull String method) {
+ this.id = Preconditions.checkNotNull(id, 'id')
+ this.method = Preconditions.checkNotNull(method, 'method')
+ }
+
+ new(@NonNull String id, @NonNull String method, Object registerOptions) {
+ this(id, method)
+ this.registerOptions = registerOptions
+ }
+}
+
+/**
+ * The client/registerCapability request is sent from the server to the client to register
+ * for a new capability on the client side. Not all clients need to support dynamic
+ * capability registration. A client opts in via the dynamicRegistration property on the
+ * specific client capabilities. A client can even provide dynamic registration for
+ * capability A but not for capability B (see TextDocumentClientCapabilities as an example).
+ */
+@JsonRpcData
+class RegistrationParams {
+ @NonNull
+ List<Registration> registrations
+
+ new() {
+ this(new ArrayList)
+ }
+
+ new(@NonNull List<Registration> registrations) {
+ this.registrations = Preconditions.checkNotNull(registrations, 'registrations')
+ }
+}
+
+/**
+ * A document filter denotes a document through properties like language, schema or pattern.
+ */
+@JsonRpcData
+class DocumentFilter {
+ /**
+ * A language id, like `typescript`.
+ */
+ String language
+
+ /**
+ * A uri scheme, like `file` or `untitled`.
+ */
+ String scheme
+
+ /**
+ * A glob pattern, like `*.{ts,js}`.
+ */
+ String pattern
+
+ new() {
+ }
+
+ new(String language, String scheme, String pattern) {
+ this.language = language
+ this.scheme = scheme
+ this.pattern = pattern
+ }
+}
+
+/**
+ * Since most of the registration options require to specify a document selector there is
+ * a base interface that can be used.
+ */
+@JsonRpcData
+class TextDocumentRegistrationOptions {
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ List<DocumentFilter> documentSelector
+
+ new() {
+ }
+
+ new(List<DocumentFilter> documentSelector) {
+ this.documentSelector = documentSelector
+ }
+}
+
+/**
+ * General parameters to unregister a capability.
+ */
+@JsonRpcData
+class Unregistration {
+ /**
+ * The id used to unregister the request or notification. Usually an id
+ * provided during the register request.
+ */
+ @NonNull
+ String id
+
+ /**
+ * The method / capability to unregister for.
+ */
+ @NonNull
+ String method
+
+ new() {
+ }
+
+ new(@NonNull String id, @NonNull String method) {
+ this.id = Preconditions.checkNotNull(id, 'id')
+ this.method = Preconditions.checkNotNull(method, 'method')
+ }
+}
+
+/**
+ * The client/unregisterCapability request is sent from the server to the client to unregister
+ * a previously registered capability.
+ */
+@JsonRpcData
+class UnregistrationParams {
+ // This is a known misspelling in the spec and is intended to be fixed in LSP 4.x
+ @NonNull
+ List<Unregistration> unregisterations
+
+ new() {
+ this(new ArrayList)
+ }
+
+ new(@NonNull List<Unregistration> unregisterations) {
+ this.unregisterations = Preconditions.checkNotNull(unregisterations, 'unregisterations')
+ }
+}
+
+/**
+ * Describe options to be used when registered for text document change events.
+ */
+@JsonRpcData
+class TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * How documents are synced to the server. See TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ @NonNull
+ TextDocumentSyncKind syncKind
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentSyncKind syncKind) {
+ this.syncKind = Preconditions.checkNotNull(syncKind, 'syncKind')
+ }
+}
+
+@JsonRpcData
+class TextDocumentSaveRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * The client is supposed to include the content on save.
+ */
+ Boolean includeText
+
+ new() {
+ }
+
+ new(Boolean includeText) {
+ this.includeText = includeText
+ }
+}
+
+@JsonRpcData
+class CompletionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * Most tools trigger completion request automatically without explicitly requesting
+ * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
+ * starts to type an identifier. For example if the user types `c` in a JavaScript file
+ * code complete will automatically pop up present `console` besides others as a
+ * completion item. Characters that make up identifiers don't need to be listed here.
+ * <p>
+ * If code complete should automatically be trigger on characters not being valid inside
+ * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+ */
+ List<String> triggerCharacters
+
+ /**
+ * The server provides support to resolve additional information for a completion item.
+ */
+ Boolean resolveProvider
+
+ /**
+ * The list of all possible characters that commit a completion. This field
+ * can be used if clients don't support individual commit characters per
+ * completion item. See client capability
+ * {@link CompletionItemCapabilities#commitCharactersSupport}.
+ * <p>
+ * If a server provides both {@code allCommitCharacters} and commit characters on
+ * an individual completion item the ones on the completion item win.
+ * <p>
+ * Since 3.2.0
+ */
+ List<String> allCommitCharacters
+
+ new() {
+ }
+
+ new(List<String> triggerCharacters, Boolean resolveProvider) {
+ this.triggerCharacters = triggerCharacters
+ this.resolveProvider = resolveProvider
+ }
+}
+
+@JsonRpcData
+class SignatureHelpRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ List<String> triggerCharacters
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ List<String> retriggerCharacters
+
+ new() {
+ }
+
+ new(List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters
+ }
+
+ new(List<String> triggerCharacters, List<String> retriggerCharacters) {
+ this(triggerCharacters)
+ this.retriggerCharacters = retriggerCharacters
+ }
+}
+
+@JsonRpcData
+class CodeLensRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * Code lens has a resolve provider as well.
+ */
+ Boolean resolveProvider
+
+ new() {
+ }
+
+ new(Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider
+ }
+}
+
+@JsonRpcData
+class DocumentLinkRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * Document links have a resolve provider as well.
+ */
+ Boolean resolveProvider
+
+ new() {
+ }
+
+ new(Boolean resolveProvider) {
+ this.resolveProvider = resolveProvider
+ }
+}
+
+@JsonRpcData
+class DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * A character on which formatting should be triggered, like `}`.
+ */
+ @NonNull
+ String firstTriggerCharacter
+
+ /**
+ * More trigger characters.
+ */
+ List<String> moreTriggerCharacter
+
+ new() {
+ }
+
+ new(@NonNull String firstTriggerCharacter) {
+ this.firstTriggerCharacter = Preconditions.checkNotNull(firstTriggerCharacter, 'firstTriggerCharacter')
+ }
+
+ new(@NonNull String firstTriggerCharacter, List<String> moreTriggerCharacter) {
+ this(firstTriggerCharacter)
+ this.moreTriggerCharacter = moreTriggerCharacter
+ }
+}
+
+/**
+ * The workspace/executeCommand request is sent from the client to the server to trigger command
+ * execution on the server. In most cases the server creates a WorkspaceEdit structure and applies
+ * the changes to the workspace using the request workspace/applyEdit which is sent from the server
+ * to the client.
+ */
+@JsonRpcData
+class ExecuteCommandParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> workDoneToken
+
+ /**
+ * The identifier of the actual command handler.
+ */
+ @NonNull
+ String command
+
+ /**
+ * Arguments that the command should be invoked with.
+ * The arguments are typically specified when a command is returned from the server to the client.
+ * Example requests that return a command are textDocument/codeAction or textDocument/codeLens.
+ */
+ List<Object> arguments
+
+ new() {
+ }
+
+ new(@NonNull String command, List<Object> arguments) {
+ this.command = Preconditions.checkNotNull(command, 'command')
+ this.arguments = arguments
+ }
+
+ new(@NonNull String command, List<Object> arguments, Either<String, Integer> workDoneToken) {
+ this(command, arguments)
+ this.workDoneToken = workDoneToken
+ }
+}
+
+/**
+ * Execute command registration options.
+ */
+@JsonRpcData
+class ExecuteCommandRegistrationOptions extends ExecuteCommandOptions {
+}
+
+/**
+ * The workspace/applyEdit request is sent from the server to the client to modify resource on the client side.
+ */
+@JsonRpcData
+class ApplyWorkspaceEditParams {
+ /**
+ * The edits to apply.
+ */
+ @NonNull
+ WorkspaceEdit edit
+
+ /**
+ * An optional label of the workspace edit. This label is
+ * presented in the user interface for example on an undo
+ * stack to undo the workspace edit.
+ */
+ String label
+
+ new() {
+ }
+
+ new(@NonNull WorkspaceEdit edit) {
+ this.edit = Preconditions.checkNotNull(edit, 'edit')
+ }
+
+ new(@NonNull WorkspaceEdit edit, String label) {
+ this(edit)
+ this.label = label
+ }
+}
+
+@JsonRpcData
+class ApplyWorkspaceEditResponse {
+ /**
+ * Indicates whether the edit was applied or not.
+ */
+ boolean applied
+
+ /**
+ * An optional textual description for why the edit was not applied.
+ * This may be used by the server for diagnostic logging or to provide
+ * a suitable error for a request that triggered the edit.
+ */
+ String failureReason
+
+ /**
+ * Depending on the client's failure handling strategy `failedChange`
+ * might contain the index of the change that failed. This property is
+ * only available if the client signals a {@link WorkspaceEditCapabilities#failureHandling}
+ * strategy in its client capabilities.
+ */
+ Integer failedChange
+
+ new() {
+ }
+
+ new(boolean applied) {
+ this.applied = applied
+ }
+}
+
+/**
+ * The server supports workspace folder.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class WorkspaceFoldersOptions {
+ /**
+ * The server has support for workspace folders
+ */
+ Boolean supported
+
+ /**
+ * Whether the server wants to receive workspace folder
+ * change notifications.
+ * <p>
+ * If a string is provided, the string is treated as an ID
+ * under which the notification is registered on the client
+ * side. The ID can be used to unregister for these events
+ * using the `client/unregisterCapability` request.
+ */
+ Either<String, Boolean> changeNotifications
+}
+
+/**
+ * The workspace/workspaceFolders request is sent from the server to the client to fetch
+ * the current open list of workspace folders. Returns null in the response if only a single
+ * file is open in the tool. Returns an empty array if a workspace is open but no folders
+ * are configured.
+ */
+@JsonRpcData
+class WorkspaceFolder {
+ /**
+ * The associated URI for this workspace folder.
+ */
+ @NonNull String uri
+
+ /**
+ * The name of the workspace folder. Defaults to the uri's basename.
+ */
+ String name
+
+ new() {
+ }
+
+ new(@NonNull String uri) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+
+ new(@NonNull String uri, String name) {
+ this(uri)
+ this.name = name
+ }
+}
+
+/**
+ * The workspace folder change event.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class WorkspaceFoldersChangeEvent {
+ /**
+ * The array of added workspace folders
+ */
+ @NonNull
+ List<WorkspaceFolder> added = new ArrayList
+
+ /**
+ * The array of the removed workspace folders
+ */
+ @NonNull
+ List<WorkspaceFolder> removed = new ArrayList
+
+ new() {
+ }
+
+ new(@NonNull List<WorkspaceFolder> added, @NonNull List<WorkspaceFolder> removed) {
+ this.added = Preconditions.checkNotNull(added, 'added')
+ this.removed = Preconditions.checkNotNull(removed, 'removed')
+ }
+}
+
+/**
+ * The workspace/didChangeWorkspaceFolders notification is sent from the client to the server to
+ * inform the server about workspace folder configuration changes. The notification is sent by
+ * default if both ServerCapabilities/workspace/workspaceFolders and
+ * ClientCapabilities/workspace/workspaceFolders are true; or if the server has registered to
+ * receive this notification it first.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class DidChangeWorkspaceFoldersParams {
+ /**
+ * The actual workspace folder change event.
+ */
+ @NonNull
+ WorkspaceFoldersChangeEvent event
+
+ new() {
+ }
+
+ new(@NonNull WorkspaceFoldersChangeEvent event) {
+ this.event = Preconditions.checkNotNull(event, 'event')
+ }
+}
+
+/**
+ * The server is interested in file notifications/requests.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileOperationsServerCapabilities {
+ /**
+ * The server is interested in receiving didCreateFiles notifications.
+ */
+ FileOperationOptions didCreate
+
+ /**
+ * The server is interested in receiving willCreateFiles requests.
+ */
+ FileOperationOptions willCreate
+
+ /**
+ * The server is interested in receiving didRenameFiles notifications.
+ */
+ FileOperationOptions didRename
+
+ /**
+ * The server is interested in receiving willRenameFiles requests.
+ */
+ FileOperationOptions willRename
+
+ /**
+ * The server is interested in receiving didDeleteFiles file notifications.
+ */
+ FileOperationOptions didDelete
+
+ /**
+ * The server is interested in receiving willDeleteFiles file requests.
+ */
+ FileOperationOptions willDelete
+
+ new() {
+ }
+}
+
+/**
+ * The options for file operations.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileOperationOptions {
+ /**
+ * The actual filters.
+ */
+ @NonNull
+ List<FileOperationFilter> filters = new ArrayList
+
+ new() {
+ }
+
+ new(@NonNull List<FileOperationFilter> filters) {
+ this.filters = Preconditions.checkNotNull(filters, 'filters')
+ }
+}
+
+/**
+ * A filter to describe in which file operation requests or notifications
+ * the server is interested in.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileOperationFilter {
+ /**
+ * The actual file operation pattern.
+ */
+ @NonNull
+ FileOperationPattern pattern
+
+ /**
+ * A Uri like {@code file} or {@code untitled}.
+ */
+ String scheme
+
+ new() {
+ }
+
+ new(@NonNull FileOperationPattern pattern) {
+ this.pattern = Preconditions.checkNotNull(pattern, 'pattern')
+ }
+
+ new(@NonNull FileOperationPattern pattern, String scheme) {
+ this(pattern)
+ this.scheme = scheme
+ }
+}
+
+/**
+ * A pattern to describe in which file operation requests or notifications
+ * the server is interested in.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileOperationPattern {
+ /**
+ * The glob pattern to match. Glob patterns can have the following syntax:
+ * <ul>
+ * <li>`*` to match one or more characters in a path segment
+ * <li>`?` to match on one character in a path segment
+ * <li>`**` to match any number of path segments, including none
+ * <li>`{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
+ * <li>`[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+ * <li>`[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+ * </ul>
+ */
+ @NonNull
+ String glob
+
+ /**
+ * Whether to match files or folders with this pattern.
+ * <p>
+ * Matches both if undefined.
+ * <p>
+ * See {@link FileOperationPatternKind} for allowed values.
+ */
+ String matches
+
+ /**
+ * Additional options used during matching.
+ */
+ FileOperationPatternOptions options
+
+ new() {
+ }
+
+ new(@NonNull String glob) {
+ this.glob = Preconditions.checkNotNull(glob, 'glob')
+ }
+}
+
+/**
+ * Matching options for the file operation pattern.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileOperationPatternOptions {
+ /**
+ * The pattern should be matched ignoring casing.
+ */
+ Boolean ignoreCase
+
+ new() {
+ }
+
+ new(Boolean ignoreCase) {
+ this.ignoreCase = ignoreCase
+ }
+}
+
+/**
+ * The parameters sent in notifications/requests for user-initiated creation
+ * of files.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CreateFilesParams {
+ /**
+ * An array of all files/folders created in this operation.
+ */
+ @NonNull
+ List<FileCreate> files = new ArrayList
+
+ new() {
+ }
+
+ new(@NonNull List<FileCreate> files) {
+ this.files = Preconditions.checkNotNull(files, 'files')
+ }
+}
+
+/**
+ * Represents information on a file/folder create.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileCreate {
+ /**
+ * A file:// URI for the location of the file/folder being created.
+ */
+ @NonNull
+ String uri
+
+ new() {
+ }
+
+ new(@NonNull String uri) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+}
+
+/**
+ * The parameters sent in notifications/requests for user-initiated renames
+ * of files.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class RenameFilesParams {
+ /**
+ * An array of all files/folders renamed in this operation. When a folder
+ * is renamed, only the folder will be included, and not its children.
+ */
+ @NonNull
+ List<FileRename> files = new ArrayList
+
+ new() {
+ }
+
+ new(@NonNull List<FileRename> files) {
+ this.files = Preconditions.checkNotNull(files, 'files')
+ }
+}
+
+/**
+ * Represents information on a file/folder rename.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileRename {
+ /**
+ * A file:// URI for the original location of the file/folder being renamed.
+ */
+ @NonNull
+ String oldUri
+
+ /**
+ * A file:// URI for the new location of the file/folder being renamed.
+ */
+ @NonNull
+ String newUri
+
+ new() {
+ }
+
+ new(@NonNull String oldUri, @NonNull String newUri) {
+ this.oldUri = Preconditions.checkNotNull(oldUri, 'oldUri')
+ this.newUri = Preconditions.checkNotNull(newUri, 'newUri')
+ }
+}
+
+/**
+ * The parameters sent in notifications/requests for user-initiated deletes
+ * of files.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class DeleteFilesParams {
+ /**
+ * An array of all files/folders deleted in this operation.
+ */
+ @NonNull
+ List<FileDelete> files = new ArrayList
+
+ new() {
+ }
+
+ new(@NonNull List<FileDelete> files) {
+ this.files = Preconditions.checkNotNull(files, 'files')
+ }
+}
+
+/**
+ * Represents information on a file/folder delete.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class FileDelete {
+ /**
+ * A file:// URI for the location of the file/folder being deleted.
+ */
+ @NonNull
+ String uri
+
+ new() {
+ }
+
+ new(@NonNull String uri) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+}
+
+/**
+ * The workspace/configuration request is sent from the server to the client to fetch configuration
+ * settings from the client. The request can fetch several configuration settings in one roundtrip.
+ * The order of the returned configuration settings correspond to the order of the passed
+ * {@link ConfigurationItem}s (e.g. the first item in the response is the result for the first
+ * configuration item in the params).
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class ConfigurationParams {
+ @NonNull
+ List<ConfigurationItem> items
+
+ new() {
+ }
+
+ new(@NonNull List<ConfigurationItem> items) {
+ this.items = Preconditions.checkNotNull(items, 'items')
+ }
+}
+
+/**
+ * A ConfigurationItem consist of the configuration section to ask for and an additional scope URI.
+ * The configuration section asked for is defined by the server and doesn’t necessarily need to
+ * correspond to the configuration store used by the client. So a server might ask for a configuration
+ * {@code cpp.formatterOptions} but the client stores the configuration in an XML store layout differently.
+ * It is up to the client to do the necessary conversion. If a scope URI is provided the client
+ * should return the setting scoped to the provided resource. If the client for example uses
+ * EditorConfig to manage its settings the configuration should be returned for the passed resource
+ * URI. If the client can't provide a configuration setting for a given scope then null needs to be
+ * present in the returned array.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class ConfigurationItem {
+ /**
+ * The scope to get the configuration section for.
+ */
+ String scopeUri
+
+ /**
+ * The configuration section asked for.
+ */
+ String section
+}
+
+/**
+ * The document color request is sent from the client to the server to list all color references
+ * found in a given text document. Along with the range, a color value in RGB is returned.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class DocumentColorParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+@JsonRpcData
+class ColorInformation {
+ /**
+ * The range in the document where this color appears.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The actual color value for this color range.
+ */
+ @NonNull
+ Color color
+
+ new() {
+ }
+
+ new(@NonNull Range range, @NonNull Color color) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.color = Preconditions.checkNotNull(color, 'color')
+ }
+}
+
+/**
+ * Represents a color in RGBA space.
+ */
+@JsonRpcData
+class Color {
+ /**
+ * The red component of this color in the range [0-1].
+ */
+ double red
+
+ /**
+ * The green component of this color in the range [0-1].
+ */
+ double green
+
+ /**
+ * The blue component of this color in the range [0-1].
+ */
+ double blue
+
+ /**
+ * The alpha component of this color in the range [0-1].
+ */
+ double alpha
+
+ new() {
+ }
+
+ new(double red, double green, double blue, double alpha) {
+ this.red = red
+ this.green = green
+ this.blue = blue
+ this.alpha = alpha
+ }
+}
+
+/**
+ * The color presentation request is sent from the client to the server to obtain a list of presentations
+ * for a color value at a given location.
+ * <p>
+ * Since 3.6.0
+ */
+@JsonRpcData
+class ColorPresentationParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The color information to request presentations for.
+ */
+ @NonNull
+ Color color
+
+ /**
+ * The range where the color would be inserted. Serves as a context.
+ */
+ @NonNull
+ Range range
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Color color, @NonNull Range range) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.color = Preconditions.checkNotNull(color, 'color')
+ this.range = Preconditions.checkNotNull(range, 'range')
+ }
+}
+
+@JsonRpcData
+class ColorPresentation {
+ /**
+ * The label of this color presentation. It will be shown on the color
+ * picker header. By default this is also the text that is inserted when selecting
+ * this color presentation.
+ */
+ @NonNull
+ String label
+
+ /**
+ * An edit which is applied to a document when selecting
+ * this presentation for the color. When `null` the label is used.
+ */
+ TextEdit textEdit
+
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this color presentation. Edits must not overlap with the main edit nor with themselves.
+ */
+ List<TextEdit> additionalTextEdits
+
+ new() {
+ }
+
+ new(@NonNull String label) {
+ this.label = Preconditions.checkNotNull(label, 'label')
+ }
+
+ new(@NonNull String label, TextEdit textEdit) {
+ this(label)
+ this.textEdit = textEdit
+ }
+
+ new(@NonNull String label, TextEdit textEdit, List<TextEdit> additionalTextEdits) {
+ this(label)
+ this.textEdit = textEdit
+ this.additionalTextEdits = additionalTextEdits
+ }
+}
+
+/**
+ * The folding range request is sent from the client to the server to return all folding
+ * ranges found in a given text document.
+ */
+@JsonRpcData
+class FoldingRangeRequestParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ }
+}
+
+/**
+ * Represents a folding range.
+ */
+@JsonRpcData
+class FoldingRange {
+
+ /**
+ * The zero-based line number from where the folded range starts.
+ */
+ int startLine
+
+ /**
+ * The zero-based line number where the folded range ends.
+ */
+ int endLine
+
+ /**
+ * The zero-based character offset from where the folded range starts. If not defined, defaults
+ * to the length of the start line.
+ */
+ Integer startCharacter
+
+ /**
+ * The zero-based character offset before the folded range ends. If not defined, defaults to the
+ * length of the end line.
+ */
+ Integer endCharacter
+
+ /**
+ * Describes the kind of the folding range such as {@link FoldingRangeKind#Comment} or {@link FoldingRangeKind#Region}.
+ * The kind is used to categorize folding ranges and used by commands like 'Fold all comments'.
+ * See {@link FoldingRangeKind} for an enumeration of standardized kinds.
+ */
+ String kind
+
+ new() {
+ }
+
+ new(int startLine, int endLine) {
+ this.startLine = startLine
+ this.endLine = endLine
+ }
+}
+
+/**
+ * The parameter of a `textDocument/prepareCallHierarchy` request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyPrepareParams extends TextDocumentPositionAndWorkDoneProgressParams {
+
+}
+
+/**
+ * The parameter of a `callHierarchy/incomingCalls` request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyIncomingCallsParams extends WorkDoneProgressAndPartialResultParams {
+ @NonNull
+ CallHierarchyItem item
+
+ new() {
+ }
+
+ new(@NonNull CallHierarchyItem item) {
+ this.item = Preconditions.checkNotNull(item, 'item')
+ }
+}
+
+/**
+ * The parameter of a `callHierarchy/outgoingCalls` request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyOutgoingCallsParams extends WorkDoneProgressAndPartialResultParams {
+ @NonNull
+ CallHierarchyItem item
+
+ new() {
+ }
+
+ new(@NonNull CallHierarchyItem item) {
+ this.item = Preconditions.checkNotNull(item, 'item')
+ }
+}
+
+/**
+ * Represents an incoming call, e.g. a caller of a method or constructor.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyIncomingCall {
+ /**
+ * The item that makes the call.
+ */
+ @NonNull
+ CallHierarchyItem from
+
+ /**
+ * The range at which at which the calls appears. This is relative to the caller
+ * denoted by {@link #from}.
+ */
+ @NonNull
+ List<Range> fromRanges
+
+ new() {
+ }
+
+ new(@NonNull CallHierarchyItem from, @NonNull List<Range> fromRanges) {
+ this.from = Preconditions.checkNotNull(from, 'from')
+ this.fromRanges = Preconditions.checkNotNull(fromRanges, 'fromRanges')
+ }
+}
+
+/**
+ * Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyOutgoingCall {
+ /**
+ * The item that is called.
+ */
+ @NonNull
+ CallHierarchyItem to
+
+ /**
+ * The range at which this item is called. This is the range relative to the caller, i.e. the {@link CallHierarchyOutgoingCallsParams#item}.
+ */
+ @NonNull
+ List<Range> fromRanges
+
+ new() {
+ }
+
+ new(@NonNull CallHierarchyItem to, @NonNull List<Range> fromRanges) {
+ this.to = Preconditions.checkNotNull(to, 'to')
+ this.fromRanges = Preconditions.checkNotNull(fromRanges, 'fromRanges')
+ }
+}
+
+/**
+ * The result of a {@code textDocument/prepareCallHierarchy} request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class CallHierarchyItem {
+ /**
+ * The name of the item targeted by the call hierarchy request.
+ */
+ @NonNull
+ String name
+
+ /**
+ * More detail for this item, e.g the signature of a function.
+ */
+ String detail
+
+ /**
+ * The kind of this item.
+ */
+ @NonNull
+ SymbolKind kind
+
+ /**
+ * Tags for this item.
+ */
+ List<SymbolTag> tags
+
+ /**
+ * The resource identifier of this item.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * The range enclosing this symbol not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the the clients cursor is
+ * inside the symbol to reveal in the symbol in the UI.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+ * Must be contained by the the {@link CallHierarchyItem#getRange range}.
+ */
+ @NonNull
+ Range selectionRange
+
+ /**
+ * A data entry field that is preserved between a call hierarchy prepare and
+ * incoming calls or outgoing calls requests.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory)
+ Object data
+}
+
+/**
+ * A parameter literal used in selection range requests.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class SelectionRangeParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ TextDocumentIdentifier textDocument
+
+ /**
+ * The positions inside the text document.
+ */
+ @NonNull
+ List<Position> positions
+
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull List<Position> positions) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, 'textDocument')
+ this.positions = Preconditions.checkNotNull(positions, 'positions')
+ }
+}
+
+/**
+ * Selection range options.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class SelectionRangeOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Selection range registration options.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class SelectionRangeRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * A selection range represents a part of a selection hierarchy. A selection range
+ * may have a parent selection range that contains it.
+ * <p>
+ * Since 3.15.0
+ */
+@JsonRpcData
+class SelectionRange {
+
+ /**
+ * The range of this selection range.
+ */
+ @NonNull
+ Range range
+
+ /**
+ * The parent selection range containing this range. Therefore `parent.range` must contain {@link #range}.
+ */
+ SelectionRange parent
+
+ new() {
+ }
+
+ new(@NonNull Range range, SelectionRange parent) {
+ this.range = Preconditions.checkNotNull(range, 'range')
+ this.parent = parent
+ }
+}
+
+/**
+ * Hover options.
+ */
+@JsonRpcData
+class HoverOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Hover registration options.
+ */
+@JsonRpcData
+class HoverRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * The hover request is sent from the client to the server to request hover information at a given
+ * text document position.
+ */
+@JsonRpcData
+class HoverParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+@JsonRpcData
+class DeclarationOptions extends AbstractWorkDoneProgressOptions {
+}
+
+@JsonRpcData
+class DeclarationRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * The go to declaration request is sent from the client to the server to resolve the declaration
+ * location of a symbol at a given text document position.
+ */
+@JsonRpcData
+class DeclarationParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+@JsonRpcData
+class DefinitionOptions extends AbstractWorkDoneProgressOptions {
+}
+
+@JsonRpcData
+class DefinitionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * The go to definition request is sent from the client to the server to resolve the definition
+ * location of a symbol at a given text document position.
+ */
+@JsonRpcData
+class DefinitionParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+@JsonRpcData
+class TypeDefinitionOptions extends AbstractWorkDoneProgressOptions {
+}
+
+@JsonRpcData
+class TypeDefinitionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * The go to type definition request is sent from the client to the server to resolve the type definition
+ * location of a symbol at a given text document position.
+ */
+@JsonRpcData
+class TypeDefinitionParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+@JsonRpcData
+class ImplementationOptions extends AbstractWorkDoneProgressOptions {
+}
+
+@JsonRpcData
+class ImplementationRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ String id
+
+ new() {
+ }
+
+ new(String id) {
+ this.id = id
+ }
+}
+
+/**
+ * The go to implementation request is sent from the client to the server to resolve the implementation
+ * location of a symbol at a given text document position.
+ */
+@JsonRpcData
+class ImplementationParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+@JsonRpcData
+class DocumentHighlightOptions extends AbstractWorkDoneProgressOptions {
+}
+
+@JsonRpcData
+class DocumentHighlightRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * The document highlight request is sent from the client to the server to resolve a document highlights
+ * for a given text document position.
+ */
+@JsonRpcData
+class DocumentHighlightParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+/**
+ * The prepare rename request is sent from the client to the server to setup and test the validity of a
+ * rename operation at a given location.
+ */
+@JsonRpcData
+class PrepareRenameParams extends TextDocumentPositionParams {
+ new() {
+ }
+
+ new(@NonNull TextDocumentIdentifier textDocument, @NonNull Position position) {
+ super(textDocument, position)
+ }
+}
+
+/**
+ * Moniker options.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class MonikerOptions extends AbstractWorkDoneProgressOptions {
+}
+
+/**
+ * Moniker registration options.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class MonikerRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+}
+
+/**
+ * The moniker request is sent from the client to the server to get the symbol monikers for a given text document position.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class MonikerParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+}
+
+/**
+ * Moniker definition to match LSIF 0.5 moniker definition.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class Moniker {
+ /**
+ * The scheme of the moniker. For example tsc or .Net
+ */
+ @NonNull
+ String scheme
+
+ /**
+ * The identifier of the moniker. The value is opaque in LSIF however
+ * schema owners are allowed to define the structure if they want.
+ */
+ @NonNull
+ String identifier
+
+ /**
+ * The scope in which the moniker is unique. Values are taken from {@link UniquenessLevel}.
+ */
+ @NonNull
+ String unique
+
+ /**
+ * The moniker kind if known. Values are taken from {@link MonikerKind}.
+ */
+ String kind
+
+ new() {
+ }
+
+ new(@NonNull String scheme, @NonNull String identifier, @NonNull String unique) {
+ this.scheme = Preconditions.checkNotNull(scheme, 'scheme')
+ this.identifier = Preconditions.checkNotNull(identifier, 'identifier')
+ this.unique = Preconditions.checkNotNull(unique, 'unique')
+ }
+
+ new(@NonNull String scheme, @NonNull String identifier, @NonNull String unique, String kind) {
+ this(scheme, identifier, unique)
+ this.kind = kind
+ }
+}
+
+/**
+ * The {@code window/workDoneProgress/create} request is sent from the server to the client to ask the client to create a work done progress.
+ */
+@JsonRpcData
+class WorkDoneProgressCreateParams {
+ /**
+ * The token to be used to report progress.
+ */
+ @NonNull
+ Either<String, Integer> token
+
+ new() {
+ }
+
+ new(@NonNull Either<String, Integer> token) {
+ this.token = Preconditions.checkNotNull(token, 'token')
+ }
+}
+
+/**
+ * The {@code window/workDoneProgress/cancel} notification is sent from the client to the server to cancel a progress initiated on the server side using the
+ * {@code window/workDoneProgress/create}.
+ */
+@JsonRpcData
+class WorkDoneProgressCancelParams {
+ /**
+ * The token to be used to report progress.
+ */
+ @NonNull
+ Either<String, Integer> token
+
+ new() {
+ }
+
+ new(@NonNull Either<String, Integer> token) {
+ this.token = Preconditions.checkNotNull(token, 'token')
+ }
+}
+
+/**
+ * Params to show a document.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class ShowDocumentParams {
+ /**
+ * The document uri to show.
+ */
+ @NonNull
+ String uri
+
+ /**
+ * Indicates to show the resource in an external program.
+ * To show for example <a href="https://www.eclipse.org/">
+ * https://www.eclipse.org/</a>
+ * in the default WEB browser set to {@code true}.
+ */
+ Boolean external
+
+ /**
+ * An optional property to indicate whether the editor
+ * showing the document should take focus or not.
+ * Clients might ignore this property if an external
+ * program is started.
+ */
+ Boolean takeFocus
+
+ /**
+ * An optional selection range if the document is a text
+ * document. Clients might ignore the property if an
+ * external program is started or the file is not a text
+ * file.
+ */
+ Range selection
+
+ new() {
+ }
+
+ new(@NonNull String uri) {
+ this.uri = Preconditions.checkNotNull(uri, 'uri')
+ }
+}
+
+/**
+ * The result of an show document request.
+ * <p>
+ * Since 3.16.0
+ */
+@JsonRpcData
+class ShowDocumentResult {
+ /**
+ * A boolean indicating if the show was successful.
+ */
+ boolean success
+
+ new() {
+ }
+
+ new(boolean success) {
+ this.success = success
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ProtocolExtensions.xtend b/java/org/eclipse/lsp4j/ProtocolExtensions.xtend
new file mode 100644
index 0000000..8d83646
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ProtocolExtensions.xtend
@@ -0,0 +1,13 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j
+
diff --git a/java/org/eclipse/lsp4j/PublishDiagnosticsCapabilities.java b/java/org/eclipse/lsp4j/PublishDiagnosticsCapabilities.java
new file mode 100644
index 0000000..2117a08
--- /dev/null
+++ b/java/org/eclipse/lsp4j/PublishDiagnosticsCapabilities.java
@@ -0,0 +1,269 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DiagnosticsTagSupport;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to `textDocument/publishDiagnostics`.
+ */
+@SuppressWarnings("all")
+public class PublishDiagnosticsCapabilities {
+ /**
+ * Whether the client accepts diagnostics with related information.
+ */
+ private Boolean relatedInformation;
+
+ /**
+ * Client supports the tag property to provide meta data about a diagnostic.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * This property had been added and implemented as boolean before it was
+ * added to the specification as {@link DiagnosticsTagSupport}. In order to
+ * keep this implementation compatible with intermediate clients (including
+ * vscode-language-client < 6.0.0) we add an either type here.
+ * <p>
+ * Since 3.15
+ */
+ private Either<Boolean, DiagnosticsTagSupport> tagSupport;
+
+ /**
+ * Whether the client interprets the version property of the
+ * `textDocument/publishDiagnostics` notification's parameter.
+ * <p>
+ * Since 3.15.0
+ */
+ private Boolean versionSupport;
+
+ /**
+ * Client supports a codeDescription property
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean codeDescriptionSupport;
+
+ /**
+ * Whether code action supports the {@link Diagnostic#data} property which is
+ * preserved between a `textDocument/publishDiagnostics` and
+ * `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean dataSupport;
+
+ public PublishDiagnosticsCapabilities() {
+ }
+
+ public PublishDiagnosticsCapabilities(final Boolean relatedInformation) {
+ this.relatedInformation = relatedInformation;
+ }
+
+ public PublishDiagnosticsCapabilities(final Boolean relatedInformation, final DiagnosticsTagSupport tagSupport) {
+ this(relatedInformation);
+ this.setTagSupport(tagSupport);
+ }
+
+ public PublishDiagnosticsCapabilities(final Boolean relatedInformation, final DiagnosticsTagSupport tagSupport, final Boolean versionSupport) {
+ this(relatedInformation, tagSupport);
+ this.versionSupport = versionSupport;
+ }
+
+ /**
+ * Whether the client accepts diagnostics with related information.
+ */
+ @Pure
+ public Boolean getRelatedInformation() {
+ return this.relatedInformation;
+ }
+
+ /**
+ * Whether the client accepts diagnostics with related information.
+ */
+ public void setRelatedInformation(final Boolean relatedInformation) {
+ this.relatedInformation = relatedInformation;
+ }
+
+ /**
+ * Client supports the tag property to provide meta data about a diagnostic.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * This property had been added and implemented as boolean before it was
+ * added to the specification as {@link DiagnosticsTagSupport}. In order to
+ * keep this implementation compatible with intermediate clients (including
+ * vscode-language-client < 6.0.0) we add an either type here.
+ * <p>
+ * Since 3.15
+ */
+ @Pure
+ public Either<Boolean, DiagnosticsTagSupport> getTagSupport() {
+ return this.tagSupport;
+ }
+
+ /**
+ * Client supports the tag property to provide meta data about a diagnostic.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * This property had been added and implemented as boolean before it was
+ * added to the specification as {@link DiagnosticsTagSupport}. In order to
+ * keep this implementation compatible with intermediate clients (including
+ * vscode-language-client < 6.0.0) we add an either type here.
+ * <p>
+ * Since 3.15
+ */
+ public void setTagSupport(final Either<Boolean, DiagnosticsTagSupport> tagSupport) {
+ this.tagSupport = tagSupport;
+ }
+
+ public void setTagSupport(final Boolean tagSupport) {
+ if (tagSupport == null) {
+ this.tagSupport = null;
+ return;
+ }
+ this.tagSupport = Either.forLeft(tagSupport);
+ }
+
+ public void setTagSupport(final DiagnosticsTagSupport tagSupport) {
+ if (tagSupport == null) {
+ this.tagSupport = null;
+ return;
+ }
+ this.tagSupport = Either.forRight(tagSupport);
+ }
+
+ /**
+ * Whether the client interprets the version property of the
+ * `textDocument/publishDiagnostics` notification's parameter.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Boolean getVersionSupport() {
+ return this.versionSupport;
+ }
+
+ /**
+ * Whether the client interprets the version property of the
+ * `textDocument/publishDiagnostics` notification's parameter.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setVersionSupport(final Boolean versionSupport) {
+ this.versionSupport = versionSupport;
+ }
+
+ /**
+ * Client supports a codeDescription property
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getCodeDescriptionSupport() {
+ return this.codeDescriptionSupport;
+ }
+
+ /**
+ * Client supports a codeDescription property
+ * <p>
+ * Since 3.16.0
+ */
+ public void setCodeDescriptionSupport(final Boolean codeDescriptionSupport) {
+ this.codeDescriptionSupport = codeDescriptionSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link Diagnostic#data} property which is
+ * preserved between a `textDocument/publishDiagnostics` and
+ * `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getDataSupport() {
+ return this.dataSupport;
+ }
+
+ /**
+ * Whether code action supports the {@link Diagnostic#data} property which is
+ * preserved between a `textDocument/publishDiagnostics` and
+ * `textDocument/codeAction` request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setDataSupport(final Boolean dataSupport) {
+ this.dataSupport = dataSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("relatedInformation", this.relatedInformation);
+ b.add("tagSupport", this.tagSupport);
+ b.add("versionSupport", this.versionSupport);
+ b.add("codeDescriptionSupport", this.codeDescriptionSupport);
+ b.add("dataSupport", this.dataSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ PublishDiagnosticsCapabilities other = (PublishDiagnosticsCapabilities) obj;
+ if (this.relatedInformation == null) {
+ if (other.relatedInformation != null)
+ return false;
+ } else if (!this.relatedInformation.equals(other.relatedInformation))
+ return false;
+ if (this.tagSupport == null) {
+ if (other.tagSupport != null)
+ return false;
+ } else if (!this.tagSupport.equals(other.tagSupport))
+ return false;
+ if (this.versionSupport == null) {
+ if (other.versionSupport != null)
+ return false;
+ } else if (!this.versionSupport.equals(other.versionSupport))
+ return false;
+ if (this.codeDescriptionSupport == null) {
+ if (other.codeDescriptionSupport != null)
+ return false;
+ } else if (!this.codeDescriptionSupport.equals(other.codeDescriptionSupport))
+ return false;
+ if (this.dataSupport == null) {
+ if (other.dataSupport != null)
+ return false;
+ } else if (!this.dataSupport.equals(other.dataSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.relatedInformation== null) ? 0 : this.relatedInformation.hashCode());
+ result = prime * result + ((this.tagSupport== null) ? 0 : this.tagSupport.hashCode());
+ result = prime * result + ((this.versionSupport== null) ? 0 : this.versionSupport.hashCode());
+ result = prime * result + ((this.codeDescriptionSupport== null) ? 0 : this.codeDescriptionSupport.hashCode());
+ return prime * result + ((this.dataSupport== null) ? 0 : this.dataSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/PublishDiagnosticsParams.java b/java/org/eclipse/lsp4j/PublishDiagnosticsParams.java
new file mode 100644
index 0000000..fc46851
--- /dev/null
+++ b/java/org/eclipse/lsp4j/PublishDiagnosticsParams.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.Diagnostic;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Diagnostics notification are sent from the server to the client to signal results of validation runs.
+ */
+@SuppressWarnings("all")
+public class PublishDiagnosticsParams {
+ /**
+ * The URI for which diagnostic information is reported.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * An array of diagnostic information items.
+ */
+ @NonNull
+ private List<Diagnostic> diagnostics;
+
+ /**
+ * Optional the version number of the document the diagnostics are published for.
+ * <p>
+ * Since 3.15.0
+ */
+ private Integer version;
+
+ public PublishDiagnosticsParams() {
+ ArrayList<Diagnostic> _arrayList = new ArrayList<Diagnostic>();
+ this.diagnostics = _arrayList;
+ }
+
+ public PublishDiagnosticsParams(@NonNull final String uri, @NonNull final List<Diagnostic> diagnostics) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ this.diagnostics = Preconditions.<List<Diagnostic>>checkNotNull(diagnostics, "diagnostics");
+ }
+
+ public PublishDiagnosticsParams(@NonNull final String uri, @NonNull final List<Diagnostic> diagnostics, final Integer version) {
+ this(uri, diagnostics);
+ this.version = version;
+ }
+
+ /**
+ * The URI for which diagnostic information is reported.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The URI for which diagnostic information is reported.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * An array of diagnostic information items.
+ */
+ @Pure
+ @NonNull
+ public List<Diagnostic> getDiagnostics() {
+ return this.diagnostics;
+ }
+
+ /**
+ * An array of diagnostic information items.
+ */
+ public void setDiagnostics(@NonNull final List<Diagnostic> diagnostics) {
+ this.diagnostics = Preconditions.checkNotNull(diagnostics, "diagnostics");
+ }
+
+ /**
+ * Optional the version number of the document the diagnostics are published for.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Integer getVersion() {
+ return this.version;
+ }
+
+ /**
+ * Optional the version number of the document the diagnostics are published for.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setVersion(final Integer version) {
+ this.version = version;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("diagnostics", this.diagnostics);
+ b.add("version", this.version);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ PublishDiagnosticsParams other = (PublishDiagnosticsParams) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.diagnostics == null) {
+ if (other.diagnostics != null)
+ return false;
+ } else if (!this.diagnostics.equals(other.diagnostics))
+ return false;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ result = prime * result + ((this.diagnostics== null) ? 0 : this.diagnostics.hashCode());
+ return prime * result + ((this.version== null) ? 0 : this.version.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Range.java b/java/org/eclipse/lsp4j/Range.java
new file mode 100644
index 0000000..13cc5c6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Range.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A range in a text document expressed as (zero-based) start and end positions.
+ */
+@SuppressWarnings("all")
+public class Range {
+ /**
+ * The range's start position
+ */
+ @NonNull
+ private Position start;
+
+ /**
+ * The range's end position
+ */
+ @NonNull
+ private Position end;
+
+ public Range() {
+ }
+
+ public Range(@NonNull final Position start, @NonNull final Position end) {
+ this.start = Preconditions.<Position>checkNotNull(start, "start");
+ this.end = Preconditions.<Position>checkNotNull(end, "end");
+ }
+
+ /**
+ * The range's start position
+ */
+ @Pure
+ @NonNull
+ public Position getStart() {
+ return this.start;
+ }
+
+ /**
+ * The range's start position
+ */
+ public void setStart(@NonNull final Position start) {
+ this.start = Preconditions.checkNotNull(start, "start");
+ }
+
+ /**
+ * The range's end position
+ */
+ @Pure
+ @NonNull
+ public Position getEnd() {
+ return this.end;
+ }
+
+ /**
+ * The range's end position
+ */
+ public void setEnd(@NonNull final Position end) {
+ this.end = Preconditions.checkNotNull(end, "end");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("start", this.start);
+ b.add("end", this.end);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Range other = (Range) obj;
+ if (this.start == null) {
+ if (other.start != null)
+ return false;
+ } else if (!this.start.equals(other.start))
+ return false;
+ if (this.end == null) {
+ if (other.end != null)
+ return false;
+ } else if (!this.end.equals(other.end))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.start== null) ? 0 : this.start.hashCode());
+ return prime * result + ((this.end== null) ? 0 : this.end.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RangeFormattingCapabilities.java b/java/org/eclipse/lsp4j/RangeFormattingCapabilities.java
new file mode 100644
index 0000000..3682c02
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RangeFormattingCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/rangeFormatting`
+ */
+@SuppressWarnings("all")
+public class RangeFormattingCapabilities extends DynamicRegistrationCapabilities {
+ public RangeFormattingCapabilities() {
+ }
+
+ public RangeFormattingCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ReferenceContext.java b/java/org/eclipse/lsp4j/ReferenceContext.java
new file mode 100644
index 0000000..7c24c00
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ReferenceContext.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The references request is sent from the client to the server to resolve project-wide references for the symbol
+ * denoted by the given text document position.
+ */
+@SuppressWarnings("all")
+public class ReferenceContext {
+ /**
+ * Include the declaration of the current symbol.
+ */
+ private boolean includeDeclaration;
+
+ public ReferenceContext() {
+ }
+
+ public ReferenceContext(final boolean includeDeclaration) {
+ this.includeDeclaration = includeDeclaration;
+ }
+
+ /**
+ * Include the declaration of the current symbol.
+ */
+ @Pure
+ public boolean isIncludeDeclaration() {
+ return this.includeDeclaration;
+ }
+
+ /**
+ * Include the declaration of the current symbol.
+ */
+ public void setIncludeDeclaration(final boolean includeDeclaration) {
+ this.includeDeclaration = includeDeclaration;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("includeDeclaration", this.includeDeclaration);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ReferenceContext other = (ReferenceContext) obj;
+ if (other.includeDeclaration != this.includeDeclaration)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + (this.includeDeclaration ? 1231 : 1237);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ReferenceOptions.java b/java/org/eclipse/lsp4j/ReferenceOptions.java
new file mode 100644
index 0000000..745b3c0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ReferenceOptions.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ReferenceOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ReferenceParams.java b/java/org/eclipse/lsp4j/ReferenceParams.java
new file mode 100644
index 0000000..001b2d0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ReferenceParams.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.ReferenceContext;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The references request is sent from the client to the server to resolve project-wide references for the symbol
+ * denoted by the given text document position.
+ */
+@SuppressWarnings("all")
+public class ReferenceParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ @NonNull
+ private ReferenceContext context;
+
+ public ReferenceParams() {
+ }
+
+ public ReferenceParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position, @NonNull final ReferenceContext context) {
+ super(textDocument, position);
+ this.context = Preconditions.<ReferenceContext>checkNotNull(context, "context");
+ }
+
+ @Deprecated
+ public ReferenceParams(@NonNull final ReferenceContext context) {
+ this.context = Preconditions.<ReferenceContext>checkNotNull(context, "context");
+ }
+
+ @Pure
+ @NonNull
+ public ReferenceContext getContext() {
+ return this.context;
+ }
+
+ public void setContext(@NonNull final ReferenceContext context) {
+ this.context = Preconditions.checkNotNull(context, "context");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("context", this.context);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ReferenceParams other = (ReferenceParams) obj;
+ if (this.context == null) {
+ if (other.context != null)
+ return false;
+ } else if (!this.context.equals(other.context))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.context== null) ? 0 : this.context.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ReferenceRegistrationOptions.java b/java/org/eclipse/lsp4j/ReferenceRegistrationOptions.java
new file mode 100644
index 0000000..effc73d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ReferenceRegistrationOptions.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class ReferenceRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ReferencesCapabilities.java b/java/org/eclipse/lsp4j/ReferencesCapabilities.java
new file mode 100644
index 0000000..f5d2115
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ReferencesCapabilities.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/references`
+ */
+@SuppressWarnings("all")
+public class ReferencesCapabilities extends DynamicRegistrationCapabilities {
+ public ReferencesCapabilities() {
+ }
+
+ public ReferencesCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/Registration.java b/java/org/eclipse/lsp4j/Registration.java
new file mode 100644
index 0000000..cac0657
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Registration.java
@@ -0,0 +1,154 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * General parameters to register for a capability.
+ */
+@SuppressWarnings("all")
+public class Registration {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again.
+ */
+ @NonNull
+ private String id;
+
+ /**
+ * The method / capability to register for.
+ */
+ @NonNull
+ private String method;
+
+ /**
+ * Options necessary for the registration.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object registerOptions;
+
+ public Registration() {
+ }
+
+ public Registration(@NonNull final String id, @NonNull final String method) {
+ this.id = Preconditions.<String>checkNotNull(id, "id");
+ this.method = Preconditions.<String>checkNotNull(method, "method");
+ }
+
+ public Registration(@NonNull final String id, @NonNull final String method, final Object registerOptions) {
+ this(id, method);
+ this.registerOptions = registerOptions;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again.
+ */
+ @Pure
+ @NonNull
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again.
+ */
+ public void setId(@NonNull final String id) {
+ this.id = Preconditions.checkNotNull(id, "id");
+ }
+
+ /**
+ * The method / capability to register for.
+ */
+ @Pure
+ @NonNull
+ public String getMethod() {
+ return this.method;
+ }
+
+ /**
+ * The method / capability to register for.
+ */
+ public void setMethod(@NonNull final String method) {
+ this.method = Preconditions.checkNotNull(method, "method");
+ }
+
+ /**
+ * Options necessary for the registration.
+ */
+ @Pure
+ public Object getRegisterOptions() {
+ return this.registerOptions;
+ }
+
+ /**
+ * Options necessary for the registration.
+ */
+ public void setRegisterOptions(final Object registerOptions) {
+ this.registerOptions = registerOptions;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("method", this.method);
+ b.add("registerOptions", this.registerOptions);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Registration other = (Registration) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ if (this.method == null) {
+ if (other.method != null)
+ return false;
+ } else if (!this.method.equals(other.method))
+ return false;
+ if (this.registerOptions == null) {
+ if (other.registerOptions != null)
+ return false;
+ } else if (!this.registerOptions.equals(other.registerOptions))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.id== null) ? 0 : this.id.hashCode());
+ result = prime * result + ((this.method== null) ? 0 : this.method.hashCode());
+ return prime * result + ((this.registerOptions== null) ? 0 : this.registerOptions.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RegistrationParams.java b/java/org/eclipse/lsp4j/RegistrationParams.java
new file mode 100644
index 0000000..465a0da
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RegistrationParams.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.Registration;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client/registerCapability request is sent from the server to the client to register
+ * for a new capability on the client side. Not all clients need to support dynamic
+ * capability registration. A client opts in via the dynamicRegistration property on the
+ * specific client capabilities. A client can even provide dynamic registration for
+ * capability A but not for capability B (see TextDocumentClientCapabilities as an example).
+ */
+@SuppressWarnings("all")
+public class RegistrationParams {
+ @NonNull
+ private List<Registration> registrations;
+
+ public RegistrationParams() {
+ this(new ArrayList<Registration>());
+ }
+
+ public RegistrationParams(@NonNull final List<Registration> registrations) {
+ this.registrations = Preconditions.<List<Registration>>checkNotNull(registrations, "registrations");
+ }
+
+ @Pure
+ @NonNull
+ public List<Registration> getRegistrations() {
+ return this.registrations;
+ }
+
+ public void setRegistrations(@NonNull final List<Registration> registrations) {
+ this.registrations = Preconditions.checkNotNull(registrations, "registrations");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("registrations", this.registrations);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RegistrationParams other = (RegistrationParams) obj;
+ if (this.registrations == null) {
+ if (other.registrations != null)
+ return false;
+ } else if (!this.registrations.equals(other.registrations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.registrations== null) ? 0 : this.registrations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RegularExpressionsCapabilities.java b/java/org/eclipse/lsp4j/RegularExpressionsCapabilities.java
new file mode 100644
index 0000000..4d5fa5c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RegularExpressionsCapabilities.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Client capabilities specific to regular expressions.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class RegularExpressionsCapabilities {
+ /**
+ * The engine's name.
+ */
+ @NonNull
+ private String engine;
+
+ /**
+ * The engine's version.
+ */
+ private String version;
+
+ public RegularExpressionsCapabilities() {
+ }
+
+ public RegularExpressionsCapabilities(@NonNull final String engine) {
+ this.engine = Preconditions.<String>checkNotNull(engine, "engine");
+ }
+
+ public RegularExpressionsCapabilities(@NonNull final String engine, final String version) {
+ this(engine);
+ this.version = version;
+ }
+
+ /**
+ * The engine's name.
+ */
+ @Pure
+ @NonNull
+ public String getEngine() {
+ return this.engine;
+ }
+
+ /**
+ * The engine's name.
+ */
+ public void setEngine(@NonNull final String engine) {
+ this.engine = Preconditions.checkNotNull(engine, "engine");
+ }
+
+ /**
+ * The engine's version.
+ */
+ @Pure
+ public String getVersion() {
+ return this.version;
+ }
+
+ /**
+ * The engine's version.
+ */
+ public void setVersion(final String version) {
+ this.version = version;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("engine", this.engine);
+ b.add("version", this.version);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RegularExpressionsCapabilities other = (RegularExpressionsCapabilities) obj;
+ if (this.engine == null) {
+ if (other.engine != null)
+ return false;
+ } else if (!this.engine.equals(other.engine))
+ return false;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.engine== null) ? 0 : this.engine.hashCode());
+ return prime * result + ((this.version== null) ? 0 : this.version.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RenameCapabilities.java b/java/org/eclipse/lsp4j/RenameCapabilities.java
new file mode 100644
index 0000000..2649555
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RenameCapabilities.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.lsp4j.PrepareSupportDefaultBehavior;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/rename`
+ */
+@SuppressWarnings("all")
+public class RenameCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Client supports testing for validity of rename operations
+ * before execution.
+ * <p>
+ * Since 3.12.0
+ */
+ private Boolean prepareSupport;
+
+ /**
+ * Client supports the default behavior result ({@code { defaultBehavior: boolean }}).
+ * <p>
+ * The value indicates the default behavior used by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ private PrepareSupportDefaultBehavior prepareSupportDefaultBehavior;
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * rename request's workspace edit by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean honorsChangeAnnotations;
+
+ public RenameCapabilities() {
+ }
+
+ public RenameCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public RenameCapabilities(final Boolean prepareSupport, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.prepareSupport = prepareSupport;
+ }
+
+ /**
+ * Client supports testing for validity of rename operations
+ * before execution.
+ * <p>
+ * Since 3.12.0
+ */
+ @Pure
+ public Boolean getPrepareSupport() {
+ return this.prepareSupport;
+ }
+
+ /**
+ * Client supports testing for validity of rename operations
+ * before execution.
+ * <p>
+ * Since 3.12.0
+ */
+ public void setPrepareSupport(final Boolean prepareSupport) {
+ this.prepareSupport = prepareSupport;
+ }
+
+ /**
+ * Client supports the default behavior result ({@code { defaultBehavior: boolean }}).
+ * <p>
+ * The value indicates the default behavior used by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public PrepareSupportDefaultBehavior getPrepareSupportDefaultBehavior() {
+ return this.prepareSupportDefaultBehavior;
+ }
+
+ /**
+ * Client supports the default behavior result ({@code { defaultBehavior: boolean }}).
+ * <p>
+ * The value indicates the default behavior used by the client.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setPrepareSupportDefaultBehavior(final PrepareSupportDefaultBehavior prepareSupportDefaultBehavior) {
+ this.prepareSupportDefaultBehavior = prepareSupportDefaultBehavior;
+ }
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * rename request's workspace edit by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getHonorsChangeAnnotations() {
+ return this.honorsChangeAnnotations;
+ }
+
+ /**
+ * Whether the client honors the change annotations in
+ * text edits and resource operations returned via the
+ * rename request's workspace edit by for example presenting
+ * the workspace edit in the user interface and asking
+ * for confirmation.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setHonorsChangeAnnotations(final Boolean honorsChangeAnnotations) {
+ this.honorsChangeAnnotations = honorsChangeAnnotations;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("prepareSupport", this.prepareSupport);
+ b.add("prepareSupportDefaultBehavior", this.prepareSupportDefaultBehavior);
+ b.add("honorsChangeAnnotations", this.honorsChangeAnnotations);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ RenameCapabilities other = (RenameCapabilities) obj;
+ if (this.prepareSupport == null) {
+ if (other.prepareSupport != null)
+ return false;
+ } else if (!this.prepareSupport.equals(other.prepareSupport))
+ return false;
+ if (this.prepareSupportDefaultBehavior == null) {
+ if (other.prepareSupportDefaultBehavior != null)
+ return false;
+ } else if (!this.prepareSupportDefaultBehavior.equals(other.prepareSupportDefaultBehavior))
+ return false;
+ if (this.honorsChangeAnnotations == null) {
+ if (other.honorsChangeAnnotations != null)
+ return false;
+ } else if (!this.honorsChangeAnnotations.equals(other.honorsChangeAnnotations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.prepareSupport== null) ? 0 : this.prepareSupport.hashCode());
+ result = prime * result + ((this.prepareSupportDefaultBehavior== null) ? 0 : this.prepareSupportDefaultBehavior.hashCode());
+ return prime * result + ((this.honorsChangeAnnotations== null) ? 0 : this.honorsChangeAnnotations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RenameFile.java b/java/org/eclipse/lsp4j/RenameFile.java
new file mode 100644
index 0000000..1c1a33c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RenameFile.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.RenameFileOptions;
+import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.ResourceOperationKind;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Rename file operation
+ */
+@SuppressWarnings("all")
+public class RenameFile extends ResourceOperation {
+ /**
+ * The old (existing) location.
+ */
+ @NonNull
+ private String oldUri;
+
+ /**
+ * The new location.
+ */
+ @NonNull
+ private String newUri;
+
+ /**
+ * Rename options.
+ */
+ private RenameFileOptions options;
+
+ public RenameFile() {
+ super(ResourceOperationKind.Rename);
+ }
+
+ public RenameFile(@NonNull final String oldUri, @NonNull final String newUri) {
+ super(ResourceOperationKind.Rename);
+ this.oldUri = Preconditions.<String>checkNotNull(oldUri, "oldUri");
+ this.newUri = Preconditions.<String>checkNotNull(newUri, "newUri");
+ }
+
+ public RenameFile(@NonNull final String oldUri, @NonNull final String newUri, final RenameFileOptions options) {
+ this(oldUri, newUri);
+ this.options = options;
+ }
+
+ /**
+ * The old (existing) location.
+ */
+ @Pure
+ @NonNull
+ public String getOldUri() {
+ return this.oldUri;
+ }
+
+ /**
+ * The old (existing) location.
+ */
+ public void setOldUri(@NonNull final String oldUri) {
+ this.oldUri = Preconditions.checkNotNull(oldUri, "oldUri");
+ }
+
+ /**
+ * The new location.
+ */
+ @Pure
+ @NonNull
+ public String getNewUri() {
+ return this.newUri;
+ }
+
+ /**
+ * The new location.
+ */
+ public void setNewUri(@NonNull final String newUri) {
+ this.newUri = Preconditions.checkNotNull(newUri, "newUri");
+ }
+
+ /**
+ * Rename options.
+ */
+ @Pure
+ public RenameFileOptions getOptions() {
+ return this.options;
+ }
+
+ /**
+ * Rename options.
+ */
+ public void setOptions(final RenameFileOptions options) {
+ this.options = options;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("oldUri", this.oldUri);
+ b.add("newUri", this.newUri);
+ b.add("options", this.options);
+ b.add("kind", getKind());
+ b.add("annotationId", getAnnotationId());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ RenameFile other = (RenameFile) obj;
+ if (this.oldUri == null) {
+ if (other.oldUri != null)
+ return false;
+ } else if (!this.oldUri.equals(other.oldUri))
+ return false;
+ if (this.newUri == null) {
+ if (other.newUri != null)
+ return false;
+ } else if (!this.newUri.equals(other.newUri))
+ return false;
+ if (this.options == null) {
+ if (other.options != null)
+ return false;
+ } else if (!this.options.equals(other.options))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.oldUri== null) ? 0 : this.oldUri.hashCode());
+ result = prime * result + ((this.newUri== null) ? 0 : this.newUri.hashCode());
+ return prime * result + ((this.options== null) ? 0 : this.options.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RenameFileOptions.java b/java/org/eclipse/lsp4j/RenameFileOptions.java
new file mode 100644
index 0000000..54383f8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RenameFileOptions.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Rename file options
+ */
+@SuppressWarnings("all")
+public class RenameFileOptions {
+ /**
+ * Overwrite target if existing. Overwrite wins over {@link #ignoreIfExists}
+ */
+ private Boolean overwrite;
+
+ /**
+ * Ignores if target exists.
+ */
+ private Boolean ignoreIfExists;
+
+ public RenameFileOptions() {
+ }
+
+ public RenameFileOptions(final Boolean overwrite, final Boolean ignoreIfExists) {
+ this.overwrite = overwrite;
+ this.ignoreIfExists = ignoreIfExists;
+ }
+
+ /**
+ * Overwrite target if existing. Overwrite wins over {@link #ignoreIfExists}
+ */
+ @Pure
+ public Boolean getOverwrite() {
+ return this.overwrite;
+ }
+
+ /**
+ * Overwrite target if existing. Overwrite wins over {@link #ignoreIfExists}
+ */
+ public void setOverwrite(final Boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+ /**
+ * Ignores if target exists.
+ */
+ @Pure
+ public Boolean getIgnoreIfExists() {
+ return this.ignoreIfExists;
+ }
+
+ /**
+ * Ignores if target exists.
+ */
+ public void setIgnoreIfExists(final Boolean ignoreIfExists) {
+ this.ignoreIfExists = ignoreIfExists;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("overwrite", this.overwrite);
+ b.add("ignoreIfExists", this.ignoreIfExists);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RenameFileOptions other = (RenameFileOptions) obj;
+ if (this.overwrite == null) {
+ if (other.overwrite != null)
+ return false;
+ } else if (!this.overwrite.equals(other.overwrite))
+ return false;
+ if (this.ignoreIfExists == null) {
+ if (other.ignoreIfExists != null)
+ return false;
+ } else if (!this.ignoreIfExists.equals(other.ignoreIfExists))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.overwrite== null) ? 0 : this.overwrite.hashCode());
+ return prime * result + ((this.ignoreIfExists== null) ? 0 : this.ignoreIfExists.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RenameFilesParams.java b/java/org/eclipse/lsp4j/RenameFilesParams.java
new file mode 100644
index 0000000..1bf8f2d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RenameFilesParams.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.FileRename;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameters sent in notifications/requests for user-initiated renames
+ * of files.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class RenameFilesParams {
+ /**
+ * An array of all files/folders renamed in this operation. When a folder
+ * is renamed, only the folder will be included, and not its children.
+ */
+ @NonNull
+ private List<FileRename> files = new ArrayList<FileRename>();
+
+ public RenameFilesParams() {
+ }
+
+ public RenameFilesParams(@NonNull final List<FileRename> files) {
+ this.files = Preconditions.<List<FileRename>>checkNotNull(files, "files");
+ }
+
+ /**
+ * An array of all files/folders renamed in this operation. When a folder
+ * is renamed, only the folder will be included, and not its children.
+ */
+ @Pure
+ @NonNull
+ public List<FileRename> getFiles() {
+ return this.files;
+ }
+
+ /**
+ * An array of all files/folders renamed in this operation. When a folder
+ * is renamed, only the folder will be included, and not its children.
+ */
+ public void setFiles(@NonNull final List<FileRename> files) {
+ this.files = Preconditions.checkNotNull(files, "files");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("files", this.files);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RenameFilesParams other = (RenameFilesParams) obj;
+ if (this.files == null) {
+ if (other.files != null)
+ return false;
+ } else if (!this.files.equals(other.files))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.files== null) ? 0 : this.files.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RenameOptions.java b/java/org/eclipse/lsp4j/RenameOptions.java
new file mode 100644
index 0000000..397f3e7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RenameOptions.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Rename options
+ */
+@SuppressWarnings("all")
+public class RenameOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ *
+ * @deprecated This options object is not specified for StaticRegistrationOptions
+ */
+ @Deprecated
+ private String id;
+
+ /**
+ * Renames should be checked and tested before being executed.
+ */
+ private Boolean prepareProvider;
+
+ public RenameOptions() {
+ }
+
+ @Deprecated
+ public RenameOptions(final String id) {
+ this.id = id;
+ }
+
+ public RenameOptions(final Boolean prepareProvider) {
+ this.prepareProvider = prepareProvider;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ *
+ * @deprecated This options object is not specified for StaticRegistrationOptions
+ */
+ @Pure
+ @Deprecated
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ *
+ * @deprecated This options object is not specified for StaticRegistrationOptions
+ */
+ @Deprecated
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * Renames should be checked and tested before being executed.
+ */
+ @Pure
+ public Boolean getPrepareProvider() {
+ return this.prepareProvider;
+ }
+
+ /**
+ * Renames should be checked and tested before being executed.
+ */
+ public void setPrepareProvider(final Boolean prepareProvider) {
+ this.prepareProvider = prepareProvider;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("prepareProvider", this.prepareProvider);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ RenameOptions other = (RenameOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ if (this.prepareProvider == null) {
+ if (other.prepareProvider != null)
+ return false;
+ } else if (!this.prepareProvider.equals(other.prepareProvider))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.id== null) ? 0 : this.id.hashCode());
+ return prime * result + ((this.prepareProvider== null) ? 0 : this.prepareProvider.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/RenameParams.java b/java/org/eclipse/lsp4j/RenameParams.java
new file mode 100644
index 0000000..c226410
--- /dev/null
+++ b/java/org/eclipse/lsp4j/RenameParams.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The rename request is sent from the client to the server to do a workspace wide rename of a symbol.
+ */
+@SuppressWarnings("all")
+public class RenameParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ /**
+ * The new name of the symbol. If the given name is not valid the request must return a
+ * ResponseError with an appropriate message set.
+ */
+ @NonNull
+ private String newName;
+
+ public RenameParams() {
+ }
+
+ public RenameParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position, @NonNull final String newName) {
+ super(textDocument, position);
+ this.newName = Preconditions.<String>checkNotNull(newName, "newName");
+ }
+
+ /**
+ * The new name of the symbol. If the given name is not valid the request must return a
+ * ResponseError with an appropriate message set.
+ */
+ @Pure
+ @NonNull
+ public String getNewName() {
+ return this.newName;
+ }
+
+ /**
+ * The new name of the symbol. If the given name is not valid the request must return a
+ * ResponseError with an appropriate message set.
+ */
+ public void setNewName(@NonNull final String newName) {
+ this.newName = Preconditions.checkNotNull(newName, "newName");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("newName", this.newName);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ RenameParams other = (RenameParams) obj;
+ if (this.newName == null) {
+ if (other.newName != null)
+ return false;
+ } else if (!this.newName.equals(other.newName))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.newName== null) ? 0 : this.newName.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ResolveTypeHierarchyItemParams.java b/java/org/eclipse/lsp4j/ResolveTypeHierarchyItemParams.java
new file mode 100644
index 0000000..6502735
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ResolveTypeHierarchyItemParams.java
@@ -0,0 +1,147 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.lsp4j.TypeHierarchyDirection;
+import org.eclipse.lsp4j.TypeHierarchyItem;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Request to resolve an unresolved {@link TypeHierarchyItem type hierarchy item} which is indicated if the
+ * {@link TypeHierarchyItem#getParents parents} or the {@link TypeHierarchyItem#getChildren children} is not
+ * defined. If resolved and no {@code parents} or {@code children} are available then an empty list is returned.
+ */
+@Beta
+@SuppressWarnings("all")
+public class ResolveTypeHierarchyItemParams {
+ /**
+ * The hierarchy item to resolve.
+ */
+ @NonNull
+ private TypeHierarchyItem item;
+
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level.
+ */
+ private int resolve;
+
+ /**
+ * The direction of the type hierarchy resolution.
+ */
+ @NonNull
+ private TypeHierarchyDirection direction;
+
+ public ResolveTypeHierarchyItemParams() {
+ }
+
+ public ResolveTypeHierarchyItemParams(@NonNull final TypeHierarchyItem item, final int resolve, @NonNull final TypeHierarchyDirection direction) {
+ this.item = Preconditions.<TypeHierarchyItem>checkNotNull(item, "item");
+ this.resolve = resolve;
+ this.direction = Preconditions.<TypeHierarchyDirection>checkNotNull(direction, "direction");
+ }
+
+ /**
+ * The hierarchy item to resolve.
+ */
+ @Pure
+ @NonNull
+ public TypeHierarchyItem getItem() {
+ return this.item;
+ }
+
+ /**
+ * The hierarchy item to resolve.
+ */
+ public void setItem(@NonNull final TypeHierarchyItem item) {
+ this.item = Preconditions.checkNotNull(item, "item");
+ }
+
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level.
+ */
+ @Pure
+ public int getResolve() {
+ return this.resolve;
+ }
+
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level.
+ */
+ public void setResolve(final int resolve) {
+ this.resolve = resolve;
+ }
+
+ /**
+ * The direction of the type hierarchy resolution.
+ */
+ @Pure
+ @NonNull
+ public TypeHierarchyDirection getDirection() {
+ return this.direction;
+ }
+
+ /**
+ * The direction of the type hierarchy resolution.
+ */
+ public void setDirection(@NonNull final TypeHierarchyDirection direction) {
+ this.direction = Preconditions.checkNotNull(direction, "direction");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("item", this.item);
+ b.add("resolve", this.resolve);
+ b.add("direction", this.direction);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResolveTypeHierarchyItemParams other = (ResolveTypeHierarchyItemParams) obj;
+ if (this.item == null) {
+ if (other.item != null)
+ return false;
+ } else if (!this.item.equals(other.item))
+ return false;
+ if (other.resolve != this.resolve)
+ return false;
+ if (this.direction == null) {
+ if (other.direction != null)
+ return false;
+ } else if (!this.direction.equals(other.direction))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.item== null) ? 0 : this.item.hashCode());
+ result = prime * result + this.resolve;
+ return prime * result + ((this.direction== null) ? 0 : this.direction.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ResourceChange.java b/java/org/eclipse/lsp4j/ResourceChange.java
new file mode 100644
index 0000000..3cc38fa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ResourceChange.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A resource change.
+ * <p><ul>
+ * <li>If both current and newUri has valid values this is considered to be a move operation.
+ * <li>If current has a valid value while newUri is null it is treated as a delete operation.
+ * <li>If current is null and newUri has a valid value a create operation is executed.
+ * </ul>
+ *
+ * @deprecated As LSP introduces resource operation, use the {@link ResourceOperation} instead.
+ */
+@Beta
+@Deprecated
+@SuppressWarnings("all")
+public class ResourceChange {
+ /**
+ * The Uri for current resource. Required for delete and move operations
+ * otherwise it is null.
+ */
+ private String current;
+
+ /**
+ * The new uri for the resource. Required for create and move operations.
+ * otherwise null.
+ * <p>
+ * Must be compatible with the current uri ie. must be a file
+ * uri if current is not null and is a file uri.
+ */
+ private String newUri;
+
+ /**
+ * The Uri for current resource. Required for delete and move operations
+ * otherwise it is null.
+ */
+ @Pure
+ public String getCurrent() {
+ return this.current;
+ }
+
+ /**
+ * The Uri for current resource. Required for delete and move operations
+ * otherwise it is null.
+ */
+ public void setCurrent(final String current) {
+ this.current = current;
+ }
+
+ /**
+ * The new uri for the resource. Required for create and move operations.
+ * otherwise null.
+ * <p>
+ * Must be compatible with the current uri ie. must be a file
+ * uri if current is not null and is a file uri.
+ */
+ @Pure
+ public String getNewUri() {
+ return this.newUri;
+ }
+
+ /**
+ * The new uri for the resource. Required for create and move operations.
+ * otherwise null.
+ * <p>
+ * Must be compatible with the current uri ie. must be a file
+ * uri if current is not null and is a file uri.
+ */
+ public void setNewUri(final String newUri) {
+ this.newUri = newUri;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("current", this.current);
+ b.add("newUri", this.newUri);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResourceChange other = (ResourceChange) obj;
+ if (this.current == null) {
+ if (other.current != null)
+ return false;
+ } else if (!this.current.equals(other.current))
+ return false;
+ if (this.newUri == null) {
+ if (other.newUri != null)
+ return false;
+ } else if (!this.newUri.equals(other.newUri))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.current== null) ? 0 : this.current.hashCode());
+ return prime * result + ((this.newUri== null) ? 0 : this.newUri.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ResourceOperation.java b/java/org/eclipse/lsp4j/ResourceOperation.java
new file mode 100644
index 0000000..b33d1ed
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ResourceOperation.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.adapters.ResourceOperationTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@JsonAdapter(ResourceOperationTypeAdapter.class)
+@SuppressWarnings("all")
+public abstract class ResourceOperation {
+ /**
+ * The kind of resource operation. For allowed values, see {@link ResourceOperationKind}
+ */
+ @NonNull
+ private String kind;
+
+ /**
+ * An optional annotation identifer describing the operation.
+ * <p>
+ * Since 3.16.0
+ */
+ private String annotationId;
+
+ public ResourceOperation() {
+ }
+
+ public ResourceOperation(@NonNull final String kind) {
+ this.kind = Preconditions.<String>checkNotNull(kind, "kind");
+ }
+
+ /**
+ * The kind of resource operation. For allowed values, see {@link ResourceOperationKind}
+ */
+ @Pure
+ @NonNull
+ public String getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of resource operation. For allowed values, see {@link ResourceOperationKind}
+ */
+ public void setKind(@NonNull final String kind) {
+ this.kind = Preconditions.checkNotNull(kind, "kind");
+ }
+
+ /**
+ * An optional annotation identifer describing the operation.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public String getAnnotationId() {
+ return this.annotationId;
+ }
+
+ /**
+ * An optional annotation identifer describing the operation.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setAnnotationId(final String annotationId) {
+ this.annotationId = annotationId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("kind", this.kind);
+ b.add("annotationId", this.annotationId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResourceOperation other = (ResourceOperation) obj;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.annotationId == null) {
+ if (other.annotationId != null)
+ return false;
+ } else if (!this.annotationId.equals(other.annotationId))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ return prime * result + ((this.annotationId== null) ? 0 : this.annotationId.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ResourceOperationKind.java b/java/org/eclipse/lsp4j/ResourceOperationKind.java
new file mode 100644
index 0000000..7de57ed
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ResourceOperationKind.java
@@ -0,0 +1,37 @@
+/******************************************************************************
+ * Copyright (c) 2018 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j;
+
+/**
+ * The kind of resource operations supported by the client.
+ */
+public final class ResourceOperationKind {
+
+ private ResourceOperationKind() {
+ }
+
+ /**
+ * Supports creating new files and folders.
+ */
+ public static final String Create = "create";
+
+ /**
+ * Supports renaming existing files and folders.
+ */
+ public static final String Rename = "rename";
+
+ /**
+ * Supports deleting existing files and folders.
+ */
+ public static final String Delete = "delete";
+}
diff --git a/java/org/eclipse/lsp4j/ResponseErrorCode.java b/java/org/eclipse/lsp4j/ResponseErrorCode.java
new file mode 100644
index 0000000..047fd1e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ResponseErrorCode.java
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * A number indicating the error type that occured.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode} instead
+ */
+@Deprecated
+public enum ResponseErrorCode {
+
+ ParseError(-32700),
+
+ InvalidRequest(-32600),
+
+ MethodNotFound(-32601),
+
+ InvalidParams(-32602),
+
+ InternalError(-32603),
+
+ serverErrorStart(-32099),
+
+ serverErrorEnd(-32000);
+
+ private final int value;
+
+ ResponseErrorCode(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/SaveOptions.java b/java/org/eclipse/lsp4j/SaveOptions.java
new file mode 100644
index 0000000..3f58995
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SaveOptions.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Save options.
+ */
+@SuppressWarnings("all")
+public class SaveOptions {
+ /**
+ * The client is supposed to include the content on save.
+ */
+ private Boolean includeText;
+
+ public SaveOptions() {
+ }
+
+ public SaveOptions(final Boolean includeText) {
+ this.includeText = includeText;
+ }
+
+ /**
+ * The client is supposed to include the content on save.
+ */
+ @Pure
+ public Boolean getIncludeText() {
+ return this.includeText;
+ }
+
+ /**
+ * The client is supposed to include the content on save.
+ */
+ public void setIncludeText(final Boolean includeText) {
+ this.includeText = includeText;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("includeText", this.includeText);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SaveOptions other = (SaveOptions) obj;
+ if (this.includeText == null) {
+ if (other.includeText != null)
+ return false;
+ } else if (!this.includeText.equals(other.includeText))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.includeText== null) ? 0 : this.includeText.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SelectionRange.java b/java/org/eclipse/lsp4j/SelectionRange.java
new file mode 100644
index 0000000..784b161
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SelectionRange.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A selection range represents a part of a selection hierarchy. A selection range
+ * may have a parent selection range that contains it.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class SelectionRange {
+ /**
+ * The range of this selection range.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The parent selection range containing this range. Therefore `parent.range` must contain {@link #range}.
+ */
+ private SelectionRange parent;
+
+ public SelectionRange() {
+ }
+
+ public SelectionRange(@NonNull final Range range, final SelectionRange parent) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.parent = parent;
+ }
+
+ /**
+ * The range of this selection range.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range of this selection range.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The parent selection range containing this range. Therefore `parent.range` must contain {@link #range}.
+ */
+ @Pure
+ public SelectionRange getParent() {
+ return this.parent;
+ }
+
+ /**
+ * The parent selection range containing this range. Therefore `parent.range` must contain {@link #range}.
+ */
+ public void setParent(final SelectionRange parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("parent", this.parent);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SelectionRange other = (SelectionRange) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.parent == null) {
+ if (other.parent != null)
+ return false;
+ } else if (!this.parent.equals(other.parent))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.parent== null) ? 0 : this.parent.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SelectionRangeCapabilities.java b/java/org/eclipse/lsp4j/SelectionRangeCapabilities.java
new file mode 100644
index 0000000..4f737c5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SelectionRangeCapabilities.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to `textDocument/selectionRange` requests
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class SelectionRangeCapabilities extends DynamicRegistrationCapabilities {
+ public SelectionRangeCapabilities() {
+ }
+
+ public SelectionRangeCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SelectionRangeOptions.java b/java/org/eclipse/lsp4j/SelectionRangeOptions.java
new file mode 100644
index 0000000..083aab0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SelectionRangeOptions.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Selection range options.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class SelectionRangeOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SelectionRangeParams.java b/java/org/eclipse/lsp4j/SelectionRangeParams.java
new file mode 100644
index 0000000..ca95621
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SelectionRangeParams.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A parameter literal used in selection range requests.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class SelectionRangeParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The positions inside the text document.
+ */
+ @NonNull
+ private List<Position> positions;
+
+ public SelectionRangeParams() {
+ }
+
+ public SelectionRangeParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final List<Position> positions) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.positions = Preconditions.<List<Position>>checkNotNull(positions, "positions");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The positions inside the text document.
+ */
+ @Pure
+ @NonNull
+ public List<Position> getPositions() {
+ return this.positions;
+ }
+
+ /**
+ * The positions inside the text document.
+ */
+ public void setPositions(@NonNull final List<Position> positions) {
+ this.positions = Preconditions.checkNotNull(positions, "positions");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("positions", this.positions);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SelectionRangeParams other = (SelectionRangeParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.positions == null) {
+ if (other.positions != null)
+ return false;
+ } else if (!this.positions.equals(other.positions))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.positions== null) ? 0 : this.positions.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SelectionRangeRegistrationOptions.java b/java/org/eclipse/lsp4j/SelectionRangeRegistrationOptions.java
new file mode 100644
index 0000000..aa3bdb1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SelectionRangeRegistrationOptions.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Selection range registration options.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class SelectionRangeRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public SelectionRangeRegistrationOptions() {
+ }
+
+ public SelectionRangeRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SelectionRangeRegistrationOptions other = (SelectionRangeRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokenModifiers.java b/java/org/eclipse/lsp4j/SemanticTokenModifiers.java
new file mode 100644
index 0000000..a920c55
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokenModifiers.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2020 Eric Dallo.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+/**
+ * Since 3.16.0
+ */
+public final class SemanticTokenModifiers {
+ private SemanticTokenModifiers() {
+ }
+
+ public static final String Declaration = "declaration";
+
+ public static final String Definition = "definition";
+
+ public static final String Readonly = "readonly";
+
+ public static final String Static = "static";
+
+ public static final String Deprecated = "deprecated";
+
+ public static final String Abstract = "abstract";
+
+ public static final String Async = "async";
+
+ public static final String Modification = "modification";
+
+ public static final String Documentation = "documentation";
+
+ public static final String DefaultLibrary = "defaultLibrary";
+
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokenTypes.java b/java/org/eclipse/lsp4j/SemanticTokenTypes.java
new file mode 100644
index 0000000..5abf16a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokenTypes.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2020 Eric Dallo.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+/**
+ * Since 3.16.0
+ */
+public final class SemanticTokenTypes {
+ private SemanticTokenTypes() {
+ }
+
+ public static final String Namespace = "namespace";
+
+ /**
+ * Represents a generic type. Acts as a fallback for types which
+ * can't be mapped to a specific type like class or enum.
+ */
+ public static final String Type = "type";
+
+ public static final String Class = "class";
+
+ public static final String Enum = "enum";
+
+ public static final String Interface = "interface";
+
+ public static final String Struct = "struct";
+
+ public static final String TypeParameter = "typeParameter";
+
+ public static final String Parameter = "parameter";
+
+ public static final String Variable = "variable";
+
+ public static final String Property = "property";
+
+ public static final String EnumMember = "enumMember";
+
+ public static final String Event = "event";
+
+ public static final String Function = "function";
+
+ /**
+ * @deprecated This was erroneously named prior to finalization. Use {@link #Method} instead.
+ */
+ @Deprecated
+ public static final String Member = "member";
+
+ public static final String Method = "method";
+
+ public static final String Macro = "macro";
+
+ public static final String Keyword = "keyword";
+
+ public static final String Modifier = "modifier";
+
+ public static final String Comment = "comment";
+
+ public static final String String = "string";
+
+ public static final String Number = "number";
+
+ public static final String Regexp = "regexp";
+
+ public static final String Operator = "operator";
+
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokens.java b/java/org/eclipse/lsp4j/SemanticTokens.java
new file mode 100644
index 0000000..f0cf906
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokens.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokens {
+ /**
+ * An optional result id. If provided and clients support delta updating
+ * the client will include the result id in the next semantic token request.
+ * A server can then instead of computing all semantic tokens again simply
+ * send a delta.
+ */
+ private String resultId;
+
+ /**
+ * The actual tokens.
+ */
+ @NonNull
+ private List<Integer> data;
+
+ public SemanticTokens(@NonNull final List<Integer> data) {
+ this.data = Preconditions.<List<Integer>>checkNotNull(data, "data");
+ }
+
+ public SemanticTokens(final String resultId, @NonNull final List<Integer> data) {
+ this(data);
+ this.resultId = resultId;
+ }
+
+ /**
+ * An optional result id. If provided and clients support delta updating
+ * the client will include the result id in the next semantic token request.
+ * A server can then instead of computing all semantic tokens again simply
+ * send a delta.
+ */
+ @Pure
+ public String getResultId() {
+ return this.resultId;
+ }
+
+ /**
+ * An optional result id. If provided and clients support delta updating
+ * the client will include the result id in the next semantic token request.
+ * A server can then instead of computing all semantic tokens again simply
+ * send a delta.
+ */
+ public void setResultId(final String resultId) {
+ this.resultId = resultId;
+ }
+
+ /**
+ * The actual tokens.
+ */
+ @Pure
+ @NonNull
+ public List<Integer> getData() {
+ return this.data;
+ }
+
+ /**
+ * The actual tokens.
+ */
+ public void setData(@NonNull final List<Integer> data) {
+ this.data = Preconditions.checkNotNull(data, "data");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resultId", this.resultId);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokens other = (SemanticTokens) obj;
+ if (this.resultId == null) {
+ if (other.resultId != null)
+ return false;
+ } else if (!this.resultId.equals(other.resultId))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.resultId== null) ? 0 : this.resultId.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensCapabilities.java b/java/org/eclipse/lsp4j/SemanticTokensCapabilities.java
new file mode 100644
index 0000000..3b2dabe
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensCapabilities.java
@@ -0,0 +1,263 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.lsp4j.SemanticTokensClientCapabilitiesRequests;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Which requests the client supports and might send to the server.
+ */
+ @NonNull
+ private SemanticTokensClientCapabilitiesRequests requests;
+
+ /**
+ * The token types that the client supports.
+ */
+ @NonNull
+ private List<String> tokenTypes;
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ @NonNull
+ private List<String> tokenModifiers;
+
+ /**
+ * The formats the client supports.
+ * <p>
+ * See {@link TokenFormat} for allowed values.
+ */
+ @NonNull
+ private List<String> formats;
+
+ /**
+ * Whether the client supports tokens that can overlap each other.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean overlappingTokenSupport;
+
+ /**
+ * Whether the client supports tokens that can span multiple lines.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean multilineTokenSupport;
+
+ public SemanticTokensCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public SemanticTokensCapabilities(@NonNull final SemanticTokensClientCapabilitiesRequests requests, @NonNull final List<String> tokenTypes, @NonNull final List<String> tokenModifiers, @NonNull final List<String> formats) {
+ this.requests = Preconditions.<SemanticTokensClientCapabilitiesRequests>checkNotNull(requests, "requests");
+ this.tokenTypes = Preconditions.<List<String>>checkNotNull(tokenTypes, "tokenTypes");
+ this.tokenModifiers = Preconditions.<List<String>>checkNotNull(tokenModifiers, "tokenModifiers");
+ this.formats = Preconditions.<List<String>>checkNotNull(formats, "formats");
+ }
+
+ public SemanticTokensCapabilities(final Boolean dynamicRegistration, @NonNull final SemanticTokensClientCapabilitiesRequests requests, @NonNull final List<String> tokenTypes, @NonNull final List<String> tokenModifiers, @NonNull final List<String> formats) {
+ super(dynamicRegistration);
+ this.requests = Preconditions.<SemanticTokensClientCapabilitiesRequests>checkNotNull(requests, "requests");
+ this.tokenTypes = Preconditions.<List<String>>checkNotNull(tokenTypes, "tokenTypes");
+ this.tokenModifiers = Preconditions.<List<String>>checkNotNull(tokenModifiers, "tokenModifiers");
+ this.formats = Preconditions.<List<String>>checkNotNull(formats, "formats");
+ }
+
+ /**
+ * Which requests the client supports and might send to the server.
+ */
+ @Pure
+ @NonNull
+ public SemanticTokensClientCapabilitiesRequests getRequests() {
+ return this.requests;
+ }
+
+ /**
+ * Which requests the client supports and might send to the server.
+ */
+ public void setRequests(@NonNull final SemanticTokensClientCapabilitiesRequests requests) {
+ this.requests = Preconditions.checkNotNull(requests, "requests");
+ }
+
+ /**
+ * The token types that the client supports.
+ */
+ @Pure
+ @NonNull
+ public List<String> getTokenTypes() {
+ return this.tokenTypes;
+ }
+
+ /**
+ * The token types that the client supports.
+ */
+ public void setTokenTypes(@NonNull final List<String> tokenTypes) {
+ this.tokenTypes = Preconditions.checkNotNull(tokenTypes, "tokenTypes");
+ }
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ @Pure
+ @NonNull
+ public List<String> getTokenModifiers() {
+ return this.tokenModifiers;
+ }
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ public void setTokenModifiers(@NonNull final List<String> tokenModifiers) {
+ this.tokenModifiers = Preconditions.checkNotNull(tokenModifiers, "tokenModifiers");
+ }
+
+ /**
+ * The formats the client supports.
+ * <p>
+ * See {@link TokenFormat} for allowed values.
+ */
+ @Pure
+ @NonNull
+ public List<String> getFormats() {
+ return this.formats;
+ }
+
+ /**
+ * The formats the client supports.
+ * <p>
+ * See {@link TokenFormat} for allowed values.
+ */
+ public void setFormats(@NonNull final List<String> formats) {
+ this.formats = Preconditions.checkNotNull(formats, "formats");
+ }
+
+ /**
+ * Whether the client supports tokens that can overlap each other.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getOverlappingTokenSupport() {
+ return this.overlappingTokenSupport;
+ }
+
+ /**
+ * Whether the client supports tokens that can overlap each other.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setOverlappingTokenSupport(final Boolean overlappingTokenSupport) {
+ this.overlappingTokenSupport = overlappingTokenSupport;
+ }
+
+ /**
+ * Whether the client supports tokens that can span multiple lines.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getMultilineTokenSupport() {
+ return this.multilineTokenSupport;
+ }
+
+ /**
+ * Whether the client supports tokens that can span multiple lines.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setMultilineTokenSupport(final Boolean multilineTokenSupport) {
+ this.multilineTokenSupport = multilineTokenSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("requests", this.requests);
+ b.add("tokenTypes", this.tokenTypes);
+ b.add("tokenModifiers", this.tokenModifiers);
+ b.add("formats", this.formats);
+ b.add("overlappingTokenSupport", this.overlappingTokenSupport);
+ b.add("multilineTokenSupport", this.multilineTokenSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SemanticTokensCapabilities other = (SemanticTokensCapabilities) obj;
+ if (this.requests == null) {
+ if (other.requests != null)
+ return false;
+ } else if (!this.requests.equals(other.requests))
+ return false;
+ if (this.tokenTypes == null) {
+ if (other.tokenTypes != null)
+ return false;
+ } else if (!this.tokenTypes.equals(other.tokenTypes))
+ return false;
+ if (this.tokenModifiers == null) {
+ if (other.tokenModifiers != null)
+ return false;
+ } else if (!this.tokenModifiers.equals(other.tokenModifiers))
+ return false;
+ if (this.formats == null) {
+ if (other.formats != null)
+ return false;
+ } else if (!this.formats.equals(other.formats))
+ return false;
+ if (this.overlappingTokenSupport == null) {
+ if (other.overlappingTokenSupport != null)
+ return false;
+ } else if (!this.overlappingTokenSupport.equals(other.overlappingTokenSupport))
+ return false;
+ if (this.multilineTokenSupport == null) {
+ if (other.multilineTokenSupport != null)
+ return false;
+ } else if (!this.multilineTokenSupport.equals(other.multilineTokenSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.requests== null) ? 0 : this.requests.hashCode());
+ result = prime * result + ((this.tokenTypes== null) ? 0 : this.tokenTypes.hashCode());
+ result = prime * result + ((this.tokenModifiers== null) ? 0 : this.tokenModifiers.hashCode());
+ result = prime * result + ((this.formats== null) ? 0 : this.formats.hashCode());
+ result = prime * result + ((this.overlappingTokenSupport== null) ? 0 : this.overlappingTokenSupport.hashCode());
+ return prime * result + ((this.multilineTokenSupport== null) ? 0 : this.multilineTokenSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensClientCapabilitiesRequests.java b/java/org/eclipse/lsp4j/SemanticTokensClientCapabilitiesRequests.java
new file mode 100644
index 0000000..394cf26
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensClientCapabilitiesRequests.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.SemanticTokensClientCapabilitiesRequestsFull;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensClientCapabilitiesRequests {
+ /**
+ * The client will send the `textDocument/semanticTokens/range` request if
+ * the server provides a corresponding handler.
+ */
+ private Either<Boolean, Object> range;
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full` request if
+ * the server provides a corresponding handler.
+ */
+ private Either<Boolean, SemanticTokensClientCapabilitiesRequestsFull> full;
+
+ public SemanticTokensClientCapabilitiesRequests() {
+ }
+
+ public SemanticTokensClientCapabilitiesRequests(final Boolean full) {
+ this.setFull(full);
+ }
+
+ public SemanticTokensClientCapabilitiesRequests(final SemanticTokensClientCapabilitiesRequestsFull full) {
+ this.setFull(full);
+ }
+
+ public SemanticTokensClientCapabilitiesRequests(final Boolean full, final Boolean range) {
+ this.setFull(full);
+ this.setRange(range);
+ }
+
+ public SemanticTokensClientCapabilitiesRequests(final SemanticTokensClientCapabilitiesRequestsFull full, final Boolean range) {
+ this.setFull(full);
+ this.setRange(range);
+ }
+
+ /**
+ * The client will send the `textDocument/semanticTokens/range` request if
+ * the server provides a corresponding handler.
+ */
+ @Pure
+ public Either<Boolean, Object> getRange() {
+ return this.range;
+ }
+
+ /**
+ * The client will send the `textDocument/semanticTokens/range` request if
+ * the server provides a corresponding handler.
+ */
+ public void setRange(final Either<Boolean, Object> range) {
+ this.range = range;
+ }
+
+ public void setRange(final Boolean range) {
+ if (range == null) {
+ this.range = null;
+ return;
+ }
+ this.range = Either.forLeft(range);
+ }
+
+ public void setRange(final Object range) {
+ if (range == null) {
+ this.range = null;
+ return;
+ }
+ this.range = Either.forRight(range);
+ }
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full` request if
+ * the server provides a corresponding handler.
+ */
+ @Pure
+ public Either<Boolean, SemanticTokensClientCapabilitiesRequestsFull> getFull() {
+ return this.full;
+ }
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full` request if
+ * the server provides a corresponding handler.
+ */
+ public void setFull(final Either<Boolean, SemanticTokensClientCapabilitiesRequestsFull> full) {
+ this.full = full;
+ }
+
+ public void setFull(final Boolean full) {
+ if (full == null) {
+ this.full = null;
+ return;
+ }
+ this.full = Either.forLeft(full);
+ }
+
+ public void setFull(final SemanticTokensClientCapabilitiesRequestsFull full) {
+ if (full == null) {
+ this.full = null;
+ return;
+ }
+ this.full = Either.forRight(full);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("full", this.full);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensClientCapabilitiesRequests other = (SemanticTokensClientCapabilitiesRequests) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.full == null) {
+ if (other.full != null)
+ return false;
+ } else if (!this.full.equals(other.full))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.full== null) ? 0 : this.full.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensClientCapabilitiesRequestsFull.java b/java/org/eclipse/lsp4j/SemanticTokensClientCapabilitiesRequestsFull.java
new file mode 100644
index 0000000..4e0ea19
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensClientCapabilitiesRequestsFull.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensClientCapabilitiesRequestsFull {
+ /**
+ * The client will send the `textDocument/semanticTokens/full/delta` request if
+ * the server provides a corresponding handler.
+ */
+ private Boolean delta;
+
+ public SemanticTokensClientCapabilitiesRequestsFull() {
+ }
+
+ public SemanticTokensClientCapabilitiesRequestsFull(final Boolean delta) {
+ this.delta = delta;
+ }
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full/delta` request if
+ * the server provides a corresponding handler.
+ */
+ @Pure
+ public Boolean getDelta() {
+ return this.delta;
+ }
+
+ /**
+ * The client will send the `textDocument/semanticTokens/full/delta` request if
+ * the server provides a corresponding handler.
+ */
+ public void setDelta(final Boolean delta) {
+ this.delta = delta;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("delta", this.delta);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensClientCapabilitiesRequestsFull other = (SemanticTokensClientCapabilitiesRequestsFull) obj;
+ if (this.delta == null) {
+ if (other.delta != null)
+ return false;
+ } else if (!this.delta.equals(other.delta))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.delta== null) ? 0 : this.delta.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensDelta.java b/java/org/eclipse/lsp4j/SemanticTokensDelta.java
new file mode 100644
index 0000000..f6a588e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensDelta.java
@@ -0,0 +1,108 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.SemanticTokensEdit;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensDelta {
+ private String resultId;
+
+ /**
+ * The semantic token edits to transform a previous result into a new result.
+ */
+ @NonNull
+ private List<SemanticTokensEdit> edits;
+
+ public SemanticTokensDelta(@NonNull final List<SemanticTokensEdit> edits) {
+ this.edits = Preconditions.<List<SemanticTokensEdit>>checkNotNull(edits, "edits");
+ }
+
+ public SemanticTokensDelta(@NonNull final List<SemanticTokensEdit> edits, final String resultId) {
+ this.edits = Preconditions.<List<SemanticTokensEdit>>checkNotNull(edits, "edits");
+ this.resultId = resultId;
+ }
+
+ @Pure
+ public String getResultId() {
+ return this.resultId;
+ }
+
+ public void setResultId(final String resultId) {
+ this.resultId = resultId;
+ }
+
+ /**
+ * The semantic token edits to transform a previous result into a new result.
+ */
+ @Pure
+ @NonNull
+ public List<SemanticTokensEdit> getEdits() {
+ return this.edits;
+ }
+
+ /**
+ * The semantic token edits to transform a previous result into a new result.
+ */
+ public void setEdits(@NonNull final List<SemanticTokensEdit> edits) {
+ this.edits = Preconditions.checkNotNull(edits, "edits");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resultId", this.resultId);
+ b.add("edits", this.edits);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensDelta other = (SemanticTokensDelta) obj;
+ if (this.resultId == null) {
+ if (other.resultId != null)
+ return false;
+ } else if (!this.resultId.equals(other.resultId))
+ return false;
+ if (this.edits == null) {
+ if (other.edits != null)
+ return false;
+ } else if (!this.edits.equals(other.edits))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.resultId== null) ? 0 : this.resultId.hashCode());
+ return prime * result + ((this.edits== null) ? 0 : this.edits.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensDeltaParams.java b/java/org/eclipse/lsp4j/SemanticTokensDeltaParams.java
new file mode 100644
index 0000000..bb5e95a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensDeltaParams.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The request is sent from the client to the server to resolve semantic token deltas for a given whole file.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensDeltaParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The result id of a previous response. The result Id can either point to a full response
+ * or a delta response depending on what was received last.
+ */
+ @NonNull
+ private String previousResultId;
+
+ public SemanticTokensDeltaParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final String previousResultId) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.previousResultId = Preconditions.<String>checkNotNull(previousResultId, "previousResultId");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The result id of a previous response. The result Id can either point to a full response
+ * or a delta response depending on what was received last.
+ */
+ @Pure
+ @NonNull
+ public String getPreviousResultId() {
+ return this.previousResultId;
+ }
+
+ /**
+ * The result id of a previous response. The result Id can either point to a full response
+ * or a delta response depending on what was received last.
+ */
+ public void setPreviousResultId(@NonNull final String previousResultId) {
+ this.previousResultId = Preconditions.checkNotNull(previousResultId, "previousResultId");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("previousResultId", this.previousResultId);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SemanticTokensDeltaParams other = (SemanticTokensDeltaParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.previousResultId == null) {
+ if (other.previousResultId != null)
+ return false;
+ } else if (!this.previousResultId.equals(other.previousResultId))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.previousResultId== null) ? 0 : this.previousResultId.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensDeltaPartialResult.java b/java/org/eclipse/lsp4j/SemanticTokensDeltaPartialResult.java
new file mode 100644
index 0000000..cbe979e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensDeltaPartialResult.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.SemanticTokensEdit;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensDeltaPartialResult {
+ @NonNull
+ private List<SemanticTokensEdit> edits;
+
+ public SemanticTokensDeltaPartialResult(@NonNull final List<SemanticTokensEdit> edits) {
+ this.edits = Preconditions.<List<SemanticTokensEdit>>checkNotNull(edits, "edits");
+ }
+
+ @Pure
+ @NonNull
+ public List<SemanticTokensEdit> getEdits() {
+ return this.edits;
+ }
+
+ public void setEdits(@NonNull final List<SemanticTokensEdit> edits) {
+ this.edits = Preconditions.checkNotNull(edits, "edits");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("edits", this.edits);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensDeltaPartialResult other = (SemanticTokensDeltaPartialResult) obj;
+ if (this.edits == null) {
+ if (other.edits != null)
+ return false;
+ } else if (!this.edits.equals(other.edits))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.edits== null) ? 0 : this.edits.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensEdit.java b/java/org/eclipse/lsp4j/SemanticTokensEdit.java
new file mode 100644
index 0000000..81f08f0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensEdit.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensEdit {
+ /**
+ * The start offset of the edit.
+ */
+ private int start;
+
+ /**
+ * The count of elements to remove.
+ */
+ private int deleteCount;
+
+ /**
+ * The elements to insert.
+ */
+ private List<Integer> data;
+
+ public SemanticTokensEdit(final int start, final int deleteCount, final List<Integer> data) {
+ this.start = start;
+ this.deleteCount = deleteCount;
+ this.data = data;
+ }
+
+ /**
+ * The start offset of the edit.
+ */
+ @Pure
+ public int getStart() {
+ return this.start;
+ }
+
+ /**
+ * The start offset of the edit.
+ */
+ public void setStart(final int start) {
+ this.start = start;
+ }
+
+ /**
+ * The count of elements to remove.
+ */
+ @Pure
+ public int getDeleteCount() {
+ return this.deleteCount;
+ }
+
+ /**
+ * The count of elements to remove.
+ */
+ public void setDeleteCount(final int deleteCount) {
+ this.deleteCount = deleteCount;
+ }
+
+ /**
+ * The elements to insert.
+ */
+ @Pure
+ public List<Integer> getData() {
+ return this.data;
+ }
+
+ /**
+ * The elements to insert.
+ */
+ public void setData(final List<Integer> data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("start", this.start);
+ b.add("deleteCount", this.deleteCount);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensEdit other = (SemanticTokensEdit) obj;
+ if (other.start != this.start)
+ return false;
+ if (other.deleteCount != this.deleteCount)
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.start;
+ result = prime * result + this.deleteCount;
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensLegend.java b/java/org/eclipse/lsp4j/SemanticTokensLegend.java
new file mode 100644
index 0000000..5d25399
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensLegend.java
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The legend used by the server
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensLegend {
+ /**
+ * The token types that the client supports.
+ */
+ @NonNull
+ private List<String> tokenTypes;
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ @NonNull
+ private List<String> tokenModifiers;
+
+ public SemanticTokensLegend(@NonNull final List<String> tokenTypes, @NonNull final List<String> tokenModifiers) {
+ this.tokenTypes = Preconditions.<List<String>>checkNotNull(tokenTypes, "tokenTypes");
+ this.tokenModifiers = Preconditions.<List<String>>checkNotNull(tokenModifiers, "tokenModifiers");
+ }
+
+ /**
+ * The token types that the client supports.
+ */
+ @Pure
+ @NonNull
+ public List<String> getTokenTypes() {
+ return this.tokenTypes;
+ }
+
+ /**
+ * The token types that the client supports.
+ */
+ public void setTokenTypes(@NonNull final List<String> tokenTypes) {
+ this.tokenTypes = Preconditions.checkNotNull(tokenTypes, "tokenTypes");
+ }
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ @Pure
+ @NonNull
+ public List<String> getTokenModifiers() {
+ return this.tokenModifiers;
+ }
+
+ /**
+ * The token modifiers that the client supports.
+ */
+ public void setTokenModifiers(@NonNull final List<String> tokenModifiers) {
+ this.tokenModifiers = Preconditions.checkNotNull(tokenModifiers, "tokenModifiers");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("tokenTypes", this.tokenTypes);
+ b.add("tokenModifiers", this.tokenModifiers);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensLegend other = (SemanticTokensLegend) obj;
+ if (this.tokenTypes == null) {
+ if (other.tokenTypes != null)
+ return false;
+ } else if (!this.tokenTypes.equals(other.tokenTypes))
+ return false;
+ if (this.tokenModifiers == null) {
+ if (other.tokenModifiers != null)
+ return false;
+ } else if (!this.tokenModifiers.equals(other.tokenModifiers))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.tokenTypes== null) ? 0 : this.tokenTypes.hashCode());
+ return prime * result + ((this.tokenModifiers== null) ? 0 : this.tokenModifiers.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensParams.java b/java/org/eclipse/lsp4j/SemanticTokensParams.java
new file mode 100644
index 0000000..5fd1311
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensParams.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The request is sent from the client to the server to resolve semantic tokens for a given whole file.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ public SemanticTokensParams(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SemanticTokensParams other = (SemanticTokensParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensPartialResult.java b/java/org/eclipse/lsp4j/SemanticTokensPartialResult.java
new file mode 100644
index 0000000..8141b81
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensPartialResult.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensPartialResult {
+ @NonNull
+ private List<Integer> data;
+
+ public SemanticTokensPartialResult(@NonNull final List<Integer> data) {
+ this.data = Preconditions.<List<Integer>>checkNotNull(data, "data");
+ }
+
+ @Pure
+ @NonNull
+ public List<Integer> getData() {
+ return this.data;
+ }
+
+ public void setData(@NonNull final List<Integer> data) {
+ this.data = Preconditions.checkNotNull(data, "data");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensPartialResult other = (SemanticTokensPartialResult) obj;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensRangeParams.java b/java/org/eclipse/lsp4j/SemanticTokensRangeParams.java
new file mode 100644
index 0000000..d73b02a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensRangeParams.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The request is sent from the client to the server to resolve semantic tokens for a range in a given file.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensRangeParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * The range the semantic tokens are requested for.
+ */
+ @NonNull
+ private Range range;
+
+ public SemanticTokensRangeParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Range range) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The range the semantic tokens are requested for.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range the semantic tokens are requested for.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("range", this.range);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SemanticTokensRangeParams other = (SemanticTokensRangeParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensServerFull.java b/java/org/eclipse/lsp4j/SemanticTokensServerFull.java
new file mode 100644
index 0000000..90dbb81
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensServerFull.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Server supports providing semantic tokens for a full document.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensServerFull {
+ /**
+ * The server supports deltas for full documents.
+ */
+ private Boolean delta;
+
+ public SemanticTokensServerFull() {
+ }
+
+ public SemanticTokensServerFull(final Boolean delta) {
+ this.delta = delta;
+ }
+
+ /**
+ * The server supports deltas for full documents.
+ */
+ @Pure
+ public Boolean getDelta() {
+ return this.delta;
+ }
+
+ /**
+ * The server supports deltas for full documents.
+ */
+ public void setDelta(final Boolean delta) {
+ this.delta = delta;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("delta", this.delta);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensServerFull other = (SemanticTokensServerFull) obj;
+ if (this.delta == null) {
+ if (other.delta != null)
+ return false;
+ } else if (!this.delta.equals(other.delta))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.delta== null) ? 0 : this.delta.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensWithRegistrationOptions.java b/java/org/eclipse/lsp4j/SemanticTokensWithRegistrationOptions.java
new file mode 100644
index 0000000..3561113
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensWithRegistrationOptions.java
@@ -0,0 +1,273 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.lsp4j.DocumentFilter;
+import org.eclipse.lsp4j.SemanticTokensLegend;
+import org.eclipse.lsp4j.SemanticTokensServerFull;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensWithRegistrationOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * The legend used by the server
+ */
+ @NonNull
+ private SemanticTokensLegend legend;
+
+ /**
+ * Server supports providing semantic tokens for a specific range
+ * of a document.
+ */
+ private Either<Boolean, Object> range;
+
+ /**
+ * Server supports providing semantic tokens for a full document.
+ */
+ private Either<Boolean, SemanticTokensServerFull> full;
+
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ private List<DocumentFilter> documentSelector;
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public SemanticTokensWithRegistrationOptions() {
+ }
+
+ public SemanticTokensWithRegistrationOptions(@NonNull final SemanticTokensLegend legend) {
+ this.legend = Preconditions.<SemanticTokensLegend>checkNotNull(legend, "legend");
+ }
+
+ public SemanticTokensWithRegistrationOptions(@NonNull final SemanticTokensLegend legend, final Boolean full) {
+ this(legend);
+ this.setFull(full);
+ }
+
+ public SemanticTokensWithRegistrationOptions(@NonNull final SemanticTokensLegend legend, final SemanticTokensServerFull full) {
+ this(legend);
+ this.setFull(full);
+ }
+
+ public SemanticTokensWithRegistrationOptions(@NonNull final SemanticTokensLegend legend, final Boolean full, final Boolean range) {
+ this(legend);
+ this.setFull(full);
+ this.setRange(range);
+ }
+
+ public SemanticTokensWithRegistrationOptions(@NonNull final SemanticTokensLegend legend, final SemanticTokensServerFull full, final Boolean range) {
+ this(legend);
+ this.setFull(full);
+ this.setRange(range);
+ }
+
+ public SemanticTokensWithRegistrationOptions(@NonNull final SemanticTokensLegend legend, final SemanticTokensServerFull full, final Boolean range, final List<DocumentFilter> documentSelector) {
+ this(legend);
+ this.setFull(full);
+ this.setRange(range);
+ this.documentSelector = documentSelector;
+ }
+
+ /**
+ * The legend used by the server
+ */
+ @Pure
+ @NonNull
+ public SemanticTokensLegend getLegend() {
+ return this.legend;
+ }
+
+ /**
+ * The legend used by the server
+ */
+ public void setLegend(@NonNull final SemanticTokensLegend legend) {
+ this.legend = Preconditions.checkNotNull(legend, "legend");
+ }
+
+ /**
+ * Server supports providing semantic tokens for a specific range
+ * of a document.
+ */
+ @Pure
+ public Either<Boolean, Object> getRange() {
+ return this.range;
+ }
+
+ /**
+ * Server supports providing semantic tokens for a specific range
+ * of a document.
+ */
+ public void setRange(final Either<Boolean, Object> range) {
+ this.range = range;
+ }
+
+ public void setRange(final Boolean range) {
+ if (range == null) {
+ this.range = null;
+ return;
+ }
+ this.range = Either.forLeft(range);
+ }
+
+ public void setRange(final Object range) {
+ if (range == null) {
+ this.range = null;
+ return;
+ }
+ this.range = Either.forRight(range);
+ }
+
+ /**
+ * Server supports providing semantic tokens for a full document.
+ */
+ @Pure
+ public Either<Boolean, SemanticTokensServerFull> getFull() {
+ return this.full;
+ }
+
+ /**
+ * Server supports providing semantic tokens for a full document.
+ */
+ public void setFull(final Either<Boolean, SemanticTokensServerFull> full) {
+ this.full = full;
+ }
+
+ public void setFull(final Boolean full) {
+ if (full == null) {
+ this.full = null;
+ return;
+ }
+ this.full = Either.forLeft(full);
+ }
+
+ public void setFull(final SemanticTokensServerFull full) {
+ if (full == null) {
+ this.full = null;
+ return;
+ }
+ this.full = Either.forRight(full);
+ }
+
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ @Pure
+ public List<DocumentFilter> getDocumentSelector() {
+ return this.documentSelector;
+ }
+
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ public void setDocumentSelector(final List<DocumentFilter> documentSelector) {
+ this.documentSelector = documentSelector;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("legend", this.legend);
+ b.add("range", this.range);
+ b.add("full", this.full);
+ b.add("documentSelector", this.documentSelector);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SemanticTokensWithRegistrationOptions other = (SemanticTokensWithRegistrationOptions) obj;
+ if (this.legend == null) {
+ if (other.legend != null)
+ return false;
+ } else if (!this.legend.equals(other.legend))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.full == null) {
+ if (other.full != null)
+ return false;
+ } else if (!this.full.equals(other.full))
+ return false;
+ if (this.documentSelector == null) {
+ if (other.documentSelector != null)
+ return false;
+ } else if (!this.documentSelector.equals(other.documentSelector))
+ return false;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.legend== null) ? 0 : this.legend.hashCode());
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.full== null) ? 0 : this.full.hashCode());
+ result = prime * result + ((this.documentSelector== null) ? 0 : this.documentSelector.hashCode());
+ return prime * result + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SemanticTokensWorkspaceCapabilities.java b/java/org/eclipse/lsp4j/SemanticTokensWorkspaceCapabilities.java
new file mode 100644
index 0000000..da9067a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SemanticTokensWorkspaceCapabilities.java
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the semantic token requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SemanticTokensWorkspaceCapabilities {
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * semantic tokens currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ private Boolean refreshSupport;
+
+ public SemanticTokensWorkspaceCapabilities() {
+ }
+
+ public SemanticTokensWorkspaceCapabilities(final Boolean refreshSupport) {
+ this.refreshSupport = refreshSupport;
+ }
+
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * semantic tokens currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ @Pure
+ public Boolean getRefreshSupport() {
+ return this.refreshSupport;
+ }
+
+ /**
+ * Whether the client implementation supports a refresh request sent from the
+ * server to the client.
+ * <p>
+ * Note that this event is global and will force the client to refresh all
+ * semantic tokens currently shown. It should be used with absolute care and is
+ * useful for situations where a server for example detects a project-wide
+ * change that requires such a calculation.
+ */
+ public void setRefreshSupport(final Boolean refreshSupport) {
+ this.refreshSupport = refreshSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("refreshSupport", this.refreshSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SemanticTokensWorkspaceCapabilities other = (SemanticTokensWorkspaceCapabilities) obj;
+ if (this.refreshSupport == null) {
+ if (other.refreshSupport != null)
+ return false;
+ } else if (!this.refreshSupport.equals(other.refreshSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.refreshSupport== null) ? 0 : this.refreshSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ServerCapabilities.java b/java/org/eclipse/lsp4j/ServerCapabilities.java
new file mode 100644
index 0000000..9a10954
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ServerCapabilities.java
@@ -0,0 +1,1317 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.CallHierarchyRegistrationOptions;
+import org.eclipse.lsp4j.CodeActionOptions;
+import org.eclipse.lsp4j.CodeLensOptions;
+import org.eclipse.lsp4j.ColorProviderOptions;
+import org.eclipse.lsp4j.CompletionOptions;
+import org.eclipse.lsp4j.DeclarationRegistrationOptions;
+import org.eclipse.lsp4j.DefinitionOptions;
+import org.eclipse.lsp4j.DocumentFormattingOptions;
+import org.eclipse.lsp4j.DocumentHighlightOptions;
+import org.eclipse.lsp4j.DocumentLinkOptions;
+import org.eclipse.lsp4j.DocumentOnTypeFormattingOptions;
+import org.eclipse.lsp4j.DocumentRangeFormattingOptions;
+import org.eclipse.lsp4j.DocumentSymbolOptions;
+import org.eclipse.lsp4j.ExecuteCommandOptions;
+import org.eclipse.lsp4j.FoldingRangeProviderOptions;
+import org.eclipse.lsp4j.HoverOptions;
+import org.eclipse.lsp4j.ImplementationRegistrationOptions;
+import org.eclipse.lsp4j.LinkedEditingRangeRegistrationOptions;
+import org.eclipse.lsp4j.MonikerRegistrationOptions;
+import org.eclipse.lsp4j.ReferenceOptions;
+import org.eclipse.lsp4j.RenameOptions;
+import org.eclipse.lsp4j.SelectionRangeRegistrationOptions;
+import org.eclipse.lsp4j.SemanticTokensWithRegistrationOptions;
+import org.eclipse.lsp4j.SignatureHelpOptions;
+import org.eclipse.lsp4j.StaticRegistrationOptions;
+import org.eclipse.lsp4j.TextDocumentSyncKind;
+import org.eclipse.lsp4j.TextDocumentSyncOptions;
+import org.eclipse.lsp4j.TypeDefinitionRegistrationOptions;
+import org.eclipse.lsp4j.WorkspaceServerCapabilities;
+import org.eclipse.lsp4j.WorkspaceSymbolOptions;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The server can signal these capabilities
+ */
+@SuppressWarnings("all")
+public class ServerCapabilities {
+ /**
+ * Defines how text documents are synced. Is either a detailed structure defining each notification or
+ * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to
+ * {@link TextDocumentSyncKind#None}
+ */
+ private Either<TextDocumentSyncKind, TextDocumentSyncOptions> textDocumentSync;
+
+ /**
+ * The server provides hover support.
+ */
+ private Either<Boolean, HoverOptions> hoverProvider;
+
+ /**
+ * The server provides completion support.
+ */
+ private CompletionOptions completionProvider;
+
+ /**
+ * The server provides signature help support.
+ */
+ private SignatureHelpOptions signatureHelpProvider;
+
+ /**
+ * The server provides goto definition support.
+ */
+ private Either<Boolean, DefinitionOptions> definitionProvider;
+
+ /**
+ * The server provides Goto Type Definition support.
+ * <p>
+ * Since 3.6.0
+ */
+ private Either<Boolean, TypeDefinitionRegistrationOptions> typeDefinitionProvider;
+
+ /**
+ * The server provides Goto Implementation support.
+ * <p>
+ * Since 3.6.0
+ */
+ private Either<Boolean, ImplementationRegistrationOptions> implementationProvider;
+
+ /**
+ * The server provides find references support.
+ */
+ private Either<Boolean, ReferenceOptions> referencesProvider;
+
+ /**
+ * The server provides document highlight support.
+ */
+ private Either<Boolean, DocumentHighlightOptions> documentHighlightProvider;
+
+ /**
+ * The server provides document symbol support.
+ */
+ private Either<Boolean, DocumentSymbolOptions> documentSymbolProvider;
+
+ /**
+ * The server provides workspace symbol support.
+ */
+ private Either<Boolean, WorkspaceSymbolOptions> workspaceSymbolProvider;
+
+ /**
+ * The server provides code actions. The {@link CodeActionOptions} return type is only
+ * valid if the client signals code action literal support via the property
+ * {@link CodeActionCapabilities#codeActionLiteralSupport}.
+ */
+ private Either<Boolean, CodeActionOptions> codeActionProvider;
+
+ /**
+ * The server provides code lens.
+ */
+ private CodeLensOptions codeLensProvider;
+
+ /**
+ * The server provides document formatting.
+ */
+ private Either<Boolean, DocumentFormattingOptions> documentFormattingProvider;
+
+ /**
+ * The server provides document range formatting.
+ */
+ private Either<Boolean, DocumentRangeFormattingOptions> documentRangeFormattingProvider;
+
+ /**
+ * The server provides document formatting on typing.
+ */
+ private DocumentOnTypeFormattingOptions documentOnTypeFormattingProvider;
+
+ /**
+ * The server provides rename support.
+ */
+ private Either<Boolean, RenameOptions> renameProvider;
+
+ /**
+ * The server provides document link support.
+ */
+ private DocumentLinkOptions documentLinkProvider;
+
+ /**
+ * The server provides color provider support.
+ * <p>
+ * Since 3.6.0
+ */
+ private Either<Boolean, ColorProviderOptions> colorProvider;
+
+ /**
+ * The server provides folding provider support.
+ * <p>
+ * Since 3.10.0
+ */
+ private Either<Boolean, FoldingRangeProviderOptions> foldingRangeProvider;
+
+ /**
+ * The server provides go to declaration support.
+ * <p>
+ * Since 3.14.0
+ */
+ private Either<Boolean, DeclarationRegistrationOptions> declarationProvider;
+
+ /**
+ * The server provides execute command support.
+ */
+ private ExecuteCommandOptions executeCommandProvider;
+
+ /**
+ * Workspace specific server capabilities
+ */
+ private WorkspaceServerCapabilities workspace;
+
+ /**
+ * Server capability for calculating super- and subtype hierarchies.
+ * The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+ @Beta
+ private Either<Boolean, StaticRegistrationOptions> typeHierarchyProvider;
+
+ /**
+ * The server provides Call Hierarchy support.
+ * <p>
+ * Since 3.16.0
+ */
+ private Either<Boolean, CallHierarchyRegistrationOptions> callHierarchyProvider;
+
+ /**
+ * The server provides selection range support.
+ * <p>
+ * Since 3.15.0
+ */
+ private Either<Boolean, SelectionRangeRegistrationOptions> selectionRangeProvider;
+
+ /**
+ * The server provides linked editing range support.
+ * <p>
+ * Since 3.16.0
+ */
+ private Either<Boolean, LinkedEditingRangeRegistrationOptions> linkedEditingRangeProvider;
+
+ /**
+ * The server provides semantic tokens support.
+ * <p>
+ * Since 3.16.0
+ */
+ private SemanticTokensWithRegistrationOptions semanticTokensProvider;
+
+ /**
+ * Whether server provides moniker support.
+ * <p>
+ * Since 3.16.0
+ */
+ private Either<Boolean, MonikerRegistrationOptions> monikerProvider;
+
+ /**
+ * Experimental server capabilities.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object experimental;
+
+ /**
+ * Defines how text documents are synced. Is either a detailed structure defining each notification or
+ * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to
+ * {@link TextDocumentSyncKind#None}
+ */
+ @Pure
+ public Either<TextDocumentSyncKind, TextDocumentSyncOptions> getTextDocumentSync() {
+ return this.textDocumentSync;
+ }
+
+ /**
+ * Defines how text documents are synced. Is either a detailed structure defining each notification or
+ * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to
+ * {@link TextDocumentSyncKind#None}
+ */
+ public void setTextDocumentSync(final Either<TextDocumentSyncKind, TextDocumentSyncOptions> textDocumentSync) {
+ this.textDocumentSync = textDocumentSync;
+ }
+
+ public void setTextDocumentSync(final TextDocumentSyncKind textDocumentSync) {
+ if (textDocumentSync == null) {
+ this.textDocumentSync = null;
+ return;
+ }
+ this.textDocumentSync = Either.forLeft(textDocumentSync);
+ }
+
+ public void setTextDocumentSync(final TextDocumentSyncOptions textDocumentSync) {
+ if (textDocumentSync == null) {
+ this.textDocumentSync = null;
+ return;
+ }
+ this.textDocumentSync = Either.forRight(textDocumentSync);
+ }
+
+ /**
+ * The server provides hover support.
+ */
+ @Pure
+ public Either<Boolean, HoverOptions> getHoverProvider() {
+ return this.hoverProvider;
+ }
+
+ /**
+ * The server provides hover support.
+ */
+ public void setHoverProvider(final Either<Boolean, HoverOptions> hoverProvider) {
+ this.hoverProvider = hoverProvider;
+ }
+
+ public void setHoverProvider(final Boolean hoverProvider) {
+ if (hoverProvider == null) {
+ this.hoverProvider = null;
+ return;
+ }
+ this.hoverProvider = Either.forLeft(hoverProvider);
+ }
+
+ public void setHoverProvider(final HoverOptions hoverProvider) {
+ if (hoverProvider == null) {
+ this.hoverProvider = null;
+ return;
+ }
+ this.hoverProvider = Either.forRight(hoverProvider);
+ }
+
+ /**
+ * The server provides completion support.
+ */
+ @Pure
+ public CompletionOptions getCompletionProvider() {
+ return this.completionProvider;
+ }
+
+ /**
+ * The server provides completion support.
+ */
+ public void setCompletionProvider(final CompletionOptions completionProvider) {
+ this.completionProvider = completionProvider;
+ }
+
+ /**
+ * The server provides signature help support.
+ */
+ @Pure
+ public SignatureHelpOptions getSignatureHelpProvider() {
+ return this.signatureHelpProvider;
+ }
+
+ /**
+ * The server provides signature help support.
+ */
+ public void setSignatureHelpProvider(final SignatureHelpOptions signatureHelpProvider) {
+ this.signatureHelpProvider = signatureHelpProvider;
+ }
+
+ /**
+ * The server provides goto definition support.
+ */
+ @Pure
+ public Either<Boolean, DefinitionOptions> getDefinitionProvider() {
+ return this.definitionProvider;
+ }
+
+ /**
+ * The server provides goto definition support.
+ */
+ public void setDefinitionProvider(final Either<Boolean, DefinitionOptions> definitionProvider) {
+ this.definitionProvider = definitionProvider;
+ }
+
+ public void setDefinitionProvider(final Boolean definitionProvider) {
+ if (definitionProvider == null) {
+ this.definitionProvider = null;
+ return;
+ }
+ this.definitionProvider = Either.forLeft(definitionProvider);
+ }
+
+ public void setDefinitionProvider(final DefinitionOptions definitionProvider) {
+ if (definitionProvider == null) {
+ this.definitionProvider = null;
+ return;
+ }
+ this.definitionProvider = Either.forRight(definitionProvider);
+ }
+
+ /**
+ * The server provides Goto Type Definition support.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public Either<Boolean, TypeDefinitionRegistrationOptions> getTypeDefinitionProvider() {
+ return this.typeDefinitionProvider;
+ }
+
+ /**
+ * The server provides Goto Type Definition support.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setTypeDefinitionProvider(final Either<Boolean, TypeDefinitionRegistrationOptions> typeDefinitionProvider) {
+ this.typeDefinitionProvider = typeDefinitionProvider;
+ }
+
+ public void setTypeDefinitionProvider(final Boolean typeDefinitionProvider) {
+ if (typeDefinitionProvider == null) {
+ this.typeDefinitionProvider = null;
+ return;
+ }
+ this.typeDefinitionProvider = Either.forLeft(typeDefinitionProvider);
+ }
+
+ public void setTypeDefinitionProvider(final TypeDefinitionRegistrationOptions typeDefinitionProvider) {
+ if (typeDefinitionProvider == null) {
+ this.typeDefinitionProvider = null;
+ return;
+ }
+ this.typeDefinitionProvider = Either.forRight(typeDefinitionProvider);
+ }
+
+ /**
+ * The server provides Goto Implementation support.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public Either<Boolean, ImplementationRegistrationOptions> getImplementationProvider() {
+ return this.implementationProvider;
+ }
+
+ /**
+ * The server provides Goto Implementation support.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setImplementationProvider(final Either<Boolean, ImplementationRegistrationOptions> implementationProvider) {
+ this.implementationProvider = implementationProvider;
+ }
+
+ public void setImplementationProvider(final Boolean implementationProvider) {
+ if (implementationProvider == null) {
+ this.implementationProvider = null;
+ return;
+ }
+ this.implementationProvider = Either.forLeft(implementationProvider);
+ }
+
+ public void setImplementationProvider(final ImplementationRegistrationOptions implementationProvider) {
+ if (implementationProvider == null) {
+ this.implementationProvider = null;
+ return;
+ }
+ this.implementationProvider = Either.forRight(implementationProvider);
+ }
+
+ /**
+ * The server provides find references support.
+ */
+ @Pure
+ public Either<Boolean, ReferenceOptions> getReferencesProvider() {
+ return this.referencesProvider;
+ }
+
+ /**
+ * The server provides find references support.
+ */
+ public void setReferencesProvider(final Either<Boolean, ReferenceOptions> referencesProvider) {
+ this.referencesProvider = referencesProvider;
+ }
+
+ public void setReferencesProvider(final Boolean referencesProvider) {
+ if (referencesProvider == null) {
+ this.referencesProvider = null;
+ return;
+ }
+ this.referencesProvider = Either.forLeft(referencesProvider);
+ }
+
+ public void setReferencesProvider(final ReferenceOptions referencesProvider) {
+ if (referencesProvider == null) {
+ this.referencesProvider = null;
+ return;
+ }
+ this.referencesProvider = Either.forRight(referencesProvider);
+ }
+
+ /**
+ * The server provides document highlight support.
+ */
+ @Pure
+ public Either<Boolean, DocumentHighlightOptions> getDocumentHighlightProvider() {
+ return this.documentHighlightProvider;
+ }
+
+ /**
+ * The server provides document highlight support.
+ */
+ public void setDocumentHighlightProvider(final Either<Boolean, DocumentHighlightOptions> documentHighlightProvider) {
+ this.documentHighlightProvider = documentHighlightProvider;
+ }
+
+ public void setDocumentHighlightProvider(final Boolean documentHighlightProvider) {
+ if (documentHighlightProvider == null) {
+ this.documentHighlightProvider = null;
+ return;
+ }
+ this.documentHighlightProvider = Either.forLeft(documentHighlightProvider);
+ }
+
+ public void setDocumentHighlightProvider(final DocumentHighlightOptions documentHighlightProvider) {
+ if (documentHighlightProvider == null) {
+ this.documentHighlightProvider = null;
+ return;
+ }
+ this.documentHighlightProvider = Either.forRight(documentHighlightProvider);
+ }
+
+ /**
+ * The server provides document symbol support.
+ */
+ @Pure
+ public Either<Boolean, DocumentSymbolOptions> getDocumentSymbolProvider() {
+ return this.documentSymbolProvider;
+ }
+
+ /**
+ * The server provides document symbol support.
+ */
+ public void setDocumentSymbolProvider(final Either<Boolean, DocumentSymbolOptions> documentSymbolProvider) {
+ this.documentSymbolProvider = documentSymbolProvider;
+ }
+
+ public void setDocumentSymbolProvider(final Boolean documentSymbolProvider) {
+ if (documentSymbolProvider == null) {
+ this.documentSymbolProvider = null;
+ return;
+ }
+ this.documentSymbolProvider = Either.forLeft(documentSymbolProvider);
+ }
+
+ public void setDocumentSymbolProvider(final DocumentSymbolOptions documentSymbolProvider) {
+ if (documentSymbolProvider == null) {
+ this.documentSymbolProvider = null;
+ return;
+ }
+ this.documentSymbolProvider = Either.forRight(documentSymbolProvider);
+ }
+
+ /**
+ * The server provides workspace symbol support.
+ */
+ @Pure
+ public Either<Boolean, WorkspaceSymbolOptions> getWorkspaceSymbolProvider() {
+ return this.workspaceSymbolProvider;
+ }
+
+ /**
+ * The server provides workspace symbol support.
+ */
+ public void setWorkspaceSymbolProvider(final Either<Boolean, WorkspaceSymbolOptions> workspaceSymbolProvider) {
+ this.workspaceSymbolProvider = workspaceSymbolProvider;
+ }
+
+ public void setWorkspaceSymbolProvider(final Boolean workspaceSymbolProvider) {
+ if (workspaceSymbolProvider == null) {
+ this.workspaceSymbolProvider = null;
+ return;
+ }
+ this.workspaceSymbolProvider = Either.forLeft(workspaceSymbolProvider);
+ }
+
+ public void setWorkspaceSymbolProvider(final WorkspaceSymbolOptions workspaceSymbolProvider) {
+ if (workspaceSymbolProvider == null) {
+ this.workspaceSymbolProvider = null;
+ return;
+ }
+ this.workspaceSymbolProvider = Either.forRight(workspaceSymbolProvider);
+ }
+
+ /**
+ * The server provides code actions. The {@link CodeActionOptions} return type is only
+ * valid if the client signals code action literal support via the property
+ * {@link CodeActionCapabilities#codeActionLiteralSupport}.
+ */
+ @Pure
+ public Either<Boolean, CodeActionOptions> getCodeActionProvider() {
+ return this.codeActionProvider;
+ }
+
+ /**
+ * The server provides code actions. The {@link CodeActionOptions} return type is only
+ * valid if the client signals code action literal support via the property
+ * {@link CodeActionCapabilities#codeActionLiteralSupport}.
+ */
+ public void setCodeActionProvider(final Either<Boolean, CodeActionOptions> codeActionProvider) {
+ this.codeActionProvider = codeActionProvider;
+ }
+
+ public void setCodeActionProvider(final Boolean codeActionProvider) {
+ if (codeActionProvider == null) {
+ this.codeActionProvider = null;
+ return;
+ }
+ this.codeActionProvider = Either.forLeft(codeActionProvider);
+ }
+
+ public void setCodeActionProvider(final CodeActionOptions codeActionProvider) {
+ if (codeActionProvider == null) {
+ this.codeActionProvider = null;
+ return;
+ }
+ this.codeActionProvider = Either.forRight(codeActionProvider);
+ }
+
+ /**
+ * The server provides code lens.
+ */
+ @Pure
+ public CodeLensOptions getCodeLensProvider() {
+ return this.codeLensProvider;
+ }
+
+ /**
+ * The server provides code lens.
+ */
+ public void setCodeLensProvider(final CodeLensOptions codeLensProvider) {
+ this.codeLensProvider = codeLensProvider;
+ }
+
+ /**
+ * The server provides document formatting.
+ */
+ @Pure
+ public Either<Boolean, DocumentFormattingOptions> getDocumentFormattingProvider() {
+ return this.documentFormattingProvider;
+ }
+
+ /**
+ * The server provides document formatting.
+ */
+ public void setDocumentFormattingProvider(final Either<Boolean, DocumentFormattingOptions> documentFormattingProvider) {
+ this.documentFormattingProvider = documentFormattingProvider;
+ }
+
+ public void setDocumentFormattingProvider(final Boolean documentFormattingProvider) {
+ if (documentFormattingProvider == null) {
+ this.documentFormattingProvider = null;
+ return;
+ }
+ this.documentFormattingProvider = Either.forLeft(documentFormattingProvider);
+ }
+
+ public void setDocumentFormattingProvider(final DocumentFormattingOptions documentFormattingProvider) {
+ if (documentFormattingProvider == null) {
+ this.documentFormattingProvider = null;
+ return;
+ }
+ this.documentFormattingProvider = Either.forRight(documentFormattingProvider);
+ }
+
+ /**
+ * The server provides document range formatting.
+ */
+ @Pure
+ public Either<Boolean, DocumentRangeFormattingOptions> getDocumentRangeFormattingProvider() {
+ return this.documentRangeFormattingProvider;
+ }
+
+ /**
+ * The server provides document range formatting.
+ */
+ public void setDocumentRangeFormattingProvider(final Either<Boolean, DocumentRangeFormattingOptions> documentRangeFormattingProvider) {
+ this.documentRangeFormattingProvider = documentRangeFormattingProvider;
+ }
+
+ public void setDocumentRangeFormattingProvider(final Boolean documentRangeFormattingProvider) {
+ if (documentRangeFormattingProvider == null) {
+ this.documentRangeFormattingProvider = null;
+ return;
+ }
+ this.documentRangeFormattingProvider = Either.forLeft(documentRangeFormattingProvider);
+ }
+
+ public void setDocumentRangeFormattingProvider(final DocumentRangeFormattingOptions documentRangeFormattingProvider) {
+ if (documentRangeFormattingProvider == null) {
+ this.documentRangeFormattingProvider = null;
+ return;
+ }
+ this.documentRangeFormattingProvider = Either.forRight(documentRangeFormattingProvider);
+ }
+
+ /**
+ * The server provides document formatting on typing.
+ */
+ @Pure
+ public DocumentOnTypeFormattingOptions getDocumentOnTypeFormattingProvider() {
+ return this.documentOnTypeFormattingProvider;
+ }
+
+ /**
+ * The server provides document formatting on typing.
+ */
+ public void setDocumentOnTypeFormattingProvider(final DocumentOnTypeFormattingOptions documentOnTypeFormattingProvider) {
+ this.documentOnTypeFormattingProvider = documentOnTypeFormattingProvider;
+ }
+
+ /**
+ * The server provides rename support.
+ */
+ @Pure
+ public Either<Boolean, RenameOptions> getRenameProvider() {
+ return this.renameProvider;
+ }
+
+ /**
+ * The server provides rename support.
+ */
+ public void setRenameProvider(final Either<Boolean, RenameOptions> renameProvider) {
+ this.renameProvider = renameProvider;
+ }
+
+ public void setRenameProvider(final Boolean renameProvider) {
+ if (renameProvider == null) {
+ this.renameProvider = null;
+ return;
+ }
+ this.renameProvider = Either.forLeft(renameProvider);
+ }
+
+ public void setRenameProvider(final RenameOptions renameProvider) {
+ if (renameProvider == null) {
+ this.renameProvider = null;
+ return;
+ }
+ this.renameProvider = Either.forRight(renameProvider);
+ }
+
+ /**
+ * The server provides document link support.
+ */
+ @Pure
+ public DocumentLinkOptions getDocumentLinkProvider() {
+ return this.documentLinkProvider;
+ }
+
+ /**
+ * The server provides document link support.
+ */
+ public void setDocumentLinkProvider(final DocumentLinkOptions documentLinkProvider) {
+ this.documentLinkProvider = documentLinkProvider;
+ }
+
+ /**
+ * The server provides color provider support.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public Either<Boolean, ColorProviderOptions> getColorProvider() {
+ return this.colorProvider;
+ }
+
+ /**
+ * The server provides color provider support.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setColorProvider(final Either<Boolean, ColorProviderOptions> colorProvider) {
+ this.colorProvider = colorProvider;
+ }
+
+ public void setColorProvider(final Boolean colorProvider) {
+ if (colorProvider == null) {
+ this.colorProvider = null;
+ return;
+ }
+ this.colorProvider = Either.forLeft(colorProvider);
+ }
+
+ public void setColorProvider(final ColorProviderOptions colorProvider) {
+ if (colorProvider == null) {
+ this.colorProvider = null;
+ return;
+ }
+ this.colorProvider = Either.forRight(colorProvider);
+ }
+
+ /**
+ * The server provides folding provider support.
+ * <p>
+ * Since 3.10.0
+ */
+ @Pure
+ public Either<Boolean, FoldingRangeProviderOptions> getFoldingRangeProvider() {
+ return this.foldingRangeProvider;
+ }
+
+ /**
+ * The server provides folding provider support.
+ * <p>
+ * Since 3.10.0
+ */
+ public void setFoldingRangeProvider(final Either<Boolean, FoldingRangeProviderOptions> foldingRangeProvider) {
+ this.foldingRangeProvider = foldingRangeProvider;
+ }
+
+ public void setFoldingRangeProvider(final Boolean foldingRangeProvider) {
+ if (foldingRangeProvider == null) {
+ this.foldingRangeProvider = null;
+ return;
+ }
+ this.foldingRangeProvider = Either.forLeft(foldingRangeProvider);
+ }
+
+ public void setFoldingRangeProvider(final FoldingRangeProviderOptions foldingRangeProvider) {
+ if (foldingRangeProvider == null) {
+ this.foldingRangeProvider = null;
+ return;
+ }
+ this.foldingRangeProvider = Either.forRight(foldingRangeProvider);
+ }
+
+ /**
+ * The server provides go to declaration support.
+ * <p>
+ * Since 3.14.0
+ */
+ @Pure
+ public Either<Boolean, DeclarationRegistrationOptions> getDeclarationProvider() {
+ return this.declarationProvider;
+ }
+
+ /**
+ * The server provides go to declaration support.
+ * <p>
+ * Since 3.14.0
+ */
+ public void setDeclarationProvider(final Either<Boolean, DeclarationRegistrationOptions> declarationProvider) {
+ this.declarationProvider = declarationProvider;
+ }
+
+ public void setDeclarationProvider(final Boolean declarationProvider) {
+ if (declarationProvider == null) {
+ this.declarationProvider = null;
+ return;
+ }
+ this.declarationProvider = Either.forLeft(declarationProvider);
+ }
+
+ public void setDeclarationProvider(final DeclarationRegistrationOptions declarationProvider) {
+ if (declarationProvider == null) {
+ this.declarationProvider = null;
+ return;
+ }
+ this.declarationProvider = Either.forRight(declarationProvider);
+ }
+
+ /**
+ * The server provides execute command support.
+ */
+ @Pure
+ public ExecuteCommandOptions getExecuteCommandProvider() {
+ return this.executeCommandProvider;
+ }
+
+ /**
+ * The server provides execute command support.
+ */
+ public void setExecuteCommandProvider(final ExecuteCommandOptions executeCommandProvider) {
+ this.executeCommandProvider = executeCommandProvider;
+ }
+
+ /**
+ * Workspace specific server capabilities
+ */
+ @Pure
+ public WorkspaceServerCapabilities getWorkspace() {
+ return this.workspace;
+ }
+
+ /**
+ * Workspace specific server capabilities
+ */
+ public void setWorkspace(final WorkspaceServerCapabilities workspace) {
+ this.workspace = workspace;
+ }
+
+ /**
+ * Server capability for calculating super- and subtype hierarchies.
+ * The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+ @Pure
+ public Either<Boolean, StaticRegistrationOptions> getTypeHierarchyProvider() {
+ return this.typeHierarchyProvider;
+ }
+
+ /**
+ * Server capability for calculating super- and subtype hierarchies.
+ * The LS supports the type hierarchy language feature, if this capability is set to {@code true}.
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+ public void setTypeHierarchyProvider(final Either<Boolean, StaticRegistrationOptions> typeHierarchyProvider) {
+ this.typeHierarchyProvider = typeHierarchyProvider;
+ }
+
+ public void setTypeHierarchyProvider(final Boolean typeHierarchyProvider) {
+ if (typeHierarchyProvider == null) {
+ this.typeHierarchyProvider = null;
+ return;
+ }
+ this.typeHierarchyProvider = Either.forLeft(typeHierarchyProvider);
+ }
+
+ public void setTypeHierarchyProvider(final StaticRegistrationOptions typeHierarchyProvider) {
+ if (typeHierarchyProvider == null) {
+ this.typeHierarchyProvider = null;
+ return;
+ }
+ this.typeHierarchyProvider = Either.forRight(typeHierarchyProvider);
+ }
+
+ /**
+ * The server provides Call Hierarchy support.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Either<Boolean, CallHierarchyRegistrationOptions> getCallHierarchyProvider() {
+ return this.callHierarchyProvider;
+ }
+
+ /**
+ * The server provides Call Hierarchy support.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setCallHierarchyProvider(final Either<Boolean, CallHierarchyRegistrationOptions> callHierarchyProvider) {
+ this.callHierarchyProvider = callHierarchyProvider;
+ }
+
+ public void setCallHierarchyProvider(final Boolean callHierarchyProvider) {
+ if (callHierarchyProvider == null) {
+ this.callHierarchyProvider = null;
+ return;
+ }
+ this.callHierarchyProvider = Either.forLeft(callHierarchyProvider);
+ }
+
+ public void setCallHierarchyProvider(final CallHierarchyRegistrationOptions callHierarchyProvider) {
+ if (callHierarchyProvider == null) {
+ this.callHierarchyProvider = null;
+ return;
+ }
+ this.callHierarchyProvider = Either.forRight(callHierarchyProvider);
+ }
+
+ /**
+ * The server provides selection range support.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Either<Boolean, SelectionRangeRegistrationOptions> getSelectionRangeProvider() {
+ return this.selectionRangeProvider;
+ }
+
+ /**
+ * The server provides selection range support.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setSelectionRangeProvider(final Either<Boolean, SelectionRangeRegistrationOptions> selectionRangeProvider) {
+ this.selectionRangeProvider = selectionRangeProvider;
+ }
+
+ public void setSelectionRangeProvider(final Boolean selectionRangeProvider) {
+ if (selectionRangeProvider == null) {
+ this.selectionRangeProvider = null;
+ return;
+ }
+ this.selectionRangeProvider = Either.forLeft(selectionRangeProvider);
+ }
+
+ public void setSelectionRangeProvider(final SelectionRangeRegistrationOptions selectionRangeProvider) {
+ if (selectionRangeProvider == null) {
+ this.selectionRangeProvider = null;
+ return;
+ }
+ this.selectionRangeProvider = Either.forRight(selectionRangeProvider);
+ }
+
+ /**
+ * The server provides linked editing range support.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Either<Boolean, LinkedEditingRangeRegistrationOptions> getLinkedEditingRangeProvider() {
+ return this.linkedEditingRangeProvider;
+ }
+
+ /**
+ * The server provides linked editing range support.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setLinkedEditingRangeProvider(final Either<Boolean, LinkedEditingRangeRegistrationOptions> linkedEditingRangeProvider) {
+ this.linkedEditingRangeProvider = linkedEditingRangeProvider;
+ }
+
+ public void setLinkedEditingRangeProvider(final Boolean linkedEditingRangeProvider) {
+ if (linkedEditingRangeProvider == null) {
+ this.linkedEditingRangeProvider = null;
+ return;
+ }
+ this.linkedEditingRangeProvider = Either.forLeft(linkedEditingRangeProvider);
+ }
+
+ public void setLinkedEditingRangeProvider(final LinkedEditingRangeRegistrationOptions linkedEditingRangeProvider) {
+ if (linkedEditingRangeProvider == null) {
+ this.linkedEditingRangeProvider = null;
+ return;
+ }
+ this.linkedEditingRangeProvider = Either.forRight(linkedEditingRangeProvider);
+ }
+
+ /**
+ * The server provides semantic tokens support.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public SemanticTokensWithRegistrationOptions getSemanticTokensProvider() {
+ return this.semanticTokensProvider;
+ }
+
+ /**
+ * The server provides semantic tokens support.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setSemanticTokensProvider(final SemanticTokensWithRegistrationOptions semanticTokensProvider) {
+ this.semanticTokensProvider = semanticTokensProvider;
+ }
+
+ /**
+ * Whether server provides moniker support.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Either<Boolean, MonikerRegistrationOptions> getMonikerProvider() {
+ return this.monikerProvider;
+ }
+
+ /**
+ * Whether server provides moniker support.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setMonikerProvider(final Either<Boolean, MonikerRegistrationOptions> monikerProvider) {
+ this.monikerProvider = monikerProvider;
+ }
+
+ public void setMonikerProvider(final Boolean monikerProvider) {
+ if (monikerProvider == null) {
+ this.monikerProvider = null;
+ return;
+ }
+ this.monikerProvider = Either.forLeft(monikerProvider);
+ }
+
+ public void setMonikerProvider(final MonikerRegistrationOptions monikerProvider) {
+ if (monikerProvider == null) {
+ this.monikerProvider = null;
+ return;
+ }
+ this.monikerProvider = Either.forRight(monikerProvider);
+ }
+
+ /**
+ * Experimental server capabilities.
+ */
+ @Pure
+ public Object getExperimental() {
+ return this.experimental;
+ }
+
+ /**
+ * Experimental server capabilities.
+ */
+ public void setExperimental(final Object experimental) {
+ this.experimental = experimental;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocumentSync", this.textDocumentSync);
+ b.add("hoverProvider", this.hoverProvider);
+ b.add("completionProvider", this.completionProvider);
+ b.add("signatureHelpProvider", this.signatureHelpProvider);
+ b.add("definitionProvider", this.definitionProvider);
+ b.add("typeDefinitionProvider", this.typeDefinitionProvider);
+ b.add("implementationProvider", this.implementationProvider);
+ b.add("referencesProvider", this.referencesProvider);
+ b.add("documentHighlightProvider", this.documentHighlightProvider);
+ b.add("documentSymbolProvider", this.documentSymbolProvider);
+ b.add("workspaceSymbolProvider", this.workspaceSymbolProvider);
+ b.add("codeActionProvider", this.codeActionProvider);
+ b.add("codeLensProvider", this.codeLensProvider);
+ b.add("documentFormattingProvider", this.documentFormattingProvider);
+ b.add("documentRangeFormattingProvider", this.documentRangeFormattingProvider);
+ b.add("documentOnTypeFormattingProvider", this.documentOnTypeFormattingProvider);
+ b.add("renameProvider", this.renameProvider);
+ b.add("documentLinkProvider", this.documentLinkProvider);
+ b.add("colorProvider", this.colorProvider);
+ b.add("foldingRangeProvider", this.foldingRangeProvider);
+ b.add("declarationProvider", this.declarationProvider);
+ b.add("executeCommandProvider", this.executeCommandProvider);
+ b.add("workspace", this.workspace);
+ b.add("typeHierarchyProvider", this.typeHierarchyProvider);
+ b.add("callHierarchyProvider", this.callHierarchyProvider);
+ b.add("selectionRangeProvider", this.selectionRangeProvider);
+ b.add("linkedEditingRangeProvider", this.linkedEditingRangeProvider);
+ b.add("semanticTokensProvider", this.semanticTokensProvider);
+ b.add("monikerProvider", this.monikerProvider);
+ b.add("experimental", this.experimental);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ServerCapabilities other = (ServerCapabilities) obj;
+ if (this.textDocumentSync == null) {
+ if (other.textDocumentSync != null)
+ return false;
+ } else if (!this.textDocumentSync.equals(other.textDocumentSync))
+ return false;
+ if (this.hoverProvider == null) {
+ if (other.hoverProvider != null)
+ return false;
+ } else if (!this.hoverProvider.equals(other.hoverProvider))
+ return false;
+ if (this.completionProvider == null) {
+ if (other.completionProvider != null)
+ return false;
+ } else if (!this.completionProvider.equals(other.completionProvider))
+ return false;
+ if (this.signatureHelpProvider == null) {
+ if (other.signatureHelpProvider != null)
+ return false;
+ } else if (!this.signatureHelpProvider.equals(other.signatureHelpProvider))
+ return false;
+ if (this.definitionProvider == null) {
+ if (other.definitionProvider != null)
+ return false;
+ } else if (!this.definitionProvider.equals(other.definitionProvider))
+ return false;
+ if (this.typeDefinitionProvider == null) {
+ if (other.typeDefinitionProvider != null)
+ return false;
+ } else if (!this.typeDefinitionProvider.equals(other.typeDefinitionProvider))
+ return false;
+ if (this.implementationProvider == null) {
+ if (other.implementationProvider != null)
+ return false;
+ } else if (!this.implementationProvider.equals(other.implementationProvider))
+ return false;
+ if (this.referencesProvider == null) {
+ if (other.referencesProvider != null)
+ return false;
+ } else if (!this.referencesProvider.equals(other.referencesProvider))
+ return false;
+ if (this.documentHighlightProvider == null) {
+ if (other.documentHighlightProvider != null)
+ return false;
+ } else if (!this.documentHighlightProvider.equals(other.documentHighlightProvider))
+ return false;
+ if (this.documentSymbolProvider == null) {
+ if (other.documentSymbolProvider != null)
+ return false;
+ } else if (!this.documentSymbolProvider.equals(other.documentSymbolProvider))
+ return false;
+ if (this.workspaceSymbolProvider == null) {
+ if (other.workspaceSymbolProvider != null)
+ return false;
+ } else if (!this.workspaceSymbolProvider.equals(other.workspaceSymbolProvider))
+ return false;
+ if (this.codeActionProvider == null) {
+ if (other.codeActionProvider != null)
+ return false;
+ } else if (!this.codeActionProvider.equals(other.codeActionProvider))
+ return false;
+ if (this.codeLensProvider == null) {
+ if (other.codeLensProvider != null)
+ return false;
+ } else if (!this.codeLensProvider.equals(other.codeLensProvider))
+ return false;
+ if (this.documentFormattingProvider == null) {
+ if (other.documentFormattingProvider != null)
+ return false;
+ } else if (!this.documentFormattingProvider.equals(other.documentFormattingProvider))
+ return false;
+ if (this.documentRangeFormattingProvider == null) {
+ if (other.documentRangeFormattingProvider != null)
+ return false;
+ } else if (!this.documentRangeFormattingProvider.equals(other.documentRangeFormattingProvider))
+ return false;
+ if (this.documentOnTypeFormattingProvider == null) {
+ if (other.documentOnTypeFormattingProvider != null)
+ return false;
+ } else if (!this.documentOnTypeFormattingProvider.equals(other.documentOnTypeFormattingProvider))
+ return false;
+ if (this.renameProvider == null) {
+ if (other.renameProvider != null)
+ return false;
+ } else if (!this.renameProvider.equals(other.renameProvider))
+ return false;
+ if (this.documentLinkProvider == null) {
+ if (other.documentLinkProvider != null)
+ return false;
+ } else if (!this.documentLinkProvider.equals(other.documentLinkProvider))
+ return false;
+ if (this.colorProvider == null) {
+ if (other.colorProvider != null)
+ return false;
+ } else if (!this.colorProvider.equals(other.colorProvider))
+ return false;
+ if (this.foldingRangeProvider == null) {
+ if (other.foldingRangeProvider != null)
+ return false;
+ } else if (!this.foldingRangeProvider.equals(other.foldingRangeProvider))
+ return false;
+ if (this.declarationProvider == null) {
+ if (other.declarationProvider != null)
+ return false;
+ } else if (!this.declarationProvider.equals(other.declarationProvider))
+ return false;
+ if (this.executeCommandProvider == null) {
+ if (other.executeCommandProvider != null)
+ return false;
+ } else if (!this.executeCommandProvider.equals(other.executeCommandProvider))
+ return false;
+ if (this.workspace == null) {
+ if (other.workspace != null)
+ return false;
+ } else if (!this.workspace.equals(other.workspace))
+ return false;
+ if (this.typeHierarchyProvider == null) {
+ if (other.typeHierarchyProvider != null)
+ return false;
+ } else if (!this.typeHierarchyProvider.equals(other.typeHierarchyProvider))
+ return false;
+ if (this.callHierarchyProvider == null) {
+ if (other.callHierarchyProvider != null)
+ return false;
+ } else if (!this.callHierarchyProvider.equals(other.callHierarchyProvider))
+ return false;
+ if (this.selectionRangeProvider == null) {
+ if (other.selectionRangeProvider != null)
+ return false;
+ } else if (!this.selectionRangeProvider.equals(other.selectionRangeProvider))
+ return false;
+ if (this.linkedEditingRangeProvider == null) {
+ if (other.linkedEditingRangeProvider != null)
+ return false;
+ } else if (!this.linkedEditingRangeProvider.equals(other.linkedEditingRangeProvider))
+ return false;
+ if (this.semanticTokensProvider == null) {
+ if (other.semanticTokensProvider != null)
+ return false;
+ } else if (!this.semanticTokensProvider.equals(other.semanticTokensProvider))
+ return false;
+ if (this.monikerProvider == null) {
+ if (other.monikerProvider != null)
+ return false;
+ } else if (!this.monikerProvider.equals(other.monikerProvider))
+ return false;
+ if (this.experimental == null) {
+ if (other.experimental != null)
+ return false;
+ } else if (!this.experimental.equals(other.experimental))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocumentSync== null) ? 0 : this.textDocumentSync.hashCode());
+ result = prime * result + ((this.hoverProvider== null) ? 0 : this.hoverProvider.hashCode());
+ result = prime * result + ((this.completionProvider== null) ? 0 : this.completionProvider.hashCode());
+ result = prime * result + ((this.signatureHelpProvider== null) ? 0 : this.signatureHelpProvider.hashCode());
+ result = prime * result + ((this.definitionProvider== null) ? 0 : this.definitionProvider.hashCode());
+ result = prime * result + ((this.typeDefinitionProvider== null) ? 0 : this.typeDefinitionProvider.hashCode());
+ result = prime * result + ((this.implementationProvider== null) ? 0 : this.implementationProvider.hashCode());
+ result = prime * result + ((this.referencesProvider== null) ? 0 : this.referencesProvider.hashCode());
+ result = prime * result + ((this.documentHighlightProvider== null) ? 0 : this.documentHighlightProvider.hashCode());
+ result = prime * result + ((this.documentSymbolProvider== null) ? 0 : this.documentSymbolProvider.hashCode());
+ result = prime * result + ((this.workspaceSymbolProvider== null) ? 0 : this.workspaceSymbolProvider.hashCode());
+ result = prime * result + ((this.codeActionProvider== null) ? 0 : this.codeActionProvider.hashCode());
+ result = prime * result + ((this.codeLensProvider== null) ? 0 : this.codeLensProvider.hashCode());
+ result = prime * result + ((this.documentFormattingProvider== null) ? 0 : this.documentFormattingProvider.hashCode());
+ result = prime * result + ((this.documentRangeFormattingProvider== null) ? 0 : this.documentRangeFormattingProvider.hashCode());
+ result = prime * result + ((this.documentOnTypeFormattingProvider== null) ? 0 : this.documentOnTypeFormattingProvider.hashCode());
+ result = prime * result + ((this.renameProvider== null) ? 0 : this.renameProvider.hashCode());
+ result = prime * result + ((this.documentLinkProvider== null) ? 0 : this.documentLinkProvider.hashCode());
+ result = prime * result + ((this.colorProvider== null) ? 0 : this.colorProvider.hashCode());
+ result = prime * result + ((this.foldingRangeProvider== null) ? 0 : this.foldingRangeProvider.hashCode());
+ result = prime * result + ((this.declarationProvider== null) ? 0 : this.declarationProvider.hashCode());
+ result = prime * result + ((this.executeCommandProvider== null) ? 0 : this.executeCommandProvider.hashCode());
+ result = prime * result + ((this.workspace== null) ? 0 : this.workspace.hashCode());
+ result = prime * result + ((this.typeHierarchyProvider== null) ? 0 : this.typeHierarchyProvider.hashCode());
+ result = prime * result + ((this.callHierarchyProvider== null) ? 0 : this.callHierarchyProvider.hashCode());
+ result = prime * result + ((this.selectionRangeProvider== null) ? 0 : this.selectionRangeProvider.hashCode());
+ result = prime * result + ((this.linkedEditingRangeProvider== null) ? 0 : this.linkedEditingRangeProvider.hashCode());
+ result = prime * result + ((this.semanticTokensProvider== null) ? 0 : this.semanticTokensProvider.hashCode());
+ result = prime * result + ((this.monikerProvider== null) ? 0 : this.monikerProvider.hashCode());
+ return prime * result + ((this.experimental== null) ? 0 : this.experimental.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ServerInfo.java b/java/org/eclipse/lsp4j/ServerInfo.java
new file mode 100644
index 0000000..d759811
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ServerInfo.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Information about the server.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class ServerInfo {
+ /**
+ * The name of the server as defined by the server.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The server's version as defined by the server.
+ */
+ private String version;
+
+ public ServerInfo() {
+ }
+
+ public ServerInfo(@NonNull final String name) {
+ this.name = Preconditions.<String>checkNotNull(name, "name");
+ }
+
+ public ServerInfo(@NonNull final String name, final String version) {
+ this(name);
+ this.version = version;
+ }
+
+ /**
+ * The name of the server as defined by the server.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the server as defined by the server.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The server's version as defined by the server.
+ */
+ @Pure
+ public String getVersion() {
+ return this.version;
+ }
+
+ /**
+ * The server's version as defined by the server.
+ */
+ public void setVersion(final String version) {
+ this.version = version;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("version", this.version);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ServerInfo other = (ServerInfo) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ return prime * result + ((this.version== null) ? 0 : this.version.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SetTraceParams.java b/java/org/eclipse/lsp4j/SetTraceParams.java
new file mode 100644
index 0000000..f204c89
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SetTraceParams.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A notification that should be used by the client to modify the trace setting of the server.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SetTraceParams {
+ /**
+ * The new value that should be assigned to the trace setting.
+ * For values, see {@link TraceValue}.
+ */
+ @NonNull
+ private String value;
+
+ public SetTraceParams() {
+ }
+
+ public SetTraceParams(@NonNull final String value) {
+ this.value = Preconditions.<String>checkNotNull(value, "value");
+ }
+
+ /**
+ * The new value that should be assigned to the trace setting.
+ * For values, see {@link TraceValue}.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The new value that should be assigned to the trace setting.
+ * For values, see {@link TraceValue}.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("value", this.value);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetTraceParams other = (SetTraceParams) obj;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.value== null) ? 0 : this.value.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ShowDocumentCapabilities.java b/java/org/eclipse/lsp4j/ShowDocumentCapabilities.java
new file mode 100644
index 0000000..6139aee
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ShowDocumentCapabilities.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Client capabilities for the show document request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class ShowDocumentCapabilities {
+ /**
+ * The client has support for the show document
+ * request.
+ */
+ private boolean support;
+
+ public ShowDocumentCapabilities() {
+ }
+
+ public ShowDocumentCapabilities(final boolean support) {
+ this.support = support;
+ }
+
+ /**
+ * The client has support for the show document
+ * request.
+ */
+ @Pure
+ public boolean isSupport() {
+ return this.support;
+ }
+
+ /**
+ * The client has support for the show document
+ * request.
+ */
+ public void setSupport(final boolean support) {
+ this.support = support;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("support", this.support);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ShowDocumentCapabilities other = (ShowDocumentCapabilities) obj;
+ if (other.support != this.support)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + (this.support ? 1231 : 1237);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ShowDocumentParams.java b/java/org/eclipse/lsp4j/ShowDocumentParams.java
new file mode 100644
index 0000000..0503888
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ShowDocumentParams.java
@@ -0,0 +1,197 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Params to show a document.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class ShowDocumentParams {
+ /**
+ * The document uri to show.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * Indicates to show the resource in an external program.
+ * To show for example <a href="https://www.eclipse.org/">
+ * https://www.eclipse.org/</a>
+ * in the default WEB browser set to {@code true}.
+ */
+ private Boolean external;
+
+ /**
+ * An optional property to indicate whether the editor
+ * showing the document should take focus or not.
+ * Clients might ignore this property if an external
+ * program is started.
+ */
+ private Boolean takeFocus;
+
+ /**
+ * An optional selection range if the document is a text
+ * document. Clients might ignore the property if an
+ * external program is started or the file is not a text
+ * file.
+ */
+ private Range selection;
+
+ public ShowDocumentParams() {
+ }
+
+ public ShowDocumentParams(@NonNull final String uri) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The document uri to show.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The document uri to show.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * Indicates to show the resource in an external program.
+ * To show for example <a href="https://www.eclipse.org/">
+ * https://www.eclipse.org/</a>
+ * in the default WEB browser set to {@code true}.
+ */
+ @Pure
+ public Boolean getExternal() {
+ return this.external;
+ }
+
+ /**
+ * Indicates to show the resource in an external program.
+ * To show for example <a href="https://www.eclipse.org/">
+ * https://www.eclipse.org/</a>
+ * in the default WEB browser set to {@code true}.
+ */
+ public void setExternal(final Boolean external) {
+ this.external = external;
+ }
+
+ /**
+ * An optional property to indicate whether the editor
+ * showing the document should take focus or not.
+ * Clients might ignore this property if an external
+ * program is started.
+ */
+ @Pure
+ public Boolean getTakeFocus() {
+ return this.takeFocus;
+ }
+
+ /**
+ * An optional property to indicate whether the editor
+ * showing the document should take focus or not.
+ * Clients might ignore this property if an external
+ * program is started.
+ */
+ public void setTakeFocus(final Boolean takeFocus) {
+ this.takeFocus = takeFocus;
+ }
+
+ /**
+ * An optional selection range if the document is a text
+ * document. Clients might ignore the property if an
+ * external program is started or the file is not a text
+ * file.
+ */
+ @Pure
+ public Range getSelection() {
+ return this.selection;
+ }
+
+ /**
+ * An optional selection range if the document is a text
+ * document. Clients might ignore the property if an
+ * external program is started or the file is not a text
+ * file.
+ */
+ public void setSelection(final Range selection) {
+ this.selection = selection;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("external", this.external);
+ b.add("takeFocus", this.takeFocus);
+ b.add("selection", this.selection);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ShowDocumentParams other = (ShowDocumentParams) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.external == null) {
+ if (other.external != null)
+ return false;
+ } else if (!this.external.equals(other.external))
+ return false;
+ if (this.takeFocus == null) {
+ if (other.takeFocus != null)
+ return false;
+ } else if (!this.takeFocus.equals(other.takeFocus))
+ return false;
+ if (this.selection == null) {
+ if (other.selection != null)
+ return false;
+ } else if (!this.selection.equals(other.selection))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ result = prime * result + ((this.external== null) ? 0 : this.external.hashCode());
+ result = prime * result + ((this.takeFocus== null) ? 0 : this.takeFocus.hashCode());
+ return prime * result + ((this.selection== null) ? 0 : this.selection.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ShowDocumentResult.java b/java/org/eclipse/lsp4j/ShowDocumentResult.java
new file mode 100644
index 0000000..54ea48c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ShowDocumentResult.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The result of an show document request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class ShowDocumentResult {
+ /**
+ * A boolean indicating if the show was successful.
+ */
+ private boolean success;
+
+ public ShowDocumentResult() {
+ }
+
+ public ShowDocumentResult(final boolean success) {
+ this.success = success;
+ }
+
+ /**
+ * A boolean indicating if the show was successful.
+ */
+ @Pure
+ public boolean isSuccess() {
+ return this.success;
+ }
+
+ /**
+ * A boolean indicating if the show was successful.
+ */
+ public void setSuccess(final boolean success) {
+ this.success = success;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("success", this.success);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ShowDocumentResult other = (ShowDocumentResult) obj;
+ if (other.success != this.success)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + (this.success ? 1231 : 1237);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/ShowMessageRequestParams.java b/java/org/eclipse/lsp4j/ShowMessageRequestParams.java
new file mode 100644
index 0000000..904c4e9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/ShowMessageRequestParams.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.MessageActionItem;
+import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The show message request is sent from a server to a client to ask the client to display a particular message in the
+ * user class. In addition to the show message notification the request allows to pass actions and to wait for an
+ * answer from the client.
+ */
+@SuppressWarnings("all")
+public class ShowMessageRequestParams extends MessageParams {
+ /**
+ * The message action items to present.
+ */
+ private List<MessageActionItem> actions;
+
+ public ShowMessageRequestParams() {
+ }
+
+ public ShowMessageRequestParams(final List<MessageActionItem> actions) {
+ this.actions = actions;
+ }
+
+ /**
+ * The message action items to present.
+ */
+ @Pure
+ public List<MessageActionItem> getActions() {
+ return this.actions;
+ }
+
+ /**
+ * The message action items to present.
+ */
+ public void setActions(final List<MessageActionItem> actions) {
+ this.actions = actions;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("actions", this.actions);
+ b.add("type", getType());
+ b.add("message", getMessage());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ShowMessageRequestParams other = (ShowMessageRequestParams) obj;
+ if (this.actions == null) {
+ if (other.actions != null)
+ return false;
+ } else if (!this.actions.equals(other.actions))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.actions== null) ? 0 : this.actions.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelp.java b/java/org/eclipse/lsp4j/SignatureHelp.java
new file mode 100644
index 0000000..a30d5e3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelp.java
@@ -0,0 +1,190 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.SignatureInformation;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Signature help represents the signature of something callable. There can be multiple signature but only one
+ * active and only one active parameter.
+ */
+@SuppressWarnings("all")
+public class SignatureHelp {
+ /**
+ * One or more signatures.
+ */
+ @NonNull
+ private List<SignatureInformation> signatures;
+
+ /**
+ * The active signature. If omitted or the value lies outside the
+ * range of {@link #signatures} the value defaults to zero or is ignored if
+ * the {@code SignatureHelp} has no signatures. Whenever possible implementors should
+ * make an active decision about the active signature and shouldn't
+ * rely on a default value.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express this.
+ */
+ private Integer activeSignature;
+
+ /**
+ * The active parameter of the active signature. If omitted or the value
+ * lies outside the range of {@code signatures[activeSignature].parameters}
+ * defaults to 0 if the active signature has parameters. If
+ * the active signature has no parameters it is ignored.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express the active parameter if the
+ * active signature does have any.
+ */
+ private Integer activeParameter;
+
+ public SignatureHelp() {
+ ArrayList<SignatureInformation> _arrayList = new ArrayList<SignatureInformation>();
+ this.signatures = _arrayList;
+ }
+
+ public SignatureHelp(@NonNull final List<SignatureInformation> signatures, final Integer activeSignature, final Integer activeParameter) {
+ this.signatures = Preconditions.<List<SignatureInformation>>checkNotNull(signatures, "signatures");
+ this.activeSignature = activeSignature;
+ this.activeParameter = activeParameter;
+ }
+
+ /**
+ * One or more signatures.
+ */
+ @Pure
+ @NonNull
+ public List<SignatureInformation> getSignatures() {
+ return this.signatures;
+ }
+
+ /**
+ * One or more signatures.
+ */
+ public void setSignatures(@NonNull final List<SignatureInformation> signatures) {
+ this.signatures = Preconditions.checkNotNull(signatures, "signatures");
+ }
+
+ /**
+ * The active signature. If omitted or the value lies outside the
+ * range of {@link #signatures} the value defaults to zero or is ignored if
+ * the {@code SignatureHelp} has no signatures. Whenever possible implementors should
+ * make an active decision about the active signature and shouldn't
+ * rely on a default value.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express this.
+ */
+ @Pure
+ public Integer getActiveSignature() {
+ return this.activeSignature;
+ }
+
+ /**
+ * The active signature. If omitted or the value lies outside the
+ * range of {@link #signatures} the value defaults to zero or is ignored if
+ * the {@code SignatureHelp} has no signatures. Whenever possible implementors should
+ * make an active decision about the active signature and shouldn't
+ * rely on a default value.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express this.
+ */
+ public void setActiveSignature(final Integer activeSignature) {
+ this.activeSignature = activeSignature;
+ }
+
+ /**
+ * The active parameter of the active signature. If omitted or the value
+ * lies outside the range of {@code signatures[activeSignature].parameters}
+ * defaults to 0 if the active signature has parameters. If
+ * the active signature has no parameters it is ignored.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express the active parameter if the
+ * active signature does have any.
+ */
+ @Pure
+ public Integer getActiveParameter() {
+ return this.activeParameter;
+ }
+
+ /**
+ * The active parameter of the active signature. If omitted or the value
+ * lies outside the range of {@code signatures[activeSignature].parameters}
+ * defaults to 0 if the active signature has parameters. If
+ * the active signature has no parameters it is ignored.
+ * <p>
+ * In future version of the protocol this property might become
+ * mandatory to better express the active parameter if the
+ * active signature does have any.
+ */
+ public void setActiveParameter(final Integer activeParameter) {
+ this.activeParameter = activeParameter;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("signatures", this.signatures);
+ b.add("activeSignature", this.activeSignature);
+ b.add("activeParameter", this.activeParameter);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SignatureHelp other = (SignatureHelp) obj;
+ if (this.signatures == null) {
+ if (other.signatures != null)
+ return false;
+ } else if (!this.signatures.equals(other.signatures))
+ return false;
+ if (this.activeSignature == null) {
+ if (other.activeSignature != null)
+ return false;
+ } else if (!this.activeSignature.equals(other.activeSignature))
+ return false;
+ if (this.activeParameter == null) {
+ if (other.activeParameter != null)
+ return false;
+ } else if (!this.activeParameter.equals(other.activeParameter))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.signatures== null) ? 0 : this.signatures.hashCode());
+ result = prime * result + ((this.activeSignature== null) ? 0 : this.activeSignature.hashCode());
+ return prime * result + ((this.activeParameter== null) ? 0 : this.activeParameter.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelpCapabilities.java b/java/org/eclipse/lsp4j/SignatureHelpCapabilities.java
new file mode 100644
index 0000000..f8857fe
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelpCapabilities.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.lsp4j.SignatureInformationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/signatureHelp`
+ */
+@SuppressWarnings("all")
+public class SignatureHelpCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports the following {@link SignatureInformation}
+ * specific properties.
+ */
+ private SignatureInformationCapabilities signatureInformation;
+
+ /**
+ * The client supports to send additional context information for a
+ * `textDocument/signatureHelp` request. A client that opts into
+ * contextSupport will also support {@link SignatureHelpOptions#retriggerCharacters}.
+ * <p>
+ * Since 3.15.0
+ */
+ private Boolean contextSupport;
+
+ public SignatureHelpCapabilities() {
+ }
+
+ public SignatureHelpCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public SignatureHelpCapabilities(final SignatureInformationCapabilities signatureInformation, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.signatureInformation = signatureInformation;
+ }
+
+ /**
+ * The client supports the following {@link SignatureInformation}
+ * specific properties.
+ */
+ @Pure
+ public SignatureInformationCapabilities getSignatureInformation() {
+ return this.signatureInformation;
+ }
+
+ /**
+ * The client supports the following {@link SignatureInformation}
+ * specific properties.
+ */
+ public void setSignatureInformation(final SignatureInformationCapabilities signatureInformation) {
+ this.signatureInformation = signatureInformation;
+ }
+
+ /**
+ * The client supports to send additional context information for a
+ * `textDocument/signatureHelp` request. A client that opts into
+ * contextSupport will also support {@link SignatureHelpOptions#retriggerCharacters}.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Boolean getContextSupport() {
+ return this.contextSupport;
+ }
+
+ /**
+ * The client supports to send additional context information for a
+ * `textDocument/signatureHelp` request. A client that opts into
+ * contextSupport will also support {@link SignatureHelpOptions#retriggerCharacters}.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setContextSupport(final Boolean contextSupport) {
+ this.contextSupport = contextSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("signatureInformation", this.signatureInformation);
+ b.add("contextSupport", this.contextSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SignatureHelpCapabilities other = (SignatureHelpCapabilities) obj;
+ if (this.signatureInformation == null) {
+ if (other.signatureInformation != null)
+ return false;
+ } else if (!this.signatureInformation.equals(other.signatureInformation))
+ return false;
+ if (this.contextSupport == null) {
+ if (other.contextSupport != null)
+ return false;
+ } else if (!this.contextSupport.equals(other.contextSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.signatureInformation== null) ? 0 : this.signatureInformation.hashCode());
+ return prime * result + ((this.contextSupport== null) ? 0 : this.contextSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelpContext.java b/java/org/eclipse/lsp4j/SignatureHelpContext.java
new file mode 100644
index 0000000..6e7f7d2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelpContext.java
@@ -0,0 +1,193 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.SignatureHelp;
+import org.eclipse.lsp4j.SignatureHelpTriggerKind;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Additional information about the context in which a signature help request was triggered.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class SignatureHelpContext {
+ /**
+ * Action that caused signature help to be triggered.
+ */
+ @NonNull
+ private SignatureHelpTriggerKind triggerKind;
+
+ /**
+ * Character that caused signature help to be triggered.
+ * <p>
+ * This is undefined when {@link #triggerKind} is not {@link SignatureHelpTriggerKind#TriggerCharacter}
+ */
+ private String triggerCharacter;
+
+ /**
+ * {@code true} if signature help was already showing when it was triggered.
+ * <p>
+ * Retriggers occur when the signature help is already active and can be caused by actions such as
+ * typing a trigger character, a cursor move, or document content changes.
+ */
+ private boolean isRetrigger;
+
+ /**
+ * The currently active {@link SignatureHelp}.
+ * <p>
+ * The `activeSignatureHelp` has its {@link SignatureHelp#activeSignature} field updated based on
+ * the user navigating through available signatures.
+ */
+ private SignatureHelp activeSignatureHelp;
+
+ public SignatureHelpContext() {
+ }
+
+ public SignatureHelpContext(@NonNull final SignatureHelpTriggerKind triggerKind, final boolean isRetrigger) {
+ this.triggerKind = Preconditions.<SignatureHelpTriggerKind>checkNotNull(triggerKind, "triggerKind");
+ this.isRetrigger = isRetrigger;
+ }
+
+ /**
+ * Action that caused signature help to be triggered.
+ */
+ @Pure
+ @NonNull
+ public SignatureHelpTriggerKind getTriggerKind() {
+ return this.triggerKind;
+ }
+
+ /**
+ * Action that caused signature help to be triggered.
+ */
+ public void setTriggerKind(@NonNull final SignatureHelpTriggerKind triggerKind) {
+ this.triggerKind = Preconditions.checkNotNull(triggerKind, "triggerKind");
+ }
+
+ /**
+ * Character that caused signature help to be triggered.
+ * <p>
+ * This is undefined when {@link #triggerKind} is not {@link SignatureHelpTriggerKind#TriggerCharacter}
+ */
+ @Pure
+ public String getTriggerCharacter() {
+ return this.triggerCharacter;
+ }
+
+ /**
+ * Character that caused signature help to be triggered.
+ * <p>
+ * This is undefined when {@link #triggerKind} is not {@link SignatureHelpTriggerKind#TriggerCharacter}
+ */
+ public void setTriggerCharacter(final String triggerCharacter) {
+ this.triggerCharacter = triggerCharacter;
+ }
+
+ /**
+ * {@code true} if signature help was already showing when it was triggered.
+ * <p>
+ * Retriggers occur when the signature help is already active and can be caused by actions such as
+ * typing a trigger character, a cursor move, or document content changes.
+ */
+ @Pure
+ public boolean isRetrigger() {
+ return this.isRetrigger;
+ }
+
+ /**
+ * {@code true} if signature help was already showing when it was triggered.
+ * <p>
+ * Retriggers occur when the signature help is already active and can be caused by actions such as
+ * typing a trigger character, a cursor move, or document content changes.
+ */
+ public void setIsRetrigger(final boolean isRetrigger) {
+ this.isRetrigger = isRetrigger;
+ }
+
+ /**
+ * The currently active {@link SignatureHelp}.
+ * <p>
+ * The `activeSignatureHelp` has its {@link SignatureHelp#activeSignature} field updated based on
+ * the user navigating through available signatures.
+ */
+ @Pure
+ public SignatureHelp getActiveSignatureHelp() {
+ return this.activeSignatureHelp;
+ }
+
+ /**
+ * The currently active {@link SignatureHelp}.
+ * <p>
+ * The `activeSignatureHelp` has its {@link SignatureHelp#activeSignature} field updated based on
+ * the user navigating through available signatures.
+ */
+ public void setActiveSignatureHelp(final SignatureHelp activeSignatureHelp) {
+ this.activeSignatureHelp = activeSignatureHelp;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("triggerKind", this.triggerKind);
+ b.add("triggerCharacter", this.triggerCharacter);
+ b.add("isRetrigger", this.isRetrigger);
+ b.add("activeSignatureHelp", this.activeSignatureHelp);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SignatureHelpContext other = (SignatureHelpContext) obj;
+ if (this.triggerKind == null) {
+ if (other.triggerKind != null)
+ return false;
+ } else if (!this.triggerKind.equals(other.triggerKind))
+ return false;
+ if (this.triggerCharacter == null) {
+ if (other.triggerCharacter != null)
+ return false;
+ } else if (!this.triggerCharacter.equals(other.triggerCharacter))
+ return false;
+ if (other.isRetrigger != this.isRetrigger)
+ return false;
+ if (this.activeSignatureHelp == null) {
+ if (other.activeSignatureHelp != null)
+ return false;
+ } else if (!this.activeSignatureHelp.equals(other.activeSignatureHelp))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.triggerKind== null) ? 0 : this.triggerKind.hashCode());
+ result = prime * result + ((this.triggerCharacter== null) ? 0 : this.triggerCharacter.hashCode());
+ result = prime * result + (this.isRetrigger ? 1231 : 1237);
+ return prime * result + ((this.activeSignatureHelp== null) ? 0 : this.activeSignatureHelp.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelpOptions.java b/java/org/eclipse/lsp4j/SignatureHelpOptions.java
new file mode 100644
index 0000000..5db394e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelpOptions.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Signature help options.
+ */
+@SuppressWarnings("all")
+public class SignatureHelpOptions extends AbstractWorkDoneProgressOptions {
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ private List<String> triggerCharacters;
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ private List<String> retriggerCharacters;
+
+ public SignatureHelpOptions() {
+ }
+
+ public SignatureHelpOptions(final List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ public SignatureHelpOptions(final List<String> triggerCharacters, final List<String> retriggerCharacters) {
+ this(triggerCharacters);
+ this.retriggerCharacters = retriggerCharacters;
+ }
+
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ @Pure
+ public List<String> getTriggerCharacters() {
+ return this.triggerCharacters;
+ }
+
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ public void setTriggerCharacters(final List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public List<String> getRetriggerCharacters() {
+ return this.retriggerCharacters;
+ }
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setRetriggerCharacters(final List<String> retriggerCharacters) {
+ this.retriggerCharacters = retriggerCharacters;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("triggerCharacters", this.triggerCharacters);
+ b.add("retriggerCharacters", this.retriggerCharacters);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SignatureHelpOptions other = (SignatureHelpOptions) obj;
+ if (this.triggerCharacters == null) {
+ if (other.triggerCharacters != null)
+ return false;
+ } else if (!this.triggerCharacters.equals(other.triggerCharacters))
+ return false;
+ if (this.retriggerCharacters == null) {
+ if (other.retriggerCharacters != null)
+ return false;
+ } else if (!this.retriggerCharacters.equals(other.retriggerCharacters))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.triggerCharacters== null) ? 0 : this.triggerCharacters.hashCode());
+ return prime * result + ((this.retriggerCharacters== null) ? 0 : this.retriggerCharacters.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelpParams.java b/java/org/eclipse/lsp4j/SignatureHelpParams.java
new file mode 100644
index 0000000..1bc3774
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelpParams.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.SignatureHelpContext;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The signature help request is sent from the client to the server to request signature information at a given cursor position.
+ */
+@SuppressWarnings("all")
+public class SignatureHelpParams extends TextDocumentPositionAndWorkDoneProgressParams {
+ /**
+ * The signature help context. This is only available if the client specifies
+ * to send this using the client capability {@link SignatureHelpCapabilities#contextSupport} as true.
+ * <p>
+ * Since 3.15.0
+ */
+ private SignatureHelpContext context;
+
+ public SignatureHelpParams() {
+ }
+
+ public SignatureHelpParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ public SignatureHelpParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position, final SignatureHelpContext context) {
+ this(textDocument, position);
+ this.context = context;
+ }
+
+ /**
+ * The signature help context. This is only available if the client specifies
+ * to send this using the client capability {@link SignatureHelpCapabilities#contextSupport} as true.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public SignatureHelpContext getContext() {
+ return this.context;
+ }
+
+ /**
+ * The signature help context. This is only available if the client specifies
+ * to send this using the client capability {@link SignatureHelpCapabilities#contextSupport} as true.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setContext(final SignatureHelpContext context) {
+ this.context = context;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("context", this.context);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SignatureHelpParams other = (SignatureHelpParams) obj;
+ if (this.context == null) {
+ if (other.context != null)
+ return false;
+ } else if (!this.context.equals(other.context))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.context== null) ? 0 : this.context.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelpRegistrationOptions.java b/java/org/eclipse/lsp4j/SignatureHelpRegistrationOptions.java
new file mode 100644
index 0000000..53cb9a6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelpRegistrationOptions.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class SignatureHelpRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ private List<String> triggerCharacters;
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ private List<String> retriggerCharacters;
+
+ public SignatureHelpRegistrationOptions() {
+ }
+
+ public SignatureHelpRegistrationOptions(final List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ public SignatureHelpRegistrationOptions(final List<String> triggerCharacters, final List<String> retriggerCharacters) {
+ this(triggerCharacters);
+ this.retriggerCharacters = retriggerCharacters;
+ }
+
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ @Pure
+ public List<String> getTriggerCharacters() {
+ return this.triggerCharacters;
+ }
+
+ /**
+ * The characters that trigger signature help automatically.
+ */
+ public void setTriggerCharacters(final List<String> triggerCharacters) {
+ this.triggerCharacters = triggerCharacters;
+ }
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public List<String> getRetriggerCharacters() {
+ return this.retriggerCharacters;
+ }
+
+ /**
+ * List of characters that re-trigger signature help.
+ * <p>
+ * These trigger characters are only active when signature help is already showing. All trigger characters
+ * are also counted as re-trigger characters.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setRetriggerCharacters(final List<String> retriggerCharacters) {
+ this.retriggerCharacters = retriggerCharacters;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("triggerCharacters", this.triggerCharacters);
+ b.add("retriggerCharacters", this.retriggerCharacters);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SignatureHelpRegistrationOptions other = (SignatureHelpRegistrationOptions) obj;
+ if (this.triggerCharacters == null) {
+ if (other.triggerCharacters != null)
+ return false;
+ } else if (!this.triggerCharacters.equals(other.triggerCharacters))
+ return false;
+ if (this.retriggerCharacters == null) {
+ if (other.retriggerCharacters != null)
+ return false;
+ } else if (!this.retriggerCharacters.equals(other.retriggerCharacters))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.triggerCharacters== null) ? 0 : this.triggerCharacters.hashCode());
+ return prime * result + ((this.retriggerCharacters== null) ? 0 : this.retriggerCharacters.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureHelpTriggerKind.java b/java/org/eclipse/lsp4j/SignatureHelpTriggerKind.java
new file mode 100644
index 0000000..d036189
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureHelpTriggerKind.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * How a signature help was triggered.
+ *
+ * Since 3.15.0
+ */
+public enum SignatureHelpTriggerKind {
+
+ /**
+ * Signature help was invoked manually by the user or by a command.
+ */
+ Invoked(1),
+
+ /**
+ * Signature help was triggered by a trigger character.
+ */
+ TriggerCharacter(2),
+
+ /**
+ * Signature help was triggered by the cursor moving or by the document content changing.
+ */
+ ContentChange(3);
+
+ private final int value;
+
+ SignatureHelpTriggerKind(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static SignatureHelpTriggerKind forValue(int value) {
+ SignatureHelpTriggerKind[] allValues = SignatureHelpTriggerKind.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/SignatureInformation.java b/java/org/eclipse/lsp4j/SignatureInformation.java
new file mode 100644
index 0000000..c5e3c19
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureInformation.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.MarkupContent;
+import org.eclipse.lsp4j.ParameterInformation;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents the signature of something callable. A signature can have a label, like a function-name, a doc-comment, and
+ * a set of parameters.
+ */
+@SuppressWarnings("all")
+public class SignatureInformation {
+ /**
+ * The label of this signature. Will be shown in the UI.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ private Either<String, MarkupContent> documentation;
+
+ /**
+ * The parameters of this signature.
+ */
+ private List<ParameterInformation> parameters;
+
+ /**
+ * The index of the active parameter.
+ * <p>
+ * If provided, this is used in place of {@link SignatureHelp#activeParameter}.
+ * <p>
+ * Since 3.16.0
+ */
+ private Integer activeParameter;
+
+ public SignatureInformation() {
+ }
+
+ public SignatureInformation(@NonNull final String label) {
+ this.label = Preconditions.<String>checkNotNull(label, "label");
+ }
+
+ public SignatureInformation(@NonNull final String label, final String documentation, final List<ParameterInformation> parameters) {
+ this(label);
+ this.setDocumentation(documentation);
+ this.parameters = parameters;
+ }
+
+ public SignatureInformation(@NonNull final String label, final MarkupContent documentation, final List<ParameterInformation> parameters) {
+ this(label);
+ this.setDocumentation(documentation);
+ this.parameters = parameters;
+ }
+
+ /**
+ * The label of this signature. Will be shown in the UI.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The label of this signature. Will be shown in the UI.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ @Pure
+ public Either<String, MarkupContent> getDocumentation() {
+ return this.documentation;
+ }
+
+ /**
+ * The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted.
+ */
+ public void setDocumentation(final Either<String, MarkupContent> documentation) {
+ this.documentation = documentation;
+ }
+
+ public void setDocumentation(final String documentation) {
+ if (documentation == null) {
+ this.documentation = null;
+ return;
+ }
+ this.documentation = Either.forLeft(documentation);
+ }
+
+ public void setDocumentation(final MarkupContent documentation) {
+ if (documentation == null) {
+ this.documentation = null;
+ return;
+ }
+ this.documentation = Either.forRight(documentation);
+ }
+
+ /**
+ * The parameters of this signature.
+ */
+ @Pure
+ public List<ParameterInformation> getParameters() {
+ return this.parameters;
+ }
+
+ /**
+ * The parameters of this signature.
+ */
+ public void setParameters(final List<ParameterInformation> parameters) {
+ this.parameters = parameters;
+ }
+
+ /**
+ * The index of the active parameter.
+ * <p>
+ * If provided, this is used in place of {@link SignatureHelp#activeParameter}.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Integer getActiveParameter() {
+ return this.activeParameter;
+ }
+
+ /**
+ * The index of the active parameter.
+ * <p>
+ * If provided, this is used in place of {@link SignatureHelp#activeParameter}.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setActiveParameter(final Integer activeParameter) {
+ this.activeParameter = activeParameter;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("documentation", this.documentation);
+ b.add("parameters", this.parameters);
+ b.add("activeParameter", this.activeParameter);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SignatureInformation other = (SignatureInformation) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.documentation == null) {
+ if (other.documentation != null)
+ return false;
+ } else if (!this.documentation.equals(other.documentation))
+ return false;
+ if (this.parameters == null) {
+ if (other.parameters != null)
+ return false;
+ } else if (!this.parameters.equals(other.parameters))
+ return false;
+ if (this.activeParameter == null) {
+ if (other.activeParameter != null)
+ return false;
+ } else if (!this.activeParameter.equals(other.activeParameter))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.documentation== null) ? 0 : this.documentation.hashCode());
+ result = prime * result + ((this.parameters== null) ? 0 : this.parameters.hashCode());
+ return prime * result + ((this.activeParameter== null) ? 0 : this.activeParameter.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SignatureInformationCapabilities.java b/java/org/eclipse/lsp4j/SignatureInformationCapabilities.java
new file mode 100644
index 0000000..813b426
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SignatureInformationCapabilities.java
@@ -0,0 +1,153 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.ParameterInformationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client supports the following {@link SignatureInformation} specific properties.
+ */
+@SuppressWarnings("all")
+public class SignatureInformationCapabilities {
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ private List<String> documentationFormat;
+
+ /**
+ * Client capabilities specific to parameter information.
+ */
+ private ParameterInformationCapabilities parameterInformation;
+
+ /**
+ * The client supports the {@link SignatureInformation#activeParameter} property.
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean activeParameterSupport;
+
+ public SignatureInformationCapabilities() {
+ }
+
+ public SignatureInformationCapabilities(final List<String> documentationFormat) {
+ this.documentationFormat = documentationFormat;
+ }
+
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ @Pure
+ public List<String> getDocumentationFormat() {
+ return this.documentationFormat;
+ }
+
+ /**
+ * Client supports the following content formats for the documentation
+ * property. The order describes the preferred format of the client.
+ * <p>
+ * See {@link MarkupKind} for allowed values.
+ */
+ public void setDocumentationFormat(final List<String> documentationFormat) {
+ this.documentationFormat = documentationFormat;
+ }
+
+ /**
+ * Client capabilities specific to parameter information.
+ */
+ @Pure
+ public ParameterInformationCapabilities getParameterInformation() {
+ return this.parameterInformation;
+ }
+
+ /**
+ * Client capabilities specific to parameter information.
+ */
+ public void setParameterInformation(final ParameterInformationCapabilities parameterInformation) {
+ this.parameterInformation = parameterInformation;
+ }
+
+ /**
+ * The client supports the {@link SignatureInformation#activeParameter} property.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getActiveParameterSupport() {
+ return this.activeParameterSupport;
+ }
+
+ /**
+ * The client supports the {@link SignatureInformation#activeParameter} property.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setActiveParameterSupport(final Boolean activeParameterSupport) {
+ this.activeParameterSupport = activeParameterSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("documentationFormat", this.documentationFormat);
+ b.add("parameterInformation", this.parameterInformation);
+ b.add("activeParameterSupport", this.activeParameterSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SignatureInformationCapabilities other = (SignatureInformationCapabilities) obj;
+ if (this.documentationFormat == null) {
+ if (other.documentationFormat != null)
+ return false;
+ } else if (!this.documentationFormat.equals(other.documentationFormat))
+ return false;
+ if (this.parameterInformation == null) {
+ if (other.parameterInformation != null)
+ return false;
+ } else if (!this.parameterInformation.equals(other.parameterInformation))
+ return false;
+ if (this.activeParameterSupport == null) {
+ if (other.activeParameterSupport != null)
+ return false;
+ } else if (!this.activeParameterSupport.equals(other.activeParameterSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.documentationFormat== null) ? 0 : this.documentationFormat.hashCode());
+ result = prime * result + ((this.parameterInformation== null) ? 0 : this.parameterInformation.hashCode());
+ return prime * result + ((this.activeParameterSupport== null) ? 0 : this.activeParameterSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/StaticRegistrationOptions.java b/java/org/eclipse/lsp4j/StaticRegistrationOptions.java
new file mode 100644
index 0000000..5a66897
--- /dev/null
+++ b/java/org/eclipse/lsp4j/StaticRegistrationOptions.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentRegistrationOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Static registration options to be returned in the initialize request.
+ */
+@SuppressWarnings("all")
+public class StaticRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public StaticRegistrationOptions() {
+ }
+
+ public StaticRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ StaticRegistrationOptions other = (StaticRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SymbolCapabilities.java b/java/org/eclipse/lsp4j/SymbolCapabilities.java
new file mode 100644
index 0000000..0adfdbf
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SymbolCapabilities.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.lsp4j.SymbolKindCapabilities;
+import org.eclipse.lsp4j.SymbolTagSupportCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `workspace/symbol` request.
+ * Referred to in the spec as WorkspaceSymbolClientCapabilities.
+ */
+@SuppressWarnings("all")
+public class SymbolCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * Specific capabilities for the {@link SymbolKind} in the `workspace/symbol` request.
+ */
+ private SymbolKindCapabilities symbolKind;
+
+ /**
+ * The client supports tags on {@link SymbolInformation}.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ private SymbolTagSupportCapabilities tagSupport;
+
+ public SymbolCapabilities() {
+ }
+
+ public SymbolCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public SymbolCapabilities(final SymbolKindCapabilities symbolKind) {
+ this.symbolKind = symbolKind;
+ }
+
+ public SymbolCapabilities(final SymbolKindCapabilities symbolKind, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.symbolKind = symbolKind;
+ }
+
+ /**
+ * Specific capabilities for the {@link SymbolKind} in the `workspace/symbol` request.
+ */
+ @Pure
+ public SymbolKindCapabilities getSymbolKind() {
+ return this.symbolKind;
+ }
+
+ /**
+ * Specific capabilities for the {@link SymbolKind} in the `workspace/symbol` request.
+ */
+ public void setSymbolKind(final SymbolKindCapabilities symbolKind) {
+ this.symbolKind = symbolKind;
+ }
+
+ /**
+ * The client supports tags on {@link SymbolInformation}.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public SymbolTagSupportCapabilities getTagSupport() {
+ return this.tagSupport;
+ }
+
+ /**
+ * The client supports tags on {@link SymbolInformation}.
+ * Clients supporting tags have to handle unknown tags gracefully.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setTagSupport(final SymbolTagSupportCapabilities tagSupport) {
+ this.tagSupport = tagSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("symbolKind", this.symbolKind);
+ b.add("tagSupport", this.tagSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SymbolCapabilities other = (SymbolCapabilities) obj;
+ if (this.symbolKind == null) {
+ if (other.symbolKind != null)
+ return false;
+ } else if (!this.symbolKind.equals(other.symbolKind))
+ return false;
+ if (this.tagSupport == null) {
+ if (other.tagSupport != null)
+ return false;
+ } else if (!this.tagSupport.equals(other.tagSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.symbolKind== null) ? 0 : this.symbolKind.hashCode());
+ return prime * result + ((this.tagSupport== null) ? 0 : this.tagSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SymbolInformation.java b/java/org/eclipse/lsp4j/SymbolInformation.java
new file mode 100644
index 0000000..e96989c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SymbolInformation.java
@@ -0,0 +1,287 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.Location;
+import org.eclipse.lsp4j.SymbolKind;
+import org.eclipse.lsp4j.SymbolTag;
+import org.eclipse.lsp4j.adapters.SymbolInformationTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents information about programming constructs like variables, classes, interfaces etc.
+ */
+@JsonAdapter(SymbolInformationTypeAdapter.Factory.class)
+@SuppressWarnings("all")
+public class SymbolInformation {
+ /**
+ * The name of this symbol.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The kind of this symbol.
+ */
+ @NonNull
+ private SymbolKind kind;
+
+ /**
+ * Tags for this symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ private List<SymbolTag> tags;
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ private Boolean deprecated;
+
+ /**
+ * The location of this symbol. The location's range is used by a tool
+ * to reveal the location in the editor. If the symbol is selected in the
+ * tool the range's start information is used to position the cursor. So
+ * the range usually spans more then the actual symbol's name and does
+ * normally include things like visibility modifiers.
+ * <p>
+ * The range doesn't have to denote a node range in the sense of a abstract
+ * syntax tree. It can therefore not be used to re-construct a hierarchy of
+ * the symbols.
+ */
+ @NonNull
+ private Location location;
+
+ /**
+ * The name of the symbol containing this symbol. This information is for
+ * user interface purposes (e.g. to render a qualifier in the user interface
+ * if necessary). It can't be used to re-infer a hierarchy for the document
+ * symbols.
+ */
+ private String containerName;
+
+ public SymbolInformation() {
+ }
+
+ public SymbolInformation(@NonNull final String name, @NonNull final SymbolKind kind, @NonNull final Location location) {
+ this.name = Preconditions.<String>checkNotNull(name, "name");
+ this.kind = Preconditions.<SymbolKind>checkNotNull(kind, "kind");
+ this.location = Preconditions.<Location>checkNotNull(location, "location");
+ }
+
+ public SymbolInformation(@NonNull final String name, @NonNull final SymbolKind kind, @NonNull final Location location, final String containerName) {
+ this(name, kind, location);
+ this.containerName = containerName;
+ }
+
+ /**
+ * The name of this symbol.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of this symbol.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The kind of this symbol.
+ */
+ @Pure
+ @NonNull
+ public SymbolKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of this symbol.
+ */
+ public void setKind(@NonNull final SymbolKind kind) {
+ this.kind = Preconditions.checkNotNull(kind, "kind");
+ }
+
+ /**
+ * Tags for this symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public List<SymbolTag> getTags() {
+ return this.tags;
+ }
+
+ /**
+ * Tags for this symbol.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setTags(final List<SymbolTag> tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Pure
+ @Deprecated
+ public Boolean getDeprecated() {
+ return this.deprecated;
+ }
+
+ /**
+ * Indicates if this symbol is deprecated.
+ *
+ * @deprecated Use {@link #tags} instead if supported.
+ */
+ @Deprecated
+ public void setDeprecated(final Boolean deprecated) {
+ this.deprecated = deprecated;
+ }
+
+ /**
+ * The location of this symbol. The location's range is used by a tool
+ * to reveal the location in the editor. If the symbol is selected in the
+ * tool the range's start information is used to position the cursor. So
+ * the range usually spans more then the actual symbol's name and does
+ * normally include things like visibility modifiers.
+ * <p>
+ * The range doesn't have to denote a node range in the sense of a abstract
+ * syntax tree. It can therefore not be used to re-construct a hierarchy of
+ * the symbols.
+ */
+ @Pure
+ @NonNull
+ public Location getLocation() {
+ return this.location;
+ }
+
+ /**
+ * The location of this symbol. The location's range is used by a tool
+ * to reveal the location in the editor. If the symbol is selected in the
+ * tool the range's start information is used to position the cursor. So
+ * the range usually spans more then the actual symbol's name and does
+ * normally include things like visibility modifiers.
+ * <p>
+ * The range doesn't have to denote a node range in the sense of a abstract
+ * syntax tree. It can therefore not be used to re-construct a hierarchy of
+ * the symbols.
+ */
+ public void setLocation(@NonNull final Location location) {
+ this.location = Preconditions.checkNotNull(location, "location");
+ }
+
+ /**
+ * The name of the symbol containing this symbol. This information is for
+ * user interface purposes (e.g. to render a qualifier in the user interface
+ * if necessary). It can't be used to re-infer a hierarchy for the document
+ * symbols.
+ */
+ @Pure
+ public String getContainerName() {
+ return this.containerName;
+ }
+
+ /**
+ * The name of the symbol containing this symbol. This information is for
+ * user interface purposes (e.g. to render a qualifier in the user interface
+ * if necessary). It can't be used to re-infer a hierarchy for the document
+ * symbols.
+ */
+ public void setContainerName(final String containerName) {
+ this.containerName = containerName;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("kind", this.kind);
+ b.add("tags", this.tags);
+ b.add("deprecated", this.deprecated);
+ b.add("location", this.location);
+ b.add("containerName", this.containerName);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SymbolInformation other = (SymbolInformation) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.tags == null) {
+ if (other.tags != null)
+ return false;
+ } else if (!this.tags.equals(other.tags))
+ return false;
+ if (this.deprecated == null) {
+ if (other.deprecated != null)
+ return false;
+ } else if (!this.deprecated.equals(other.deprecated))
+ return false;
+ if (this.location == null) {
+ if (other.location != null)
+ return false;
+ } else if (!this.location.equals(other.location))
+ return false;
+ if (this.containerName == null) {
+ if (other.containerName != null)
+ return false;
+ } else if (!this.containerName.equals(other.containerName))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.tags== null) ? 0 : this.tags.hashCode());
+ result = prime * result + ((this.deprecated== null) ? 0 : this.deprecated.hashCode());
+ result = prime * result + ((this.location== null) ? 0 : this.location.hashCode());
+ return prime * result + ((this.containerName== null) ? 0 : this.containerName.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SymbolKind.java b/java/org/eclipse/lsp4j/SymbolKind.java
new file mode 100644
index 0000000..343287f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SymbolKind.java
@@ -0,0 +1,85 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+public enum SymbolKind {
+
+ File(1),
+
+ Module(2),
+
+ Namespace(3),
+
+ Package(4),
+
+ Class(5),
+
+ Method(6),
+
+ Property(7),
+
+ Field(8),
+
+ Constructor(9),
+
+ Enum(10),
+
+ Interface(11),
+
+ Function(12),
+
+ Variable(13),
+
+ Constant(14),
+
+ String(15),
+
+ Number(16),
+
+ Boolean(17),
+
+ Array(18),
+
+ Object(19),
+
+ Key(20),
+
+ Null(21),
+
+ EnumMember(22),
+
+ Struct(23),
+
+ Event(24),
+
+ Operator(25),
+
+ TypeParameter(26);
+
+ private final int value;
+
+ SymbolKind(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static SymbolKind forValue(int value) {
+ SymbolKind[] allValues = SymbolKind.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/SymbolKindCapabilities.java b/java/org/eclipse/lsp4j/SymbolKindCapabilities.java
new file mode 100644
index 0000000..91f5eef
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SymbolKindCapabilities.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.SymbolKind;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Specific capabilities for the {@link SymbolKind}.
+ */
+@SuppressWarnings("all")
+public class SymbolKindCapabilities {
+ /**
+ * The symbol kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the symbol kinds from {@link SymbolKind#File} to
+ * {@link SymbolKind#Array} as defined in the initial version of the protocol.
+ */
+ private List<SymbolKind> valueSet;
+
+ public SymbolKindCapabilities() {
+ }
+
+ public SymbolKindCapabilities(final List<SymbolKind> valueSet) {
+ this.valueSet = valueSet;
+ }
+
+ /**
+ * The symbol kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the symbol kinds from {@link SymbolKind#File} to
+ * {@link SymbolKind#Array} as defined in the initial version of the protocol.
+ */
+ @Pure
+ public List<SymbolKind> getValueSet() {
+ return this.valueSet;
+ }
+
+ /**
+ * The symbol kind values the client supports. When this
+ * property exists the client also guarantees that it will
+ * handle values outside its set gracefully and falls back
+ * to a default value when unknown.
+ * <p>
+ * If this property is not present the client only supports
+ * the symbol kinds from {@link SymbolKind#File} to
+ * {@link SymbolKind#Array} as defined in the initial version of the protocol.
+ */
+ public void setValueSet(final List<SymbolKind> valueSet) {
+ this.valueSet = valueSet;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SymbolKindCapabilities other = (SymbolKindCapabilities) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SymbolTag.java b/java/org/eclipse/lsp4j/SymbolTag.java
new file mode 100644
index 0000000..9a87c55
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SymbolTag.java
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * Copyright (c) 2019 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j;
+
+/**
+ * Symbol tags are extra annotations that tweak the rendering of a symbol.
+ *
+ * Since 3.16
+ */
+public enum SymbolTag {
+
+ /**
+ * Render a symbol as obsolete, usually using a strike-out.
+ */
+ Deprecated(1);
+
+ private final int value;
+
+ SymbolTag(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static SymbolTag forValue(int value) {
+ SymbolTag[] allValues = SymbolTag.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/SymbolTagSupportCapabilities.java b/java/org/eclipse/lsp4j/SymbolTagSupportCapabilities.java
new file mode 100644
index 0000000..d7b99f0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SymbolTagSupportCapabilities.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.SymbolTag;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Specific capabilities for the {@link SymbolTag}.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class SymbolTagSupportCapabilities {
+ /**
+ * The tags supported by the client.
+ */
+ @NonNull
+ private List<SymbolTag> valueSet;
+
+ public SymbolTagSupportCapabilities() {
+ ArrayList<SymbolTag> _arrayList = new ArrayList<SymbolTag>();
+ this.valueSet = _arrayList;
+ }
+
+ public SymbolTagSupportCapabilities(@NonNull final List<SymbolTag> valueSet) {
+ this.valueSet = Preconditions.<List<SymbolTag>>checkNotNull(valueSet, "valueSet");
+ }
+
+ /**
+ * The tags supported by the client.
+ */
+ @Pure
+ @NonNull
+ public List<SymbolTag> getValueSet() {
+ return this.valueSet;
+ }
+
+ /**
+ * The tags supported by the client.
+ */
+ public void setValueSet(@NonNull final List<SymbolTag> valueSet) {
+ this.valueSet = Preconditions.checkNotNull(valueSet, "valueSet");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("valueSet", this.valueSet);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SymbolTagSupportCapabilities other = (SymbolTagSupportCapabilities) obj;
+ if (this.valueSet == null) {
+ if (other.valueSet != null)
+ return false;
+ } else if (!this.valueSet.equals(other.valueSet))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.valueSet== null) ? 0 : this.valueSet.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/SynchronizationCapabilities.java b/java/org/eclipse/lsp4j/SynchronizationCapabilities.java
new file mode 100644
index 0000000..e3bef92
--- /dev/null
+++ b/java/org/eclipse/lsp4j/SynchronizationCapabilities.java
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class SynchronizationCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports sending will save notifications.
+ */
+ private Boolean willSave;
+
+ /**
+ * The client supports sending a will save request and
+ * waits for a response providing text edits which will
+ * be applied to the document before it is saved.
+ */
+ private Boolean willSaveWaitUntil;
+
+ /**
+ * The client supports did save notifications.
+ */
+ private Boolean didSave;
+
+ public SynchronizationCapabilities() {
+ }
+
+ public SynchronizationCapabilities(final Boolean willSave, final Boolean willSaveWaitUntil, final Boolean didSave) {
+ this.willSave = willSave;
+ this.willSaveWaitUntil = willSaveWaitUntil;
+ this.didSave = didSave;
+ }
+
+ public SynchronizationCapabilities(final Boolean willSave, final Boolean willSaveWaitUntil, final Boolean didSave, final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ this.willSave = willSave;
+ this.willSaveWaitUntil = willSaveWaitUntil;
+ this.didSave = didSave;
+ }
+
+ /**
+ * The client supports sending will save notifications.
+ */
+ @Pure
+ public Boolean getWillSave() {
+ return this.willSave;
+ }
+
+ /**
+ * The client supports sending will save notifications.
+ */
+ public void setWillSave(final Boolean willSave) {
+ this.willSave = willSave;
+ }
+
+ /**
+ * The client supports sending a will save request and
+ * waits for a response providing text edits which will
+ * be applied to the document before it is saved.
+ */
+ @Pure
+ public Boolean getWillSaveWaitUntil() {
+ return this.willSaveWaitUntil;
+ }
+
+ /**
+ * The client supports sending a will save request and
+ * waits for a response providing text edits which will
+ * be applied to the document before it is saved.
+ */
+ public void setWillSaveWaitUntil(final Boolean willSaveWaitUntil) {
+ this.willSaveWaitUntil = willSaveWaitUntil;
+ }
+
+ /**
+ * The client supports did save notifications.
+ */
+ @Pure
+ public Boolean getDidSave() {
+ return this.didSave;
+ }
+
+ /**
+ * The client supports did save notifications.
+ */
+ public void setDidSave(final Boolean didSave) {
+ this.didSave = didSave;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("willSave", this.willSave);
+ b.add("willSaveWaitUntil", this.willSaveWaitUntil);
+ b.add("didSave", this.didSave);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ SynchronizationCapabilities other = (SynchronizationCapabilities) obj;
+ if (this.willSave == null) {
+ if (other.willSave != null)
+ return false;
+ } else if (!this.willSave.equals(other.willSave))
+ return false;
+ if (this.willSaveWaitUntil == null) {
+ if (other.willSaveWaitUntil != null)
+ return false;
+ } else if (!this.willSaveWaitUntil.equals(other.willSaveWaitUntil))
+ return false;
+ if (this.didSave == null) {
+ if (other.didSave != null)
+ return false;
+ } else if (!this.didSave.equals(other.didSave))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.willSave== null) ? 0 : this.willSave.hashCode());
+ result = prime * result + ((this.willSaveWaitUntil== null) ? 0 : this.willSaveWaitUntil.hashCode());
+ return prime * result + ((this.didSave== null) ? 0 : this.didSave.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentChangeRegistrationOptions.java b/java/org/eclipse/lsp4j/TextDocumentChangeRegistrationOptions.java
new file mode 100644
index 0000000..490cf62
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentChangeRegistrationOptions.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentRegistrationOptions;
+import org.eclipse.lsp4j.TextDocumentSyncKind;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Describe options to be used when registered for text document change events.
+ */
+@SuppressWarnings("all")
+public class TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * How documents are synced to the server. See TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ @NonNull
+ private TextDocumentSyncKind syncKind;
+
+ public TextDocumentChangeRegistrationOptions() {
+ }
+
+ public TextDocumentChangeRegistrationOptions(@NonNull final TextDocumentSyncKind syncKind) {
+ this.syncKind = Preconditions.<TextDocumentSyncKind>checkNotNull(syncKind, "syncKind");
+ }
+
+ /**
+ * How documents are synced to the server. See TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentSyncKind getSyncKind() {
+ return this.syncKind;
+ }
+
+ /**
+ * How documents are synced to the server. See TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ public void setSyncKind(@NonNull final TextDocumentSyncKind syncKind) {
+ this.syncKind = Preconditions.checkNotNull(syncKind, "syncKind");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("syncKind", this.syncKind);
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TextDocumentChangeRegistrationOptions other = (TextDocumentChangeRegistrationOptions) obj;
+ if (this.syncKind == null) {
+ if (other.syncKind != null)
+ return false;
+ } else if (!this.syncKind.equals(other.syncKind))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.syncKind== null) ? 0 : this.syncKind.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentClientCapabilities.java b/java/org/eclipse/lsp4j/TextDocumentClientCapabilities.java
new file mode 100644
index 0000000..0210335
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentClientCapabilities.java
@@ -0,0 +1,866 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.lsp4j.CallHierarchyCapabilities;
+import org.eclipse.lsp4j.CodeActionCapabilities;
+import org.eclipse.lsp4j.CodeLensCapabilities;
+import org.eclipse.lsp4j.ColorProviderCapabilities;
+import org.eclipse.lsp4j.CompletionCapabilities;
+import org.eclipse.lsp4j.DeclarationCapabilities;
+import org.eclipse.lsp4j.DefinitionCapabilities;
+import org.eclipse.lsp4j.DocumentHighlightCapabilities;
+import org.eclipse.lsp4j.DocumentLinkCapabilities;
+import org.eclipse.lsp4j.DocumentSymbolCapabilities;
+import org.eclipse.lsp4j.FoldingRangeCapabilities;
+import org.eclipse.lsp4j.FormattingCapabilities;
+import org.eclipse.lsp4j.HoverCapabilities;
+import org.eclipse.lsp4j.ImplementationCapabilities;
+import org.eclipse.lsp4j.LinkedEditingRangeCapabilities;
+import org.eclipse.lsp4j.MonikerCapabilities;
+import org.eclipse.lsp4j.OnTypeFormattingCapabilities;
+import org.eclipse.lsp4j.PublishDiagnosticsCapabilities;
+import org.eclipse.lsp4j.RangeFormattingCapabilities;
+import org.eclipse.lsp4j.ReferencesCapabilities;
+import org.eclipse.lsp4j.RenameCapabilities;
+import org.eclipse.lsp4j.SelectionRangeCapabilities;
+import org.eclipse.lsp4j.SemanticTokensCapabilities;
+import org.eclipse.lsp4j.SignatureHelpCapabilities;
+import org.eclipse.lsp4j.SynchronizationCapabilities;
+import org.eclipse.lsp4j.TypeDefinitionCapabilities;
+import org.eclipse.lsp4j.TypeHierarchyCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Text document specific client capabilities.
+ */
+@SuppressWarnings("all")
+public class TextDocumentClientCapabilities {
+ private SynchronizationCapabilities synchronization;
+
+ /**
+ * Capabilities specific to the {@code textDocument/completion}
+ */
+ private CompletionCapabilities completion;
+
+ /**
+ * Capabilities specific to the {@code textDocument/hover}
+ */
+ private HoverCapabilities hover;
+
+ /**
+ * Capabilities specific to the {@code textDocument/signatureHelp}
+ */
+ private SignatureHelpCapabilities signatureHelp;
+
+ /**
+ * Capabilities specific to the {@code textDocument/references}
+ */
+ private ReferencesCapabilities references;
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentHighlight}
+ */
+ private DocumentHighlightCapabilities documentHighlight;
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentSymbol}
+ */
+ private DocumentSymbolCapabilities documentSymbol;
+
+ /**
+ * Capabilities specific to the {@code textDocument/formatting}
+ */
+ private FormattingCapabilities formatting;
+
+ /**
+ * Capabilities specific to the {@code textDocument/rangeFormatting}
+ */
+ private RangeFormattingCapabilities rangeFormatting;
+
+ /**
+ * Capabilities specific to the {@code textDocument/onTypeFormatting}
+ */
+ private OnTypeFormattingCapabilities onTypeFormatting;
+
+ /**
+ * Capabilities specific to the {@code textDocument/declaration}
+ * <p>
+ * Since 3.14.0
+ */
+ private DeclarationCapabilities declaration;
+
+ /**
+ * Capabilities specific to the {@code textDocument/definition}
+ * <p>
+ * Since 3.14.0
+ */
+ private DefinitionCapabilities definition;
+
+ /**
+ * Capabilities specific to the {@code textDocument/typeDefinition}
+ * <p>
+ * Since 3.6.0
+ */
+ private TypeDefinitionCapabilities typeDefinition;
+
+ /**
+ * Capabilities specific to the {@code textDocument/implementation}
+ * <p>
+ * Since 3.6.0
+ */
+ private ImplementationCapabilities implementation;
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeAction}
+ */
+ private CodeActionCapabilities codeAction;
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeLens}
+ */
+ private CodeLensCapabilities codeLens;
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentLink}
+ */
+ private DocumentLinkCapabilities documentLink;
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentColor} and the
+ * {@code textDocument/colorPresentation} request.
+ * <p>
+ * Since 3.6.0
+ */
+ private ColorProviderCapabilities colorProvider;
+
+ /**
+ * Capabilities specific to the {@code textDocument/rename}
+ */
+ private RenameCapabilities rename;
+
+ /**
+ * Capabilities specific to {@code textDocument/publishDiagnostics}.
+ */
+ private PublishDiagnosticsCapabilities publishDiagnostics;
+
+ /**
+ * Capabilities specific to {@code textDocument/foldingRange} requests.
+ * <p>
+ * Since 3.10.0
+ */
+ private FoldingRangeCapabilities foldingRange;
+
+ /**
+ * Capabilities specific to {@code textDocument/typeHierarchy}.
+ */
+ @Beta
+ private TypeHierarchyCapabilities typeHierarchyCapabilities;
+
+ /**
+ * Capabilities specific to {@code textDocument/prepareCallHierarchy}.
+ * <p>
+ * Since 3.16.0
+ */
+ private CallHierarchyCapabilities callHierarchy;
+
+ /**
+ * Capabilities specific to `textDocument/selectionRange` requests
+ * <p>
+ * Since 3.15.0
+ */
+ private SelectionRangeCapabilities selectionRange;
+
+ /**
+ * Capabilities specific to {@code textDocument/semanticTokens}.
+ * <p>
+ * Since 3.16.0
+ */
+ private SemanticTokensCapabilities semanticTokens;
+
+ /**
+ * Capabilities specific to the {@code textDocument/moniker} request.
+ * <p>
+ * Since 3.16.0
+ */
+ private MonikerCapabilities moniker;
+
+ /**
+ * Capabilities specific to the {@code textDocument/linkedEditingRange} request.
+ * <p>
+ * Since 3.16.0
+ */
+ private LinkedEditingRangeCapabilities linkedEditingRange;
+
+ @Pure
+ public SynchronizationCapabilities getSynchronization() {
+ return this.synchronization;
+ }
+
+ public void setSynchronization(final SynchronizationCapabilities synchronization) {
+ this.synchronization = synchronization;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/completion}
+ */
+ @Pure
+ public CompletionCapabilities getCompletion() {
+ return this.completion;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/completion}
+ */
+ public void setCompletion(final CompletionCapabilities completion) {
+ this.completion = completion;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/hover}
+ */
+ @Pure
+ public HoverCapabilities getHover() {
+ return this.hover;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/hover}
+ */
+ public void setHover(final HoverCapabilities hover) {
+ this.hover = hover;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/signatureHelp}
+ */
+ @Pure
+ public SignatureHelpCapabilities getSignatureHelp() {
+ return this.signatureHelp;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/signatureHelp}
+ */
+ public void setSignatureHelp(final SignatureHelpCapabilities signatureHelp) {
+ this.signatureHelp = signatureHelp;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/references}
+ */
+ @Pure
+ public ReferencesCapabilities getReferences() {
+ return this.references;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/references}
+ */
+ public void setReferences(final ReferencesCapabilities references) {
+ this.references = references;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentHighlight}
+ */
+ @Pure
+ public DocumentHighlightCapabilities getDocumentHighlight() {
+ return this.documentHighlight;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentHighlight}
+ */
+ public void setDocumentHighlight(final DocumentHighlightCapabilities documentHighlight) {
+ this.documentHighlight = documentHighlight;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentSymbol}
+ */
+ @Pure
+ public DocumentSymbolCapabilities getDocumentSymbol() {
+ return this.documentSymbol;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentSymbol}
+ */
+ public void setDocumentSymbol(final DocumentSymbolCapabilities documentSymbol) {
+ this.documentSymbol = documentSymbol;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/formatting}
+ */
+ @Pure
+ public FormattingCapabilities getFormatting() {
+ return this.formatting;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/formatting}
+ */
+ public void setFormatting(final FormattingCapabilities formatting) {
+ this.formatting = formatting;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/rangeFormatting}
+ */
+ @Pure
+ public RangeFormattingCapabilities getRangeFormatting() {
+ return this.rangeFormatting;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/rangeFormatting}
+ */
+ public void setRangeFormatting(final RangeFormattingCapabilities rangeFormatting) {
+ this.rangeFormatting = rangeFormatting;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/onTypeFormatting}
+ */
+ @Pure
+ public OnTypeFormattingCapabilities getOnTypeFormatting() {
+ return this.onTypeFormatting;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/onTypeFormatting}
+ */
+ public void setOnTypeFormatting(final OnTypeFormattingCapabilities onTypeFormatting) {
+ this.onTypeFormatting = onTypeFormatting;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/declaration}
+ * <p>
+ * Since 3.14.0
+ */
+ @Pure
+ public DeclarationCapabilities getDeclaration() {
+ return this.declaration;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/declaration}
+ * <p>
+ * Since 3.14.0
+ */
+ public void setDeclaration(final DeclarationCapabilities declaration) {
+ this.declaration = declaration;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/definition}
+ * <p>
+ * Since 3.14.0
+ */
+ @Pure
+ public DefinitionCapabilities getDefinition() {
+ return this.definition;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/definition}
+ * <p>
+ * Since 3.14.0
+ */
+ public void setDefinition(final DefinitionCapabilities definition) {
+ this.definition = definition;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/typeDefinition}
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public TypeDefinitionCapabilities getTypeDefinition() {
+ return this.typeDefinition;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/typeDefinition}
+ * <p>
+ * Since 3.6.0
+ */
+ public void setTypeDefinition(final TypeDefinitionCapabilities typeDefinition) {
+ this.typeDefinition = typeDefinition;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/implementation}
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public ImplementationCapabilities getImplementation() {
+ return this.implementation;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/implementation}
+ * <p>
+ * Since 3.6.0
+ */
+ public void setImplementation(final ImplementationCapabilities implementation) {
+ this.implementation = implementation;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeAction}
+ */
+ @Pure
+ public CodeActionCapabilities getCodeAction() {
+ return this.codeAction;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeAction}
+ */
+ public void setCodeAction(final CodeActionCapabilities codeAction) {
+ this.codeAction = codeAction;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeLens}
+ */
+ @Pure
+ public CodeLensCapabilities getCodeLens() {
+ return this.codeLens;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/codeLens}
+ */
+ public void setCodeLens(final CodeLensCapabilities codeLens) {
+ this.codeLens = codeLens;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentLink}
+ */
+ @Pure
+ public DocumentLinkCapabilities getDocumentLink() {
+ return this.documentLink;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentLink}
+ */
+ public void setDocumentLink(final DocumentLinkCapabilities documentLink) {
+ this.documentLink = documentLink;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentColor} and the
+ * {@code textDocument/colorPresentation} request.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public ColorProviderCapabilities getColorProvider() {
+ return this.colorProvider;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/documentColor} and the
+ * {@code textDocument/colorPresentation} request.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setColorProvider(final ColorProviderCapabilities colorProvider) {
+ this.colorProvider = colorProvider;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/rename}
+ */
+ @Pure
+ public RenameCapabilities getRename() {
+ return this.rename;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/rename}
+ */
+ public void setRename(final RenameCapabilities rename) {
+ this.rename = rename;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/publishDiagnostics}.
+ */
+ @Pure
+ public PublishDiagnosticsCapabilities getPublishDiagnostics() {
+ return this.publishDiagnostics;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/publishDiagnostics}.
+ */
+ public void setPublishDiagnostics(final PublishDiagnosticsCapabilities publishDiagnostics) {
+ this.publishDiagnostics = publishDiagnostics;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/foldingRange} requests.
+ * <p>
+ * Since 3.10.0
+ */
+ @Pure
+ public FoldingRangeCapabilities getFoldingRange() {
+ return this.foldingRange;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/foldingRange} requests.
+ * <p>
+ * Since 3.10.0
+ */
+ public void setFoldingRange(final FoldingRangeCapabilities foldingRange) {
+ this.foldingRange = foldingRange;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/typeHierarchy}.
+ */
+ @Pure
+ public TypeHierarchyCapabilities getTypeHierarchyCapabilities() {
+ return this.typeHierarchyCapabilities;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/typeHierarchy}.
+ */
+ public void setTypeHierarchyCapabilities(final TypeHierarchyCapabilities typeHierarchyCapabilities) {
+ this.typeHierarchyCapabilities = typeHierarchyCapabilities;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/prepareCallHierarchy}.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public CallHierarchyCapabilities getCallHierarchy() {
+ return this.callHierarchy;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/prepareCallHierarchy}.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setCallHierarchy(final CallHierarchyCapabilities callHierarchy) {
+ this.callHierarchy = callHierarchy;
+ }
+
+ /**
+ * Capabilities specific to `textDocument/selectionRange` requests
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public SelectionRangeCapabilities getSelectionRange() {
+ return this.selectionRange;
+ }
+
+ /**
+ * Capabilities specific to `textDocument/selectionRange` requests
+ * <p>
+ * Since 3.15.0
+ */
+ public void setSelectionRange(final SelectionRangeCapabilities selectionRange) {
+ this.selectionRange = selectionRange;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/semanticTokens}.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public SemanticTokensCapabilities getSemanticTokens() {
+ return this.semanticTokens;
+ }
+
+ /**
+ * Capabilities specific to {@code textDocument/semanticTokens}.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setSemanticTokens(final SemanticTokensCapabilities semanticTokens) {
+ this.semanticTokens = semanticTokens;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/moniker} request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public MonikerCapabilities getMoniker() {
+ return this.moniker;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/moniker} request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setMoniker(final MonikerCapabilities moniker) {
+ this.moniker = moniker;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/linkedEditingRange} request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public LinkedEditingRangeCapabilities getLinkedEditingRange() {
+ return this.linkedEditingRange;
+ }
+
+ /**
+ * Capabilities specific to the {@code textDocument/linkedEditingRange} request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setLinkedEditingRange(final LinkedEditingRangeCapabilities linkedEditingRange) {
+ this.linkedEditingRange = linkedEditingRange;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("synchronization", this.synchronization);
+ b.add("completion", this.completion);
+ b.add("hover", this.hover);
+ b.add("signatureHelp", this.signatureHelp);
+ b.add("references", this.references);
+ b.add("documentHighlight", this.documentHighlight);
+ b.add("documentSymbol", this.documentSymbol);
+ b.add("formatting", this.formatting);
+ b.add("rangeFormatting", this.rangeFormatting);
+ b.add("onTypeFormatting", this.onTypeFormatting);
+ b.add("declaration", this.declaration);
+ b.add("definition", this.definition);
+ b.add("typeDefinition", this.typeDefinition);
+ b.add("implementation", this.implementation);
+ b.add("codeAction", this.codeAction);
+ b.add("codeLens", this.codeLens);
+ b.add("documentLink", this.documentLink);
+ b.add("colorProvider", this.colorProvider);
+ b.add("rename", this.rename);
+ b.add("publishDiagnostics", this.publishDiagnostics);
+ b.add("foldingRange", this.foldingRange);
+ b.add("typeHierarchyCapabilities", this.typeHierarchyCapabilities);
+ b.add("callHierarchy", this.callHierarchy);
+ b.add("selectionRange", this.selectionRange);
+ b.add("semanticTokens", this.semanticTokens);
+ b.add("moniker", this.moniker);
+ b.add("linkedEditingRange", this.linkedEditingRange);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentClientCapabilities other = (TextDocumentClientCapabilities) obj;
+ if (this.synchronization == null) {
+ if (other.synchronization != null)
+ return false;
+ } else if (!this.synchronization.equals(other.synchronization))
+ return false;
+ if (this.completion == null) {
+ if (other.completion != null)
+ return false;
+ } else if (!this.completion.equals(other.completion))
+ return false;
+ if (this.hover == null) {
+ if (other.hover != null)
+ return false;
+ } else if (!this.hover.equals(other.hover))
+ return false;
+ if (this.signatureHelp == null) {
+ if (other.signatureHelp != null)
+ return false;
+ } else if (!this.signatureHelp.equals(other.signatureHelp))
+ return false;
+ if (this.references == null) {
+ if (other.references != null)
+ return false;
+ } else if (!this.references.equals(other.references))
+ return false;
+ if (this.documentHighlight == null) {
+ if (other.documentHighlight != null)
+ return false;
+ } else if (!this.documentHighlight.equals(other.documentHighlight))
+ return false;
+ if (this.documentSymbol == null) {
+ if (other.documentSymbol != null)
+ return false;
+ } else if (!this.documentSymbol.equals(other.documentSymbol))
+ return false;
+ if (this.formatting == null) {
+ if (other.formatting != null)
+ return false;
+ } else if (!this.formatting.equals(other.formatting))
+ return false;
+ if (this.rangeFormatting == null) {
+ if (other.rangeFormatting != null)
+ return false;
+ } else if (!this.rangeFormatting.equals(other.rangeFormatting))
+ return false;
+ if (this.onTypeFormatting == null) {
+ if (other.onTypeFormatting != null)
+ return false;
+ } else if (!this.onTypeFormatting.equals(other.onTypeFormatting))
+ return false;
+ if (this.declaration == null) {
+ if (other.declaration != null)
+ return false;
+ } else if (!this.declaration.equals(other.declaration))
+ return false;
+ if (this.definition == null) {
+ if (other.definition != null)
+ return false;
+ } else if (!this.definition.equals(other.definition))
+ return false;
+ if (this.typeDefinition == null) {
+ if (other.typeDefinition != null)
+ return false;
+ } else if (!this.typeDefinition.equals(other.typeDefinition))
+ return false;
+ if (this.implementation == null) {
+ if (other.implementation != null)
+ return false;
+ } else if (!this.implementation.equals(other.implementation))
+ return false;
+ if (this.codeAction == null) {
+ if (other.codeAction != null)
+ return false;
+ } else if (!this.codeAction.equals(other.codeAction))
+ return false;
+ if (this.codeLens == null) {
+ if (other.codeLens != null)
+ return false;
+ } else if (!this.codeLens.equals(other.codeLens))
+ return false;
+ if (this.documentLink == null) {
+ if (other.documentLink != null)
+ return false;
+ } else if (!this.documentLink.equals(other.documentLink))
+ return false;
+ if (this.colorProvider == null) {
+ if (other.colorProvider != null)
+ return false;
+ } else if (!this.colorProvider.equals(other.colorProvider))
+ return false;
+ if (this.rename == null) {
+ if (other.rename != null)
+ return false;
+ } else if (!this.rename.equals(other.rename))
+ return false;
+ if (this.publishDiagnostics == null) {
+ if (other.publishDiagnostics != null)
+ return false;
+ } else if (!this.publishDiagnostics.equals(other.publishDiagnostics))
+ return false;
+ if (this.foldingRange == null) {
+ if (other.foldingRange != null)
+ return false;
+ } else if (!this.foldingRange.equals(other.foldingRange))
+ return false;
+ if (this.typeHierarchyCapabilities == null) {
+ if (other.typeHierarchyCapabilities != null)
+ return false;
+ } else if (!this.typeHierarchyCapabilities.equals(other.typeHierarchyCapabilities))
+ return false;
+ if (this.callHierarchy == null) {
+ if (other.callHierarchy != null)
+ return false;
+ } else if (!this.callHierarchy.equals(other.callHierarchy))
+ return false;
+ if (this.selectionRange == null) {
+ if (other.selectionRange != null)
+ return false;
+ } else if (!this.selectionRange.equals(other.selectionRange))
+ return false;
+ if (this.semanticTokens == null) {
+ if (other.semanticTokens != null)
+ return false;
+ } else if (!this.semanticTokens.equals(other.semanticTokens))
+ return false;
+ if (this.moniker == null) {
+ if (other.moniker != null)
+ return false;
+ } else if (!this.moniker.equals(other.moniker))
+ return false;
+ if (this.linkedEditingRange == null) {
+ if (other.linkedEditingRange != null)
+ return false;
+ } else if (!this.linkedEditingRange.equals(other.linkedEditingRange))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.synchronization== null) ? 0 : this.synchronization.hashCode());
+ result = prime * result + ((this.completion== null) ? 0 : this.completion.hashCode());
+ result = prime * result + ((this.hover== null) ? 0 : this.hover.hashCode());
+ result = prime * result + ((this.signatureHelp== null) ? 0 : this.signatureHelp.hashCode());
+ result = prime * result + ((this.references== null) ? 0 : this.references.hashCode());
+ result = prime * result + ((this.documentHighlight== null) ? 0 : this.documentHighlight.hashCode());
+ result = prime * result + ((this.documentSymbol== null) ? 0 : this.documentSymbol.hashCode());
+ result = prime * result + ((this.formatting== null) ? 0 : this.formatting.hashCode());
+ result = prime * result + ((this.rangeFormatting== null) ? 0 : this.rangeFormatting.hashCode());
+ result = prime * result + ((this.onTypeFormatting== null) ? 0 : this.onTypeFormatting.hashCode());
+ result = prime * result + ((this.declaration== null) ? 0 : this.declaration.hashCode());
+ result = prime * result + ((this.definition== null) ? 0 : this.definition.hashCode());
+ result = prime * result + ((this.typeDefinition== null) ? 0 : this.typeDefinition.hashCode());
+ result = prime * result + ((this.implementation== null) ? 0 : this.implementation.hashCode());
+ result = prime * result + ((this.codeAction== null) ? 0 : this.codeAction.hashCode());
+ result = prime * result + ((this.codeLens== null) ? 0 : this.codeLens.hashCode());
+ result = prime * result + ((this.documentLink== null) ? 0 : this.documentLink.hashCode());
+ result = prime * result + ((this.colorProvider== null) ? 0 : this.colorProvider.hashCode());
+ result = prime * result + ((this.rename== null) ? 0 : this.rename.hashCode());
+ result = prime * result + ((this.publishDiagnostics== null) ? 0 : this.publishDiagnostics.hashCode());
+ result = prime * result + ((this.foldingRange== null) ? 0 : this.foldingRange.hashCode());
+ result = prime * result + ((this.typeHierarchyCapabilities== null) ? 0 : this.typeHierarchyCapabilities.hashCode());
+ result = prime * result + ((this.callHierarchy== null) ? 0 : this.callHierarchy.hashCode());
+ result = prime * result + ((this.selectionRange== null) ? 0 : this.selectionRange.hashCode());
+ result = prime * result + ((this.semanticTokens== null) ? 0 : this.semanticTokens.hashCode());
+ result = prime * result + ((this.moniker== null) ? 0 : this.moniker.hashCode());
+ return prime * result + ((this.linkedEditingRange== null) ? 0 : this.linkedEditingRange.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentContentChangeEvent.java b/java/org/eclipse/lsp4j/TextDocumentContentChangeEvent.java
new file mode 100644
index 0000000..d311c51
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentContentChangeEvent.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An event describing a change to a text document. If range and rangeLength are omitted the new text is considered
+ * to be the full content of the document.
+ */
+@SuppressWarnings("all")
+public class TextDocumentContentChangeEvent {
+ /**
+ * The range of the document that changed.
+ */
+ private Range range;
+
+ /**
+ * The length of the range that got replaced.
+ *
+ * @deprecated Use range instead.
+ */
+ @Deprecated
+ private Integer rangeLength;
+
+ /**
+ * The new text of the range/document.
+ */
+ @NonNull
+ private String text;
+
+ public TextDocumentContentChangeEvent() {
+ }
+
+ public TextDocumentContentChangeEvent(@NonNull final String text) {
+ this.text = Preconditions.<String>checkNotNull(text, "text");
+ }
+
+ public TextDocumentContentChangeEvent(final Range range, final Integer rangeLength, @NonNull final String text) {
+ this(text);
+ this.range = range;
+ this.rangeLength = rangeLength;
+ }
+
+ /**
+ * The range of the document that changed.
+ */
+ @Pure
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range of the document that changed.
+ */
+ public void setRange(final Range range) {
+ this.range = range;
+ }
+
+ /**
+ * The length of the range that got replaced.
+ *
+ * @deprecated Use range instead.
+ */
+ @Pure
+ @Deprecated
+ public Integer getRangeLength() {
+ return this.rangeLength;
+ }
+
+ /**
+ * The length of the range that got replaced.
+ *
+ * @deprecated Use range instead.
+ */
+ @Deprecated
+ public void setRangeLength(final Integer rangeLength) {
+ this.rangeLength = rangeLength;
+ }
+
+ /**
+ * The new text of the range/document.
+ */
+ @Pure
+ @NonNull
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * The new text of the range/document.
+ */
+ public void setText(@NonNull final String text) {
+ this.text = Preconditions.checkNotNull(text, "text");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("rangeLength", this.rangeLength);
+ b.add("text", this.text);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentContentChangeEvent other = (TextDocumentContentChangeEvent) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.rangeLength == null) {
+ if (other.rangeLength != null)
+ return false;
+ } else if (!this.rangeLength.equals(other.rangeLength))
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.rangeLength== null) ? 0 : this.rangeLength.hashCode());
+ return prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentEdit.java b/java/org/eclipse/lsp4j/TextDocumentEdit.java
new file mode 100644
index 0000000..2dfaa5d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentEdit.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Describes textual changes on a single text document.
+ * The text document is referred to as a {@link VersionedTextDocumentIdentifier}
+ * to allow clients to check the text document version before an edit is applied.
+ */
+@SuppressWarnings("all")
+public class TextDocumentEdit {
+ /**
+ * The text document to change.
+ */
+ @NonNull
+ private VersionedTextDocumentIdentifier textDocument;
+
+ /**
+ * The edits to be applied
+ */
+ @NonNull
+ private List<TextEdit> edits;
+
+ public TextDocumentEdit() {
+ }
+
+ public TextDocumentEdit(@NonNull final VersionedTextDocumentIdentifier textDocument, @NonNull final List<TextEdit> edits) {
+ this.textDocument = Preconditions.<VersionedTextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.edits = Preconditions.<List<TextEdit>>checkNotNull(edits, "edits");
+ }
+
+ /**
+ * The text document to change.
+ */
+ @Pure
+ @NonNull
+ public VersionedTextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document to change.
+ */
+ public void setTextDocument(@NonNull final VersionedTextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * The edits to be applied
+ */
+ @Pure
+ @NonNull
+ public List<TextEdit> getEdits() {
+ return this.edits;
+ }
+
+ /**
+ * The edits to be applied
+ */
+ public void setEdits(@NonNull final List<TextEdit> edits) {
+ this.edits = Preconditions.checkNotNull(edits, "edits");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("edits", this.edits);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentEdit other = (TextDocumentEdit) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.edits == null) {
+ if (other.edits != null)
+ return false;
+ } else if (!this.edits.equals(other.edits))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.edits== null) ? 0 : this.edits.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentIdentifier.java b/java/org/eclipse/lsp4j/TextDocumentIdentifier.java
new file mode 100644
index 0000000..8805a9a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentIdentifier.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Text documents are identified using an URI. On the protocol level URI's are passed as strings.
+ */
+@SuppressWarnings("all")
+public class TextDocumentIdentifier {
+ /**
+ * The text document's uri.
+ */
+ @NonNull
+ private String uri;
+
+ public TextDocumentIdentifier() {
+ }
+
+ public TextDocumentIdentifier(@NonNull final String uri) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The text document's uri.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The text document's uri.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentIdentifier other = (TextDocumentIdentifier) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.uri== null) ? 0 : this.uri.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentItem.java b/java/org/eclipse/lsp4j/TextDocumentItem.java
new file mode 100644
index 0000000..df16dd7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentItem.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An item to transfer a text document from the client to the server.
+ */
+@SuppressWarnings("all")
+public class TextDocumentItem {
+ /**
+ * The text document's uri.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * The text document's language identifier
+ */
+ @NonNull
+ private String languageId;
+
+ /**
+ * The version number of this document (it will strictly increase after each change, including undo/redo).
+ */
+ private int version;
+
+ /**
+ * The content of the opened text document.
+ */
+ @NonNull
+ private String text;
+
+ public TextDocumentItem() {
+ }
+
+ public TextDocumentItem(@NonNull final String uri, @NonNull final String languageId, final int version, @NonNull final String text) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ this.languageId = Preconditions.<String>checkNotNull(languageId, "languageId");
+ this.version = version;
+ this.text = Preconditions.<String>checkNotNull(text, "text");
+ }
+
+ /**
+ * The text document's uri.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The text document's uri.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The text document's language identifier
+ */
+ @Pure
+ @NonNull
+ public String getLanguageId() {
+ return this.languageId;
+ }
+
+ /**
+ * The text document's language identifier
+ */
+ public void setLanguageId(@NonNull final String languageId) {
+ this.languageId = Preconditions.checkNotNull(languageId, "languageId");
+ }
+
+ /**
+ * The version number of this document (it will strictly increase after each change, including undo/redo).
+ */
+ @Pure
+ public int getVersion() {
+ return this.version;
+ }
+
+ /**
+ * The version number of this document (it will strictly increase after each change, including undo/redo).
+ */
+ public void setVersion(final int version) {
+ this.version = version;
+ }
+
+ /**
+ * The content of the opened text document.
+ */
+ @Pure
+ @NonNull
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * The content of the opened text document.
+ */
+ public void setText(@NonNull final String text) {
+ this.text = Preconditions.checkNotNull(text, "text");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("languageId", this.languageId);
+ b.add("version", this.version);
+ b.add("text", this.text);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentItem other = (TextDocumentItem) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.languageId == null) {
+ if (other.languageId != null)
+ return false;
+ } else if (!this.languageId.equals(other.languageId))
+ return false;
+ if (other.version != this.version)
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ result = prime * result + ((this.languageId== null) ? 0 : this.languageId.hashCode());
+ result = prime * result + this.version;
+ return prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentPositionAndWorkDoneProgressAndPartialResultParams.java b/java/org/eclipse/lsp4j/TextDocumentPositionAndWorkDoneProgressAndPartialResultParams.java
new file mode 100644
index 0000000..00b81a0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentPositionAndWorkDoneProgressAndPartialResultParams.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.PartialResultParams;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Abstract class which extends TextDocumentPosition and implements work done progress and partial result request parameter.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public abstract class TextDocumentPositionAndWorkDoneProgressAndPartialResultParams extends TextDocumentPositionAndWorkDoneProgressParams implements PartialResultParams {
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ private Either<String, Integer> partialResultToken;
+
+ public TextDocumentPositionAndWorkDoneProgressAndPartialResultParams() {
+ }
+
+ public TextDocumentPositionAndWorkDoneProgressAndPartialResultParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getPartialResultToken() {
+ return this.partialResultToken;
+ }
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ public void setPartialResultToken(final Either<String, Integer> partialResultToken) {
+ this.partialResultToken = partialResultToken;
+ }
+
+ public void setPartialResultToken(final String partialResultToken) {
+ if (partialResultToken == null) {
+ this.partialResultToken = null;
+ return;
+ }
+ this.partialResultToken = Either.forLeft(partialResultToken);
+ }
+
+ public void setPartialResultToken(final Integer partialResultToken) {
+ if (partialResultToken == null) {
+ this.partialResultToken = null;
+ return;
+ }
+ this.partialResultToken = Either.forRight(partialResultToken);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", this.partialResultToken);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TextDocumentPositionAndWorkDoneProgressAndPartialResultParams other = (TextDocumentPositionAndWorkDoneProgressAndPartialResultParams) obj;
+ if (this.partialResultToken == null) {
+ if (other.partialResultToken != null)
+ return false;
+ } else if (!this.partialResultToken.equals(other.partialResultToken))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.partialResultToken== null) ? 0 : this.partialResultToken.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentPositionAndWorkDoneProgressParams.java b/java/org/eclipse/lsp4j/TextDocumentPositionAndWorkDoneProgressParams.java
new file mode 100644
index 0000000..a22d371
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentPositionAndWorkDoneProgressParams.java
@@ -0,0 +1,111 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.eclipse.lsp4j.WorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Abstract class which extends TextDocumentPosition and implements work done progress request parameter.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public abstract class TextDocumentPositionAndWorkDoneProgressParams extends TextDocumentPositionParams implements WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ private Either<String, Integer> workDoneToken;
+
+ public TextDocumentPositionAndWorkDoneProgressParams() {
+ }
+
+ public TextDocumentPositionAndWorkDoneProgressParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getWorkDoneToken() {
+ return this.workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ public void setWorkDoneToken(final Either<String, Integer> workDoneToken) {
+ this.workDoneToken = workDoneToken;
+ }
+
+ public void setWorkDoneToken(final String workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forLeft(workDoneToken);
+ }
+
+ public void setWorkDoneToken(final Integer workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forRight(workDoneToken);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", this.workDoneToken);
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TextDocumentPositionAndWorkDoneProgressParams other = (TextDocumentPositionAndWorkDoneProgressParams) obj;
+ if (this.workDoneToken == null) {
+ if (other.workDoneToken != null)
+ return false;
+ } else if (!this.workDoneToken.equals(other.workDoneToken))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.workDoneToken== null) ? 0 : this.workDoneToken.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentPositionParams.java b/java/org/eclipse/lsp4j/TextDocumentPositionParams.java
new file mode 100644
index 0000000..a41fd88
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentPositionParams.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A parameter literal used in requests to pass a text document and a position inside that document.
+ */
+@SuppressWarnings("all")
+public class TextDocumentPositionParams {
+ /**
+ * The text document.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ private String uri;
+
+ /**
+ * The position inside the text document.
+ */
+ @NonNull
+ private Position position;
+
+ public TextDocumentPositionParams() {
+ }
+
+ public TextDocumentPositionParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.position = Preconditions.<Position>checkNotNull(position, "position");
+ }
+
+ @Deprecated
+ public TextDocumentPositionParams(@NonNull final TextDocumentIdentifier textDocument, final String uri, @NonNull final Position position) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.uri = uri;
+ this.position = Preconditions.<Position>checkNotNull(position, "position");
+ }
+
+ /**
+ * The text document.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The text document.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Pure
+ @Deprecated
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * Legacy property to support protocol version 1.0 requests.
+ */
+ @Deprecated
+ public void setUri(final String uri) {
+ this.uri = uri;
+ }
+
+ /**
+ * The position inside the text document.
+ */
+ @Pure
+ @NonNull
+ public Position getPosition() {
+ return this.position;
+ }
+
+ /**
+ * The position inside the text document.
+ */
+ public void setPosition(@NonNull final Position position) {
+ this.position = Preconditions.checkNotNull(position, "position");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("uri", this.uri);
+ b.add("position", this.position);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentPositionParams other = (TextDocumentPositionParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.position == null) {
+ if (other.position != null)
+ return false;
+ } else if (!this.position.equals(other.position))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.position== null) ? 0 : this.position.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentRegistrationOptions.java b/java/org/eclipse/lsp4j/TextDocumentRegistrationOptions.java
new file mode 100644
index 0000000..a80d482
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentRegistrationOptions.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.List;
+import org.eclipse.lsp4j.DocumentFilter;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Since most of the registration options require to specify a document selector there is
+ * a base interface that can be used.
+ */
+@SuppressWarnings("all")
+public class TextDocumentRegistrationOptions {
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ private List<DocumentFilter> documentSelector;
+
+ public TextDocumentRegistrationOptions() {
+ }
+
+ public TextDocumentRegistrationOptions(final List<DocumentFilter> documentSelector) {
+ this.documentSelector = documentSelector;
+ }
+
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ @Pure
+ public List<DocumentFilter> getDocumentSelector() {
+ return this.documentSelector;
+ }
+
+ /**
+ * A document selector to identify the scope of the registration. If set to null
+ * the document selector provided on the client side will be used.
+ */
+ public void setDocumentSelector(final List<DocumentFilter> documentSelector) {
+ this.documentSelector = documentSelector;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("documentSelector", this.documentSelector);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentRegistrationOptions other = (TextDocumentRegistrationOptions) obj;
+ if (this.documentSelector == null) {
+ if (other.documentSelector != null)
+ return false;
+ } else if (!this.documentSelector.equals(other.documentSelector))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.documentSelector== null) ? 0 : this.documentSelector.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentSaveReason.java b/java/org/eclipse/lsp4j/TextDocumentSaveReason.java
new file mode 100644
index 0000000..7cfef6a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentSaveReason.java
@@ -0,0 +1,52 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * Represents reasons why a text document is saved.
+ */
+public enum TextDocumentSaveReason {
+
+ /**
+ * Manually triggered, e.g. by the user pressing save, by starting debugging,
+ * or by an API call.
+ */
+ Manual(1),
+
+ /**
+ * Automatic after a delay.
+ */
+ AfterDelay(2),
+
+ /**
+ * When the editor lost focus.
+ */
+ FocusOut(3);
+
+ private final int value;
+
+ TextDocumentSaveReason(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static TextDocumentSaveReason forValue(int value) {
+ TextDocumentSaveReason[] allValues = TextDocumentSaveReason.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentSaveRegistrationOptions.java b/java/org/eclipse/lsp4j/TextDocumentSaveRegistrationOptions.java
new file mode 100644
index 0000000..773b7bb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentSaveRegistrationOptions.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentRegistrationOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class TextDocumentSaveRegistrationOptions extends TextDocumentRegistrationOptions {
+ /**
+ * The client is supposed to include the content on save.
+ */
+ private Boolean includeText;
+
+ public TextDocumentSaveRegistrationOptions() {
+ }
+
+ public TextDocumentSaveRegistrationOptions(final Boolean includeText) {
+ this.includeText = includeText;
+ }
+
+ /**
+ * The client is supposed to include the content on save.
+ */
+ @Pure
+ public Boolean getIncludeText() {
+ return this.includeText;
+ }
+
+ /**
+ * The client is supposed to include the content on save.
+ */
+ public void setIncludeText(final Boolean includeText) {
+ this.includeText = includeText;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("includeText", this.includeText);
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TextDocumentSaveRegistrationOptions other = (TextDocumentSaveRegistrationOptions) obj;
+ if (this.includeText == null) {
+ if (other.includeText != null)
+ return false;
+ } else if (!this.includeText.equals(other.includeText))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.includeText== null) ? 0 : this.includeText.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentSyncKind.java b/java/org/eclipse/lsp4j/TextDocumentSyncKind.java
new file mode 100644
index 0000000..4221c17
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentSyncKind.java
@@ -0,0 +1,42 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+/**
+ * Defines how text documents are synced.
+ */
+public enum TextDocumentSyncKind {
+
+ /**
+ * Documents should not be synced at all.
+ */
+ None,
+
+ /**
+ * Documents are synced by always sending the full content of the document.
+ */
+ Full,
+
+ /**
+ * Documents are synced by sending the full content on open. After that only incremental
+ * updates to the document are send.
+ */
+ Incremental;
+
+ public static TextDocumentSyncKind forValue(int value) {
+ TextDocumentSyncKind[] allValues = TextDocumentSyncKind.values();
+ if (value < 0 || value >= allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/TextDocumentSyncOptions.java b/java/org/eclipse/lsp4j/TextDocumentSyncOptions.java
new file mode 100644
index 0000000..eb6b689
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextDocumentSyncOptions.java
@@ -0,0 +1,202 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.SaveOptions;
+import org.eclipse.lsp4j.TextDocumentSyncKind;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class TextDocumentSyncOptions {
+ /**
+ * Open and close notifications are sent to the server.
+ */
+ private Boolean openClose;
+
+ /**
+ * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ private TextDocumentSyncKind change;
+
+ /**
+ * Will save notifications are sent to the server.
+ */
+ private Boolean willSave;
+
+ /**
+ * Will save wait until requests are sent to the server.
+ */
+ private Boolean willSaveWaitUntil;
+
+ /**
+ * Save notifications are sent to the server.
+ */
+ private Either<Boolean, SaveOptions> save;
+
+ /**
+ * Open and close notifications are sent to the server.
+ */
+ @Pure
+ public Boolean getOpenClose() {
+ return this.openClose;
+ }
+
+ /**
+ * Open and close notifications are sent to the server.
+ */
+ public void setOpenClose(final Boolean openClose) {
+ this.openClose = openClose;
+ }
+
+ /**
+ * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ @Pure
+ public TextDocumentSyncKind getChange() {
+ return this.change;
+ }
+
+ /**
+ * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
+ * and TextDocumentSyncKind.Incremental.
+ */
+ public void setChange(final TextDocumentSyncKind change) {
+ this.change = change;
+ }
+
+ /**
+ * Will save notifications are sent to the server.
+ */
+ @Pure
+ public Boolean getWillSave() {
+ return this.willSave;
+ }
+
+ /**
+ * Will save notifications are sent to the server.
+ */
+ public void setWillSave(final Boolean willSave) {
+ this.willSave = willSave;
+ }
+
+ /**
+ * Will save wait until requests are sent to the server.
+ */
+ @Pure
+ public Boolean getWillSaveWaitUntil() {
+ return this.willSaveWaitUntil;
+ }
+
+ /**
+ * Will save wait until requests are sent to the server.
+ */
+ public void setWillSaveWaitUntil(final Boolean willSaveWaitUntil) {
+ this.willSaveWaitUntil = willSaveWaitUntil;
+ }
+
+ /**
+ * Save notifications are sent to the server.
+ */
+ @Pure
+ public Either<Boolean, SaveOptions> getSave() {
+ return this.save;
+ }
+
+ /**
+ * Save notifications are sent to the server.
+ */
+ public void setSave(final Either<Boolean, SaveOptions> save) {
+ this.save = save;
+ }
+
+ public void setSave(final Boolean save) {
+ if (save == null) {
+ this.save = null;
+ return;
+ }
+ this.save = Either.forLeft(save);
+ }
+
+ public void setSave(final SaveOptions save) {
+ if (save == null) {
+ this.save = null;
+ return;
+ }
+ this.save = Either.forRight(save);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("openClose", this.openClose);
+ b.add("change", this.change);
+ b.add("willSave", this.willSave);
+ b.add("willSaveWaitUntil", this.willSaveWaitUntil);
+ b.add("save", this.save);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextDocumentSyncOptions other = (TextDocumentSyncOptions) obj;
+ if (this.openClose == null) {
+ if (other.openClose != null)
+ return false;
+ } else if (!this.openClose.equals(other.openClose))
+ return false;
+ if (this.change == null) {
+ if (other.change != null)
+ return false;
+ } else if (!this.change.equals(other.change))
+ return false;
+ if (this.willSave == null) {
+ if (other.willSave != null)
+ return false;
+ } else if (!this.willSave.equals(other.willSave))
+ return false;
+ if (this.willSaveWaitUntil == null) {
+ if (other.willSaveWaitUntil != null)
+ return false;
+ } else if (!this.willSaveWaitUntil.equals(other.willSaveWaitUntil))
+ return false;
+ if (this.save == null) {
+ if (other.save != null)
+ return false;
+ } else if (!this.save.equals(other.save))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.openClose== null) ? 0 : this.openClose.hashCode());
+ result = prime * result + ((this.change== null) ? 0 : this.change.hashCode());
+ result = prime * result + ((this.willSave== null) ? 0 : this.willSave.hashCode());
+ result = prime * result + ((this.willSaveWaitUntil== null) ? 0 : this.willSaveWaitUntil.hashCode());
+ return prime * result + ((this.save== null) ? 0 : this.save.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TextEdit.java b/java/org/eclipse/lsp4j/TextEdit.java
new file mode 100644
index 0000000..989ac44
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TextEdit.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A textual edit applicable to a text document.
+ */
+@SuppressWarnings("all")
+public class TextEdit {
+ /**
+ * The range of the text document to be manipulated. To insert text into a document create a range where start === end.
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The string to be inserted. For delete operations use an empty string.
+ */
+ @NonNull
+ private String newText;
+
+ public TextEdit() {
+ }
+
+ public TextEdit(@NonNull final Range range, @NonNull final String newText) {
+ this.range = Preconditions.<Range>checkNotNull(range, "range");
+ this.newText = Preconditions.<String>checkNotNull(newText, "newText");
+ }
+
+ /**
+ * The range of the text document to be manipulated. To insert text into a document create a range where start === end.
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range of the text document to be manipulated. To insert text into a document create a range where start === end.
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The string to be inserted. For delete operations use an empty string.
+ */
+ @Pure
+ @NonNull
+ public String getNewText() {
+ return this.newText;
+ }
+
+ /**
+ * The string to be inserted. For delete operations use an empty string.
+ */
+ public void setNewText(@NonNull final String newText) {
+ this.newText = Preconditions.checkNotNull(newText, "newText");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("range", this.range);
+ b.add("newText", this.newText);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TextEdit other = (TextEdit) obj;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.newText == null) {
+ if (other.newText != null)
+ return false;
+ } else if (!this.newText.equals(other.newText))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ return prime * result + ((this.newText== null) ? 0 : this.newText.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TokenFormat.java b/java/org/eclipse/lsp4j/TokenFormat.java
new file mode 100644
index 0000000..c576b4e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TokenFormat.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2020 Eric Dallo.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+/**
+ * Since 3.16.0
+ */
+public final class TokenFormat {
+ private TokenFormat() {
+ }
+
+ public static final String Relative = "relative";
+
+}
diff --git a/java/org/eclipse/lsp4j/TraceValue.java b/java/org/eclipse/lsp4j/TraceValue.java
new file mode 100644
index 0000000..8f51eab
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TraceValue.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+
+package org.eclipse.lsp4j;
+
+/**
+ * A TraceValue represents the level of verbosity with which the server systematically reports its execution
+ * trace using {@code $/logTrace} notifications. The initial trace value is set by the client at initialization and
+ * can be modified later using the {@code $/setTrace} notification.
+ */
+public class TraceValue {
+ private TraceValue() {
+ }
+
+ public static final String Off = "off";
+
+ public static final String Message = "message";
+
+ public static final String Verbose = "verbose";
+}
diff --git a/java/org/eclipse/lsp4j/TypeDefinitionCapabilities.java b/java/org/eclipse/lsp4j/TypeDefinitionCapabilities.java
new file mode 100644
index 0000000..35b0c3e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeDefinitionCapabilities.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the `textDocument/typeDefinition`
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class TypeDefinitionCapabilities extends DynamicRegistrationCapabilities {
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ private Boolean linkSupport;
+
+ public TypeDefinitionCapabilities() {
+ }
+
+ public TypeDefinitionCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ public TypeDefinitionCapabilities(final Boolean dynamicRegistration, final Boolean linkSupport) {
+ super(dynamicRegistration);
+ this.linkSupport = linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ @Pure
+ public Boolean getLinkSupport() {
+ return this.linkSupport;
+ }
+
+ /**
+ * The client supports additional metadata in the form of definition links.
+ * <p>
+ * Since 3.14.0
+ */
+ public void setLinkSupport(final Boolean linkSupport) {
+ this.linkSupport = linkSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("linkSupport", this.linkSupport);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TypeDefinitionCapabilities other = (TypeDefinitionCapabilities) obj;
+ if (this.linkSupport == null) {
+ if (other.linkSupport != null)
+ return false;
+ } else if (!this.linkSupport.equals(other.linkSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.linkSupport== null) ? 0 : this.linkSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TypeDefinitionOptions.java b/java/org/eclipse/lsp4j/TypeDefinitionOptions.java
new file mode 100644
index 0000000..e4745d5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeDefinitionOptions.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class TypeDefinitionOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TypeDefinitionParams.java b/java/org/eclipse/lsp4j/TypeDefinitionParams.java
new file mode 100644
index 0000000..5eda4e6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeDefinitionParams.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The go to type definition request is sent from the client to the server to resolve the type definition
+ * location of a symbol at a given text document position.
+ */
+@SuppressWarnings("all")
+public class TypeDefinitionParams extends TextDocumentPositionAndWorkDoneProgressAndPartialResultParams {
+ public TypeDefinitionParams() {
+ }
+
+ public TypeDefinitionParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position) {
+ super(textDocument, position);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("partialResultToken", getPartialResultToken());
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TypeDefinitionRegistrationOptions.java b/java/org/eclipse/lsp4j/TypeDefinitionRegistrationOptions.java
new file mode 100644
index 0000000..6e44b9b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeDefinitionRegistrationOptions.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractTextDocumentRegistrationAndWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class TypeDefinitionRegistrationOptions extends AbstractTextDocumentRegistrationAndWorkDoneProgressOptions {
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ private String id;
+
+ public TypeDefinitionRegistrationOptions() {
+ }
+
+ public TypeDefinitionRegistrationOptions(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ @Pure
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to register the request. The id can be used to deregister
+ * the request again. See also Registration#id.
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ b.add("documentSelector", getDocumentSelector());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TypeDefinitionRegistrationOptions other = (TypeDefinitionRegistrationOptions) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.id== null) ? 0 : this.id.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TypeHierarchyCapabilities.java b/java/org/eclipse/lsp4j/TypeHierarchyCapabilities.java
new file mode 100644
index 0000000..154a139
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeHierarchyCapabilities.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.lsp4j.DynamicRegistrationCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the {@code textDocument/typeHierarchy}.
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+@Beta
+@SuppressWarnings("all")
+public class TypeHierarchyCapabilities extends DynamicRegistrationCapabilities {
+ public TypeHierarchyCapabilities() {
+ }
+
+ public TypeHierarchyCapabilities(final Boolean dynamicRegistration) {
+ super(dynamicRegistration);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dynamicRegistration", getDynamicRegistration());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TypeHierarchyDirection.java b/java/org/eclipse/lsp4j/TypeHierarchyDirection.java
new file mode 100644
index 0000000..88f4869
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeHierarchyDirection.java
@@ -0,0 +1,57 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.services.TextDocumentService;
+
+/**
+ * Direction specific to the
+ * {@link TextDocumentService#typeHierarchy(TypeHierarchyParams)
+ * textDocument/typeHierarchy} and
+ * {@link TextDocumentService#resolveTypeHierarchy(ResolveTypeHierarchyItemParams)
+ * typeHierarchy/resolve} LS methods.
+ *
+ * <p>
+ * Valid values are:
+ * <ul>
+ * <li>{@link TypeHierarchyDirection#Children Children},</li>
+ * <li>{@link TypeHierarchyDirection#Parents Parents},</li>
+ * <li>{@link TypeHierarchyDirection#Both Both}.</li>
+ * </ul>
+ *
+ */
+public enum TypeHierarchyDirection {
+
+ /**
+ * Flag for retrieving/resolving the subtypes. Value: {@code 0}.
+ */
+ Children,
+
+ /**
+ * Flag to use when retrieving/resolving the supertypes. Value: {@code 1}.
+ */
+ Parents,
+
+ /**
+ * Flag for resolving both the super- and subtypes. Value: {@code 2}.
+ */
+ Both;
+
+ public static TypeHierarchyDirection forValue(int value) {
+ TypeHierarchyDirection[] values = TypeHierarchyDirection.values();
+ if (value < 0 || value >= values.length) {
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ }
+ return values[value];
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/TypeHierarchyItem.java b/java/org/eclipse/lsp4j/TypeHierarchyItem.java
new file mode 100644
index 0000000..ebf9f7c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeHierarchyItem.java
@@ -0,0 +1,365 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import com.google.gson.annotations.JsonAdapter;
+import java.util.List;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.SymbolKind;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Representation of an item that carries type information (such as class, interface, enumeration, etc) with additional parentage details.
+ */
+@Beta
+@SuppressWarnings("all")
+public class TypeHierarchyItem {
+ /**
+ * The human readable name of the hierarchy item.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method.
+ */
+ private String detail;
+
+ /**
+ * The kind of the hierarchy item. For instance, class or interface.
+ */
+ @NonNull
+ private SymbolKind kind;
+
+ /**
+ * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default.
+ */
+ private Boolean deprecated;
+
+ /**
+ * The URI of the text document where this type hierarchy item belongs to.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is inside the type
+ * hierarchy item to reveal in the symbol in the UI.
+ *
+ * @see TypeHierarchyItem#selectionRange
+ */
+ @NonNull
+ private Range range;
+
+ /**
+ * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function.
+ * Must be contained by the the {@link TypeHierarchyItem#getRange range}.
+ *
+ * @see TypeHierarchyItem#range
+ */
+ @NonNull
+ private Range selectionRange;
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any
+ * direct parents. If not defined, the parents have not been resolved yet.
+ */
+ private List<TypeHierarchyItem> parents;
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct children of the current item.
+ * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved.
+ */
+ private List<TypeHierarchyItem> children;
+
+ /**
+ * An optional data field can be used to identify a type hierarchy item in a resolve request.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ /**
+ * The human readable name of the hierarchy item.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The human readable name of the hierarchy item.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method.
+ */
+ @Pure
+ public String getDetail() {
+ return this.detail;
+ }
+
+ /**
+ * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method.
+ */
+ public void setDetail(final String detail) {
+ this.detail = detail;
+ }
+
+ /**
+ * The kind of the hierarchy item. For instance, class or interface.
+ */
+ @Pure
+ @NonNull
+ public SymbolKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of the hierarchy item. For instance, class or interface.
+ */
+ public void setKind(@NonNull final SymbolKind kind) {
+ this.kind = Preconditions.checkNotNull(kind, "kind");
+ }
+
+ /**
+ * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default.
+ */
+ @Pure
+ public Boolean getDeprecated() {
+ return this.deprecated;
+ }
+
+ /**
+ * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default.
+ */
+ public void setDeprecated(final Boolean deprecated) {
+ this.deprecated = deprecated;
+ }
+
+ /**
+ * The URI of the text document where this type hierarchy item belongs to.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The URI of the text document where this type hierarchy item belongs to.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is inside the type
+ * hierarchy item to reveal in the symbol in the UI.
+ *
+ * @see TypeHierarchyItem#selectionRange
+ */
+ @Pure
+ @NonNull
+ public Range getRange() {
+ return this.range;
+ }
+
+ /**
+ * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else
+ * like comments. This information is typically used to determine if the clients cursor is inside the type
+ * hierarchy item to reveal in the symbol in the UI.
+ *
+ * @see TypeHierarchyItem#selectionRange
+ */
+ public void setRange(@NonNull final Range range) {
+ this.range = Preconditions.checkNotNull(range, "range");
+ }
+
+ /**
+ * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function.
+ * Must be contained by the the {@link TypeHierarchyItem#getRange range}.
+ *
+ * @see TypeHierarchyItem#range
+ */
+ @Pure
+ @NonNull
+ public Range getSelectionRange() {
+ return this.selectionRange;
+ }
+
+ /**
+ * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function.
+ * Must be contained by the the {@link TypeHierarchyItem#getRange range}.
+ *
+ * @see TypeHierarchyItem#range
+ */
+ public void setSelectionRange(@NonNull final Range selectionRange) {
+ this.selectionRange = Preconditions.checkNotNull(selectionRange, "selectionRange");
+ }
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any
+ * direct parents. If not defined, the parents have not been resolved yet.
+ */
+ @Pure
+ public List<TypeHierarchyItem> getParents() {
+ return this.parents;
+ }
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any
+ * direct parents. If not defined, the parents have not been resolved yet.
+ */
+ public void setParents(final List<TypeHierarchyItem> parents) {
+ this.parents = parents;
+ }
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct children of the current item.
+ * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved.
+ */
+ @Pure
+ public List<TypeHierarchyItem> getChildren() {
+ return this.children;
+ }
+
+ /**
+ * If this type hierarchy item is resolved, it contains the direct children of the current item.
+ * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved.
+ */
+ public void setChildren(final List<TypeHierarchyItem> children) {
+ this.children = children;
+ }
+
+ /**
+ * An optional data field can be used to identify a type hierarchy item in a resolve request.
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * An optional data field can be used to identify a type hierarchy item in a resolve request.
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("detail", this.detail);
+ b.add("kind", this.kind);
+ b.add("deprecated", this.deprecated);
+ b.add("uri", this.uri);
+ b.add("range", this.range);
+ b.add("selectionRange", this.selectionRange);
+ b.add("parents", this.parents);
+ b.add("children", this.children);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TypeHierarchyItem other = (TypeHierarchyItem) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.detail == null) {
+ if (other.detail != null)
+ return false;
+ } else if (!this.detail.equals(other.detail))
+ return false;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.deprecated == null) {
+ if (other.deprecated != null)
+ return false;
+ } else if (!this.deprecated.equals(other.deprecated))
+ return false;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.range == null) {
+ if (other.range != null)
+ return false;
+ } else if (!this.range.equals(other.range))
+ return false;
+ if (this.selectionRange == null) {
+ if (other.selectionRange != null)
+ return false;
+ } else if (!this.selectionRange.equals(other.selectionRange))
+ return false;
+ if (this.parents == null) {
+ if (other.parents != null)
+ return false;
+ } else if (!this.parents.equals(other.parents))
+ return false;
+ if (this.children == null) {
+ if (other.children != null)
+ return false;
+ } else if (!this.children.equals(other.children))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.detail== null) ? 0 : this.detail.hashCode());
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.deprecated== null) ? 0 : this.deprecated.hashCode());
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ result = prime * result + ((this.range== null) ? 0 : this.range.hashCode());
+ result = prime * result + ((this.selectionRange== null) ? 0 : this.selectionRange.hashCode());
+ result = prime * result + ((this.parents== null) ? 0 : this.parents.hashCode());
+ result = prime * result + ((this.children== null) ? 0 : this.children.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/TypeHierarchyParams.java b/java/org/eclipse/lsp4j/TypeHierarchyParams.java
new file mode 100644
index 0000000..d796521
--- /dev/null
+++ b/java/org/eclipse/lsp4j/TypeHierarchyParams.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.eclipse.lsp4j.TypeHierarchyDirection;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The type hierarchy request is sent from the client resolve a {@link TypeHierarchyItem type hierarchy item} for
+ * a give cursor location in the text document. The request would also allow to specify if the item should be resolved
+ * and whether sub- or supertypes are to be resolved.
+ */
+@Beta
+@SuppressWarnings("all")
+public class TypeHierarchyParams extends TextDocumentPositionParams {
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level. It defaults to {@code 0}.
+ */
+ private int resolve;
+
+ /**
+ * The direction of the type hierarchy resolution. If not defined, defaults to {@link TypeHierarchyDirection#Children Children}.
+ */
+ private TypeHierarchyDirection direction;
+
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level. It defaults to {@code 0}.
+ */
+ @Pure
+ public int getResolve() {
+ return this.resolve;
+ }
+
+ /**
+ * The number of hierarchy levels to resolve. {@code 0} indicates no hierarchy level. It defaults to {@code 0}.
+ */
+ public void setResolve(final int resolve) {
+ this.resolve = resolve;
+ }
+
+ /**
+ * The direction of the type hierarchy resolution. If not defined, defaults to {@link TypeHierarchyDirection#Children Children}.
+ */
+ @Pure
+ public TypeHierarchyDirection getDirection() {
+ return this.direction;
+ }
+
+ /**
+ * The direction of the type hierarchy resolution. If not defined, defaults to {@link TypeHierarchyDirection#Children Children}.
+ */
+ public void setDirection(final TypeHierarchyDirection direction) {
+ this.direction = direction;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("resolve", this.resolve);
+ b.add("direction", this.direction);
+ b.add("textDocument", getTextDocument());
+ b.add("uri", getUri());
+ b.add("position", getPosition());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ TypeHierarchyParams other = (TypeHierarchyParams) obj;
+ if (other.resolve != this.resolve)
+ return false;
+ if (this.direction == null) {
+ if (other.direction != null)
+ return false;
+ } else if (!this.direction.equals(other.direction))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + this.resolve;
+ return prime * result + ((this.direction== null) ? 0 : this.direction.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/UniquenessLevel.java b/java/org/eclipse/lsp4j/UniquenessLevel.java
new file mode 100644
index 0000000..dfb258e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/UniquenessLevel.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+
+package org.eclipse.lsp4j;
+
+/**
+ * Moniker uniqueness level to define scope of the moniker.
+ *
+ * Since 3.16.0
+ */
+public final class UniquenessLevel {
+ private UniquenessLevel() {
+ }
+
+ /**
+ * The moniker is only unique inside a document
+ */
+ public static final String Document = "document";
+
+ /**
+ * The moniker is unique inside a project for which a dump got created
+ */
+ public static final String Project = "project";
+
+ /**
+ * The moniker is unique inside the group to which a project belongs
+ */
+ public static final String Group = "group";
+
+ /**
+ * The moniker is unique inside the moniker scheme.
+ */
+ public static final String Scheme = "scheme";
+
+ /**
+ * The moniker is globally unique
+ */
+ public static final String Global = "global";
+}
diff --git a/java/org/eclipse/lsp4j/Unregistration.java b/java/org/eclipse/lsp4j/Unregistration.java
new file mode 100644
index 0000000..6b7fa0b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/Unregistration.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * General parameters to unregister a capability.
+ */
+@SuppressWarnings("all")
+public class Unregistration {
+ /**
+ * The id used to unregister the request or notification. Usually an id
+ * provided during the register request.
+ */
+ @NonNull
+ private String id;
+
+ /**
+ * The method / capability to unregister for.
+ */
+ @NonNull
+ private String method;
+
+ public Unregistration() {
+ }
+
+ public Unregistration(@NonNull final String id, @NonNull final String method) {
+ this.id = Preconditions.<String>checkNotNull(id, "id");
+ this.method = Preconditions.<String>checkNotNull(method, "method");
+ }
+
+ /**
+ * The id used to unregister the request or notification. Usually an id
+ * provided during the register request.
+ */
+ @Pure
+ @NonNull
+ public String getId() {
+ return this.id;
+ }
+
+ /**
+ * The id used to unregister the request or notification. Usually an id
+ * provided during the register request.
+ */
+ public void setId(@NonNull final String id) {
+ this.id = Preconditions.checkNotNull(id, "id");
+ }
+
+ /**
+ * The method / capability to unregister for.
+ */
+ @Pure
+ @NonNull
+ public String getMethod() {
+ return this.method;
+ }
+
+ /**
+ * The method / capability to unregister for.
+ */
+ public void setMethod(@NonNull final String method) {
+ this.method = Preconditions.checkNotNull(method, "method");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("method", this.method);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Unregistration other = (Unregistration) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ if (this.method == null) {
+ if (other.method != null)
+ return false;
+ } else if (!this.method.equals(other.method))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.id== null) ? 0 : this.id.hashCode());
+ return prime * result + ((this.method== null) ? 0 : this.method.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/UnregistrationParams.java b/java/org/eclipse/lsp4j/UnregistrationParams.java
new file mode 100644
index 0000000..aba3733
--- /dev/null
+++ b/java/org/eclipse/lsp4j/UnregistrationParams.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.Unregistration;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The client/unregisterCapability request is sent from the server to the client to unregister
+ * a previously registered capability.
+ */
+@SuppressWarnings("all")
+public class UnregistrationParams {
+ @NonNull
+ private List<Unregistration> unregisterations;
+
+ public UnregistrationParams() {
+ this(new ArrayList<Unregistration>());
+ }
+
+ public UnregistrationParams(@NonNull final List<Unregistration> unregisterations) {
+ this.unregisterations = Preconditions.<List<Unregistration>>checkNotNull(unregisterations, "unregisterations");
+ }
+
+ @Pure
+ @NonNull
+ public List<Unregistration> getUnregisterations() {
+ return this.unregisterations;
+ }
+
+ public void setUnregisterations(@NonNull final List<Unregistration> unregisterations) {
+ this.unregisterations = Preconditions.checkNotNull(unregisterations, "unregisterations");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("unregisterations", this.unregisterations);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ UnregistrationParams other = (UnregistrationParams) obj;
+ if (this.unregisterations == null) {
+ if (other.unregisterations != null)
+ return false;
+ } else if (!this.unregisterations.equals(other.unregisterations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.unregisterations== null) ? 0 : this.unregisterations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/VersionedTextDocumentIdentifier.java b/java/org/eclipse/lsp4j/VersionedTextDocumentIdentifier.java
new file mode 100644
index 0000000..d50e6b8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/VersionedTextDocumentIdentifier.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.gson.annotations.JsonAdapter;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.adapters.VersionedTextDocumentIdentifierTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An identifier to denote a specific version of a text document. This information usually flows from the client to the server.
+ */
+@JsonAdapter(VersionedTextDocumentIdentifierTypeAdapter.Factory.class)
+@SuppressWarnings("all")
+public class VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
+ /**
+ * The version number of this document. If a versioned text document identifier
+ * is sent from the server to the client and the file is not open in the editor
+ * (the server has not received an open notification before) the server can send
+ * `null` to indicate that the version is known and the content on disk is the
+ * truth (as specified with document content ownership).
+ */
+ private Integer version;
+
+ public VersionedTextDocumentIdentifier() {
+ }
+
+ public VersionedTextDocumentIdentifier(@NonNull final String uri, final Integer version) {
+ super(uri);
+ this.version = version;
+ }
+
+ @Deprecated
+ public VersionedTextDocumentIdentifier(final Integer version) {
+ this.version = version;
+ }
+
+ /**
+ * The version number of this document. If a versioned text document identifier
+ * is sent from the server to the client and the file is not open in the editor
+ * (the server has not received an open notification before) the server can send
+ * `null` to indicate that the version is known and the content on disk is the
+ * truth (as specified with document content ownership).
+ */
+ @Pure
+ public Integer getVersion() {
+ return this.version;
+ }
+
+ /**
+ * The version number of this document. If a versioned text document identifier
+ * is sent from the server to the client and the file is not open in the editor
+ * (the server has not received an open notification before) the server can send
+ * `null` to indicate that the version is known and the content on disk is the
+ * truth (as specified with document content ownership).
+ */
+ public void setVersion(final Integer version) {
+ this.version = version;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("version", this.version);
+ b.add("uri", getUri());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ VersionedTextDocumentIdentifier other = (VersionedTextDocumentIdentifier) obj;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.version== null) ? 0 : this.version.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WatchKind.java b/java/org/eclipse/lsp4j/WatchKind.java
new file mode 100644
index 0000000..46b51cf
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WatchKind.java
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+public final class WatchKind {
+ private WatchKind() {}
+
+ /**
+ * Interested in create events.
+ */
+ public static final int Create = 1;
+
+ /**
+ * Interested in change events
+ */
+ public static final int Change = 2;
+
+ /**
+ * Interested in delete events
+ */
+ public static final int Delete = 4;
+
+}
diff --git a/java/org/eclipse/lsp4j/WillSaveTextDocumentParams.java b/java/org/eclipse/lsp4j/WillSaveTextDocumentParams.java
new file mode 100644
index 0000000..222b9fa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WillSaveTextDocumentParams.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentSaveReason;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class WillSaveTextDocumentParams {
+ /**
+ * The document that will be saved.
+ */
+ @NonNull
+ private TextDocumentIdentifier textDocument;
+
+ /**
+ * A reason why a text document is saved.
+ */
+ @NonNull
+ private TextDocumentSaveReason reason;
+
+ public WillSaveTextDocumentParams() {
+ }
+
+ public WillSaveTextDocumentParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final TextDocumentSaveReason reason) {
+ this.textDocument = Preconditions.<TextDocumentIdentifier>checkNotNull(textDocument, "textDocument");
+ this.reason = Preconditions.<TextDocumentSaveReason>checkNotNull(reason, "reason");
+ }
+
+ /**
+ * The document that will be saved.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentIdentifier getTextDocument() {
+ return this.textDocument;
+ }
+
+ /**
+ * The document that will be saved.
+ */
+ public void setTextDocument(@NonNull final TextDocumentIdentifier textDocument) {
+ this.textDocument = Preconditions.checkNotNull(textDocument, "textDocument");
+ }
+
+ /**
+ * A reason why a text document is saved.
+ */
+ @Pure
+ @NonNull
+ public TextDocumentSaveReason getReason() {
+ return this.reason;
+ }
+
+ /**
+ * A reason why a text document is saved.
+ */
+ public void setReason(@NonNull final TextDocumentSaveReason reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("textDocument", this.textDocument);
+ b.add("reason", this.reason);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WillSaveTextDocumentParams other = (WillSaveTextDocumentParams) obj;
+ if (this.textDocument == null) {
+ if (other.textDocument != null)
+ return false;
+ } else if (!this.textDocument.equals(other.textDocument))
+ return false;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.textDocument== null) ? 0 : this.textDocument.hashCode());
+ return prime * result + ((this.reason== null) ? 0 : this.reason.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WindowClientCapabilities.java b/java/org/eclipse/lsp4j/WindowClientCapabilities.java
new file mode 100644
index 0000000..1a8e739
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WindowClientCapabilities.java
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.ShowDocumentCapabilities;
+import org.eclipse.lsp4j.WindowShowMessageRequestCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Window specific client capabilities.
+ */
+@SuppressWarnings("all")
+public class WindowClientCapabilities {
+ /**
+ * Whether client supports handling progress notifications. If set servers are allowed to
+ * report in `workDoneProgress` property in the request specific server capabilities.
+ * <p>
+ * Since 3.15.0
+ */
+ private Boolean workDoneProgress;
+
+ /**
+ * Capabilities specific to the showMessage request
+ * <p>
+ * Since 3.16.0
+ */
+ private WindowShowMessageRequestCapabilities showMessage;
+
+ /**
+ * Client capabilities for the show document request.
+ * <p>
+ * Since 3.16.0
+ */
+ private ShowDocumentCapabilities showDocument;
+
+ /**
+ * Whether client supports handling progress notifications. If set servers are allowed to
+ * report in `workDoneProgress` property in the request specific server capabilities.
+ * <p>
+ * Since 3.15.0
+ */
+ @Pure
+ public Boolean getWorkDoneProgress() {
+ return this.workDoneProgress;
+ }
+
+ /**
+ * Whether client supports handling progress notifications. If set servers are allowed to
+ * report in `workDoneProgress` property in the request specific server capabilities.
+ * <p>
+ * Since 3.15.0
+ */
+ public void setWorkDoneProgress(final Boolean workDoneProgress) {
+ this.workDoneProgress = workDoneProgress;
+ }
+
+ /**
+ * Capabilities specific to the showMessage request
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public WindowShowMessageRequestCapabilities getShowMessage() {
+ return this.showMessage;
+ }
+
+ /**
+ * Capabilities specific to the showMessage request
+ * <p>
+ * Since 3.16.0
+ */
+ public void setShowMessage(final WindowShowMessageRequestCapabilities showMessage) {
+ this.showMessage = showMessage;
+ }
+
+ /**
+ * Client capabilities for the show document request.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public ShowDocumentCapabilities getShowDocument() {
+ return this.showDocument;
+ }
+
+ /**
+ * Client capabilities for the show document request.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setShowDocument(final ShowDocumentCapabilities showDocument) {
+ this.showDocument = showDocument;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", this.workDoneProgress);
+ b.add("showMessage", this.showMessage);
+ b.add("showDocument", this.showDocument);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WindowClientCapabilities other = (WindowClientCapabilities) obj;
+ if (this.workDoneProgress == null) {
+ if (other.workDoneProgress != null)
+ return false;
+ } else if (!this.workDoneProgress.equals(other.workDoneProgress))
+ return false;
+ if (this.showMessage == null) {
+ if (other.showMessage != null)
+ return false;
+ } else if (!this.showMessage.equals(other.showMessage))
+ return false;
+ if (this.showDocument == null) {
+ if (other.showDocument != null)
+ return false;
+ } else if (!this.showDocument.equals(other.showDocument))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workDoneProgress== null) ? 0 : this.workDoneProgress.hashCode());
+ result = prime * result + ((this.showMessage== null) ? 0 : this.showMessage.hashCode());
+ return prime * result + ((this.showDocument== null) ? 0 : this.showDocument.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WindowShowMessageRequestActionItemCapabilities.java b/java/org/eclipse/lsp4j/WindowShowMessageRequestActionItemCapabilities.java
new file mode 100644
index 0000000..222963e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WindowShowMessageRequestActionItemCapabilities.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to the {@link MessageActionItem} type of show message request.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class WindowShowMessageRequestActionItemCapabilities {
+ /**
+ * Whether the client supports additional attributes which
+ * are preserved and sent back to the server in the
+ * request's response.
+ */
+ private Boolean additionalPropertiesSupport;
+
+ public WindowShowMessageRequestActionItemCapabilities() {
+ }
+
+ public WindowShowMessageRequestActionItemCapabilities(final Boolean additionalPropertiesSupport) {
+ this.additionalPropertiesSupport = additionalPropertiesSupport;
+ }
+
+ /**
+ * Whether the client supports additional attributes which
+ * are preserved and sent back to the server in the
+ * request's response.
+ */
+ @Pure
+ public Boolean getAdditionalPropertiesSupport() {
+ return this.additionalPropertiesSupport;
+ }
+
+ /**
+ * Whether the client supports additional attributes which
+ * are preserved and sent back to the server in the
+ * request's response.
+ */
+ public void setAdditionalPropertiesSupport(final Boolean additionalPropertiesSupport) {
+ this.additionalPropertiesSupport = additionalPropertiesSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("additionalPropertiesSupport", this.additionalPropertiesSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WindowShowMessageRequestActionItemCapabilities other = (WindowShowMessageRequestActionItemCapabilities) obj;
+ if (this.additionalPropertiesSupport == null) {
+ if (other.additionalPropertiesSupport != null)
+ return false;
+ } else if (!this.additionalPropertiesSupport.equals(other.additionalPropertiesSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.additionalPropertiesSupport== null) ? 0 : this.additionalPropertiesSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WindowShowMessageRequestCapabilities.java b/java/org/eclipse/lsp4j/WindowShowMessageRequestCapabilities.java
new file mode 100644
index 0000000..116dca8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WindowShowMessageRequestCapabilities.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WindowShowMessageRequestActionItemCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Show message request client capabilities
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class WindowShowMessageRequestCapabilities {
+ /**
+ * Capabilities specific to the {@link MessageActionItem} type.
+ */
+ private WindowShowMessageRequestActionItemCapabilities messageActionItem;
+
+ public WindowShowMessageRequestCapabilities() {
+ }
+
+ /**
+ * Capabilities specific to the {@link MessageActionItem} type.
+ */
+ @Pure
+ public WindowShowMessageRequestActionItemCapabilities getMessageActionItem() {
+ return this.messageActionItem;
+ }
+
+ /**
+ * Capabilities specific to the {@link MessageActionItem} type.
+ */
+ public void setMessageActionItem(final WindowShowMessageRequestActionItemCapabilities messageActionItem) {
+ this.messageActionItem = messageActionItem;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("messageActionItem", this.messageActionItem);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WindowShowMessageRequestCapabilities other = (WindowShowMessageRequestCapabilities) obj;
+ if (this.messageActionItem == null) {
+ if (other.messageActionItem != null)
+ return false;
+ } else if (!this.messageActionItem.equals(other.messageActionItem))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.messageActionItem== null) ? 0 : this.messageActionItem.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressAndPartialResultParams.java b/java/org/eclipse/lsp4j/WorkDoneProgressAndPartialResultParams.java
new file mode 100644
index 0000000..f800e13
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressAndPartialResultParams.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.PartialResultParams;
+import org.eclipse.lsp4j.WorkDoneProgressParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Abstract class which implements work done progress and partial result request parameter.
+ * It is not present in protocol specification, so it's just "dry" class.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public abstract class WorkDoneProgressAndPartialResultParams implements WorkDoneProgressParams, PartialResultParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ private Either<String, Integer> workDoneToken;
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ private Either<String, Integer> partialResultToken;
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getWorkDoneToken() {
+ return this.workDoneToken;
+ }
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ public void setWorkDoneToken(final Either<String, Integer> workDoneToken) {
+ this.workDoneToken = workDoneToken;
+ }
+
+ public void setWorkDoneToken(final String workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forLeft(workDoneToken);
+ }
+
+ public void setWorkDoneToken(final Integer workDoneToken) {
+ if (workDoneToken == null) {
+ this.workDoneToken = null;
+ return;
+ }
+ this.workDoneToken = Either.forRight(workDoneToken);
+ }
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ @Pure
+ @Override
+ public Either<String, Integer> getPartialResultToken() {
+ return this.partialResultToken;
+ }
+
+ /**
+ * An optional token that a server can use to report partial results (e.g. streaming) to
+ * the client.
+ */
+ public void setPartialResultToken(final Either<String, Integer> partialResultToken) {
+ this.partialResultToken = partialResultToken;
+ }
+
+ public void setPartialResultToken(final String partialResultToken) {
+ if (partialResultToken == null) {
+ this.partialResultToken = null;
+ return;
+ }
+ this.partialResultToken = Either.forLeft(partialResultToken);
+ }
+
+ public void setPartialResultToken(final Integer partialResultToken) {
+ if (partialResultToken == null) {
+ this.partialResultToken = null;
+ return;
+ }
+ this.partialResultToken = Either.forRight(partialResultToken);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneToken", this.workDoneToken);
+ b.add("partialResultToken", this.partialResultToken);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkDoneProgressAndPartialResultParams other = (WorkDoneProgressAndPartialResultParams) obj;
+ if (this.workDoneToken == null) {
+ if (other.workDoneToken != null)
+ return false;
+ } else if (!this.workDoneToken.equals(other.workDoneToken))
+ return false;
+ if (this.partialResultToken == null) {
+ if (other.partialResultToken != null)
+ return false;
+ } else if (!this.partialResultToken.equals(other.partialResultToken))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workDoneToken== null) ? 0 : this.workDoneToken.hashCode());
+ return prime * result + ((this.partialResultToken== null) ? 0 : this.partialResultToken.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressBegin.java b/java/org/eclipse/lsp4j/WorkDoneProgressBegin.java
new file mode 100644
index 0000000..5294d70
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressBegin.java
@@ -0,0 +1,214 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkDoneProgressKind;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The $/progress notification payload to start progress reporting.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class WorkDoneProgressBegin implements WorkDoneProgressNotification {
+ /**
+ * Always return begin
+ */
+ @Override
+ public WorkDoneProgressKind getKind() {
+ return WorkDoneProgressKind.begin;
+ }
+
+ /**
+ * Mandatory title of the progress operation. Used to briefly inform about
+ * the kind of operation being performed.
+ * <p>
+ * Examples: "Indexing" or "Linking dependencies".
+ */
+ @NonNull
+ private String title;
+
+ /**
+ * Controls if a cancel button should show to allow the user to cancel the
+ * long running operation. Clients that don't support cancellation are allowed
+ * to ignore the setting.
+ */
+ private Boolean cancellable;
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link #title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ private String message;
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ private Integer percentage;
+
+ /**
+ * Mandatory title of the progress operation. Used to briefly inform about
+ * the kind of operation being performed.
+ * <p>
+ * Examples: "Indexing" or "Linking dependencies".
+ */
+ @Pure
+ @NonNull
+ public String getTitle() {
+ return this.title;
+ }
+
+ /**
+ * Mandatory title of the progress operation. Used to briefly inform about
+ * the kind of operation being performed.
+ * <p>
+ * Examples: "Indexing" or "Linking dependencies".
+ */
+ public void setTitle(@NonNull final String title) {
+ this.title = Preconditions.checkNotNull(title, "title");
+ }
+
+ /**
+ * Controls if a cancel button should show to allow the user to cancel the
+ * long running operation. Clients that don't support cancellation are allowed
+ * to ignore the setting.
+ */
+ @Pure
+ public Boolean getCancellable() {
+ return this.cancellable;
+ }
+
+ /**
+ * Controls if a cancel button should show to allow the user to cancel the
+ * long running operation. Clients that don't support cancellation are allowed
+ * to ignore the setting.
+ */
+ public void setCancellable(final Boolean cancellable) {
+ this.cancellable = cancellable;
+ }
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link #title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link #title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ @Pure
+ public Integer getPercentage() {
+ return this.percentage;
+ }
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ public void setPercentage(final Integer percentage) {
+ this.percentage = percentage;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("title", this.title);
+ b.add("cancellable", this.cancellable);
+ b.add("message", this.message);
+ b.add("percentage", this.percentage);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkDoneProgressBegin other = (WorkDoneProgressBegin) obj;
+ if (this.title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!this.title.equals(other.title))
+ return false;
+ if (this.cancellable == null) {
+ if (other.cancellable != null)
+ return false;
+ } else if (!this.cancellable.equals(other.cancellable))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.percentage == null) {
+ if (other.percentage != null)
+ return false;
+ } else if (!this.percentage.equals(other.percentage))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.title== null) ? 0 : this.title.hashCode());
+ result = prime * result + ((this.cancellable== null) ? 0 : this.cancellable.hashCode());
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ return prime * result + ((this.percentage== null) ? 0 : this.percentage.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressCancelParams.java b/java/org/eclipse/lsp4j/WorkDoneProgressCancelParams.java
new file mode 100644
index 0000000..332e540
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressCancelParams.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The {@code window/workDoneProgress/cancel} notification is sent from the client to the server to cancel a progress initiated on the server side using the
+ * {@code window/workDoneProgress/create}.
+ */
+@SuppressWarnings("all")
+public class WorkDoneProgressCancelParams {
+ /**
+ * The token to be used to report progress.
+ */
+ @NonNull
+ private Either<String, Integer> token;
+
+ public WorkDoneProgressCancelParams() {
+ }
+
+ public WorkDoneProgressCancelParams(@NonNull final Either<String, Integer> token) {
+ this.token = Preconditions.<Either<String, Integer>>checkNotNull(token, "token");
+ }
+
+ /**
+ * The token to be used to report progress.
+ */
+ @Pure
+ @NonNull
+ public Either<String, Integer> getToken() {
+ return this.token;
+ }
+
+ /**
+ * The token to be used to report progress.
+ */
+ public void setToken(@NonNull final Either<String, Integer> token) {
+ this.token = Preconditions.checkNotNull(token, "token");
+ }
+
+ public void setToken(final String token) {
+ if (token == null) {
+ Preconditions.checkNotNull(token, "token");
+ this.token = null;
+ return;
+ }
+ this.token = Either.forLeft(token);
+ }
+
+ public void setToken(final Integer token) {
+ if (token == null) {
+ Preconditions.checkNotNull(token, "token");
+ this.token = null;
+ return;
+ }
+ this.token = Either.forRight(token);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("token", this.token);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkDoneProgressCancelParams other = (WorkDoneProgressCancelParams) obj;
+ if (this.token == null) {
+ if (other.token != null)
+ return false;
+ } else if (!this.token.equals(other.token))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.token== null) ? 0 : this.token.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressCreateParams.java b/java/org/eclipse/lsp4j/WorkDoneProgressCreateParams.java
new file mode 100644
index 0000000..ce5c79f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressCreateParams.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The {@code window/workDoneProgress/create} request is sent from the server to the client to ask the client to create a work done progress.
+ */
+@SuppressWarnings("all")
+public class WorkDoneProgressCreateParams {
+ /**
+ * The token to be used to report progress.
+ */
+ @NonNull
+ private Either<String, Integer> token;
+
+ public WorkDoneProgressCreateParams() {
+ }
+
+ public WorkDoneProgressCreateParams(@NonNull final Either<String, Integer> token) {
+ this.token = Preconditions.<Either<String, Integer>>checkNotNull(token, "token");
+ }
+
+ /**
+ * The token to be used to report progress.
+ */
+ @Pure
+ @NonNull
+ public Either<String, Integer> getToken() {
+ return this.token;
+ }
+
+ /**
+ * The token to be used to report progress.
+ */
+ public void setToken(@NonNull final Either<String, Integer> token) {
+ this.token = Preconditions.checkNotNull(token, "token");
+ }
+
+ public void setToken(final String token) {
+ if (token == null) {
+ Preconditions.checkNotNull(token, "token");
+ this.token = null;
+ return;
+ }
+ this.token = Either.forLeft(token);
+ }
+
+ public void setToken(final Integer token) {
+ if (token == null) {
+ Preconditions.checkNotNull(token, "token");
+ this.token = null;
+ return;
+ }
+ this.token = Either.forRight(token);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("token", this.token);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkDoneProgressCreateParams other = (WorkDoneProgressCreateParams) obj;
+ if (this.token == null) {
+ if (other.token != null)
+ return false;
+ } else if (!this.token.equals(other.token))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.token== null) ? 0 : this.token.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressEnd.java b/java/org/eclipse/lsp4j/WorkDoneProgressEnd.java
new file mode 100644
index 0000000..5a8ea02
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressEnd.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkDoneProgressKind;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The notification payload about progress reporting.
+ * Signaling the end of a progress reporting is done using the following payload:
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class WorkDoneProgressEnd implements WorkDoneProgressNotification {
+ /**
+ * Always return end
+ */
+ @Override
+ public WorkDoneProgressKind getKind() {
+ return WorkDoneProgressKind.end;
+ }
+
+ /**
+ * Optional, a final message indicating to for example indicate the outcome
+ * of the operation.
+ */
+ private String message;
+
+ /**
+ * Optional, a final message indicating to for example indicate the outcome
+ * of the operation.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Optional, a final message indicating to for example indicate the outcome
+ * of the operation.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("message", this.message);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkDoneProgressEnd other = (WorkDoneProgressEnd) obj;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.message== null) ? 0 : this.message.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressKind.java b/java/org/eclipse/lsp4j/WorkDoneProgressKind.java
new file mode 100644
index 0000000..171eb6c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressKind.java
@@ -0,0 +1,17 @@
+/******************************************************************************
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j;
+
+public enum WorkDoneProgressKind {
+ begin, report, end;
+
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressNotification.java b/java/org/eclipse/lsp4j/WorkDoneProgressNotification.java
new file mode 100644
index 0000000..6e528b9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressNotification.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkDoneProgressKind;
+
+/**
+ * The $/progress notification payload interface.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public interface WorkDoneProgressNotification {
+ WorkDoneProgressKind getKind();
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressOptions.java b/java/org/eclipse/lsp4j/WorkDoneProgressOptions.java
new file mode 100644
index 0000000..e6daaef
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressOptions.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+/**
+ * Options to signal work done progress support in server capabilities.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public interface WorkDoneProgressOptions {
+ Boolean getWorkDoneProgress();
+
+ void setWorkDoneProgress(final Boolean workDoneProgress);
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressParams.java b/java/org/eclipse/lsp4j/WorkDoneProgressParams.java
new file mode 100644
index 0000000..89c19c2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressParams.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+/**
+ * A parameter literal used to pass a work done progress token.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public interface WorkDoneProgressParams {
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ Either<String, Integer> getWorkDoneToken();
+
+ /**
+ * An optional token that a server can use to report work done progress.
+ */
+ void setWorkDoneToken(final Either<String, Integer> token);
+}
diff --git a/java/org/eclipse/lsp4j/WorkDoneProgressReport.java b/java/org/eclipse/lsp4j/WorkDoneProgressReport.java
new file mode 100644
index 0000000..3ce8eb2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkDoneProgressReport.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkDoneProgressKind;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The notification payload about progress reporting.
+ * <p>
+ * Since 3.15.0
+ */
+@SuppressWarnings("all")
+public class WorkDoneProgressReport implements WorkDoneProgressNotification {
+ /**
+ * Always return report
+ */
+ @Override
+ public WorkDoneProgressKind getKind() {
+ return WorkDoneProgressKind.report;
+ }
+
+ /**
+ * Controls enablement state of a cancel button. This property is only valid if a cancel
+ * button got requested in the {@link WorkDoneProgressBegin} payload.
+ * <p>
+ * Clients that don't support cancellation or don't support control the button's
+ * enablement state are allowed to ignore the setting.
+ */
+ private Boolean cancellable;
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link WorkDoneProgressBegin#title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ private String message;
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ private Integer percentage;
+
+ /**
+ * Controls enablement state of a cancel button. This property is only valid if a cancel
+ * button got requested in the {@link WorkDoneProgressBegin} payload.
+ * <p>
+ * Clients that don't support cancellation or don't support control the button's
+ * enablement state are allowed to ignore the setting.
+ */
+ @Pure
+ public Boolean getCancellable() {
+ return this.cancellable;
+ }
+
+ /**
+ * Controls enablement state of a cancel button. This property is only valid if a cancel
+ * button got requested in the {@link WorkDoneProgressBegin} payload.
+ * <p>
+ * Clients that don't support cancellation or don't support control the button's
+ * enablement state are allowed to ignore the setting.
+ */
+ public void setCancellable(final Boolean cancellable) {
+ this.cancellable = cancellable;
+ }
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link WorkDoneProgressBegin#title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Optional, more detailed associated progress message. Contains
+ * complementary information to the {@link WorkDoneProgressBegin#title}.
+ * <p>
+ * Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
+ * If unset, the previous progress message (if any) is still valid.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ @Pure
+ public Integer getPercentage() {
+ return this.percentage;
+ }
+
+ /**
+ * Optional progress percentage to display (value 100 is considered 100%).
+ * If not provided infinite progress is assumed and clients are allowed
+ * to ignore the `percentage` value in subsequent in report notifications.
+ * <p>
+ * The value should be steadily rising. Clients are free to ignore values
+ * that are not following this rule.
+ */
+ public void setPercentage(final Integer percentage) {
+ this.percentage = percentage;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("cancellable", this.cancellable);
+ b.add("message", this.message);
+ b.add("percentage", this.percentage);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkDoneProgressReport other = (WorkDoneProgressReport) obj;
+ if (this.cancellable == null) {
+ if (other.cancellable != null)
+ return false;
+ } else if (!this.cancellable.equals(other.cancellable))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.percentage == null) {
+ if (other.percentage != null)
+ return false;
+ } else if (!this.percentage.equals(other.percentage))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.cancellable== null) ? 0 : this.cancellable.hashCode());
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ return prime * result + ((this.percentage== null) ? 0 : this.percentage.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceClientCapabilities.java b/java/org/eclipse/lsp4j/WorkspaceClientCapabilities.java
new file mode 100644
index 0000000..f5655d9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceClientCapabilities.java
@@ -0,0 +1,392 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.CodeLensWorkspaceCapabilities;
+import org.eclipse.lsp4j.DidChangeConfigurationCapabilities;
+import org.eclipse.lsp4j.DidChangeWatchedFilesCapabilities;
+import org.eclipse.lsp4j.ExecuteCommandCapabilities;
+import org.eclipse.lsp4j.FileOperationsWorkspaceCapabilities;
+import org.eclipse.lsp4j.SemanticTokensWorkspaceCapabilities;
+import org.eclipse.lsp4j.SymbolCapabilities;
+import org.eclipse.lsp4j.WorkspaceEditCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Workspace specific client capabilities.
+ */
+@SuppressWarnings("all")
+public class WorkspaceClientCapabilities {
+ /**
+ * The client supports applying batch edits to the workspace by supporting
+ * the request 'workspace/applyEdit'.
+ */
+ private Boolean applyEdit;
+
+ /**
+ * Capabilities specific to {@link WorkspaceEdit}s
+ */
+ private WorkspaceEditCapabilities workspaceEdit;
+
+ /**
+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+ */
+ private DidChangeConfigurationCapabilities didChangeConfiguration;
+
+ /**
+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+ */
+ private DidChangeWatchedFilesCapabilities didChangeWatchedFiles;
+
+ /**
+ * Capabilities specific to the `workspace/symbol` request.
+ */
+ private SymbolCapabilities symbol;
+
+ /**
+ * Capabilities specific to the `workspace/executeCommand` request.
+ */
+ private ExecuteCommandCapabilities executeCommand;
+
+ /**
+ * The client has support for workspace folders.
+ * <p>
+ * Since 3.6.0
+ */
+ private Boolean workspaceFolders;
+
+ /**
+ * The client supports `workspace/configuration` requests.
+ * <p>
+ * Since 3.6.0
+ */
+ private Boolean configuration;
+
+ /**
+ * Capabilities specific to the semantic token requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ private SemanticTokensWorkspaceCapabilities semanticTokens;
+
+ /**
+ * Capabilities specific to the code lens requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ private CodeLensWorkspaceCapabilities codeLens;
+
+ /**
+ * The client has support for file requests/notifications.
+ * <p>
+ * Since 3.16.0
+ */
+ private FileOperationsWorkspaceCapabilities fileOperations;
+
+ /**
+ * The client supports applying batch edits to the workspace by supporting
+ * the request 'workspace/applyEdit'.
+ */
+ @Pure
+ public Boolean getApplyEdit() {
+ return this.applyEdit;
+ }
+
+ /**
+ * The client supports applying batch edits to the workspace by supporting
+ * the request 'workspace/applyEdit'.
+ */
+ public void setApplyEdit(final Boolean applyEdit) {
+ this.applyEdit = applyEdit;
+ }
+
+ /**
+ * Capabilities specific to {@link WorkspaceEdit}s
+ */
+ @Pure
+ public WorkspaceEditCapabilities getWorkspaceEdit() {
+ return this.workspaceEdit;
+ }
+
+ /**
+ * Capabilities specific to {@link WorkspaceEdit}s
+ */
+ public void setWorkspaceEdit(final WorkspaceEditCapabilities workspaceEdit) {
+ this.workspaceEdit = workspaceEdit;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+ */
+ @Pure
+ public DidChangeConfigurationCapabilities getDidChangeConfiguration() {
+ return this.didChangeConfiguration;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+ */
+ public void setDidChangeConfiguration(final DidChangeConfigurationCapabilities didChangeConfiguration) {
+ this.didChangeConfiguration = didChangeConfiguration;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+ */
+ @Pure
+ public DidChangeWatchedFilesCapabilities getDidChangeWatchedFiles() {
+ return this.didChangeWatchedFiles;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+ */
+ public void setDidChangeWatchedFiles(final DidChangeWatchedFilesCapabilities didChangeWatchedFiles) {
+ this.didChangeWatchedFiles = didChangeWatchedFiles;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/symbol` request.
+ */
+ @Pure
+ public SymbolCapabilities getSymbol() {
+ return this.symbol;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/symbol` request.
+ */
+ public void setSymbol(final SymbolCapabilities symbol) {
+ this.symbol = symbol;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/executeCommand` request.
+ */
+ @Pure
+ public ExecuteCommandCapabilities getExecuteCommand() {
+ return this.executeCommand;
+ }
+
+ /**
+ * Capabilities specific to the `workspace/executeCommand` request.
+ */
+ public void setExecuteCommand(final ExecuteCommandCapabilities executeCommand) {
+ this.executeCommand = executeCommand;
+ }
+
+ /**
+ * The client has support for workspace folders.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public Boolean getWorkspaceFolders() {
+ return this.workspaceFolders;
+ }
+
+ /**
+ * The client has support for workspace folders.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setWorkspaceFolders(final Boolean workspaceFolders) {
+ this.workspaceFolders = workspaceFolders;
+ }
+
+ /**
+ * The client supports `workspace/configuration` requests.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public Boolean getConfiguration() {
+ return this.configuration;
+ }
+
+ /**
+ * The client supports `workspace/configuration` requests.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setConfiguration(final Boolean configuration) {
+ this.configuration = configuration;
+ }
+
+ /**
+ * Capabilities specific to the semantic token requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public SemanticTokensWorkspaceCapabilities getSemanticTokens() {
+ return this.semanticTokens;
+ }
+
+ /**
+ * Capabilities specific to the semantic token requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setSemanticTokens(final SemanticTokensWorkspaceCapabilities semanticTokens) {
+ this.semanticTokens = semanticTokens;
+ }
+
+ /**
+ * Capabilities specific to the code lens requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public CodeLensWorkspaceCapabilities getCodeLens() {
+ return this.codeLens;
+ }
+
+ /**
+ * Capabilities specific to the code lens requests scoped to the
+ * workspace.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setCodeLens(final CodeLensWorkspaceCapabilities codeLens) {
+ this.codeLens = codeLens;
+ }
+
+ /**
+ * The client has support for file requests/notifications.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public FileOperationsWorkspaceCapabilities getFileOperations() {
+ return this.fileOperations;
+ }
+
+ /**
+ * The client has support for file requests/notifications.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setFileOperations(final FileOperationsWorkspaceCapabilities fileOperations) {
+ this.fileOperations = fileOperations;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("applyEdit", this.applyEdit);
+ b.add("workspaceEdit", this.workspaceEdit);
+ b.add("didChangeConfiguration", this.didChangeConfiguration);
+ b.add("didChangeWatchedFiles", this.didChangeWatchedFiles);
+ b.add("symbol", this.symbol);
+ b.add("executeCommand", this.executeCommand);
+ b.add("workspaceFolders", this.workspaceFolders);
+ b.add("configuration", this.configuration);
+ b.add("semanticTokens", this.semanticTokens);
+ b.add("codeLens", this.codeLens);
+ b.add("fileOperations", this.fileOperations);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceClientCapabilities other = (WorkspaceClientCapabilities) obj;
+ if (this.applyEdit == null) {
+ if (other.applyEdit != null)
+ return false;
+ } else if (!this.applyEdit.equals(other.applyEdit))
+ return false;
+ if (this.workspaceEdit == null) {
+ if (other.workspaceEdit != null)
+ return false;
+ } else if (!this.workspaceEdit.equals(other.workspaceEdit))
+ return false;
+ if (this.didChangeConfiguration == null) {
+ if (other.didChangeConfiguration != null)
+ return false;
+ } else if (!this.didChangeConfiguration.equals(other.didChangeConfiguration))
+ return false;
+ if (this.didChangeWatchedFiles == null) {
+ if (other.didChangeWatchedFiles != null)
+ return false;
+ } else if (!this.didChangeWatchedFiles.equals(other.didChangeWatchedFiles))
+ return false;
+ if (this.symbol == null) {
+ if (other.symbol != null)
+ return false;
+ } else if (!this.symbol.equals(other.symbol))
+ return false;
+ if (this.executeCommand == null) {
+ if (other.executeCommand != null)
+ return false;
+ } else if (!this.executeCommand.equals(other.executeCommand))
+ return false;
+ if (this.workspaceFolders == null) {
+ if (other.workspaceFolders != null)
+ return false;
+ } else if (!this.workspaceFolders.equals(other.workspaceFolders))
+ return false;
+ if (this.configuration == null) {
+ if (other.configuration != null)
+ return false;
+ } else if (!this.configuration.equals(other.configuration))
+ return false;
+ if (this.semanticTokens == null) {
+ if (other.semanticTokens != null)
+ return false;
+ } else if (!this.semanticTokens.equals(other.semanticTokens))
+ return false;
+ if (this.codeLens == null) {
+ if (other.codeLens != null)
+ return false;
+ } else if (!this.codeLens.equals(other.codeLens))
+ return false;
+ if (this.fileOperations == null) {
+ if (other.fileOperations != null)
+ return false;
+ } else if (!this.fileOperations.equals(other.fileOperations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.applyEdit== null) ? 0 : this.applyEdit.hashCode());
+ result = prime * result + ((this.workspaceEdit== null) ? 0 : this.workspaceEdit.hashCode());
+ result = prime * result + ((this.didChangeConfiguration== null) ? 0 : this.didChangeConfiguration.hashCode());
+ result = prime * result + ((this.didChangeWatchedFiles== null) ? 0 : this.didChangeWatchedFiles.hashCode());
+ result = prime * result + ((this.symbol== null) ? 0 : this.symbol.hashCode());
+ result = prime * result + ((this.executeCommand== null) ? 0 : this.executeCommand.hashCode());
+ result = prime * result + ((this.workspaceFolders== null) ? 0 : this.workspaceFolders.hashCode());
+ result = prime * result + ((this.configuration== null) ? 0 : this.configuration.hashCode());
+ result = prime * result + ((this.semanticTokens== null) ? 0 : this.semanticTokens.hashCode());
+ result = prime * result + ((this.codeLens== null) ? 0 : this.codeLens.hashCode());
+ return prime * result + ((this.fileOperations== null) ? 0 : this.fileOperations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceEdit.java b/java/org/eclipse/lsp4j/WorkspaceEdit.java
new file mode 100644
index 0000000..39984e6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceEdit.java
@@ -0,0 +1,263 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import com.google.gson.annotations.JsonAdapter;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.lsp4j.ChangeAnnotation;
+import org.eclipse.lsp4j.ResourceChange;
+import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.TextDocumentEdit;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.adapters.DocumentChangeListAdapter;
+import org.eclipse.lsp4j.adapters.ResourceChangeListAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A workspace edit represents changes to many resources managed in the workspace.
+ * The edit should either provide {@link #changes} or {@link #documentChanges}.
+ * If documentChanges are present they are preferred over changes
+ * if the client can handle versioned document edits.
+ */
+@SuppressWarnings("all")
+public class WorkspaceEdit {
+ /**
+ * Holds changes to existing resources.
+ */
+ private Map<String, List<TextEdit>> changes;
+
+ /**
+ * Depending on the client capability
+ * {@link WorkspaceEditCapabilities#resourceOperations} document changes are either
+ * an array of {@link TextDocumentEdit}s to express changes to n different text
+ * documents where each text document edit addresses a specific version of
+ * a text document. Or it can contain above {@link TextDocumentEdit}s mixed with
+ * create, rename and delete file / folder operations.
+ * <p>
+ * Whether a client supports versioned document edits is expressed via
+ * {@link WorkspaceEditCapabilities#documentChanges} client capability.
+ * <p>
+ * If a client neither supports {@link WorkspaceEditCapabilities#documentChanges} nor
+ * {@link WorkspaceEditCapabilities#resourceOperations} then only plain {@link TextEdit}s
+ * using the {@link #changes} property are supported.
+ */
+ @JsonAdapter(DocumentChangeListAdapter.class)
+ private List<Either<TextDocumentEdit, ResourceOperation>> documentChanges;
+
+ /**
+ * If resource changes are supported the `WorkspaceEdit`
+ * uses the property `resourceChanges` which are either a
+ * rename, move, delete or content change.
+ * <p>
+ * These changes are applied in the order that they are supplied,
+ * however clients may group the changes for optimization
+ *
+ * @deprecated Since LSP introduces resource operations, use the {@link #documentChanges} instead
+ */
+ @Beta
+ @JsonAdapter(ResourceChangeListAdapter.class)
+ @Deprecated
+ private List<Either<ResourceChange, TextDocumentEdit>> resourceChanges;
+
+ /**
+ * A map of change annotations that can be referenced in
+ * {@link AnnotatedTextEdit}s or {@link ResourceOperation}s.
+ * <p>
+ * Client support depends on {@link WorkspaceEditCapabilities#changeAnnotationSupport}.
+ * <p>
+ * Since 3.16.0
+ */
+ private Map<String, ChangeAnnotation> changeAnnotations;
+
+ public WorkspaceEdit() {
+ LinkedHashMap<String, List<TextEdit>> _linkedHashMap = new LinkedHashMap<String, List<TextEdit>>();
+ this.changes = _linkedHashMap;
+ }
+
+ public WorkspaceEdit(final Map<String, List<TextEdit>> changes) {
+ this.changes = changes;
+ }
+
+ public WorkspaceEdit(final List<Either<TextDocumentEdit, ResourceOperation>> documentChanges) {
+ this.documentChanges = documentChanges;
+ }
+
+ /**
+ * Holds changes to existing resources.
+ */
+ @Pure
+ public Map<String, List<TextEdit>> getChanges() {
+ return this.changes;
+ }
+
+ /**
+ * Holds changes to existing resources.
+ */
+ public void setChanges(final Map<String, List<TextEdit>> changes) {
+ this.changes = changes;
+ }
+
+ /**
+ * Depending on the client capability
+ * {@link WorkspaceEditCapabilities#resourceOperations} document changes are either
+ * an array of {@link TextDocumentEdit}s to express changes to n different text
+ * documents where each text document edit addresses a specific version of
+ * a text document. Or it can contain above {@link TextDocumentEdit}s mixed with
+ * create, rename and delete file / folder operations.
+ * <p>
+ * Whether a client supports versioned document edits is expressed via
+ * {@link WorkspaceEditCapabilities#documentChanges} client capability.
+ * <p>
+ * If a client neither supports {@link WorkspaceEditCapabilities#documentChanges} nor
+ * {@link WorkspaceEditCapabilities#resourceOperations} then only plain {@link TextEdit}s
+ * using the {@link #changes} property are supported.
+ */
+ @Pure
+ public List<Either<TextDocumentEdit, ResourceOperation>> getDocumentChanges() {
+ return this.documentChanges;
+ }
+
+ /**
+ * Depending on the client capability
+ * {@link WorkspaceEditCapabilities#resourceOperations} document changes are either
+ * an array of {@link TextDocumentEdit}s to express changes to n different text
+ * documents where each text document edit addresses a specific version of
+ * a text document. Or it can contain above {@link TextDocumentEdit}s mixed with
+ * create, rename and delete file / folder operations.
+ * <p>
+ * Whether a client supports versioned document edits is expressed via
+ * {@link WorkspaceEditCapabilities#documentChanges} client capability.
+ * <p>
+ * If a client neither supports {@link WorkspaceEditCapabilities#documentChanges} nor
+ * {@link WorkspaceEditCapabilities#resourceOperations} then only plain {@link TextEdit}s
+ * using the {@link #changes} property are supported.
+ */
+ public void setDocumentChanges(final List<Either<TextDocumentEdit, ResourceOperation>> documentChanges) {
+ this.documentChanges = documentChanges;
+ }
+
+ /**
+ * If resource changes are supported the `WorkspaceEdit`
+ * uses the property `resourceChanges` which are either a
+ * rename, move, delete or content change.
+ * <p>
+ * These changes are applied in the order that they are supplied,
+ * however clients may group the changes for optimization
+ *
+ * @deprecated Since LSP introduces resource operations, use the {@link #documentChanges} instead
+ */
+ @Pure
+ @Deprecated
+ public List<Either<ResourceChange, TextDocumentEdit>> getResourceChanges() {
+ return this.resourceChanges;
+ }
+
+ /**
+ * If resource changes are supported the `WorkspaceEdit`
+ * uses the property `resourceChanges` which are either a
+ * rename, move, delete or content change.
+ * <p>
+ * These changes are applied in the order that they are supplied,
+ * however clients may group the changes for optimization
+ *
+ * @deprecated Since LSP introduces resource operations, use the {@link #documentChanges} instead
+ */
+ @Deprecated
+ public void setResourceChanges(final List<Either<ResourceChange, TextDocumentEdit>> resourceChanges) {
+ this.resourceChanges = resourceChanges;
+ }
+
+ /**
+ * A map of change annotations that can be referenced in
+ * {@link AnnotatedTextEdit}s or {@link ResourceOperation}s.
+ * <p>
+ * Client support depends on {@link WorkspaceEditCapabilities#changeAnnotationSupport}.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Map<String, ChangeAnnotation> getChangeAnnotations() {
+ return this.changeAnnotations;
+ }
+
+ /**
+ * A map of change annotations that can be referenced in
+ * {@link AnnotatedTextEdit}s or {@link ResourceOperation}s.
+ * <p>
+ * Client support depends on {@link WorkspaceEditCapabilities#changeAnnotationSupport}.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setChangeAnnotations(final Map<String, ChangeAnnotation> changeAnnotations) {
+ this.changeAnnotations = changeAnnotations;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("changes", this.changes);
+ b.add("documentChanges", this.documentChanges);
+ b.add("resourceChanges", this.resourceChanges);
+ b.add("changeAnnotations", this.changeAnnotations);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceEdit other = (WorkspaceEdit) obj;
+ if (this.changes == null) {
+ if (other.changes != null)
+ return false;
+ } else if (!this.changes.equals(other.changes))
+ return false;
+ if (this.documentChanges == null) {
+ if (other.documentChanges != null)
+ return false;
+ } else if (!this.documentChanges.equals(other.documentChanges))
+ return false;
+ if (this.resourceChanges == null) {
+ if (other.resourceChanges != null)
+ return false;
+ } else if (!this.resourceChanges.equals(other.resourceChanges))
+ return false;
+ if (this.changeAnnotations == null) {
+ if (other.changeAnnotations != null)
+ return false;
+ } else if (!this.changeAnnotations.equals(other.changeAnnotations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.changes== null) ? 0 : this.changes.hashCode());
+ result = prime * result + ((this.documentChanges== null) ? 0 : this.documentChanges.hashCode());
+ result = prime * result + ((this.resourceChanges== null) ? 0 : this.resourceChanges.hashCode());
+ return prime * result + ((this.changeAnnotations== null) ? 0 : this.changeAnnotations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceEditCapabilities.java b/java/org/eclipse/lsp4j/WorkspaceEditCapabilities.java
new file mode 100644
index 0000000..935b1e2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceEditCapabilities.java
@@ -0,0 +1,291 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import com.google.common.annotations.Beta;
+import java.util.List;
+import org.eclipse.lsp4j.WorkspaceEditChangeAnnotationSupportCapabilities;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Capabilities specific to {@link WorkspaceEdit}s
+ */
+@SuppressWarnings("all")
+public class WorkspaceEditCapabilities {
+ /**
+ * The client supports versioned document changes in {@link WorkspaceEdit}s
+ */
+ private Boolean documentChanges;
+
+ /**
+ * The client supports resource changes
+ * in {@link WorkspaceEdit}s.
+ *
+ * @deprecated Since LSP introduced resource operations, use {@link #resourceOperations}
+ */
+ @Deprecated
+ @Beta
+ private Boolean resourceChanges;
+
+ /**
+ * The resource operations the client supports. Clients should at least
+ * support 'create', 'rename' and 'delete' files and folders.
+ * <p>
+ * See {@link ResourceOperationKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ private List<String> resourceOperations;
+
+ /**
+ * The failure handling strategy of a client if applying the workspace edit
+ * fails.
+ * <p>
+ * See {@link FailureHandlingKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ private String failureHandling;
+
+ /**
+ * Whether the client normalizes line endings to the client specific
+ * setting.
+ * <p>
+ * If set to {@code true} the client will normalize line ending characters
+ * in a workspace edit to the client specific new line character(s).
+ * <p>
+ * Since 3.16.0
+ */
+ private Boolean normalizesLineEndings;
+
+ /**
+ * Whether the client in general supports change annotations on text edits,
+ * create file, rename file and delete file changes.
+ * <p>
+ * Since 3.16.0
+ */
+ private WorkspaceEditChangeAnnotationSupportCapabilities changeAnnotationSupport;
+
+ public WorkspaceEditCapabilities() {
+ }
+
+ @Deprecated
+ public WorkspaceEditCapabilities(final Boolean documentChanges) {
+ this.documentChanges = documentChanges;
+ }
+
+ /**
+ * The client supports versioned document changes in {@link WorkspaceEdit}s
+ */
+ @Pure
+ public Boolean getDocumentChanges() {
+ return this.documentChanges;
+ }
+
+ /**
+ * The client supports versioned document changes in {@link WorkspaceEdit}s
+ */
+ public void setDocumentChanges(final Boolean documentChanges) {
+ this.documentChanges = documentChanges;
+ }
+
+ /**
+ * The client supports resource changes
+ * in {@link WorkspaceEdit}s.
+ *
+ * @deprecated Since LSP introduced resource operations, use {@link #resourceOperations}
+ */
+ @Pure
+ @Deprecated
+ public Boolean getResourceChanges() {
+ return this.resourceChanges;
+ }
+
+ /**
+ * The client supports resource changes
+ * in {@link WorkspaceEdit}s.
+ *
+ * @deprecated Since LSP introduced resource operations, use {@link #resourceOperations}
+ */
+ @Deprecated
+ public void setResourceChanges(final Boolean resourceChanges) {
+ this.resourceChanges = resourceChanges;
+ }
+
+ /**
+ * The resource operations the client supports. Clients should at least
+ * support 'create', 'rename' and 'delete' files and folders.
+ * <p>
+ * See {@link ResourceOperationKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ @Pure
+ public List<String> getResourceOperations() {
+ return this.resourceOperations;
+ }
+
+ /**
+ * The resource operations the client supports. Clients should at least
+ * support 'create', 'rename' and 'delete' files and folders.
+ * <p>
+ * See {@link ResourceOperationKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ public void setResourceOperations(final List<String> resourceOperations) {
+ this.resourceOperations = resourceOperations;
+ }
+
+ /**
+ * The failure handling strategy of a client if applying the workspace edit
+ * fails.
+ * <p>
+ * See {@link FailureHandlingKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ @Pure
+ public String getFailureHandling() {
+ return this.failureHandling;
+ }
+
+ /**
+ * The failure handling strategy of a client if applying the workspace edit
+ * fails.
+ * <p>
+ * See {@link FailureHandlingKind} for allowed values.
+ * <p>
+ * Since 3.13.0
+ */
+ public void setFailureHandling(final String failureHandling) {
+ this.failureHandling = failureHandling;
+ }
+
+ /**
+ * Whether the client normalizes line endings to the client specific
+ * setting.
+ * <p>
+ * If set to {@code true} the client will normalize line ending characters
+ * in a workspace edit to the client specific new line character(s).
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public Boolean getNormalizesLineEndings() {
+ return this.normalizesLineEndings;
+ }
+
+ /**
+ * Whether the client normalizes line endings to the client specific
+ * setting.
+ * <p>
+ * If set to {@code true} the client will normalize line ending characters
+ * in a workspace edit to the client specific new line character(s).
+ * <p>
+ * Since 3.16.0
+ */
+ public void setNormalizesLineEndings(final Boolean normalizesLineEndings) {
+ this.normalizesLineEndings = normalizesLineEndings;
+ }
+
+ /**
+ * Whether the client in general supports change annotations on text edits,
+ * create file, rename file and delete file changes.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public WorkspaceEditChangeAnnotationSupportCapabilities getChangeAnnotationSupport() {
+ return this.changeAnnotationSupport;
+ }
+
+ /**
+ * Whether the client in general supports change annotations on text edits,
+ * create file, rename file and delete file changes.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setChangeAnnotationSupport(final WorkspaceEditChangeAnnotationSupportCapabilities changeAnnotationSupport) {
+ this.changeAnnotationSupport = changeAnnotationSupport;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("documentChanges", this.documentChanges);
+ b.add("resourceChanges", this.resourceChanges);
+ b.add("resourceOperations", this.resourceOperations);
+ b.add("failureHandling", this.failureHandling);
+ b.add("normalizesLineEndings", this.normalizesLineEndings);
+ b.add("changeAnnotationSupport", this.changeAnnotationSupport);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceEditCapabilities other = (WorkspaceEditCapabilities) obj;
+ if (this.documentChanges == null) {
+ if (other.documentChanges != null)
+ return false;
+ } else if (!this.documentChanges.equals(other.documentChanges))
+ return false;
+ if (this.resourceChanges == null) {
+ if (other.resourceChanges != null)
+ return false;
+ } else if (!this.resourceChanges.equals(other.resourceChanges))
+ return false;
+ if (this.resourceOperations == null) {
+ if (other.resourceOperations != null)
+ return false;
+ } else if (!this.resourceOperations.equals(other.resourceOperations))
+ return false;
+ if (this.failureHandling == null) {
+ if (other.failureHandling != null)
+ return false;
+ } else if (!this.failureHandling.equals(other.failureHandling))
+ return false;
+ if (this.normalizesLineEndings == null) {
+ if (other.normalizesLineEndings != null)
+ return false;
+ } else if (!this.normalizesLineEndings.equals(other.normalizesLineEndings))
+ return false;
+ if (this.changeAnnotationSupport == null) {
+ if (other.changeAnnotationSupport != null)
+ return false;
+ } else if (!this.changeAnnotationSupport.equals(other.changeAnnotationSupport))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.documentChanges== null) ? 0 : this.documentChanges.hashCode());
+ result = prime * result + ((this.resourceChanges== null) ? 0 : this.resourceChanges.hashCode());
+ result = prime * result + ((this.resourceOperations== null) ? 0 : this.resourceOperations.hashCode());
+ result = prime * result + ((this.failureHandling== null) ? 0 : this.failureHandling.hashCode());
+ result = prime * result + ((this.normalizesLineEndings== null) ? 0 : this.normalizesLineEndings.hashCode());
+ return prime * result + ((this.changeAnnotationSupport== null) ? 0 : this.changeAnnotationSupport.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceEditChangeAnnotationSupportCapabilities.java b/java/org/eclipse/lsp4j/WorkspaceEditChangeAnnotationSupportCapabilities.java
new file mode 100644
index 0000000..4e58fcd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceEditChangeAnnotationSupportCapabilities.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Whether the client in general supports change annotations on text edits,
+ * create file, rename file and delete file changes.
+ * <p>
+ * Since 3.16.0
+ */
+@SuppressWarnings("all")
+public class WorkspaceEditChangeAnnotationSupportCapabilities {
+ /**
+ * Whether the client groups edits with equal labels into tree nodes,
+ * for instance all edits labelled with "Changes in Strings" would
+ * be a tree node.
+ */
+ private Boolean groupsOnLabel;
+
+ public WorkspaceEditChangeAnnotationSupportCapabilities() {
+ }
+
+ public WorkspaceEditChangeAnnotationSupportCapabilities(final Boolean groupsOnLabel) {
+ this.groupsOnLabel = groupsOnLabel;
+ }
+
+ /**
+ * Whether the client groups edits with equal labels into tree nodes,
+ * for instance all edits labelled with "Changes in Strings" would
+ * be a tree node.
+ */
+ @Pure
+ public Boolean getGroupsOnLabel() {
+ return this.groupsOnLabel;
+ }
+
+ /**
+ * Whether the client groups edits with equal labels into tree nodes,
+ * for instance all edits labelled with "Changes in Strings" would
+ * be a tree node.
+ */
+ public void setGroupsOnLabel(final Boolean groupsOnLabel) {
+ this.groupsOnLabel = groupsOnLabel;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("groupsOnLabel", this.groupsOnLabel);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceEditChangeAnnotationSupportCapabilities other = (WorkspaceEditChangeAnnotationSupportCapabilities) obj;
+ if (this.groupsOnLabel == null) {
+ if (other.groupsOnLabel != null)
+ return false;
+ } else if (!this.groupsOnLabel.equals(other.groupsOnLabel))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.groupsOnLabel== null) ? 0 : this.groupsOnLabel.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceFolder.java b/java/org/eclipse/lsp4j/WorkspaceFolder.java
new file mode 100644
index 0000000..032cb91
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceFolder.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The workspace/workspaceFolders request is sent from the server to the client to fetch
+ * the current open list of workspace folders. Returns null in the response if only a single
+ * file is open in the tool. Returns an empty array if a workspace is open but no folders
+ * are configured.
+ */
+@SuppressWarnings("all")
+public class WorkspaceFolder {
+ /**
+ * The associated URI for this workspace folder.
+ */
+ @NonNull
+ private String uri;
+
+ /**
+ * The name of the workspace folder. Defaults to the uri's basename.
+ */
+ private String name;
+
+ public WorkspaceFolder() {
+ }
+
+ public WorkspaceFolder(@NonNull final String uri) {
+ this.uri = Preconditions.<String>checkNotNull(uri, "uri");
+ }
+
+ public WorkspaceFolder(@NonNull final String uri, final String name) {
+ this(uri);
+ this.name = name;
+ }
+
+ /**
+ * The associated URI for this workspace folder.
+ */
+ @Pure
+ @NonNull
+ public String getUri() {
+ return this.uri;
+ }
+
+ /**
+ * The associated URI for this workspace folder.
+ */
+ public void setUri(@NonNull final String uri) {
+ this.uri = Preconditions.checkNotNull(uri, "uri");
+ }
+
+ /**
+ * The name of the workspace folder. Defaults to the uri's basename.
+ */
+ @Pure
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the workspace folder. Defaults to the uri's basename.
+ */
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("uri", this.uri);
+ b.add("name", this.name);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceFolder other = (WorkspaceFolder) obj;
+ if (this.uri == null) {
+ if (other.uri != null)
+ return false;
+ } else if (!this.uri.equals(other.uri))
+ return false;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.uri== null) ? 0 : this.uri.hashCode());
+ return prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceFoldersChangeEvent.java b/java/org/eclipse/lsp4j/WorkspaceFoldersChangeEvent.java
new file mode 100644
index 0000000..e74b52a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceFoldersChangeEvent.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.lsp4j.WorkspaceFolder;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The workspace folder change event.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class WorkspaceFoldersChangeEvent {
+ /**
+ * The array of added workspace folders
+ */
+ @NonNull
+ private List<WorkspaceFolder> added = new ArrayList<WorkspaceFolder>();
+
+ /**
+ * The array of the removed workspace folders
+ */
+ @NonNull
+ private List<WorkspaceFolder> removed = new ArrayList<WorkspaceFolder>();
+
+ public WorkspaceFoldersChangeEvent() {
+ }
+
+ public WorkspaceFoldersChangeEvent(@NonNull final List<WorkspaceFolder> added, @NonNull final List<WorkspaceFolder> removed) {
+ this.added = Preconditions.<List<WorkspaceFolder>>checkNotNull(added, "added");
+ this.removed = Preconditions.<List<WorkspaceFolder>>checkNotNull(removed, "removed");
+ }
+
+ /**
+ * The array of added workspace folders
+ */
+ @Pure
+ @NonNull
+ public List<WorkspaceFolder> getAdded() {
+ return this.added;
+ }
+
+ /**
+ * The array of added workspace folders
+ */
+ public void setAdded(@NonNull final List<WorkspaceFolder> added) {
+ this.added = Preconditions.checkNotNull(added, "added");
+ }
+
+ /**
+ * The array of the removed workspace folders
+ */
+ @Pure
+ @NonNull
+ public List<WorkspaceFolder> getRemoved() {
+ return this.removed;
+ }
+
+ /**
+ * The array of the removed workspace folders
+ */
+ public void setRemoved(@NonNull final List<WorkspaceFolder> removed) {
+ this.removed = Preconditions.checkNotNull(removed, "removed");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("added", this.added);
+ b.add("removed", this.removed);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceFoldersChangeEvent other = (WorkspaceFoldersChangeEvent) obj;
+ if (this.added == null) {
+ if (other.added != null)
+ return false;
+ } else if (!this.added.equals(other.added))
+ return false;
+ if (this.removed == null) {
+ if (other.removed != null)
+ return false;
+ } else if (!this.removed.equals(other.removed))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.added== null) ? 0 : this.added.hashCode());
+ return prime * result + ((this.removed== null) ? 0 : this.removed.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceFoldersOptions.java b/java/org/eclipse/lsp4j/WorkspaceFoldersOptions.java
new file mode 100644
index 0000000..6adc38b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceFoldersOptions.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The server supports workspace folder.
+ * <p>
+ * Since 3.6.0
+ */
+@SuppressWarnings("all")
+public class WorkspaceFoldersOptions {
+ /**
+ * The server has support for workspace folders
+ */
+ private Boolean supported;
+
+ /**
+ * Whether the server wants to receive workspace folder
+ * change notifications.
+ * <p>
+ * If a string is provided, the string is treated as an ID
+ * under which the notification is registered on the client
+ * side. The ID can be used to unregister for these events
+ * using the `client/unregisterCapability` request.
+ */
+ private Either<String, Boolean> changeNotifications;
+
+ /**
+ * The server has support for workspace folders
+ */
+ @Pure
+ public Boolean getSupported() {
+ return this.supported;
+ }
+
+ /**
+ * The server has support for workspace folders
+ */
+ public void setSupported(final Boolean supported) {
+ this.supported = supported;
+ }
+
+ /**
+ * Whether the server wants to receive workspace folder
+ * change notifications.
+ * <p>
+ * If a string is provided, the string is treated as an ID
+ * under which the notification is registered on the client
+ * side. The ID can be used to unregister for these events
+ * using the `client/unregisterCapability` request.
+ */
+ @Pure
+ public Either<String, Boolean> getChangeNotifications() {
+ return this.changeNotifications;
+ }
+
+ /**
+ * Whether the server wants to receive workspace folder
+ * change notifications.
+ * <p>
+ * If a string is provided, the string is treated as an ID
+ * under which the notification is registered on the client
+ * side. The ID can be used to unregister for these events
+ * using the `client/unregisterCapability` request.
+ */
+ public void setChangeNotifications(final Either<String, Boolean> changeNotifications) {
+ this.changeNotifications = changeNotifications;
+ }
+
+ public void setChangeNotifications(final String changeNotifications) {
+ if (changeNotifications == null) {
+ this.changeNotifications = null;
+ return;
+ }
+ this.changeNotifications = Either.forLeft(changeNotifications);
+ }
+
+ public void setChangeNotifications(final Boolean changeNotifications) {
+ if (changeNotifications == null) {
+ this.changeNotifications = null;
+ return;
+ }
+ this.changeNotifications = Either.forRight(changeNotifications);
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("supported", this.supported);
+ b.add("changeNotifications", this.changeNotifications);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceFoldersOptions other = (WorkspaceFoldersOptions) obj;
+ if (this.supported == null) {
+ if (other.supported != null)
+ return false;
+ } else if (!this.supported.equals(other.supported))
+ return false;
+ if (this.changeNotifications == null) {
+ if (other.changeNotifications != null)
+ return false;
+ } else if (!this.changeNotifications.equals(other.changeNotifications))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.supported== null) ? 0 : this.supported.hashCode());
+ return prime * result + ((this.changeNotifications== null) ? 0 : this.changeNotifications.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceServerCapabilities.java b/java/org/eclipse/lsp4j/WorkspaceServerCapabilities.java
new file mode 100644
index 0000000..4ea0974
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceServerCapabilities.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.FileOperationsServerCapabilities;
+import org.eclipse.lsp4j.WorkspaceFoldersOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Workspace specific server capabilities
+ */
+@SuppressWarnings("all")
+public class WorkspaceServerCapabilities {
+ /**
+ * The server supports workspace folder.
+ * <p>
+ * Since 3.6.0
+ */
+ private WorkspaceFoldersOptions workspaceFolders;
+
+ /**
+ * The server is interested in file notifications/requests.
+ * <p>
+ * Since 3.16.0
+ */
+ private FileOperationsServerCapabilities fileOperations;
+
+ public WorkspaceServerCapabilities() {
+ }
+
+ public WorkspaceServerCapabilities(final WorkspaceFoldersOptions workspaceFolders) {
+ this.workspaceFolders = workspaceFolders;
+ }
+
+ /**
+ * The server supports workspace folder.
+ * <p>
+ * Since 3.6.0
+ */
+ @Pure
+ public WorkspaceFoldersOptions getWorkspaceFolders() {
+ return this.workspaceFolders;
+ }
+
+ /**
+ * The server supports workspace folder.
+ * <p>
+ * Since 3.6.0
+ */
+ public void setWorkspaceFolders(final WorkspaceFoldersOptions workspaceFolders) {
+ this.workspaceFolders = workspaceFolders;
+ }
+
+ /**
+ * The server is interested in file notifications/requests.
+ * <p>
+ * Since 3.16.0
+ */
+ @Pure
+ public FileOperationsServerCapabilities getFileOperations() {
+ return this.fileOperations;
+ }
+
+ /**
+ * The server is interested in file notifications/requests.
+ * <p>
+ * Since 3.16.0
+ */
+ public void setFileOperations(final FileOperationsServerCapabilities fileOperations) {
+ this.fileOperations = fileOperations;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workspaceFolders", this.workspaceFolders);
+ b.add("fileOperations", this.fileOperations);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ WorkspaceServerCapabilities other = (WorkspaceServerCapabilities) obj;
+ if (this.workspaceFolders == null) {
+ if (other.workspaceFolders != null)
+ return false;
+ } else if (!this.workspaceFolders.equals(other.workspaceFolders))
+ return false;
+ if (this.fileOperations == null) {
+ if (other.fileOperations != null)
+ return false;
+ } else if (!this.fileOperations.equals(other.fileOperations))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.workspaceFolders== null) ? 0 : this.workspaceFolders.hashCode());
+ return prime * result + ((this.fileOperations== null) ? 0 : this.fileOperations.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceSymbolOptions.java b/java/org/eclipse/lsp4j/WorkspaceSymbolOptions.java
new file mode 100644
index 0000000..4b67f7c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceSymbolOptions.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.AbstractWorkDoneProgressOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The options of a Workspace Symbol Request.
+ */
+@SuppressWarnings("all")
+public class WorkspaceSymbolOptions extends AbstractWorkDoneProgressOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceSymbolParams.java b/java/org/eclipse/lsp4j/WorkspaceSymbolParams.java
new file mode 100644
index 0000000..71174f2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceSymbolParams.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkDoneProgressAndPartialResultParams;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.util.Preconditions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The parameters of a Workspace Symbol Request.
+ */
+@SuppressWarnings("all")
+public class WorkspaceSymbolParams extends WorkDoneProgressAndPartialResultParams {
+ /**
+ * A query string to filter symbols by. Clients may send an empty
+ * string here to request all symbols.
+ */
+ @NonNull
+ private String query;
+
+ public WorkspaceSymbolParams() {
+ }
+
+ public WorkspaceSymbolParams(@NonNull final String query) {
+ this.query = Preconditions.<String>checkNotNull(query, "query");
+ }
+
+ /**
+ * A query string to filter symbols by. Clients may send an empty
+ * string here to request all symbols.
+ */
+ @Pure
+ @NonNull
+ public String getQuery() {
+ return this.query;
+ }
+
+ /**
+ * A query string to filter symbols by. Clients may send an empty
+ * string here to request all symbols.
+ */
+ public void setQuery(@NonNull final String query) {
+ this.query = Preconditions.checkNotNull(query, "query");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("query", this.query);
+ b.add("workDoneToken", getWorkDoneToken());
+ b.add("partialResultToken", getPartialResultToken());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ WorkspaceSymbolParams other = (WorkspaceSymbolParams) obj;
+ if (this.query == null) {
+ if (other.query != null)
+ return false;
+ } else if (!this.query.equals(other.query))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * super.hashCode() + ((this.query== null) ? 0 : this.query.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/WorkspaceSymbolRegistrationOptions.java b/java/org/eclipse/lsp4j/WorkspaceSymbolRegistrationOptions.java
new file mode 100644
index 0000000..3c0a570
--- /dev/null
+++ b/java/org/eclipse/lsp4j/WorkspaceSymbolRegistrationOptions.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j;
+
+import org.eclipse.lsp4j.WorkspaceSymbolOptions;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The options of a Workspace Symbol Registration Request.
+ */
+@SuppressWarnings("all")
+public class WorkspaceSymbolRegistrationOptions extends WorkspaceSymbolOptions {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("workDoneProgress", getWorkDoneProgress());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return super.hashCode();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/CodeActionResponseAdapter.java b/java/org/eclipse/lsp4j/adapters/CodeActionResponseAdapter.java
new file mode 100644
index 0000000..aec2452
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/CodeActionResponseAdapter.java
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.util.ArrayList;
+import java.util.function.Predicate;
+
+import org.eclipse.lsp4j.CodeAction;
+import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class CodeActionResponseAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<Command, CodeAction>> ELEMENT_TYPE
+ = new TypeToken<Either<Command, CodeAction>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Predicate<JsonElement> leftChecker = new PropertyChecker("command", JsonPrimitive.class);
+ Predicate<JsonElement> rightChecker = new PropertyChecker("title");
+ TypeAdapter<Either<Command, CodeAction>> elementTypeAdapter = new EitherTypeAdapter<>(gson,
+ ELEMENT_TYPE, leftChecker, rightChecker);
+ return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/adapters/CompletionItemTextEditTypeAdapter.java b/java/org/eclipse/lsp4j/adapters/CompletionItemTextEditTypeAdapter.java
new file mode 100644
index 0000000..68cc1c5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/CompletionItemTextEditTypeAdapter.java
@@ -0,0 +1,37 @@
+/******************************************************************************
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j.adapters;
+
+import org.eclipse.lsp4j.InsertReplaceEdit;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class CompletionItemTextEditTypeAdapter implements TypeAdapterFactory {
+ private static final TypeToken<Either<TextEdit, InsertReplaceEdit>> ELEMENT_TYPE
+ = new TypeToken<Either<TextEdit, InsertReplaceEdit>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ PropertyChecker leftChecker = new PropertyChecker("range");
+ PropertyChecker rightChecker = new PropertyChecker("insert");
+ return (TypeAdapter<T>) new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/DocumentChangeListAdapter.java b/java/org/eclipse/lsp4j/adapters/DocumentChangeListAdapter.java
new file mode 100644
index 0000000..68d9474
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/DocumentChangeListAdapter.java
@@ -0,0 +1,45 @@
+/******************************************************************************
+ * Copyright (c) 2018 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j.adapters;
+
+import java.util.ArrayList;
+import java.util.function.Predicate;
+
+import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.TextDocumentEdit;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class DocumentChangeListAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<TextDocumentEdit, ResourceOperation>> ELEMENT_TYPE
+ = new TypeToken<Either<TextDocumentEdit, ResourceOperation>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Predicate<JsonElement> leftChecker = new PropertyChecker("textDocument").and(new PropertyChecker("edits"));
+ Predicate<JsonElement> rightChecker = new PropertyChecker("kind");
+ TypeAdapter<Either<TextDocumentEdit, ResourceOperation>> elementTypeAdapter = new EitherTypeAdapter<>(gson,
+ ELEMENT_TYPE, leftChecker, rightChecker);
+ return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/DocumentSymbolResponseAdapter.java b/java/org/eclipse/lsp4j/adapters/DocumentSymbolResponseAdapter.java
new file mode 100644
index 0000000..0a4d7ba
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/DocumentSymbolResponseAdapter.java
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.util.ArrayList;
+
+import org.eclipse.lsp4j.DocumentSymbol;
+import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class DocumentSymbolResponseAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<SymbolInformation, DocumentSymbol>> ELEMENT_TYPE
+ = new TypeToken<Either<SymbolInformation, DocumentSymbol>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ PropertyChecker leftChecker = new PropertyChecker("location");
+ PropertyChecker rightChecker = new PropertyChecker("range");
+ TypeAdapter<Either<SymbolInformation, DocumentSymbol>> elementTypeAdapter = new EitherTypeAdapter<>(gson,
+ ELEMENT_TYPE, leftChecker, rightChecker);
+ return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/adapters/HoverTypeAdapter.java b/java/org/eclipse/lsp4j/adapters/HoverTypeAdapter.java
new file mode 100644
index 0000000..8665f20
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/HoverTypeAdapter.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.adapters;
+
+import com.google.common.base.Objects;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.lsp4j.Hover;
+import org.eclipse.lsp4j.MarkedString;
+import org.eclipse.lsp4j.MarkupContent;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.generator.TypeAdapterImpl;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+/**
+ * A type adapter for the Hover protocol type.
+ */
+@TypeAdapterImpl(Hover.class)
+@SuppressWarnings("all")
+public class HoverTypeAdapter extends TypeAdapter<Hover> {
+ public static class Factory implements TypeAdapterFactory {
+ public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
+ if (!Hover.class.isAssignableFrom(typeToken.getRawType())) {
+ return null;
+ }
+ return (TypeAdapter<T>) new HoverTypeAdapter(gson);
+ }
+ }
+
+ private static final TypeToken<List<Either<String, MarkedString>>> LIST_STRING_MARKEDSTRING = new TypeToken<List<Either<String, MarkedString>>>() {
+ };
+
+ private static final TypeToken<Either<String, MarkedString>> STRING_MARKEDSTRING = new TypeToken<Either<String, MarkedString>>() {
+ };
+
+ protected Either<List<Either<String, MarkedString>>, MarkupContent> readContents(final JsonReader in) throws IOException {
+ final JsonToken nextToken = in.peek();
+ boolean _equals = Objects.equal(nextToken, JsonToken.STRING);
+ if (_equals) {
+ final List<Either<String, MarkedString>> value = CollectionLiterals.<Either<String, MarkedString>>newArrayList(Either.<String, MarkedString>forLeft(in.nextString()));
+ return Either.<List<Either<String, MarkedString>>, MarkupContent>forLeft(value);
+ } else {
+ boolean _equals_1 = Objects.equal(nextToken, JsonToken.BEGIN_ARRAY);
+ if (_equals_1) {
+ final List<Either<String, MarkedString>> value_1 = this.gson.<List<Either<String, MarkedString>>>fromJson(in, HoverTypeAdapter.LIST_STRING_MARKEDSTRING.getType());
+ return Either.<List<Either<String, MarkedString>>, MarkupContent>forLeft(value_1);
+ } else {
+ JsonElement _parseReader = JsonParser.parseReader(in);
+ final JsonObject object = ((JsonObject) _parseReader);
+ boolean _has = object.has("language");
+ if (_has) {
+ final List<Either<String, MarkedString>> value_2 = CollectionLiterals.<Either<String, MarkedString>>newArrayList(Either.<String, MarkedString>forRight(this.gson.<MarkedString>fromJson(object, MarkedString.class)));
+ return Either.<List<Either<String, MarkedString>>, MarkupContent>forLeft(value_2);
+ } else {
+ return Either.<List<Either<String, MarkedString>>, MarkupContent>forRight(this.gson.<MarkupContent>fromJson(object, MarkupContent.class));
+ }
+ }
+ }
+ }
+
+ protected void writeContents(final JsonWriter out, final Either<List<Either<String, MarkedString>>, MarkupContent> contents) throws IOException {
+ boolean _isLeft = contents.isLeft();
+ if (_isLeft) {
+ final List<Either<String, MarkedString>> list = contents.getLeft();
+ int _size = list.size();
+ boolean _equals = (_size == 1);
+ if (_equals) {
+ this.gson.toJson(list.get(0), HoverTypeAdapter.STRING_MARKEDSTRING.getType(), out);
+ } else {
+ this.gson.toJson(list, HoverTypeAdapter.LIST_STRING_MARKEDSTRING.getType(), out);
+ }
+ } else {
+ this.gson.toJson(contents.getRight(), MarkupContent.class, out);
+ }
+ }
+
+ private static final TypeToken<Either<List<Either<String, MarkedString>>, MarkupContent>> CONTENTS_TYPE_TOKEN = new TypeToken<Either<List<Either<String, MarkedString>>, MarkupContent>>() {};
+
+ private final Gson gson;
+
+ public HoverTypeAdapter(final Gson gson) {
+ this.gson = gson;
+ }
+
+ public Hover read(final JsonReader in) throws IOException {
+ JsonToken nextToken = in.peek();
+ if (nextToken == JsonToken.NULL) {
+ return null;
+ }
+
+ Hover result = new Hover();
+ in.beginObject();
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "contents":
+ result.setContents(readContents(in));
+ break;
+ case "range":
+ result.setRange(readRange(in));
+ break;
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+ return result;
+ }
+
+ protected Range readRange(final JsonReader in) throws IOException {
+ return gson.fromJson(in, Range.class);
+ }
+
+ public void write(final JsonWriter out, final Hover value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ return;
+ }
+
+ out.beginObject();
+ out.name("contents");
+ writeContents(out, value.getContents());
+ out.name("range");
+ writeRange(out, value.getRange());
+ out.endObject();
+ }
+
+ protected void writeRange(final JsonWriter out, final Range value) throws IOException {
+ gson.toJson(value, Range.class, out);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/HoverTypeAdapter.xtend b/java/org/eclipse/lsp4j/adapters/HoverTypeAdapter.xtend
new file mode 100644
index 0000000..94ddde3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/HoverTypeAdapter.xtend
@@ -0,0 +1,69 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters
+
+import com.google.gson.JsonObject
+import com.google.gson.JsonParser
+import com.google.gson.reflect.TypeToken
+import com.google.gson.stream.JsonReader
+import com.google.gson.stream.JsonToken
+import com.google.gson.stream.JsonWriter
+import java.io.IOException
+import java.util.List
+import org.eclipse.lsp4j.Hover
+import org.eclipse.lsp4j.MarkedString
+import org.eclipse.lsp4j.MarkupContent
+import org.eclipse.lsp4j.generator.TypeAdapterImpl
+import org.eclipse.lsp4j.jsonrpc.messages.Either
+
+/**
+ * A type adapter for the Hover protocol type.
+ */
+@TypeAdapterImpl(Hover)
+class HoverTypeAdapter {
+
+ static val LIST_STRING_MARKEDSTRING = new TypeToken<List<Either<String, MarkedString>>>() {}
+ static val STRING_MARKEDSTRING = new TypeToken<Either<String, MarkedString>>() {}
+
+ protected def readContents(JsonReader in) throws IOException {
+ val nextToken = in.peek()
+ if (nextToken == JsonToken.STRING) {
+ val List<Either<String, MarkedString>> value = newArrayList(Either.forLeft(in.nextString))
+ return Either.forLeft(value)
+ } else if (nextToken == JsonToken.BEGIN_ARRAY) {
+ val value = gson.fromJson(in, LIST_STRING_MARKEDSTRING.type)
+ return Either.forLeft(value)
+ } else {
+ val object = JsonParser.parseReader(in) as JsonObject
+ if (object.has("language")) {
+ val List<Either<String, MarkedString>> value = newArrayList(Either.forRight(gson.fromJson(object, MarkedString)))
+ return Either.forLeft(value)
+ } else {
+ return Either.forRight(gson.fromJson(object, MarkupContent))
+ }
+ }
+ }
+
+ protected def writeContents(JsonWriter out, Either<List<Either<String, MarkedString>>, MarkupContent> contents) throws IOException {
+ if (contents.isLeft) {
+ val list = contents.getLeft
+ if (list.size == 1) {
+ gson.toJson(list.get(0), STRING_MARKEDSTRING.type, out)
+ } else {
+ gson.toJson(list, LIST_STRING_MARKEDSTRING.type, out)
+ }
+ } else {
+ gson.toJson(contents.getRight, MarkupContent, out)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/adapters/InitializeParamsTypeAdapter.java b/java/org/eclipse/lsp4j/adapters/InitializeParamsTypeAdapter.java
new file mode 100644
index 0000000..68e10bc
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/InitializeParamsTypeAdapter.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.adapters;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.ClientInfo;
+import org.eclipse.lsp4j.InitializeParams;
+import org.eclipse.lsp4j.WorkspaceFolder;
+import org.eclipse.lsp4j.generator.TypeAdapterImpl;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+/**
+ * A type adapter for the InitializeParams protocol type.
+ */
+@TypeAdapterImpl(InitializeParams.class)
+@SuppressWarnings("all")
+public class InitializeParamsTypeAdapter extends TypeAdapter<InitializeParams> {
+ public static class Factory implements TypeAdapterFactory {
+ public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
+ if (!InitializeParams.class.isAssignableFrom(typeToken.getRawType())) {
+ return null;
+ }
+ return (TypeAdapter<T>) new InitializeParamsTypeAdapter(gson);
+ }
+ }
+
+ protected Object readInitializationOptions(final JsonReader in) throws IOException {
+ return this.gson.<JsonElement>getAdapter(JsonElement.class).read(in);
+ }
+
+ protected void writeProcessId(final JsonWriter out, final Integer value) throws IOException {
+ if ((value == null)) {
+ final boolean previousSerializeNulls = out.getSerializeNulls();
+ out.setSerializeNulls(true);
+ out.nullValue();
+ out.setSerializeNulls(previousSerializeNulls);
+ } else {
+ out.value(value);
+ }
+ }
+
+ protected void writeRootUri(final JsonWriter out, final String value) throws IOException {
+ if ((value == null)) {
+ final boolean previousSerializeNulls = out.getSerializeNulls();
+ out.setSerializeNulls(true);
+ out.nullValue();
+ out.setSerializeNulls(previousSerializeNulls);
+ } else {
+ out.value(value);
+ }
+ }
+
+ private static final TypeToken<Either<String, Integer>> WORKDONETOKEN_TYPE_TOKEN = new TypeToken<Either<String, Integer>>() {};
+
+ private static final TypeToken<List<WorkspaceFolder>> WORKSPACEFOLDERS_TYPE_TOKEN = new TypeToken<List<WorkspaceFolder>>() {};
+
+ private final Gson gson;
+
+ public InitializeParamsTypeAdapter(final Gson gson) {
+ this.gson = gson;
+ }
+
+ public InitializeParams read(final JsonReader in) throws IOException {
+ JsonToken nextToken = in.peek();
+ if (nextToken == JsonToken.NULL) {
+ return null;
+ }
+
+ InitializeParams result = new InitializeParams();
+ in.beginObject();
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "workDoneToken":
+ result.setWorkDoneToken(readWorkDoneToken(in));
+ break;
+ case "processId":
+ result.setProcessId(readProcessId(in));
+ break;
+ case "rootPath":
+ result.setRootPath(readRootPath(in));
+ break;
+ case "rootUri":
+ result.setRootUri(readRootUri(in));
+ break;
+ case "initializationOptions":
+ result.setInitializationOptions(readInitializationOptions(in));
+ break;
+ case "capabilities":
+ result.setCapabilities(readCapabilities(in));
+ break;
+ case "clientName":
+ result.setClientName(readClientName(in));
+ break;
+ case "clientInfo":
+ result.setClientInfo(readClientInfo(in));
+ break;
+ case "locale":
+ result.setLocale(readLocale(in));
+ break;
+ case "trace":
+ result.setTrace(readTrace(in));
+ break;
+ case "workspaceFolders":
+ result.setWorkspaceFolders(readWorkspaceFolders(in));
+ break;
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+ return result;
+ }
+
+ protected Either<String, Integer> readWorkDoneToken(final JsonReader in) throws IOException {
+ return gson.fromJson(in, WORKDONETOKEN_TYPE_TOKEN.getType());
+ }
+
+ protected Integer readProcessId(final JsonReader in) throws IOException {
+ return gson.fromJson(in, Integer.class);
+ }
+
+ protected String readRootPath(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ protected String readRootUri(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ protected ClientCapabilities readCapabilities(final JsonReader in) throws IOException {
+ return gson.fromJson(in, ClientCapabilities.class);
+ }
+
+ protected String readClientName(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ protected ClientInfo readClientInfo(final JsonReader in) throws IOException {
+ return gson.fromJson(in, ClientInfo.class);
+ }
+
+ protected String readLocale(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ protected String readTrace(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ protected List<WorkspaceFolder> readWorkspaceFolders(final JsonReader in) throws IOException {
+ return gson.fromJson(in, WORKSPACEFOLDERS_TYPE_TOKEN.getType());
+ }
+
+ public void write(final JsonWriter out, final InitializeParams value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ return;
+ }
+
+ out.beginObject();
+ out.name("workDoneToken");
+ writeWorkDoneToken(out, value.getWorkDoneToken());
+ out.name("processId");
+ writeProcessId(out, value.getProcessId());
+ out.name("rootPath");
+ writeRootPath(out, value.getRootPath());
+ out.name("rootUri");
+ writeRootUri(out, value.getRootUri());
+ out.name("initializationOptions");
+ writeInitializationOptions(out, value.getInitializationOptions());
+ out.name("capabilities");
+ writeCapabilities(out, value.getCapabilities());
+ out.name("clientName");
+ writeClientName(out, value.getClientName());
+ out.name("clientInfo");
+ writeClientInfo(out, value.getClientInfo());
+ out.name("locale");
+ writeLocale(out, value.getLocale());
+ out.name("trace");
+ writeTrace(out, value.getTrace());
+ out.name("workspaceFolders");
+ writeWorkspaceFolders(out, value.getWorkspaceFolders());
+ out.endObject();
+ }
+
+ protected void writeWorkDoneToken(final JsonWriter out, final Either<String, Integer> value) throws IOException {
+ gson.toJson(value, WORKDONETOKEN_TYPE_TOKEN.getType(), out);
+ }
+
+ protected void writeRootPath(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+
+ protected void writeInitializationOptions(final JsonWriter out, final Object value) throws IOException {
+ if (value == null)
+ out.nullValue();
+ else
+ gson.toJson(value, value.getClass(), out);
+ }
+
+ protected void writeCapabilities(final JsonWriter out, final ClientCapabilities value) throws IOException {
+ gson.toJson(value, ClientCapabilities.class, out);
+ }
+
+ protected void writeClientName(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+
+ protected void writeClientInfo(final JsonWriter out, final ClientInfo value) throws IOException {
+ gson.toJson(value, ClientInfo.class, out);
+ }
+
+ protected void writeLocale(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+
+ protected void writeTrace(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+
+ protected void writeWorkspaceFolders(final JsonWriter out, final List<WorkspaceFolder> value) throws IOException {
+ gson.toJson(value, WORKSPACEFOLDERS_TYPE_TOKEN.getType(), out);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/InitializeParamsTypeAdapter.xtend b/java/org/eclipse/lsp4j/adapters/InitializeParamsTypeAdapter.xtend
new file mode 100644
index 0000000..6e20c92
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/InitializeParamsTypeAdapter.xtend
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters
+
+import com.google.gson.JsonElement;
+import com.google.gson.stream.JsonReader
+import com.google.gson.stream.JsonWriter
+import java.io.IOException
+import org.eclipse.lsp4j.InitializeParams
+import org.eclipse.lsp4j.generator.TypeAdapterImpl
+
+/**
+ * A type adapter for the InitializeParams protocol type.
+ */
+@TypeAdapterImpl(InitializeParams)
+class InitializeParamsTypeAdapter {
+
+ protected def Object readInitializationOptions(JsonReader in) throws IOException {
+ return gson.getAdapter(JsonElement).read(in);
+ }
+
+ protected def void writeProcessId(JsonWriter out, Integer value) throws IOException {
+ if (value === null) {
+ val previousSerializeNulls = out.serializeNulls
+ out.serializeNulls = true
+ out.nullValue()
+ out.serializeNulls = previousSerializeNulls
+ } else {
+ out.value(value)
+ }
+ }
+
+ protected def void writeRootUri(JsonWriter out, String value) throws IOException {
+ if (value === null) {
+ val previousSerializeNulls = out.serializeNulls
+ out.serializeNulls = true
+ out.nullValue()
+ out.serializeNulls = previousSerializeNulls
+ } else {
+ out.value(value)
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/adapters/LocationLinkListAdapter.java b/java/org/eclipse/lsp4j/adapters/LocationLinkListAdapter.java
new file mode 100644
index 0000000..50ac650
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/LocationLinkListAdapter.java
@@ -0,0 +1,30 @@
+package org.eclipse.lsp4j.adapters;
+
+import java.util.List;
+
+import org.eclipse.lsp4j.Location;
+import org.eclipse.lsp4j.LocationLink;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.ListChecker;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class LocationLinkListAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<List<? extends Location>, List<? extends LocationLink>>> EITHER_TYPE
+ = new TypeToken<Either<List<? extends Location>, List<? extends LocationLink>>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ ListChecker leftChecker = new ListChecker(new PropertyChecker("uri"), true);
+ ListChecker rightChecker = new ListChecker(new PropertyChecker("targetUri"), false);
+ return (TypeAdapter<T>) new EitherTypeAdapter<>(gson, EITHER_TYPE, leftChecker, rightChecker);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/adapters/PrepareRenameResponseAdapter.java b/java/org/eclipse/lsp4j/adapters/PrepareRenameResponseAdapter.java
new file mode 100644
index 0000000..e626592
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/PrepareRenameResponseAdapter.java
@@ -0,0 +1,40 @@
+/******************************************************************************
+ * Copyright (c) 2018-2019 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.util.function.Predicate;
+
+import org.eclipse.lsp4j.PrepareRenameResult;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class PrepareRenameResponseAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<Range, PrepareRenameResult>> ELEMENT_TYPE
+ = new TypeToken<Either<Range, PrepareRenameResult>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Predicate<JsonElement> leftChecker = new PropertyChecker("start");
+ Predicate<JsonElement> rightChecker = new PropertyChecker("range");
+ return (TypeAdapter<T>) new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/ProgressNotificationAdapter.java b/java/org/eclipse/lsp4j/adapters/ProgressNotificationAdapter.java
new file mode 100644
index 0000000..64a4f6f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/ProgressNotificationAdapter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2021 1C-Soft LLC and others.
+ *
+ * This program and the accompanying materials are made available under
+ * the terms of the Eclipse Public License 2.0 which is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ *******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.util.function.Predicate;
+
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+public class ProgressNotificationAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<WorkDoneProgressNotification, Object>> ELEMENT_TYPE
+ = new TypeToken<Either<WorkDoneProgressNotification, Object>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Gson gson2 = gson.newBuilder().registerTypeHierarchyAdapter(WorkDoneProgressNotification.class,
+ new WorkDoneProgressNotificationAdapter()).create();
+ Predicate<JsonElement> leftChecker = new PropertyChecker("kind", "begin").or(
+ new PropertyChecker("kind", "report")).or(new PropertyChecker("kind", "end"));
+ Predicate<JsonElement> rightChecker = t -> true;
+ return (TypeAdapter<T>) new EitherTypeAdapter<>(gson2, ELEMENT_TYPE, leftChecker, rightChecker);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/ResourceChangeListAdapter.java b/java/org/eclipse/lsp4j/adapters/ResourceChangeListAdapter.java
new file mode 100644
index 0000000..7c61961
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/ResourceChangeListAdapter.java
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.util.ArrayList;
+import java.util.function.Predicate;
+
+import org.eclipse.lsp4j.ResourceChange;
+import org.eclipse.lsp4j.TextDocumentEdit;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+@SuppressWarnings("deprecation")
+public class ResourceChangeListAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<ResourceChange, TextDocumentEdit>> ELEMENT_TYPE
+ = new TypeToken<Either<ResourceChange, TextDocumentEdit>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Predicate<JsonElement> leftChecker = new PropertyChecker("current").or(new PropertyChecker("newUri"));
+ Predicate<JsonElement> rightChecker = new PropertyChecker("textDocument").and(new PropertyChecker("edits"));
+ TypeAdapter<Either<ResourceChange, TextDocumentEdit>> elementTypeAdapter = new EitherTypeAdapter<>(gson,
+ ELEMENT_TYPE, leftChecker, rightChecker);
+ return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new);
+ }
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/adapters/ResourceOperationTypeAdapter.java b/java/org/eclipse/lsp4j/adapters/ResourceOperationTypeAdapter.java
new file mode 100644
index 0000000..2c661ee
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/ResourceOperationTypeAdapter.java
@@ -0,0 +1,90 @@
+/******************************************************************************
+ * Copyright (c) 2018 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j.adapters;
+
+import java.io.IOException;
+
+import org.eclipse.lsp4j.CreateFile;
+import org.eclipse.lsp4j.DeleteFile;
+import org.eclipse.lsp4j.RenameFile;
+import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.ResourceOperationKind;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+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;
+
+public class ResourceOperationTypeAdapter implements TypeAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+
+ if (!ResourceOperation.class.isAssignableFrom(type.getRawType())) {
+ return null;
+ }
+
+ return (TypeAdapter<T>) new InnerResourceOperationTypeAdapter(this, gson).nullSafe();
+ }
+
+ private static class InnerResourceOperationTypeAdapter extends TypeAdapter<ResourceOperation> {
+
+ TypeAdapter<CreateFile> createFileAdapter;
+ TypeAdapter<DeleteFile> deleteFileAdapter;
+ TypeAdapter<RenameFile> renameFileAdapter;
+
+ InnerResourceOperationTypeAdapter(TypeAdapterFactory factory, Gson gson) {
+ createFileAdapter = gson.getDelegateAdapter(factory, TypeToken.get(CreateFile.class));
+ deleteFileAdapter = gson.getDelegateAdapter(factory, TypeToken.get(DeleteFile.class));
+ renameFileAdapter = gson.getDelegateAdapter(factory, TypeToken.get(RenameFile.class));
+ }
+
+ @Override
+ public void write(JsonWriter out, ResourceOperation value) throws IOException {
+ if (value.getClass().isAssignableFrom(CreateFile.class)) {
+ createFileAdapter.write(out, (CreateFile) value);
+ } else if (value.getClass().isAssignableFrom(DeleteFile.class)) {
+ deleteFileAdapter.write(out, (DeleteFile) value);
+ } else if (value.getClass().isAssignableFrom(RenameFile.class)) {
+ renameFileAdapter.write(out, (RenameFile) value);
+ }
+ }
+
+ @Override
+ public ResourceOperation read(JsonReader in) throws IOException {
+ JsonObject objectJson = JsonParser.parseReader(in).getAsJsonObject();
+ JsonElement value = objectJson.get("kind");
+ if (value != null && value.isJsonPrimitive()) {
+ String kindValue = value.getAsString();
+
+ if (ResourceOperationKind.Create.equals(kindValue)) {
+ return createFileAdapter.fromJsonTree(objectJson);
+ } else if (ResourceOperationKind.Delete.equals(kindValue)) {
+ return deleteFileAdapter.fromJsonTree(objectJson);
+ } else if (ResourceOperationKind.Rename.equals(kindValue)) {
+ return renameFileAdapter.fromJsonTree(objectJson);
+ }
+ }
+
+ throw new JsonParseException(
+ "The ResourceOperation object either has null \"kind\" value or the \"kind\" value is not valid.");
+ }
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/SemanticTokensFullDeltaResponseAdapter.java b/java/org/eclipse/lsp4j/adapters/SemanticTokensFullDeltaResponseAdapter.java
new file mode 100644
index 0000000..4850a86
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/SemanticTokensFullDeltaResponseAdapter.java
@@ -0,0 +1,40 @@
+/******************************************************************************
+ * Copyright (c) 2018-2019 Microsoft Corporation and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.util.function.Predicate;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+
+import org.eclipse.lsp4j.SemanticTokensDelta;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter.PropertyChecker;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+public class SemanticTokensFullDeltaResponseAdapter implements TypeAdapterFactory {
+
+ private static final TypeToken<Either<SemanticTokens, SemanticTokensDelta>> ELEMENT_TYPE
+ = new TypeToken<Either<SemanticTokens, SemanticTokensDelta>>() {};
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ Predicate<JsonElement> leftChecker = new PropertyChecker("data");
+ Predicate<JsonElement> rightChecker = new PropertyChecker("edits");
+ return (TypeAdapter<T>) new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/SymbolInformationTypeAdapter.java b/java/org/eclipse/lsp4j/adapters/SymbolInformationTypeAdapter.java
new file mode 100644
index 0000000..c62fe93
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/SymbolInformationTypeAdapter.java
@@ -0,0 +1,184 @@
+package org.eclipse.lsp4j.adapters;
+
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.lsp4j.Location;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.SymbolKind;
+import org.eclipse.lsp4j.SymbolTag;
+import org.eclipse.lsp4j.generator.TypeAdapterImpl;
+
+/**
+ * A type adapter for the SymbolInformation protocol type.
+ */
+@TypeAdapterImpl(SymbolInformation.class)
+@SuppressWarnings("all")
+public class SymbolInformationTypeAdapter extends TypeAdapter<SymbolInformation> {
+ public static class Factory implements TypeAdapterFactory {
+ public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
+ if (!SymbolInformation.class.isAssignableFrom(typeToken.getRawType())) {
+ return null;
+ }
+ return (TypeAdapter<T>) new SymbolInformationTypeAdapter(gson);
+ }
+ }
+
+ protected void writeLocation(final JsonWriter out, final Location value) throws IOException {
+ if ((value == null)) {
+ out.nullValue();
+ return;
+ }
+ out.beginObject();
+ out.name("uri");
+ out.value(value.getUri());
+ out.name("range");
+ this.writeRange(out, value.getRange());
+ out.endObject();
+ }
+
+ protected void writeRange(final JsonWriter out, final Range value) throws IOException {
+ if ((value == null)) {
+ out.nullValue();
+ return;
+ }
+ out.beginObject();
+ out.name("start");
+ this.writePosition(out, value.getStart());
+ out.name("end");
+ this.writePosition(out, value.getEnd());
+ out.endObject();
+ }
+
+ protected void writePosition(final JsonWriter out, final Position value) throws IOException {
+ if ((value == null)) {
+ out.nullValue();
+ return;
+ }
+ out.beginObject();
+ out.name("line");
+ out.value(value.getLine());
+ out.name("character");
+ out.value(value.getCharacter());
+ out.endObject();
+ }
+
+ private static final TypeToken<List<SymbolTag>> TAGS_TYPE_TOKEN = new TypeToken<List<SymbolTag>>() {};
+
+ private final Gson gson;
+
+ public SymbolInformationTypeAdapter(final Gson gson) {
+ this.gson = gson;
+ }
+
+ public SymbolInformation read(final JsonReader in) throws IOException {
+ JsonToken nextToken = in.peek();
+ if (nextToken == JsonToken.NULL) {
+ return null;
+ }
+
+ SymbolInformation result = new SymbolInformation();
+ in.beginObject();
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "name":
+ result.setName(readName(in));
+ break;
+ case "kind":
+ result.setKind(readKind(in));
+ break;
+ case "tags":
+ result.setTags(readTags(in));
+ break;
+ case "deprecated":
+ result.setDeprecated(readDeprecated(in));
+ break;
+ case "location":
+ result.setLocation(readLocation(in));
+ break;
+ case "containerName":
+ result.setContainerName(readContainerName(in));
+ break;
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+ return result;
+ }
+
+ protected String readName(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ protected SymbolKind readKind(final JsonReader in) throws IOException {
+ return gson.fromJson(in, SymbolKind.class);
+ }
+
+ protected List<SymbolTag> readTags(final JsonReader in) throws IOException {
+ return gson.fromJson(in, TAGS_TYPE_TOKEN.getType());
+ }
+
+ protected Boolean readDeprecated(final JsonReader in) throws IOException {
+ return gson.fromJson(in, Boolean.class);
+ }
+
+ protected Location readLocation(final JsonReader in) throws IOException {
+ return gson.fromJson(in, Location.class);
+ }
+
+ protected String readContainerName(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ public void write(final JsonWriter out, final SymbolInformation value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ return;
+ }
+
+ out.beginObject();
+ out.name("name");
+ writeName(out, value.getName());
+ out.name("kind");
+ writeKind(out, value.getKind());
+ out.name("tags");
+ writeTags(out, value.getTags());
+ out.name("deprecated");
+ writeDeprecated(out, value.getDeprecated());
+ out.name("location");
+ writeLocation(out, value.getLocation());
+ out.name("containerName");
+ writeContainerName(out, value.getContainerName());
+ out.endObject();
+ }
+
+ protected void writeName(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+
+ protected void writeKind(final JsonWriter out, final SymbolKind value) throws IOException {
+ gson.toJson(value, SymbolKind.class, out);
+ }
+
+ protected void writeTags(final JsonWriter out, final List<SymbolTag> value) throws IOException {
+ gson.toJson(value, TAGS_TYPE_TOKEN.getType(), out);
+ }
+
+ protected void writeDeprecated(final JsonWriter out, final Boolean value) throws IOException {
+ out.value(value);
+ }
+
+ protected void writeContainerName(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/SymbolInformationTypeAdapter.xtend b/java/org/eclipse/lsp4j/adapters/SymbolInformationTypeAdapter.xtend
new file mode 100644
index 0000000..d4a594c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/SymbolInformationTypeAdapter.xtend
@@ -0,0 +1,59 @@
+package org.eclipse.lsp4j.adapters
+
+import com.google.gson.stream.JsonWriter
+import java.io.IOException
+import org.eclipse.lsp4j.Location
+import org.eclipse.lsp4j.Position
+import org.eclipse.lsp4j.Range
+import org.eclipse.lsp4j.SymbolInformation
+import org.eclipse.lsp4j.generator.TypeAdapterImpl
+
+/**
+ * A type adapter for the SymbolInformation protocol type.
+ */
+@TypeAdapterImpl(SymbolInformation)
+class SymbolInformationTypeAdapter {
+
+ protected def writeLocation(JsonWriter out, Location value) throws IOException {
+ if (value === null) {
+ out.nullValue()
+ return
+ }
+
+ out.beginObject()
+ out.name('uri')
+ out.value(value.uri)
+ out.name('range')
+ writeRange(out, value.range)
+ out.endObject()
+ }
+
+ protected def writeRange(JsonWriter out, Range value) throws IOException {
+ if (value === null) {
+ out.nullValue()
+ return
+ }
+
+ out.beginObject()
+ out.name('start')
+ writePosition(out, value.start)
+ out.name('end')
+ writePosition(out, value.end)
+ out.endObject()
+ }
+
+ protected def writePosition(JsonWriter out, Position value) throws IOException {
+ if (value === null) {
+ out.nullValue()
+ return
+ }
+
+ out.beginObject()
+ out.name('line')
+ out.value(value.line)
+ out.name('character')
+ out.value(value.character)
+ out.endObject()
+ }
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/adapters/VersionedTextDocumentIdentifierTypeAdapter.java b/java/org/eclipse/lsp4j/adapters/VersionedTextDocumentIdentifierTypeAdapter.java
new file mode 100644
index 0000000..1cbc534
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/VersionedTextDocumentIdentifierTypeAdapter.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.adapters;
+
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
+import org.eclipse.lsp4j.generator.TypeAdapterImpl;
+
+/**
+ * A type adapter for the VersionedTextDocumentIdentifier protocol type.
+ */
+@TypeAdapterImpl(VersionedTextDocumentIdentifier.class)
+@SuppressWarnings("all")
+public class VersionedTextDocumentIdentifierTypeAdapter extends TypeAdapter<VersionedTextDocumentIdentifier> {
+ public static class Factory implements TypeAdapterFactory {
+ public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
+ if (!VersionedTextDocumentIdentifier.class.isAssignableFrom(typeToken.getRawType())) {
+ return null;
+ }
+ return (TypeAdapter<T>) new VersionedTextDocumentIdentifierTypeAdapter(gson);
+ }
+ }
+
+ protected void writeVersion(final JsonWriter out, final Integer value) throws IOException {
+ if ((value == null)) {
+ final boolean previousSerializeNulls = out.getSerializeNulls();
+ out.setSerializeNulls(true);
+ out.nullValue();
+ out.setSerializeNulls(previousSerializeNulls);
+ } else {
+ out.value(value);
+ }
+ }
+
+ private final Gson gson;
+
+ public VersionedTextDocumentIdentifierTypeAdapter(final Gson gson) {
+ this.gson = gson;
+ }
+
+ public VersionedTextDocumentIdentifier read(final JsonReader in) throws IOException {
+ JsonToken nextToken = in.peek();
+ if (nextToken == JsonToken.NULL) {
+ return null;
+ }
+
+ VersionedTextDocumentIdentifier result = new VersionedTextDocumentIdentifier();
+ in.beginObject();
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "version":
+ result.setVersion(readVersion(in));
+ break;
+ case "uri":
+ result.setUri(readUri(in));
+ break;
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+ return result;
+ }
+
+ protected Integer readVersion(final JsonReader in) throws IOException {
+ return gson.fromJson(in, Integer.class);
+ }
+
+ protected String readUri(final JsonReader in) throws IOException {
+ return gson.fromJson(in, String.class);
+ }
+
+ public void write(final JsonWriter out, final VersionedTextDocumentIdentifier value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ return;
+ }
+
+ out.beginObject();
+ out.name("version");
+ writeVersion(out, value.getVersion());
+ out.name("uri");
+ writeUri(out, value.getUri());
+ out.endObject();
+ }
+
+ protected void writeUri(final JsonWriter out, final String value) throws IOException {
+ out.value(value);
+ }
+}
diff --git a/java/org/eclipse/lsp4j/adapters/VersionedTextDocumentIdentifierTypeAdapter.xtend b/java/org/eclipse/lsp4j/adapters/VersionedTextDocumentIdentifierTypeAdapter.xtend
new file mode 100644
index 0000000..ebdcf8b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/VersionedTextDocumentIdentifierTypeAdapter.xtend
@@ -0,0 +1,36 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters
+
+import com.google.gson.stream.JsonWriter
+import java.io.IOException
+import org.eclipse.lsp4j.VersionedTextDocumentIdentifier
+import org.eclipse.lsp4j.generator.TypeAdapterImpl
+
+/**
+ * A type adapter for the VersionedTextDocumentIdentifier protocol type.
+ */
+@TypeAdapterImpl(VersionedTextDocumentIdentifier)
+class VersionedTextDocumentIdentifierTypeAdapter {
+
+ protected def void writeVersion(JsonWriter out, Integer value) throws IOException {
+ if (value === null) {
+ val previousSerializeNulls = out.serializeNulls
+ out.serializeNulls = true
+ out.nullValue()
+ out.serializeNulls = previousSerializeNulls
+ } else {
+ out.value(value)
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/adapters/WorkDoneProgressNotificationAdapter.java b/java/org/eclipse/lsp4j/adapters/WorkDoneProgressNotificationAdapter.java
new file mode 100644
index 0000000..44ac0dd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/adapters/WorkDoneProgressNotificationAdapter.java
@@ -0,0 +1,176 @@
+/******************************************************************************
+ * Copyright (c) 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.adapters;
+
+import java.io.EOFException;
+import java.io.IOException;
+
+import org.eclipse.lsp4j.WorkDoneProgressBegin;
+import org.eclipse.lsp4j.WorkDoneProgressEnd;
+import org.eclipse.lsp4j.WorkDoneProgressKind;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.WorkDoneProgressReport;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSyntaxException;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import com.google.gson.stream.MalformedJsonException;
+
+/**
+ * A type adapter for class which implements WorkDoneProgressNotification interface.
+ */
+public class WorkDoneProgressNotificationAdapter extends TypeAdapter<WorkDoneProgressNotification> {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ Class<?> rawType = typeToken.getRawType();
+ if (!WorkDoneProgressNotification.class.isAssignableFrom(rawType)) {
+ return null;
+ }
+ return (TypeAdapter<T>) new WorkDoneProgressNotificationAdapter();
+ }
+
+ }
+
+ public WorkDoneProgressNotificationAdapter() {
+ }
+
+ @Override
+ public WorkDoneProgressNotification read(JsonReader in) throws IOException {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+
+ in.beginObject();
+ String kind = null, message = null, title = null;
+ Boolean cancellable = null;
+ Integer percentage = null;
+ try {
+
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "kind": {
+ kind = in.nextString();
+ break;
+ }
+ case "title": {
+ title = in.nextString();
+ break;
+ }
+ case "message": {
+ message = in.nextString();
+ break;
+ }
+ case "cancellable": {
+ cancellable = in.nextBoolean();
+ break;
+ }
+ case "percentage": {
+ percentage = in.nextInt();
+ break;
+ }
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+ return createNotification(kind, message, title, cancellable, percentage);
+
+ } catch (JsonSyntaxException | MalformedJsonException | EOFException exception) {
+ if (kind != null) {
+ throw new JsonParseException(exception);
+ } else {
+ throw exception;
+ }
+ }
+ }
+
+ private WorkDoneProgressNotification createNotification(String kind, String message, String title,
+ Boolean cancellable, Integer percentage) throws MalformedJsonException {
+ if(kind == null) {
+ throw new MalformedJsonException("Kind of progress notification is empty");
+ }
+ switch (kind) {
+ case "begin":
+ WorkDoneProgressBegin begin = new WorkDoneProgressBegin();
+ begin.setMessage(message);
+ begin.setCancellable(cancellable);
+ begin.setPercentage(percentage);
+ begin.setTitle(title);
+ return begin;
+ case "report":
+ WorkDoneProgressReport report = new WorkDoneProgressReport();
+ report.setMessage(message);
+ report.setCancellable(cancellable);
+ report.setPercentage(percentage);
+ return report;
+ case "end":
+ WorkDoneProgressEnd end = new WorkDoneProgressEnd();
+ end.setMessage(message);
+ return end;
+ default:
+ throw new MalformedJsonException("Kind of progress notification is unknown: "+kind);
+ }
+ }
+
+ @Override
+ public void write(JsonWriter out, WorkDoneProgressNotification notification) throws IOException {
+ out.beginObject();
+ out.name("kind");
+ WorkDoneProgressKind kind = notification.getKind();
+ out.value(kind.toString());
+
+ switch (kind) {
+ case begin:
+ WorkDoneProgressBegin begin = (WorkDoneProgressBegin) notification;
+ out.name("title");
+ out.value(begin.getTitle());
+ out.name("cancellable");
+ out.value(begin.getCancellable());
+ out.name("message");
+ out.value(begin.getMessage());
+ out.name("percentage");
+ out.value(begin.getPercentage());
+ break;
+ case report:
+ WorkDoneProgressReport report = (WorkDoneProgressReport) notification;
+ out.name("cancellable");
+ out.value(report.getCancellable());
+ out.name("message");
+ out.value(report.getMessage());
+ out.name("percentage");
+ out.value(report.getPercentage());
+ break;
+ case end:
+ WorkDoneProgressEnd end = (WorkDoneProgressEnd) notification;
+ out.name("message");
+ out.value(end.getMessage());
+ break;
+
+ default:
+ throw new MalformedJsonException("Kind of progress notification is unknown: "+kind);
+ }
+ out.endObject();
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/debug/AttachRequestArguments.java b/java/org/eclipse/lsp4j/debug/AttachRequestArguments.java
new file mode 100644
index 0000000..cd720ca
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/AttachRequestArguments.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'attach' request. Additional attributes are implementation specific.
+ */
+@SuppressWarnings("all")
+public class AttachRequestArguments {
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ private Object __restart;
+
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Object get__restart() {
+ return this.__restart;
+ }
+
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ public void set__restart(final Object __restart) {
+ this.__restart = __restart;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("__restart", this.__restart);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ AttachRequestArguments other = (AttachRequestArguments) obj;
+ if (this.__restart == null) {
+ if (other.__restart != null)
+ return false;
+ } else if (!this.__restart.equals(other.__restart))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.__restart== null) ? 0 : this.__restart.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Breakpoint.java b/java/org/eclipse/lsp4j/debug/Breakpoint.java
new file mode 100644
index 0000000..4b84205
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Breakpoint.java
@@ -0,0 +1,392 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Information about a Breakpoint created in setBreakpoints, setFunctionBreakpoints, setInstructionBreakpoints, or
+ * setDataBreakpoints.
+ */
+@SuppressWarnings("all")
+public class Breakpoint {
+ /**
+ * An optional identifier for the breakpoint. It is needed if breakpoint events are used to update or remove
+ * breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer id;
+
+ /**
+ * If true breakpoint could be set (but not necessarily at the desired location).
+ */
+ private boolean verified;
+
+ /**
+ * An optional message about the state of the breakpoint.
+ * <p>
+ * This is shown to the user and can be used to explain why a breakpoint could not be verified.
+ * <p>
+ * This is an optional property.
+ */
+ private String message;
+
+ /**
+ * The source where the breakpoint is located.
+ * <p>
+ * This is an optional property.
+ */
+ private Source source;
+
+ /**
+ * The start line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer line;
+
+ /**
+ * An optional start column of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * An optional end line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * An optional end column of the actual range covered by the breakpoint.
+ * <p>
+ * If no end line is given, then the end column is assumed to be in the start line.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * An optional memory reference to where the breakpoint is set.
+ * <p>
+ * This is an optional property.
+ */
+ private String instructionReference;
+
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer offset;
+
+ /**
+ * An optional identifier for the breakpoint. It is needed if breakpoint events are used to update or remove
+ * breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getId() {
+ return this.id;
+ }
+
+ /**
+ * An optional identifier for the breakpoint. It is needed if breakpoint events are used to update or remove
+ * breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ public void setId(final Integer id) {
+ this.id = id;
+ }
+
+ /**
+ * If true breakpoint could be set (but not necessarily at the desired location).
+ */
+ @Pure
+ public boolean isVerified() {
+ return this.verified;
+ }
+
+ /**
+ * If true breakpoint could be set (but not necessarily at the desired location).
+ */
+ public void setVerified(final boolean verified) {
+ this.verified = verified;
+ }
+
+ /**
+ * An optional message about the state of the breakpoint.
+ * <p>
+ * This is shown to the user and can be used to explain why a breakpoint could not be verified.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * An optional message about the state of the breakpoint.
+ * <p>
+ * This is shown to the user and can be used to explain why a breakpoint could not be verified.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ /**
+ * The source where the breakpoint is located.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * The source where the breakpoint is located.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSource(final Source source) {
+ this.source = source;
+ }
+
+ /**
+ * The start line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLine() {
+ return this.line;
+ }
+
+ /**
+ * The start line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLine(final Integer line) {
+ this.line = line;
+ }
+
+ /**
+ * An optional start column of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * An optional start column of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * An optional end line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * An optional end line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * An optional end column of the actual range covered by the breakpoint.
+ * <p>
+ * If no end line is given, then the end column is assumed to be in the start line.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * An optional end column of the actual range covered by the breakpoint.
+ * <p>
+ * If no end line is given, then the end column is assumed to be in the start line.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ /**
+ * An optional memory reference to where the breakpoint is set.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getInstructionReference() {
+ return this.instructionReference;
+ }
+
+ /**
+ * An optional memory reference to where the breakpoint is set.
+ * <p>
+ * This is an optional property.
+ */
+ public void setInstructionReference(final String instructionReference) {
+ this.instructionReference = instructionReference;
+ }
+
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getOffset() {
+ return this.offset;
+ }
+
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ public void setOffset(final Integer offset) {
+ this.offset = offset;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("verified", this.verified);
+ b.add("message", this.message);
+ b.add("source", this.source);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ b.add("instructionReference", this.instructionReference);
+ b.add("offset", this.offset);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Breakpoint other = (Breakpoint) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ if (other.verified != this.verified)
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (this.line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!this.line.equals(other.line))
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ if (this.instructionReference == null) {
+ if (other.instructionReference != null)
+ return false;
+ } else if (!this.instructionReference.equals(other.instructionReference))
+ return false;
+ if (this.offset == null) {
+ if (other.offset != null)
+ return false;
+ } else if (!this.offset.equals(other.offset))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.id== null) ? 0 : this.id.hashCode());
+ result = prime * result + (this.verified ? 1231 : 1237);
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + ((this.line== null) ? 0 : this.line.hashCode());
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ result = prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ result = prime * result + ((this.instructionReference== null) ? 0 : this.instructionReference.hashCode());
+ return prime * result + ((this.offset== null) ? 0 : this.offset.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/BreakpointEventArguments.java b/java/org/eclipse/lsp4j/debug/BreakpointEventArguments.java
new file mode 100644
index 0000000..a589403
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/BreakpointEventArguments.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Breakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that some information about a breakpoint has changed.
+ */
+@SuppressWarnings("all")
+public class BreakpointEventArguments {
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link BreakpointEventArgumentsReason}
+ */
+ @NonNull
+ private String reason;
+
+ /**
+ * The 'id' attribute is used to find the target breakpoint and the other attributes are used as the new values.
+ */
+ @NonNull
+ private Breakpoint breakpoint;
+
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link BreakpointEventArgumentsReason}
+ */
+ @Pure
+ @NonNull
+ public String getReason() {
+ return this.reason;
+ }
+
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link BreakpointEventArgumentsReason}
+ */
+ public void setReason(@NonNull final String reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ /**
+ * The 'id' attribute is used to find the target breakpoint and the other attributes are used as the new values.
+ */
+ @Pure
+ @NonNull
+ public Breakpoint getBreakpoint() {
+ return this.breakpoint;
+ }
+
+ /**
+ * The 'id' attribute is used to find the target breakpoint and the other attributes are used as the new values.
+ */
+ public void setBreakpoint(@NonNull final Breakpoint breakpoint) {
+ this.breakpoint = Preconditions.checkNotNull(breakpoint, "breakpoint");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("reason", this.reason);
+ b.add("breakpoint", this.breakpoint);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ BreakpointEventArguments other = (BreakpointEventArguments) obj;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ if (this.breakpoint == null) {
+ if (other.breakpoint != null)
+ return false;
+ } else if (!this.breakpoint.equals(other.breakpoint))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.reason== null) ? 0 : this.reason.hashCode());
+ return prime * result + ((this.breakpoint== null) ? 0 : this.breakpoint.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/BreakpointEventArgumentsReason.java b/java/org/eclipse/lsp4j/debug/BreakpointEventArgumentsReason.java
new file mode 100644
index 0000000..4b6076d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/BreakpointEventArgumentsReason.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link BreakpointEventArgumentsReason}
+ */
+@SuppressWarnings("all")
+public interface BreakpointEventArgumentsReason {
+ static final String CHANGED = "changed";
+
+ static final String NEW = "new";
+
+ static final String REMOVED = "removed";
+}
diff --git a/java/org/eclipse/lsp4j/debug/BreakpointLocation.java b/java/org/eclipse/lsp4j/debug/BreakpointLocation.java
new file mode 100644
index 0000000..8c79738
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/BreakpointLocation.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Properties of a breakpoint location returned from the 'breakpointLocations' request.
+ */
+@SuppressWarnings("all")
+public class BreakpointLocation {
+ /**
+ * Start line of breakpoint location.
+ */
+ private int line;
+
+ /**
+ * Optional start column of breakpoint location.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * Optional end line of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * Optional end column of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * Start line of breakpoint location.
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * Start line of breakpoint location.
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * Optional start column of breakpoint location.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * Optional start column of breakpoint location.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * Optional end line of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * Optional end line of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * Optional end column of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * Optional end column of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ BreakpointLocation other = (BreakpointLocation) obj;
+ if (other.line != this.line)
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.line;
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ return prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/BreakpointLocationsArguments.java b/java/org/eclipse/lsp4j/debug/BreakpointLocationsArguments.java
new file mode 100644
index 0000000..14ce2a5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/BreakpointLocationsArguments.java
@@ -0,0 +1,215 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'breakpointLocations' request.
+ */
+@SuppressWarnings("all")
+public class BreakpointLocationsArguments {
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ @NonNull
+ private Source source;
+
+ /**
+ * Start line of range to search possible breakpoint locations in. If only the line is specified, the request
+ * returns all possible locations in that line.
+ */
+ private int line;
+
+ /**
+ * Optional start column of range to search possible breakpoint locations in. If no start column is given, the
+ * first column in the start line is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * Optional end line of range to search possible breakpoint locations in. If no end line is given, then the end
+ * line is assumed to be the start line.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * Optional end column of range to search possible breakpoint locations in. If no end column is given, then it is
+ * assumed to be in the last column of the end line.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ @Pure
+ @NonNull
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ public void setSource(@NonNull final Source source) {
+ this.source = Preconditions.checkNotNull(source, "source");
+ }
+
+ /**
+ * Start line of range to search possible breakpoint locations in. If only the line is specified, the request
+ * returns all possible locations in that line.
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * Start line of range to search possible breakpoint locations in. If only the line is specified, the request
+ * returns all possible locations in that line.
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * Optional start column of range to search possible breakpoint locations in. If no start column is given, the
+ * first column in the start line is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * Optional start column of range to search possible breakpoint locations in. If no start column is given, the
+ * first column in the start line is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * Optional end line of range to search possible breakpoint locations in. If no end line is given, then the end
+ * line is assumed to be the start line.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * Optional end line of range to search possible breakpoint locations in. If no end line is given, then the end
+ * line is assumed to be the start line.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * Optional end column of range to search possible breakpoint locations in. If no end column is given, then it is
+ * assumed to be in the last column of the end line.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * Optional end column of range to search possible breakpoint locations in. If no end column is given, then it is
+ * assumed to be in the last column of the end line.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("source", this.source);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ BreakpointLocationsArguments other = (BreakpointLocationsArguments) obj;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (other.line != this.line)
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + this.line;
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ return prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/BreakpointLocationsResponse.java b/java/org/eclipse/lsp4j/debug/BreakpointLocationsResponse.java
new file mode 100644
index 0000000..72f572a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/BreakpointLocationsResponse.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.BreakpointLocation;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'breakpointLocations' request.
+ * <p>
+ * Contains possible locations for source breakpoints.
+ */
+@SuppressWarnings("all")
+public class BreakpointLocationsResponse {
+ /**
+ * Sorted set of possible breakpoint locations.
+ */
+ @NonNull
+ private BreakpointLocation[] breakpoints;
+
+ /**
+ * Sorted set of possible breakpoint locations.
+ */
+ @Pure
+ @NonNull
+ public BreakpointLocation[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * Sorted set of possible breakpoint locations.
+ */
+ public void setBreakpoints(@NonNull final BreakpointLocation[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ BreakpointLocationsResponse other = (BreakpointLocationsResponse) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/CancelArguments.java b/java/org/eclipse/lsp4j/debug/CancelArguments.java
new file mode 100644
index 0000000..05a97d4
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/CancelArguments.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'cancel' request.
+ */
+@SuppressWarnings("all")
+public class CancelArguments {
+ /**
+ * The ID (attribute 'seq') of the request to cancel. If missing no request is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer requestId;
+
+ /**
+ * The ID (attribute 'progressId') of the progress to cancel. If missing no progress is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ private String progressId;
+
+ /**
+ * The ID (attribute 'seq') of the request to cancel. If missing no request is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getRequestId() {
+ return this.requestId;
+ }
+
+ /**
+ * The ID (attribute 'seq') of the request to cancel. If missing no request is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setRequestId(final Integer requestId) {
+ this.requestId = requestId;
+ }
+
+ /**
+ * The ID (attribute 'progressId') of the progress to cancel. If missing no progress is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getProgressId() {
+ return this.progressId;
+ }
+
+ /**
+ * The ID (attribute 'progressId') of the progress to cancel. If missing no progress is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setProgressId(final String progressId) {
+ this.progressId = progressId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("requestId", this.requestId);
+ b.add("progressId", this.progressId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CancelArguments other = (CancelArguments) obj;
+ if (this.requestId == null) {
+ if (other.requestId != null)
+ return false;
+ } else if (!this.requestId.equals(other.requestId))
+ return false;
+ if (this.progressId == null) {
+ if (other.progressId != null)
+ return false;
+ } else if (!this.progressId.equals(other.progressId))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.requestId== null) ? 0 : this.requestId.hashCode());
+ return prime * result + ((this.progressId== null) ? 0 : this.progressId.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Capabilities.java b/java/org/eclipse/lsp4j/debug/Capabilities.java
new file mode 100644
index 0000000..07adbb9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Capabilities.java
@@ -0,0 +1,1252 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.ChecksumAlgorithm;
+import org.eclipse.lsp4j.debug.ColumnDescriptor;
+import org.eclipse.lsp4j.debug.ExceptionBreakpointsFilter;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Information about the capabilities of a debug adapter.
+ */
+@SuppressWarnings("all")
+public class Capabilities {
+ /**
+ * The debug adapter supports the 'configurationDone' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsConfigurationDoneRequest;
+
+ /**
+ * The debug adapter supports function breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsFunctionBreakpoints;
+
+ /**
+ * The debug adapter supports conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsConditionalBreakpoints;
+
+ /**
+ * The debug adapter supports breakpoints that break execution after a specified number of hits.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsHitConditionalBreakpoints;
+
+ /**
+ * The debug adapter supports a (side effect free) evaluate request for data hovers.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsEvaluateForHovers;
+
+ /**
+ * Available exception filter options for the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ private ExceptionBreakpointsFilter[] exceptionBreakpointFilters;
+
+ /**
+ * The debug adapter supports stepping back via the 'stepBack' and 'reverseContinue' requests.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsStepBack;
+
+ /**
+ * The debug adapter supports setting a variable to a value.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsSetVariable;
+
+ /**
+ * The debug adapter supports restarting a frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsRestartFrame;
+
+ /**
+ * The debug adapter supports the 'gotoTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsGotoTargetsRequest;
+
+ /**
+ * The debug adapter supports the 'stepInTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsStepInTargetsRequest;
+
+ /**
+ * The debug adapter supports the 'completions' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsCompletionsRequest;
+
+ /**
+ * The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the '.'
+ * character.
+ * <p>
+ * This is an optional property.
+ */
+ private String[] completionTriggerCharacters;
+
+ /**
+ * The debug adapter supports the 'modules' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsModulesRequest;
+
+ /**
+ * The set of additional module information exposed by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private ColumnDescriptor[] additionalModuleColumns;
+
+ /**
+ * Checksum algorithms supported by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private ChecksumAlgorithm[] supportedChecksumAlgorithms;
+
+ /**
+ * The debug adapter supports the 'restart' request. In this case a client should not implement 'restart' by
+ * terminating and relaunching the adapter but by calling the RestartRequest.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsRestartRequest;
+
+ /**
+ * The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsExceptionOptions;
+
+ /**
+ * The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and
+ * evaluateRequest.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsValueFormattingOptions;
+
+ /**
+ * The debug adapter supports the 'exceptionInfo' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsExceptionInfoRequest;
+
+ /**
+ * The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportTerminateDebuggee;
+
+ /**
+ * The debug adapter supports the delayed loading of parts of the stack, which requires that both the 'startFrame'
+ * and 'levels' arguments and an optional 'totalFrames' result of the 'StackTrace' request are supported.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsDelayedStackTraceLoading;
+
+ /**
+ * The debug adapter supports the 'loadedSources' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsLoadedSourcesRequest;
+
+ /**
+ * The debug adapter supports logpoints by interpreting the 'logMessage' attribute of the SourceBreakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsLogPoints;
+
+ /**
+ * The debug adapter supports the 'terminateThreads' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsTerminateThreadsRequest;
+
+ /**
+ * The debug adapter supports the 'setExpression' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsSetExpression;
+
+ /**
+ * The debug adapter supports the 'terminate' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsTerminateRequest;
+
+ /**
+ * The debug adapter supports data breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsDataBreakpoints;
+
+ /**
+ * The debug adapter supports the 'readMemory' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsReadMemoryRequest;
+
+ /**
+ * The debug adapter supports the 'disassemble' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsDisassembleRequest;
+
+ /**
+ * The debug adapter supports the 'cancel' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsCancelRequest;
+
+ /**
+ * The debug adapter supports the 'breakpointLocations' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsBreakpointLocationsRequest;
+
+ /**
+ * The debug adapter supports the 'clipboard' context value in the 'evaluate' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsClipboardContext;
+
+ /**
+ * The debug adapter supports stepping granularities (argument 'granularity') for the stepping requests.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsSteppingGranularity;
+
+ /**
+ * The debug adapter supports adding breakpoints based on instruction references.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsInstructionBreakpoints;
+
+ /**
+ * The debug adapter supports 'filterOptions' as an argument on the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsExceptionFilterOptions;
+
+ /**
+ * The debug adapter supports the 'configurationDone' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsConfigurationDoneRequest() {
+ return this.supportsConfigurationDoneRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'configurationDone' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsConfigurationDoneRequest(final Boolean supportsConfigurationDoneRequest) {
+ this.supportsConfigurationDoneRequest = supportsConfigurationDoneRequest;
+ }
+
+ /**
+ * The debug adapter supports function breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsFunctionBreakpoints() {
+ return this.supportsFunctionBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports function breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsFunctionBreakpoints(final Boolean supportsFunctionBreakpoints) {
+ this.supportsFunctionBreakpoints = supportsFunctionBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsConditionalBreakpoints() {
+ return this.supportsConditionalBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsConditionalBreakpoints(final Boolean supportsConditionalBreakpoints) {
+ this.supportsConditionalBreakpoints = supportsConditionalBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports breakpoints that break execution after a specified number of hits.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsHitConditionalBreakpoints() {
+ return this.supportsHitConditionalBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports breakpoints that break execution after a specified number of hits.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsHitConditionalBreakpoints(final Boolean supportsHitConditionalBreakpoints) {
+ this.supportsHitConditionalBreakpoints = supportsHitConditionalBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports a (side effect free) evaluate request for data hovers.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsEvaluateForHovers() {
+ return this.supportsEvaluateForHovers;
+ }
+
+ /**
+ * The debug adapter supports a (side effect free) evaluate request for data hovers.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsEvaluateForHovers(final Boolean supportsEvaluateForHovers) {
+ this.supportsEvaluateForHovers = supportsEvaluateForHovers;
+ }
+
+ /**
+ * Available exception filter options for the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ExceptionBreakpointsFilter[] getExceptionBreakpointFilters() {
+ return this.exceptionBreakpointFilters;
+ }
+
+ /**
+ * Available exception filter options for the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setExceptionBreakpointFilters(final ExceptionBreakpointsFilter[] exceptionBreakpointFilters) {
+ this.exceptionBreakpointFilters = exceptionBreakpointFilters;
+ }
+
+ /**
+ * The debug adapter supports stepping back via the 'stepBack' and 'reverseContinue' requests.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsStepBack() {
+ return this.supportsStepBack;
+ }
+
+ /**
+ * The debug adapter supports stepping back via the 'stepBack' and 'reverseContinue' requests.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsStepBack(final Boolean supportsStepBack) {
+ this.supportsStepBack = supportsStepBack;
+ }
+
+ /**
+ * The debug adapter supports setting a variable to a value.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsSetVariable() {
+ return this.supportsSetVariable;
+ }
+
+ /**
+ * The debug adapter supports setting a variable to a value.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsSetVariable(final Boolean supportsSetVariable) {
+ this.supportsSetVariable = supportsSetVariable;
+ }
+
+ /**
+ * The debug adapter supports restarting a frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsRestartFrame() {
+ return this.supportsRestartFrame;
+ }
+
+ /**
+ * The debug adapter supports restarting a frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsRestartFrame(final Boolean supportsRestartFrame) {
+ this.supportsRestartFrame = supportsRestartFrame;
+ }
+
+ /**
+ * The debug adapter supports the 'gotoTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsGotoTargetsRequest() {
+ return this.supportsGotoTargetsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'gotoTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsGotoTargetsRequest(final Boolean supportsGotoTargetsRequest) {
+ this.supportsGotoTargetsRequest = supportsGotoTargetsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'stepInTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsStepInTargetsRequest() {
+ return this.supportsStepInTargetsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'stepInTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsStepInTargetsRequest(final Boolean supportsStepInTargetsRequest) {
+ this.supportsStepInTargetsRequest = supportsStepInTargetsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'completions' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsCompletionsRequest() {
+ return this.supportsCompletionsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'completions' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsCompletionsRequest(final Boolean supportsCompletionsRequest) {
+ this.supportsCompletionsRequest = supportsCompletionsRequest;
+ }
+
+ /**
+ * The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the '.'
+ * character.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String[] getCompletionTriggerCharacters() {
+ return this.completionTriggerCharacters;
+ }
+
+ /**
+ * The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the '.'
+ * character.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCompletionTriggerCharacters(final String[] completionTriggerCharacters) {
+ this.completionTriggerCharacters = completionTriggerCharacters;
+ }
+
+ /**
+ * The debug adapter supports the 'modules' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsModulesRequest() {
+ return this.supportsModulesRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'modules' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsModulesRequest(final Boolean supportsModulesRequest) {
+ this.supportsModulesRequest = supportsModulesRequest;
+ }
+
+ /**
+ * The set of additional module information exposed by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ColumnDescriptor[] getAdditionalModuleColumns() {
+ return this.additionalModuleColumns;
+ }
+
+ /**
+ * The set of additional module information exposed by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAdditionalModuleColumns(final ColumnDescriptor[] additionalModuleColumns) {
+ this.additionalModuleColumns = additionalModuleColumns;
+ }
+
+ /**
+ * Checksum algorithms supported by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ChecksumAlgorithm[] getSupportedChecksumAlgorithms() {
+ return this.supportedChecksumAlgorithms;
+ }
+
+ /**
+ * Checksum algorithms supported by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportedChecksumAlgorithms(final ChecksumAlgorithm[] supportedChecksumAlgorithms) {
+ this.supportedChecksumAlgorithms = supportedChecksumAlgorithms;
+ }
+
+ /**
+ * The debug adapter supports the 'restart' request. In this case a client should not implement 'restart' by
+ * terminating and relaunching the adapter but by calling the RestartRequest.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsRestartRequest() {
+ return this.supportsRestartRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'restart' request. In this case a client should not implement 'restart' by
+ * terminating and relaunching the adapter but by calling the RestartRequest.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsRestartRequest(final Boolean supportsRestartRequest) {
+ this.supportsRestartRequest = supportsRestartRequest;
+ }
+
+ /**
+ * The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsExceptionOptions() {
+ return this.supportsExceptionOptions;
+ }
+
+ /**
+ * The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsExceptionOptions(final Boolean supportsExceptionOptions) {
+ this.supportsExceptionOptions = supportsExceptionOptions;
+ }
+
+ /**
+ * The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and
+ * evaluateRequest.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsValueFormattingOptions() {
+ return this.supportsValueFormattingOptions;
+ }
+
+ /**
+ * The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and
+ * evaluateRequest.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsValueFormattingOptions(final Boolean supportsValueFormattingOptions) {
+ this.supportsValueFormattingOptions = supportsValueFormattingOptions;
+ }
+
+ /**
+ * The debug adapter supports the 'exceptionInfo' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsExceptionInfoRequest() {
+ return this.supportsExceptionInfoRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'exceptionInfo' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsExceptionInfoRequest(final Boolean supportsExceptionInfoRequest) {
+ this.supportsExceptionInfoRequest = supportsExceptionInfoRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportTerminateDebuggee() {
+ return this.supportTerminateDebuggee;
+ }
+
+ /**
+ * The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportTerminateDebuggee(final Boolean supportTerminateDebuggee) {
+ this.supportTerminateDebuggee = supportTerminateDebuggee;
+ }
+
+ /**
+ * The debug adapter supports the delayed loading of parts of the stack, which requires that both the 'startFrame'
+ * and 'levels' arguments and an optional 'totalFrames' result of the 'StackTrace' request are supported.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsDelayedStackTraceLoading() {
+ return this.supportsDelayedStackTraceLoading;
+ }
+
+ /**
+ * The debug adapter supports the delayed loading of parts of the stack, which requires that both the 'startFrame'
+ * and 'levels' arguments and an optional 'totalFrames' result of the 'StackTrace' request are supported.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsDelayedStackTraceLoading(final Boolean supportsDelayedStackTraceLoading) {
+ this.supportsDelayedStackTraceLoading = supportsDelayedStackTraceLoading;
+ }
+
+ /**
+ * The debug adapter supports the 'loadedSources' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsLoadedSourcesRequest() {
+ return this.supportsLoadedSourcesRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'loadedSources' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsLoadedSourcesRequest(final Boolean supportsLoadedSourcesRequest) {
+ this.supportsLoadedSourcesRequest = supportsLoadedSourcesRequest;
+ }
+
+ /**
+ * The debug adapter supports logpoints by interpreting the 'logMessage' attribute of the SourceBreakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsLogPoints() {
+ return this.supportsLogPoints;
+ }
+
+ /**
+ * The debug adapter supports logpoints by interpreting the 'logMessage' attribute of the SourceBreakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsLogPoints(final Boolean supportsLogPoints) {
+ this.supportsLogPoints = supportsLogPoints;
+ }
+
+ /**
+ * The debug adapter supports the 'terminateThreads' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsTerminateThreadsRequest() {
+ return this.supportsTerminateThreadsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'terminateThreads' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsTerminateThreadsRequest(final Boolean supportsTerminateThreadsRequest) {
+ this.supportsTerminateThreadsRequest = supportsTerminateThreadsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'setExpression' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsSetExpression() {
+ return this.supportsSetExpression;
+ }
+
+ /**
+ * The debug adapter supports the 'setExpression' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsSetExpression(final Boolean supportsSetExpression) {
+ this.supportsSetExpression = supportsSetExpression;
+ }
+
+ /**
+ * The debug adapter supports the 'terminate' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsTerminateRequest() {
+ return this.supportsTerminateRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'terminate' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsTerminateRequest(final Boolean supportsTerminateRequest) {
+ this.supportsTerminateRequest = supportsTerminateRequest;
+ }
+
+ /**
+ * The debug adapter supports data breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsDataBreakpoints() {
+ return this.supportsDataBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports data breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsDataBreakpoints(final Boolean supportsDataBreakpoints) {
+ this.supportsDataBreakpoints = supportsDataBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports the 'readMemory' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsReadMemoryRequest() {
+ return this.supportsReadMemoryRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'readMemory' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsReadMemoryRequest(final Boolean supportsReadMemoryRequest) {
+ this.supportsReadMemoryRequest = supportsReadMemoryRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'disassemble' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsDisassembleRequest() {
+ return this.supportsDisassembleRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'disassemble' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsDisassembleRequest(final Boolean supportsDisassembleRequest) {
+ this.supportsDisassembleRequest = supportsDisassembleRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'cancel' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsCancelRequest() {
+ return this.supportsCancelRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'cancel' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsCancelRequest(final Boolean supportsCancelRequest) {
+ this.supportsCancelRequest = supportsCancelRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'breakpointLocations' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsBreakpointLocationsRequest() {
+ return this.supportsBreakpointLocationsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'breakpointLocations' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsBreakpointLocationsRequest(final Boolean supportsBreakpointLocationsRequest) {
+ this.supportsBreakpointLocationsRequest = supportsBreakpointLocationsRequest;
+ }
+
+ /**
+ * The debug adapter supports the 'clipboard' context value in the 'evaluate' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsClipboardContext() {
+ return this.supportsClipboardContext;
+ }
+
+ /**
+ * The debug adapter supports the 'clipboard' context value in the 'evaluate' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsClipboardContext(final Boolean supportsClipboardContext) {
+ this.supportsClipboardContext = supportsClipboardContext;
+ }
+
+ /**
+ * The debug adapter supports stepping granularities (argument 'granularity') for the stepping requests.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsSteppingGranularity() {
+ return this.supportsSteppingGranularity;
+ }
+
+ /**
+ * The debug adapter supports stepping granularities (argument 'granularity') for the stepping requests.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsSteppingGranularity(final Boolean supportsSteppingGranularity) {
+ this.supportsSteppingGranularity = supportsSteppingGranularity;
+ }
+
+ /**
+ * The debug adapter supports adding breakpoints based on instruction references.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsInstructionBreakpoints() {
+ return this.supportsInstructionBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports adding breakpoints based on instruction references.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsInstructionBreakpoints(final Boolean supportsInstructionBreakpoints) {
+ this.supportsInstructionBreakpoints = supportsInstructionBreakpoints;
+ }
+
+ /**
+ * The debug adapter supports 'filterOptions' as an argument on the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsExceptionFilterOptions() {
+ return this.supportsExceptionFilterOptions;
+ }
+
+ /**
+ * The debug adapter supports 'filterOptions' as an argument on the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsExceptionFilterOptions(final Boolean supportsExceptionFilterOptions) {
+ this.supportsExceptionFilterOptions = supportsExceptionFilterOptions;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("supportsConfigurationDoneRequest", this.supportsConfigurationDoneRequest);
+ b.add("supportsFunctionBreakpoints", this.supportsFunctionBreakpoints);
+ b.add("supportsConditionalBreakpoints", this.supportsConditionalBreakpoints);
+ b.add("supportsHitConditionalBreakpoints", this.supportsHitConditionalBreakpoints);
+ b.add("supportsEvaluateForHovers", this.supportsEvaluateForHovers);
+ b.add("exceptionBreakpointFilters", this.exceptionBreakpointFilters);
+ b.add("supportsStepBack", this.supportsStepBack);
+ b.add("supportsSetVariable", this.supportsSetVariable);
+ b.add("supportsRestartFrame", this.supportsRestartFrame);
+ b.add("supportsGotoTargetsRequest", this.supportsGotoTargetsRequest);
+ b.add("supportsStepInTargetsRequest", this.supportsStepInTargetsRequest);
+ b.add("supportsCompletionsRequest", this.supportsCompletionsRequest);
+ b.add("completionTriggerCharacters", this.completionTriggerCharacters);
+ b.add("supportsModulesRequest", this.supportsModulesRequest);
+ b.add("additionalModuleColumns", this.additionalModuleColumns);
+ b.add("supportedChecksumAlgorithms", this.supportedChecksumAlgorithms);
+ b.add("supportsRestartRequest", this.supportsRestartRequest);
+ b.add("supportsExceptionOptions", this.supportsExceptionOptions);
+ b.add("supportsValueFormattingOptions", this.supportsValueFormattingOptions);
+ b.add("supportsExceptionInfoRequest", this.supportsExceptionInfoRequest);
+ b.add("supportTerminateDebuggee", this.supportTerminateDebuggee);
+ b.add("supportsDelayedStackTraceLoading", this.supportsDelayedStackTraceLoading);
+ b.add("supportsLoadedSourcesRequest", this.supportsLoadedSourcesRequest);
+ b.add("supportsLogPoints", this.supportsLogPoints);
+ b.add("supportsTerminateThreadsRequest", this.supportsTerminateThreadsRequest);
+ b.add("supportsSetExpression", this.supportsSetExpression);
+ b.add("supportsTerminateRequest", this.supportsTerminateRequest);
+ b.add("supportsDataBreakpoints", this.supportsDataBreakpoints);
+ b.add("supportsReadMemoryRequest", this.supportsReadMemoryRequest);
+ b.add("supportsDisassembleRequest", this.supportsDisassembleRequest);
+ b.add("supportsCancelRequest", this.supportsCancelRequest);
+ b.add("supportsBreakpointLocationsRequest", this.supportsBreakpointLocationsRequest);
+ b.add("supportsClipboardContext", this.supportsClipboardContext);
+ b.add("supportsSteppingGranularity", this.supportsSteppingGranularity);
+ b.add("supportsInstructionBreakpoints", this.supportsInstructionBreakpoints);
+ b.add("supportsExceptionFilterOptions", this.supportsExceptionFilterOptions);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Capabilities other = (Capabilities) obj;
+ if (this.supportsConfigurationDoneRequest == null) {
+ if (other.supportsConfigurationDoneRequest != null)
+ return false;
+ } else if (!this.supportsConfigurationDoneRequest.equals(other.supportsConfigurationDoneRequest))
+ return false;
+ if (this.supportsFunctionBreakpoints == null) {
+ if (other.supportsFunctionBreakpoints != null)
+ return false;
+ } else if (!this.supportsFunctionBreakpoints.equals(other.supportsFunctionBreakpoints))
+ return false;
+ if (this.supportsConditionalBreakpoints == null) {
+ if (other.supportsConditionalBreakpoints != null)
+ return false;
+ } else if (!this.supportsConditionalBreakpoints.equals(other.supportsConditionalBreakpoints))
+ return false;
+ if (this.supportsHitConditionalBreakpoints == null) {
+ if (other.supportsHitConditionalBreakpoints != null)
+ return false;
+ } else if (!this.supportsHitConditionalBreakpoints.equals(other.supportsHitConditionalBreakpoints))
+ return false;
+ if (this.supportsEvaluateForHovers == null) {
+ if (other.supportsEvaluateForHovers != null)
+ return false;
+ } else if (!this.supportsEvaluateForHovers.equals(other.supportsEvaluateForHovers))
+ return false;
+ if (this.exceptionBreakpointFilters == null) {
+ if (other.exceptionBreakpointFilters != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.exceptionBreakpointFilters, other.exceptionBreakpointFilters))
+ return false;
+ if (this.supportsStepBack == null) {
+ if (other.supportsStepBack != null)
+ return false;
+ } else if (!this.supportsStepBack.equals(other.supportsStepBack))
+ return false;
+ if (this.supportsSetVariable == null) {
+ if (other.supportsSetVariable != null)
+ return false;
+ } else if (!this.supportsSetVariable.equals(other.supportsSetVariable))
+ return false;
+ if (this.supportsRestartFrame == null) {
+ if (other.supportsRestartFrame != null)
+ return false;
+ } else if (!this.supportsRestartFrame.equals(other.supportsRestartFrame))
+ return false;
+ if (this.supportsGotoTargetsRequest == null) {
+ if (other.supportsGotoTargetsRequest != null)
+ return false;
+ } else if (!this.supportsGotoTargetsRequest.equals(other.supportsGotoTargetsRequest))
+ return false;
+ if (this.supportsStepInTargetsRequest == null) {
+ if (other.supportsStepInTargetsRequest != null)
+ return false;
+ } else if (!this.supportsStepInTargetsRequest.equals(other.supportsStepInTargetsRequest))
+ return false;
+ if (this.supportsCompletionsRequest == null) {
+ if (other.supportsCompletionsRequest != null)
+ return false;
+ } else if (!this.supportsCompletionsRequest.equals(other.supportsCompletionsRequest))
+ return false;
+ if (this.completionTriggerCharacters == null) {
+ if (other.completionTriggerCharacters != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.completionTriggerCharacters, other.completionTriggerCharacters))
+ return false;
+ if (this.supportsModulesRequest == null) {
+ if (other.supportsModulesRequest != null)
+ return false;
+ } else if (!this.supportsModulesRequest.equals(other.supportsModulesRequest))
+ return false;
+ if (this.additionalModuleColumns == null) {
+ if (other.additionalModuleColumns != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.additionalModuleColumns, other.additionalModuleColumns))
+ return false;
+ if (this.supportedChecksumAlgorithms == null) {
+ if (other.supportedChecksumAlgorithms != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.supportedChecksumAlgorithms, other.supportedChecksumAlgorithms))
+ return false;
+ if (this.supportsRestartRequest == null) {
+ if (other.supportsRestartRequest != null)
+ return false;
+ } else if (!this.supportsRestartRequest.equals(other.supportsRestartRequest))
+ return false;
+ if (this.supportsExceptionOptions == null) {
+ if (other.supportsExceptionOptions != null)
+ return false;
+ } else if (!this.supportsExceptionOptions.equals(other.supportsExceptionOptions))
+ return false;
+ if (this.supportsValueFormattingOptions == null) {
+ if (other.supportsValueFormattingOptions != null)
+ return false;
+ } else if (!this.supportsValueFormattingOptions.equals(other.supportsValueFormattingOptions))
+ return false;
+ if (this.supportsExceptionInfoRequest == null) {
+ if (other.supportsExceptionInfoRequest != null)
+ return false;
+ } else if (!this.supportsExceptionInfoRequest.equals(other.supportsExceptionInfoRequest))
+ return false;
+ if (this.supportTerminateDebuggee == null) {
+ if (other.supportTerminateDebuggee != null)
+ return false;
+ } else if (!this.supportTerminateDebuggee.equals(other.supportTerminateDebuggee))
+ return false;
+ if (this.supportsDelayedStackTraceLoading == null) {
+ if (other.supportsDelayedStackTraceLoading != null)
+ return false;
+ } else if (!this.supportsDelayedStackTraceLoading.equals(other.supportsDelayedStackTraceLoading))
+ return false;
+ if (this.supportsLoadedSourcesRequest == null) {
+ if (other.supportsLoadedSourcesRequest != null)
+ return false;
+ } else if (!this.supportsLoadedSourcesRequest.equals(other.supportsLoadedSourcesRequest))
+ return false;
+ if (this.supportsLogPoints == null) {
+ if (other.supportsLogPoints != null)
+ return false;
+ } else if (!this.supportsLogPoints.equals(other.supportsLogPoints))
+ return false;
+ if (this.supportsTerminateThreadsRequest == null) {
+ if (other.supportsTerminateThreadsRequest != null)
+ return false;
+ } else if (!this.supportsTerminateThreadsRequest.equals(other.supportsTerminateThreadsRequest))
+ return false;
+ if (this.supportsSetExpression == null) {
+ if (other.supportsSetExpression != null)
+ return false;
+ } else if (!this.supportsSetExpression.equals(other.supportsSetExpression))
+ return false;
+ if (this.supportsTerminateRequest == null) {
+ if (other.supportsTerminateRequest != null)
+ return false;
+ } else if (!this.supportsTerminateRequest.equals(other.supportsTerminateRequest))
+ return false;
+ if (this.supportsDataBreakpoints == null) {
+ if (other.supportsDataBreakpoints != null)
+ return false;
+ } else if (!this.supportsDataBreakpoints.equals(other.supportsDataBreakpoints))
+ return false;
+ if (this.supportsReadMemoryRequest == null) {
+ if (other.supportsReadMemoryRequest != null)
+ return false;
+ } else if (!this.supportsReadMemoryRequest.equals(other.supportsReadMemoryRequest))
+ return false;
+ if (this.supportsDisassembleRequest == null) {
+ if (other.supportsDisassembleRequest != null)
+ return false;
+ } else if (!this.supportsDisassembleRequest.equals(other.supportsDisassembleRequest))
+ return false;
+ if (this.supportsCancelRequest == null) {
+ if (other.supportsCancelRequest != null)
+ return false;
+ } else if (!this.supportsCancelRequest.equals(other.supportsCancelRequest))
+ return false;
+ if (this.supportsBreakpointLocationsRequest == null) {
+ if (other.supportsBreakpointLocationsRequest != null)
+ return false;
+ } else if (!this.supportsBreakpointLocationsRequest.equals(other.supportsBreakpointLocationsRequest))
+ return false;
+ if (this.supportsClipboardContext == null) {
+ if (other.supportsClipboardContext != null)
+ return false;
+ } else if (!this.supportsClipboardContext.equals(other.supportsClipboardContext))
+ return false;
+ if (this.supportsSteppingGranularity == null) {
+ if (other.supportsSteppingGranularity != null)
+ return false;
+ } else if (!this.supportsSteppingGranularity.equals(other.supportsSteppingGranularity))
+ return false;
+ if (this.supportsInstructionBreakpoints == null) {
+ if (other.supportsInstructionBreakpoints != null)
+ return false;
+ } else if (!this.supportsInstructionBreakpoints.equals(other.supportsInstructionBreakpoints))
+ return false;
+ if (this.supportsExceptionFilterOptions == null) {
+ if (other.supportsExceptionFilterOptions != null)
+ return false;
+ } else if (!this.supportsExceptionFilterOptions.equals(other.supportsExceptionFilterOptions))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.supportsConfigurationDoneRequest== null) ? 0 : this.supportsConfigurationDoneRequest.hashCode());
+ result = prime * result + ((this.supportsFunctionBreakpoints== null) ? 0 : this.supportsFunctionBreakpoints.hashCode());
+ result = prime * result + ((this.supportsConditionalBreakpoints== null) ? 0 : this.supportsConditionalBreakpoints.hashCode());
+ result = prime * result + ((this.supportsHitConditionalBreakpoints== null) ? 0 : this.supportsHitConditionalBreakpoints.hashCode());
+ result = prime * result + ((this.supportsEvaluateForHovers== null) ? 0 : this.supportsEvaluateForHovers.hashCode());
+ result = prime * result + ((this.exceptionBreakpointFilters== null) ? 0 : Arrays.deepHashCode(this.exceptionBreakpointFilters));
+ result = prime * result + ((this.supportsStepBack== null) ? 0 : this.supportsStepBack.hashCode());
+ result = prime * result + ((this.supportsSetVariable== null) ? 0 : this.supportsSetVariable.hashCode());
+ result = prime * result + ((this.supportsRestartFrame== null) ? 0 : this.supportsRestartFrame.hashCode());
+ result = prime * result + ((this.supportsGotoTargetsRequest== null) ? 0 : this.supportsGotoTargetsRequest.hashCode());
+ result = prime * result + ((this.supportsStepInTargetsRequest== null) ? 0 : this.supportsStepInTargetsRequest.hashCode());
+ result = prime * result + ((this.supportsCompletionsRequest== null) ? 0 : this.supportsCompletionsRequest.hashCode());
+ result = prime * result + ((this.completionTriggerCharacters== null) ? 0 : Arrays.deepHashCode(this.completionTriggerCharacters));
+ result = prime * result + ((this.supportsModulesRequest== null) ? 0 : this.supportsModulesRequest.hashCode());
+ result = prime * result + ((this.additionalModuleColumns== null) ? 0 : Arrays.deepHashCode(this.additionalModuleColumns));
+ result = prime * result + ((this.supportedChecksumAlgorithms== null) ? 0 : Arrays.deepHashCode(this.supportedChecksumAlgorithms));
+ result = prime * result + ((this.supportsRestartRequest== null) ? 0 : this.supportsRestartRequest.hashCode());
+ result = prime * result + ((this.supportsExceptionOptions== null) ? 0 : this.supportsExceptionOptions.hashCode());
+ result = prime * result + ((this.supportsValueFormattingOptions== null) ? 0 : this.supportsValueFormattingOptions.hashCode());
+ result = prime * result + ((this.supportsExceptionInfoRequest== null) ? 0 : this.supportsExceptionInfoRequest.hashCode());
+ result = prime * result + ((this.supportTerminateDebuggee== null) ? 0 : this.supportTerminateDebuggee.hashCode());
+ result = prime * result + ((this.supportsDelayedStackTraceLoading== null) ? 0 : this.supportsDelayedStackTraceLoading.hashCode());
+ result = prime * result + ((this.supportsLoadedSourcesRequest== null) ? 0 : this.supportsLoadedSourcesRequest.hashCode());
+ result = prime * result + ((this.supportsLogPoints== null) ? 0 : this.supportsLogPoints.hashCode());
+ result = prime * result + ((this.supportsTerminateThreadsRequest== null) ? 0 : this.supportsTerminateThreadsRequest.hashCode());
+ result = prime * result + ((this.supportsSetExpression== null) ? 0 : this.supportsSetExpression.hashCode());
+ result = prime * result + ((this.supportsTerminateRequest== null) ? 0 : this.supportsTerminateRequest.hashCode());
+ result = prime * result + ((this.supportsDataBreakpoints== null) ? 0 : this.supportsDataBreakpoints.hashCode());
+ result = prime * result + ((this.supportsReadMemoryRequest== null) ? 0 : this.supportsReadMemoryRequest.hashCode());
+ result = prime * result + ((this.supportsDisassembleRequest== null) ? 0 : this.supportsDisassembleRequest.hashCode());
+ result = prime * result + ((this.supportsCancelRequest== null) ? 0 : this.supportsCancelRequest.hashCode());
+ result = prime * result + ((this.supportsBreakpointLocationsRequest== null) ? 0 : this.supportsBreakpointLocationsRequest.hashCode());
+ result = prime * result + ((this.supportsClipboardContext== null) ? 0 : this.supportsClipboardContext.hashCode());
+ result = prime * result + ((this.supportsSteppingGranularity== null) ? 0 : this.supportsSteppingGranularity.hashCode());
+ result = prime * result + ((this.supportsInstructionBreakpoints== null) ? 0 : this.supportsInstructionBreakpoints.hashCode());
+ return prime * result + ((this.supportsExceptionFilterOptions== null) ? 0 : this.supportsExceptionFilterOptions.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/CapabilitiesEventArguments.java b/java/org/eclipse/lsp4j/debug/CapabilitiesEventArguments.java
new file mode 100644
index 0000000..a34eaba
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/CapabilitiesEventArguments.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Capabilities;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that one or more capabilities have changed.
+ * <p>
+ * Since the capabilities are dependent on the frontend and its UI, it might not be possible to change that at
+ * random times (or too late).
+ * <p>
+ * Consequently this event has a hint characteristic: a frontend can only be expected to make a 'best effort' in
+ * honouring individual capabilities but there are no guarantees.
+ * <p>
+ * Only changed capabilities need to be included, all other capabilities keep their values.
+ */
+@SuppressWarnings("all")
+public class CapabilitiesEventArguments {
+ /**
+ * The set of updated capabilities.
+ */
+ @NonNull
+ private Capabilities capabilities;
+
+ /**
+ * The set of updated capabilities.
+ */
+ @Pure
+ @NonNull
+ public Capabilities getCapabilities() {
+ return this.capabilities;
+ }
+
+ /**
+ * The set of updated capabilities.
+ */
+ public void setCapabilities(@NonNull final Capabilities capabilities) {
+ this.capabilities = Preconditions.checkNotNull(capabilities, "capabilities");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("capabilities", this.capabilities);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CapabilitiesEventArguments other = (CapabilitiesEventArguments) obj;
+ if (this.capabilities == null) {
+ if (other.capabilities != null)
+ return false;
+ } else if (!this.capabilities.equals(other.capabilities))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.capabilities== null) ? 0 : this.capabilities.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Checksum.java b/java/org/eclipse/lsp4j/debug/Checksum.java
new file mode 100644
index 0000000..06e1e06
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Checksum.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ChecksumAlgorithm;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The checksum of an item calculated by the specified algorithm.
+ */
+@SuppressWarnings("all")
+public class Checksum {
+ /**
+ * The algorithm used to calculate this checksum.
+ */
+ @NonNull
+ private ChecksumAlgorithm algorithm;
+
+ /**
+ * Value of the checksum.
+ */
+ @NonNull
+ private String checksum;
+
+ /**
+ * The algorithm used to calculate this checksum.
+ */
+ @Pure
+ @NonNull
+ public ChecksumAlgorithm getAlgorithm() {
+ return this.algorithm;
+ }
+
+ /**
+ * The algorithm used to calculate this checksum.
+ */
+ public void setAlgorithm(@NonNull final ChecksumAlgorithm algorithm) {
+ this.algorithm = Preconditions.checkNotNull(algorithm, "algorithm");
+ }
+
+ /**
+ * Value of the checksum.
+ */
+ @Pure
+ @NonNull
+ public String getChecksum() {
+ return this.checksum;
+ }
+
+ /**
+ * Value of the checksum.
+ */
+ public void setChecksum(@NonNull final String checksum) {
+ this.checksum = Preconditions.checkNotNull(checksum, "checksum");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("algorithm", this.algorithm);
+ b.add("checksum", this.checksum);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Checksum other = (Checksum) obj;
+ if (this.algorithm == null) {
+ if (other.algorithm != null)
+ return false;
+ } else if (!this.algorithm.equals(other.algorithm))
+ return false;
+ if (this.checksum == null) {
+ if (other.checksum != null)
+ return false;
+ } else if (!this.checksum.equals(other.checksum))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.algorithm== null) ? 0 : this.algorithm.hashCode());
+ return prime * result + ((this.checksum== null) ? 0 : this.checksum.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ChecksumAlgorithm.java b/java/org/eclipse/lsp4j/debug/ChecksumAlgorithm.java
new file mode 100644
index 0000000..c579542
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ChecksumAlgorithm.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Names of checksum algorithms that may be supported by a debug adapter.
+ */
+@SuppressWarnings("all")
+public enum ChecksumAlgorithm {
+ @SerializedName("MD5")
+ MD5,
+
+ @SerializedName("SHA1")
+ SHA1,
+
+ @SerializedName("SHA256")
+ SHA256,
+
+ TIMESTAMP;
+}
diff --git a/java/org/eclipse/lsp4j/debug/ColumnDescriptor.java b/java/org/eclipse/lsp4j/debug/ColumnDescriptor.java
new file mode 100644
index 0000000..350b118
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ColumnDescriptor.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ColumnDescriptorType;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A ColumnDescriptor specifies what module attribute to show in a column of the ModulesView, how to format it,
+ * <p>
+ * and what the column's label should be.
+ * <p>
+ * It is only used if the underlying UI actually supports this level of customization.
+ */
+@SuppressWarnings("all")
+public class ColumnDescriptor {
+ /**
+ * Name of the attribute rendered in this column.
+ */
+ @NonNull
+ private String attributeName;
+
+ /**
+ * Header UI label of column.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * Format to use for the rendered values in this column. TBD how the format strings looks like.
+ * <p>
+ * This is an optional property.
+ */
+ private String format;
+
+ /**
+ * Datatype of values in this column. Defaults to 'string' if not specified.
+ * <p>
+ * This is an optional property.
+ */
+ private ColumnDescriptorType type;
+
+ /**
+ * Width of this column in characters (hint only).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer width;
+
+ /**
+ * Name of the attribute rendered in this column.
+ */
+ @Pure
+ @NonNull
+ public String getAttributeName() {
+ return this.attributeName;
+ }
+
+ /**
+ * Name of the attribute rendered in this column.
+ */
+ public void setAttributeName(@NonNull final String attributeName) {
+ this.attributeName = Preconditions.checkNotNull(attributeName, "attributeName");
+ }
+
+ /**
+ * Header UI label of column.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * Header UI label of column.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * Format to use for the rendered values in this column. TBD how the format strings looks like.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getFormat() {
+ return this.format;
+ }
+
+ /**
+ * Format to use for the rendered values in this column. TBD how the format strings looks like.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFormat(final String format) {
+ this.format = format;
+ }
+
+ /**
+ * Datatype of values in this column. Defaults to 'string' if not specified.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ColumnDescriptorType getType() {
+ return this.type;
+ }
+
+ /**
+ * Datatype of values in this column. Defaults to 'string' if not specified.
+ * <p>
+ * This is an optional property.
+ */
+ public void setType(final ColumnDescriptorType type) {
+ this.type = type;
+ }
+
+ /**
+ * Width of this column in characters (hint only).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getWidth() {
+ return this.width;
+ }
+
+ /**
+ * Width of this column in characters (hint only).
+ * <p>
+ * This is an optional property.
+ */
+ public void setWidth(final Integer width) {
+ this.width = width;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("attributeName", this.attributeName);
+ b.add("label", this.label);
+ b.add("format", this.format);
+ b.add("type", this.type);
+ b.add("width", this.width);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ColumnDescriptor other = (ColumnDescriptor) obj;
+ if (this.attributeName == null) {
+ if (other.attributeName != null)
+ return false;
+ } else if (!this.attributeName.equals(other.attributeName))
+ return false;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.width == null) {
+ if (other.width != null)
+ return false;
+ } else if (!this.width.equals(other.width))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.attributeName== null) ? 0 : this.attributeName.hashCode());
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ return prime * result + ((this.width== null) ? 0 : this.width.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ColumnDescriptorType.java b/java/org/eclipse/lsp4j/debug/ColumnDescriptorType.java
new file mode 100644
index 0000000..ab83b85
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ColumnDescriptorType.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Datatype of values in this column. Defaults to 'string' if not specified.
+ */
+@SuppressWarnings("all")
+public enum ColumnDescriptorType {
+ STRING,
+
+ NUMBER,
+
+ BOOLEAN,
+
+ @SerializedName("unixTimestampUTC")
+ UNIX_TIMESTAMP_UTC;
+}
diff --git a/java/org/eclipse/lsp4j/debug/CompletionItem.java b/java/org/eclipse/lsp4j/debug/CompletionItem.java
new file mode 100644
index 0000000..2fde17f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/CompletionItem.java
@@ -0,0 +1,353 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.CompletionItemType;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * CompletionItems are the suggestions returned from the CompletionsRequest.
+ */
+@SuppressWarnings("all")
+public class CompletionItem {
+ /**
+ * The label of this completion item. By default this is also the text that is inserted when selecting this
+ * completion.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * If text is not falsy then it is inserted instead of the label.
+ * <p>
+ * This is an optional property.
+ */
+ private String text;
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ * <p>
+ * This is an optional property.
+ */
+ private String sortText;
+
+ /**
+ * The item's type. Typically the client uses this information to render the item in the UI with an icon.
+ * <p>
+ * This is an optional property.
+ */
+ private CompletionItemType type;
+
+ /**
+ * This value determines the location (in the CompletionsRequest's 'text' attribute) where the completion text is
+ * added.
+ * <p>
+ * If missing the text is added at the location specified by the CompletionsRequest's 'column' attribute.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer start;
+
+ /**
+ * This value determines how many characters are overwritten by the completion text.
+ * <p>
+ * If missing the value 0 is assumed which results in the completion text being inserted.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer length;
+
+ /**
+ * Determines the start of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The start position must in the range 0 and length of the completion text.
+ * <p>
+ * If omitted the selection starts at the end of the completion text.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer selectionStart;
+
+ /**
+ * Determines the length of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The selection can not extend beyond the bounds of the completion text.
+ * <p>
+ * If omitted the length is assumed to be 0.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer selectionLength;
+
+ /**
+ * The label of this completion item. By default this is also the text that is inserted when selecting this
+ * completion.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The label of this completion item. By default this is also the text that is inserted when selecting this
+ * completion.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * If text is not falsy then it is inserted instead of the label.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * If text is not falsy then it is inserted instead of the label.
+ * <p>
+ * This is an optional property.
+ */
+ public void setText(final String text) {
+ this.text = text;
+ }
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getSortText() {
+ return this.sortText;
+ }
+
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSortText(final String sortText) {
+ this.sortText = sortText;
+ }
+
+ /**
+ * The item's type. Typically the client uses this information to render the item in the UI with an icon.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public CompletionItemType getType() {
+ return this.type;
+ }
+
+ /**
+ * The item's type. Typically the client uses this information to render the item in the UI with an icon.
+ * <p>
+ * This is an optional property.
+ */
+ public void setType(final CompletionItemType type) {
+ this.type = type;
+ }
+
+ /**
+ * This value determines the location (in the CompletionsRequest's 'text' attribute) where the completion text is
+ * added.
+ * <p>
+ * If missing the text is added at the location specified by the CompletionsRequest's 'column' attribute.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getStart() {
+ return this.start;
+ }
+
+ /**
+ * This value determines the location (in the CompletionsRequest's 'text' attribute) where the completion text is
+ * added.
+ * <p>
+ * If missing the text is added at the location specified by the CompletionsRequest's 'column' attribute.
+ * <p>
+ * This is an optional property.
+ */
+ public void setStart(final Integer start) {
+ this.start = start;
+ }
+
+ /**
+ * This value determines how many characters are overwritten by the completion text.
+ * <p>
+ * If missing the value 0 is assumed which results in the completion text being inserted.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLength() {
+ return this.length;
+ }
+
+ /**
+ * This value determines how many characters are overwritten by the completion text.
+ * <p>
+ * If missing the value 0 is assumed which results in the completion text being inserted.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLength(final Integer length) {
+ this.length = length;
+ }
+
+ /**
+ * Determines the start of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The start position must in the range 0 and length of the completion text.
+ * <p>
+ * If omitted the selection starts at the end of the completion text.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getSelectionStart() {
+ return this.selectionStart;
+ }
+
+ /**
+ * Determines the start of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The start position must in the range 0 and length of the completion text.
+ * <p>
+ * If omitted the selection starts at the end of the completion text.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSelectionStart(final Integer selectionStart) {
+ this.selectionStart = selectionStart;
+ }
+
+ /**
+ * Determines the length of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The selection can not extend beyond the bounds of the completion text.
+ * <p>
+ * If omitted the length is assumed to be 0.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getSelectionLength() {
+ return this.selectionLength;
+ }
+
+ /**
+ * Determines the length of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The selection can not extend beyond the bounds of the completion text.
+ * <p>
+ * If omitted the length is assumed to be 0.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSelectionLength(final Integer selectionLength) {
+ this.selectionLength = selectionLength;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("label", this.label);
+ b.add("text", this.text);
+ b.add("sortText", this.sortText);
+ b.add("type", this.type);
+ b.add("start", this.start);
+ b.add("length", this.length);
+ b.add("selectionStart", this.selectionStart);
+ b.add("selectionLength", this.selectionLength);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionItem other = (CompletionItem) obj;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ if (this.sortText == null) {
+ if (other.sortText != null)
+ return false;
+ } else if (!this.sortText.equals(other.sortText))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.start == null) {
+ if (other.start != null)
+ return false;
+ } else if (!this.start.equals(other.start))
+ return false;
+ if (this.length == null) {
+ if (other.length != null)
+ return false;
+ } else if (!this.length.equals(other.length))
+ return false;
+ if (this.selectionStart == null) {
+ if (other.selectionStart != null)
+ return false;
+ } else if (!this.selectionStart.equals(other.selectionStart))
+ return false;
+ if (this.selectionLength == null) {
+ if (other.selectionLength != null)
+ return false;
+ } else if (!this.selectionLength.equals(other.selectionLength))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ result = prime * result + ((this.sortText== null) ? 0 : this.sortText.hashCode());
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ result = prime * result + ((this.start== null) ? 0 : this.start.hashCode());
+ result = prime * result + ((this.length== null) ? 0 : this.length.hashCode());
+ result = prime * result + ((this.selectionStart== null) ? 0 : this.selectionStart.hashCode());
+ return prime * result + ((this.selectionLength== null) ? 0 : this.selectionLength.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/CompletionItemType.java b/java/org/eclipse/lsp4j/debug/CompletionItemType.java
new file mode 100644
index 0000000..9b47e79
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/CompletionItemType.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Some predefined types for the CompletionItem. Please note that not all clients have specific icons for all of
+ * them.
+ */
+@SuppressWarnings("all")
+public enum CompletionItemType {
+ METHOD,
+
+ FUNCTION,
+
+ CONSTRUCTOR,
+
+ FIELD,
+
+ VARIABLE,
+
+ CLASS,
+
+ INTERFACE,
+
+ MODULE,
+
+ PROPERTY,
+
+ UNIT,
+
+ VALUE,
+
+ ENUM,
+
+ KEYWORD,
+
+ SNIPPET,
+
+ TEXT,
+
+ COLOR,
+
+ FILE,
+
+ REFERENCE,
+
+ CUSTOMCOLOR;
+}
diff --git a/java/org/eclipse/lsp4j/debug/CompletionsArguments.java b/java/org/eclipse/lsp4j/debug/CompletionsArguments.java
new file mode 100644
index 0000000..abb9e5d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/CompletionsArguments.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'completions' request.
+ */
+@SuppressWarnings("all")
+public class CompletionsArguments {
+ /**
+ * Returns completions in the scope of this stack frame. If not specified, the completions are returned for the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer frameId;
+
+ /**
+ * One or more source lines. Typically this is the text a user has typed into the debug console before he asked
+ * for completion.
+ */
+ @NonNull
+ private String text;
+
+ /**
+ * The character position for which to determine the completion proposals.
+ */
+ private int column;
+
+ /**
+ * An optional line for which to determine the completion proposals. If missing the first line of the text is
+ * assumed.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer line;
+
+ /**
+ * Returns completions in the scope of this stack frame. If not specified, the completions are returned for the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getFrameId() {
+ return this.frameId;
+ }
+
+ /**
+ * Returns completions in the scope of this stack frame. If not specified, the completions are returned for the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFrameId(final Integer frameId) {
+ this.frameId = frameId;
+ }
+
+ /**
+ * One or more source lines. Typically this is the text a user has typed into the debug console before he asked
+ * for completion.
+ */
+ @Pure
+ @NonNull
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * One or more source lines. Typically this is the text a user has typed into the debug console before he asked
+ * for completion.
+ */
+ public void setText(@NonNull final String text) {
+ this.text = Preconditions.checkNotNull(text, "text");
+ }
+
+ /**
+ * The character position for which to determine the completion proposals.
+ */
+ @Pure
+ public int getColumn() {
+ return this.column;
+ }
+
+ /**
+ * The character position for which to determine the completion proposals.
+ */
+ public void setColumn(final int column) {
+ this.column = column;
+ }
+
+ /**
+ * An optional line for which to determine the completion proposals. If missing the first line of the text is
+ * assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLine() {
+ return this.line;
+ }
+
+ /**
+ * An optional line for which to determine the completion proposals. If missing the first line of the text is
+ * assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLine(final Integer line) {
+ this.line = line;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("frameId", this.frameId);
+ b.add("text", this.text);
+ b.add("column", this.column);
+ b.add("line", this.line);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionsArguments other = (CompletionsArguments) obj;
+ if (this.frameId == null) {
+ if (other.frameId != null)
+ return false;
+ } else if (!this.frameId.equals(other.frameId))
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ if (other.column != this.column)
+ return false;
+ if (this.line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!this.line.equals(other.line))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.frameId== null) ? 0 : this.frameId.hashCode());
+ result = prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ result = prime * result + this.column;
+ return prime * result + ((this.line== null) ? 0 : this.line.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/CompletionsResponse.java b/java/org/eclipse/lsp4j/debug/CompletionsResponse.java
new file mode 100644
index 0000000..f8e7fcd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/CompletionsResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.CompletionItem;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'completions' request.
+ */
+@SuppressWarnings("all")
+public class CompletionsResponse {
+ /**
+ * The possible completions for .
+ */
+ @NonNull
+ private CompletionItem[] targets;
+
+ /**
+ * The possible completions for .
+ */
+ @Pure
+ @NonNull
+ public CompletionItem[] getTargets() {
+ return this.targets;
+ }
+
+ /**
+ * The possible completions for .
+ */
+ public void setTargets(@NonNull final CompletionItem[] targets) {
+ this.targets = Preconditions.checkNotNull(targets, "targets");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("targets", this.targets);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CompletionsResponse other = (CompletionsResponse) obj;
+ if (this.targets == null) {
+ if (other.targets != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.targets, other.targets))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.targets== null) ? 0 : Arrays.deepHashCode(this.targets));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ConfigurationDoneArguments.java b/java/org/eclipse/lsp4j/debug/ConfigurationDoneArguments.java
new file mode 100644
index 0000000..68a8640
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ConfigurationDoneArguments.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'configurationDone' request.
+ */
+@SuppressWarnings("all")
+public class ConfigurationDoneArguments {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 1;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ContinueArguments.java b/java/org/eclipse/lsp4j/debug/ContinueArguments.java
new file mode 100644
index 0000000..f5528f7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ContinueArguments.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'continue' request.
+ */
+@SuppressWarnings("all")
+public class ContinueArguments {
+ /**
+ * Continue execution for the specified thread (if possible).
+ * <p>
+ * If the backend cannot continue on a single thread but will continue on all threads, it should set the
+ * 'allThreadsContinued' attribute in the response to true.
+ */
+ private int threadId;
+
+ /**
+ * Continue execution for the specified thread (if possible).
+ * <p>
+ * If the backend cannot continue on a single thread but will continue on all threads, it should set the
+ * 'allThreadsContinued' attribute in the response to true.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Continue execution for the specified thread (if possible).
+ * <p>
+ * If the backend cannot continue on a single thread but will continue on all threads, it should set the
+ * 'allThreadsContinued' attribute in the response to true.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ContinueArguments other = (ContinueArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.threadId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ContinueResponse.java b/java/org/eclipse/lsp4j/debug/ContinueResponse.java
new file mode 100644
index 0000000..f48aceb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ContinueResponse.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'continue' request.
+ */
+@SuppressWarnings("all")
+public class ContinueResponse {
+ /**
+ * If true, the 'continue' request has ignored the specified thread and continued all threads instead.
+ * <p>
+ * If this attribute is missing a value of 'true' is assumed for backward compatibility.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean allThreadsContinued;
+
+ /**
+ * If true, the 'continue' request has ignored the specified thread and continued all threads instead.
+ * <p>
+ * If this attribute is missing a value of 'true' is assumed for backward compatibility.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getAllThreadsContinued() {
+ return this.allThreadsContinued;
+ }
+
+ /**
+ * If true, the 'continue' request has ignored the specified thread and continued all threads instead.
+ * <p>
+ * If this attribute is missing a value of 'true' is assumed for backward compatibility.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAllThreadsContinued(final Boolean allThreadsContinued) {
+ this.allThreadsContinued = allThreadsContinued;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("allThreadsContinued", this.allThreadsContinued);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ContinueResponse other = (ContinueResponse) obj;
+ if (this.allThreadsContinued == null) {
+ if (other.allThreadsContinued != null)
+ return false;
+ } else if (!this.allThreadsContinued.equals(other.allThreadsContinued))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.allThreadsContinued== null) ? 0 : this.allThreadsContinued.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ContinuedEventArguments.java b/java/org/eclipse/lsp4j/debug/ContinuedEventArguments.java
new file mode 100644
index 0000000..671aeda
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ContinuedEventArguments.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that the execution of the debuggee has continued.
+ * <p>
+ * Please note: a debug adapter is not expected to send this event in response to a request that implies that
+ * execution continues, e.g. 'launch' or 'continue'.
+ * <p>
+ * It is only necessary to send a 'continued' event if there was no previous request that implied this.
+ */
+@SuppressWarnings("all")
+public class ContinuedEventArguments {
+ /**
+ * The thread which was continued.
+ */
+ private int threadId;
+
+ /**
+ * If 'allThreadsContinued' is true, a debug adapter can announce that all threads have continued.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean allThreadsContinued;
+
+ /**
+ * The thread which was continued.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * The thread which was continued.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * If 'allThreadsContinued' is true, a debug adapter can announce that all threads have continued.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getAllThreadsContinued() {
+ return this.allThreadsContinued;
+ }
+
+ /**
+ * If 'allThreadsContinued' is true, a debug adapter can announce that all threads have continued.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAllThreadsContinued(final Boolean allThreadsContinued) {
+ this.allThreadsContinued = allThreadsContinued;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("allThreadsContinued", this.allThreadsContinued);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ContinuedEventArguments other = (ContinuedEventArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (this.allThreadsContinued == null) {
+ if (other.allThreadsContinued != null)
+ return false;
+ } else if (!this.allThreadsContinued.equals(other.allThreadsContinued))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ return prime * result + ((this.allThreadsContinued== null) ? 0 : this.allThreadsContinued.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DataBreakpoint.java b/java/org/eclipse/lsp4j/debug/DataBreakpoint.java
new file mode 100644
index 0000000..9e796e6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DataBreakpoint.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.DataBreakpointAccessType;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Properties of a data breakpoint passed to the setDataBreakpoints request.
+ */
+@SuppressWarnings("all")
+public class DataBreakpoint {
+ /**
+ * An id representing the data. This id is returned from the dataBreakpointInfo request.
+ */
+ @NonNull
+ private String dataId;
+
+ /**
+ * The access type of the data.
+ * <p>
+ * This is an optional property.
+ */
+ private DataBreakpointAccessType accessType;
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ private String condition;
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * This is an optional property.
+ */
+ private String hitCondition;
+
+ /**
+ * An id representing the data. This id is returned from the dataBreakpointInfo request.
+ */
+ @Pure
+ @NonNull
+ public String getDataId() {
+ return this.dataId;
+ }
+
+ /**
+ * An id representing the data. This id is returned from the dataBreakpointInfo request.
+ */
+ public void setDataId(@NonNull final String dataId) {
+ this.dataId = Preconditions.checkNotNull(dataId, "dataId");
+ }
+
+ /**
+ * The access type of the data.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public DataBreakpointAccessType getAccessType() {
+ return this.accessType;
+ }
+
+ /**
+ * The access type of the data.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAccessType(final DataBreakpointAccessType accessType) {
+ this.accessType = accessType;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getCondition() {
+ return this.condition;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCondition(final String condition) {
+ this.condition = condition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getHitCondition() {
+ return this.hitCondition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setHitCondition(final String hitCondition) {
+ this.hitCondition = hitCondition;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dataId", this.dataId);
+ b.add("accessType", this.accessType);
+ b.add("condition", this.condition);
+ b.add("hitCondition", this.hitCondition);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DataBreakpoint other = (DataBreakpoint) obj;
+ if (this.dataId == null) {
+ if (other.dataId != null)
+ return false;
+ } else if (!this.dataId.equals(other.dataId))
+ return false;
+ if (this.accessType == null) {
+ if (other.accessType != null)
+ return false;
+ } else if (!this.accessType.equals(other.accessType))
+ return false;
+ if (this.condition == null) {
+ if (other.condition != null)
+ return false;
+ } else if (!this.condition.equals(other.condition))
+ return false;
+ if (this.hitCondition == null) {
+ if (other.hitCondition != null)
+ return false;
+ } else if (!this.hitCondition.equals(other.hitCondition))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.dataId== null) ? 0 : this.dataId.hashCode());
+ result = prime * result + ((this.accessType== null) ? 0 : this.accessType.hashCode());
+ result = prime * result + ((this.condition== null) ? 0 : this.condition.hashCode());
+ return prime * result + ((this.hitCondition== null) ? 0 : this.hitCondition.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DataBreakpointAccessType.java b/java/org/eclipse/lsp4j/debug/DataBreakpointAccessType.java
new file mode 100644
index 0000000..4426110
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DataBreakpointAccessType.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * This enumeration defines all possible access types for data breakpoints.
+ */
+@SuppressWarnings("all")
+public enum DataBreakpointAccessType {
+ READ,
+
+ WRITE,
+
+ READ_WRITE;
+}
diff --git a/java/org/eclipse/lsp4j/debug/DataBreakpointInfoArguments.java b/java/org/eclipse/lsp4j/debug/DataBreakpointInfoArguments.java
new file mode 100644
index 0000000..c1866ae
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DataBreakpointInfoArguments.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'dataBreakpointInfo' request.
+ */
+@SuppressWarnings("all")
+public class DataBreakpointInfoArguments {
+ /**
+ * Reference to the Variable container if the data breakpoint is requested for a child of the container.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer variablesReference;
+
+ /**
+ * The name of the Variable's child to obtain data breakpoint information for.
+ * <p>
+ * If variablesReference isn’t provided, this can be an expression.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * Reference to the Variable container if the data breakpoint is requested for a child of the container.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * Reference to the Variable container if the data breakpoint is requested for a child of the container.
+ * <p>
+ * This is an optional property.
+ */
+ public void setVariablesReference(final Integer variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The name of the Variable's child to obtain data breakpoint information for.
+ * <p>
+ * If variablesReference isn’t provided, this can be an expression.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the Variable's child to obtain data breakpoint information for.
+ * <p>
+ * If variablesReference isn’t provided, this can be an expression.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("variablesReference", this.variablesReference);
+ b.add("name", this.name);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DataBreakpointInfoArguments other = (DataBreakpointInfoArguments) obj;
+ if (this.variablesReference == null) {
+ if (other.variablesReference != null)
+ return false;
+ } else if (!this.variablesReference.equals(other.variablesReference))
+ return false;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.variablesReference== null) ? 0 : this.variablesReference.hashCode());
+ return prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DataBreakpointInfoResponse.java b/java/org/eclipse/lsp4j/debug/DataBreakpointInfoResponse.java
new file mode 100644
index 0000000..0ae1e9e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DataBreakpointInfoResponse.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.DataBreakpointAccessType;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'dataBreakpointInfo' request.
+ */
+@SuppressWarnings("all")
+public class DataBreakpointInfoResponse {
+ /**
+ * An identifier for the data on which a data breakpoint can be registered with the setDataBreakpoints request or
+ * null if no data breakpoint is available.
+ */
+ private String dataId;
+
+ /**
+ * UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available.
+ */
+ @NonNull
+ private String description;
+
+ /**
+ * Optional attribute listing the available access types for a potential data breakpoint. A UI frontend could
+ * surface this information.
+ * <p>
+ * This is an optional property.
+ */
+ private DataBreakpointAccessType[] accessTypes;
+
+ /**
+ * Optional attribute indicating that a potential data breakpoint could be persisted across sessions.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean canPersist;
+
+ /**
+ * An identifier for the data on which a data breakpoint can be registered with the setDataBreakpoints request or
+ * null if no data breakpoint is available.
+ */
+ @Pure
+ public String getDataId() {
+ return this.dataId;
+ }
+
+ /**
+ * An identifier for the data on which a data breakpoint can be registered with the setDataBreakpoints request or
+ * null if no data breakpoint is available.
+ */
+ public void setDataId(final String dataId) {
+ this.dataId = dataId;
+ }
+
+ /**
+ * UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available.
+ */
+ @Pure
+ @NonNull
+ public String getDescription() {
+ return this.description;
+ }
+
+ /**
+ * UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available.
+ */
+ public void setDescription(@NonNull final String description) {
+ this.description = Preconditions.checkNotNull(description, "description");
+ }
+
+ /**
+ * Optional attribute listing the available access types for a potential data breakpoint. A UI frontend could
+ * surface this information.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public DataBreakpointAccessType[] getAccessTypes() {
+ return this.accessTypes;
+ }
+
+ /**
+ * Optional attribute listing the available access types for a potential data breakpoint. A UI frontend could
+ * surface this information.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAccessTypes(final DataBreakpointAccessType[] accessTypes) {
+ this.accessTypes = accessTypes;
+ }
+
+ /**
+ * Optional attribute indicating that a potential data breakpoint could be persisted across sessions.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getCanPersist() {
+ return this.canPersist;
+ }
+
+ /**
+ * Optional attribute indicating that a potential data breakpoint could be persisted across sessions.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCanPersist(final Boolean canPersist) {
+ this.canPersist = canPersist;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("dataId", this.dataId);
+ b.add("description", this.description);
+ b.add("accessTypes", this.accessTypes);
+ b.add("canPersist", this.canPersist);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DataBreakpointInfoResponse other = (DataBreakpointInfoResponse) obj;
+ if (this.dataId == null) {
+ if (other.dataId != null)
+ return false;
+ } else if (!this.dataId.equals(other.dataId))
+ return false;
+ if (this.description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!this.description.equals(other.description))
+ return false;
+ if (this.accessTypes == null) {
+ if (other.accessTypes != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.accessTypes, other.accessTypes))
+ return false;
+ if (this.canPersist == null) {
+ if (other.canPersist != null)
+ return false;
+ } else if (!this.canPersist.equals(other.canPersist))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.dataId== null) ? 0 : this.dataId.hashCode());
+ result = prime * result + ((this.description== null) ? 0 : this.description.hashCode());
+ result = prime * result + ((this.accessTypes== null) ? 0 : Arrays.deepHashCode(this.accessTypes));
+ return prime * result + ((this.canPersist== null) ? 0 : this.canPersist.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DebugProtocol.java b/java/org/eclipse/lsp4j/debug/DebugProtocol.java
new file mode 100644
index 0000000..34e8257
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DebugProtocol.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Declaration of parameters, response bodies, and event bodies for
+ * the <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter Protocol</a>
+ */
+@SuppressWarnings("all")
+public class DebugProtocol {
+ /**
+ * Version of Debug Protocol
+ */
+ public static final String SCHEMA_VERSION = "1.44.0";
+}
diff --git a/java/org/eclipse/lsp4j/debug/DebugProtocol.xtend b/java/org/eclipse/lsp4j/debug/DebugProtocol.xtend
new file mode 100644
index 0000000..d150bb3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DebugProtocol.xtend
@@ -0,0 +1,3771 @@
+/******************************************************************************
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j.debug;
+
+import com.google.gson.annotations.SerializedName
+import java.util.Map
+import org.eclipse.lsp4j.generator.JsonRpcData
+import org.eclipse.lsp4j.jsonrpc.messages.Either
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull
+
+/**
+ * Declaration of parameters, response bodies, and event bodies for
+ * the <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter Protocol</a>
+ */
+class DebugProtocol {
+ /**
+ * Version of Debug Protocol
+ */
+ public static final String SCHEMA_VERSION = "1.44.0";
+}
+
+/**
+ * Arguments for 'cancel' request.
+ */
+@JsonRpcData
+class CancelArguments {
+ /**
+ * The ID (attribute 'seq') of the request to cancel. If missing no request is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ Integer requestId;
+ /**
+ * The ID (attribute 'progressId') of the progress to cancel. If missing no progress is cancelled.
+ * <p>
+ * Both a 'requestId' and a 'progressId' can be specified in one request.
+ * <p>
+ * This is an optional property.
+ */
+ String progressId;
+}
+
+/**
+ * The event indicates that the execution of the debuggee has stopped due to some condition.
+ * <p>
+ * This can be caused by a break point previously set, a stepping request has completed, by executing a debugger
+ * statement etc.
+ */
+@JsonRpcData
+class StoppedEventArguments {
+ /**
+ * The reason for the event.
+ * <p>
+ * For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it
+ * must not be translated).
+ * <p>
+ * Possible values include - but not limited to those defined in {@link StoppedEventArgumentsReason}
+ */
+ @NonNull
+ String reason;
+ /**
+ * The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and must be
+ * translated.
+ * <p>
+ * This is an optional property.
+ */
+ String description;
+ /**
+ * The thread which was stopped.
+ * <p>
+ * This is an optional property.
+ */
+ Integer threadId;
+ /**
+ * A value of true hints to the frontend that this event should not change the focus.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean preserveFocusHint;
+ /**
+ * Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown
+ * in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ String text;
+ /**
+ * If 'allThreadsStopped' is true, a debug adapter can announce that all threads have stopped.
+ * <ul>
+ * <li>The client should use this information to enable that all threads can be expanded to access their
+ * stacktraces.</li>
+ * <li>If the attribute is missing or false, only the thread with the given threadId can be expanded.</li>
+ * </ul>
+ * <p>
+ * This is an optional property.
+ */
+ Boolean allThreadsStopped;
+}
+
+/**
+ * The reason for the event.
+ * <p>
+ * For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it
+ * must not be translated).
+ * <p>
+ * Possible values include - but not limited to those defined in {@link StoppedEventArgumentsReason}
+ */
+interface StoppedEventArgumentsReason {
+ public static final String STEP = "step";
+ public static final String BREAKPOINT = "breakpoint";
+ public static final String EXCEPTION = "exception";
+ public static final String PAUSE = "pause";
+ public static final String ENTRY = "entry";
+ public static final String GOTO = "goto";
+ public static final String FUNCTION_BREAKPOINT = "function breakpoint";
+ public static final String DATA_BREAKPOINT = "data breakpoint";
+ public static final String INSTRUCTION_BREAKPOINT = "instruction breakpoint";
+}
+
+/**
+ * The event indicates that the execution of the debuggee has continued.
+ * <p>
+ * Please note: a debug adapter is not expected to send this event in response to a request that implies that
+ * execution continues, e.g. 'launch' or 'continue'.
+ * <p>
+ * It is only necessary to send a 'continued' event if there was no previous request that implied this.
+ */
+@JsonRpcData
+class ContinuedEventArguments {
+ /**
+ * The thread which was continued.
+ */
+ int threadId;
+ /**
+ * If 'allThreadsContinued' is true, a debug adapter can announce that all threads have continued.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean allThreadsContinued;
+}
+
+/**
+ * The event indicates that the debuggee has exited and returns its exit code.
+ */
+@JsonRpcData
+class ExitedEventArguments {
+ /**
+ * The exit code returned from the debuggee.
+ */
+ int exitCode;
+}
+
+/**
+ * The event indicates that debugging of the debuggee has terminated. This does **not** mean that the debuggee
+ * itself has exited.
+ */
+@JsonRpcData
+class TerminatedEventArguments {
+ /**
+ * A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts
+ * the session.
+ * <p>
+ * The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the 'launch'
+ * and 'attach' requests.
+ * <p>
+ * This is an optional property.
+ */
+ Object restart;
+}
+
+/**
+ * The event indicates that a thread has started or exited.
+ */
+@JsonRpcData
+class ThreadEventArguments {
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ThreadEventArgumentsReason}
+ */
+ @NonNull
+ String reason;
+ /**
+ * The identifier of the thread.
+ */
+ int threadId;
+}
+
+/**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ThreadEventArgumentsReason}
+ */
+interface ThreadEventArgumentsReason {
+ public static final String STARTED = "started";
+ public static final String EXITED = "exited";
+}
+
+/**
+ * The event indicates that the target has produced some output.
+ */
+@JsonRpcData
+class OutputEventArguments {
+ /**
+ * The output category. If not specified, 'console' is assumed.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link OutputEventArgumentsCategory}
+ */
+ String category;
+ /**
+ * The output to report.
+ */
+ @NonNull
+ String output;
+ /**
+ * Support for keeping an output log organized by grouping related messages.
+ * <p>
+ * This is an optional property.
+ */
+ OutputEventArgumentsGroup group;
+ /**
+ * If an attribute 'variablesReference' exists and its value is > 0, the output contains objects which can be
+ * retrieved by passing 'variablesReference' to the 'variables' request. The value should be less than or equal to
+ * 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer variablesReference;
+ /**
+ * An optional source location where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ Source source;
+ /**
+ * An optional source location line where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ Integer line;
+ /**
+ * An optional source location column where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * Optional data to report. For the 'telemetry' category the data will be sent to telemetry, for the other
+ * categories the data is shown in JSON format.
+ * <p>
+ * This is an optional property.
+ */
+ Object data;
+}
+
+/**
+ * The output category. If not specified, 'console' is assumed.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link OutputEventArgumentsCategory}
+ */
+interface OutputEventArgumentsCategory {
+ public static final String CONSOLE = "console";
+ public static final String STDOUT = "stdout";
+ public static final String STDERR = "stderr";
+ public static final String TELEMETRY = "telemetry";
+}
+
+/**
+ * Support for keeping an output log organized by grouping related messages.
+ */
+enum OutputEventArgumentsGroup {
+ /**
+ * Start a new group in expanded mode. Subsequent output events are members of the group and should be shown
+ * indented.
+ * The 'output' attribute becomes the name of the group and is not indented.
+ */
+ START,
+ /**
+ * Start a new group in collapsed mode. Subsequent output events are members of the group and should be shown
+ * indented (as soon as the group is expanded).
+ * The 'output' attribute becomes the name of the group and is not
+ * indented.
+ */
+ START_COLLAPSED,
+ /**
+ * End the current group and decreases the indentation of subsequent output events.
+ * A non empty 'output' attribute
+ * is shown as the unindented end of the group.
+ */
+ END
+}
+
+/**
+ * The event indicates that some information about a breakpoint has changed.
+ */
+@JsonRpcData
+class BreakpointEventArguments {
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link BreakpointEventArgumentsReason}
+ */
+ @NonNull
+ String reason;
+ /**
+ * The 'id' attribute is used to find the target breakpoint and the other attributes are used as the new values.
+ */
+ @NonNull
+ Breakpoint breakpoint;
+}
+
+/**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link BreakpointEventArgumentsReason}
+ */
+interface BreakpointEventArgumentsReason {
+ public static final String CHANGED = "changed";
+ public static final String NEW = "new";
+ public static final String REMOVED = "removed";
+}
+
+/**
+ * The event indicates that some information about a module has changed.
+ */
+@JsonRpcData
+class ModuleEventArguments {
+ /**
+ * The reason for the event.
+ */
+ @NonNull
+ ModuleEventArgumentsReason reason;
+ /**
+ * The new, changed, or removed module. In case of 'removed' only the module id is used.
+ */
+ @NonNull
+ Module module;
+}
+
+/**
+ * The reason for the event.
+ */
+enum ModuleEventArgumentsReason {
+ NEW,
+ CHANGED,
+ REMOVED
+}
+
+/**
+ * The event indicates that some source has been added, changed, or removed from the set of all loaded sources.
+ */
+@JsonRpcData
+class LoadedSourceEventArguments {
+ /**
+ * The reason for the event.
+ */
+ @NonNull
+ LoadedSourceEventArgumentsReason reason;
+ /**
+ * The new, changed, or removed source.
+ */
+ @NonNull
+ Source source;
+}
+
+/**
+ * The reason for the event.
+ */
+enum LoadedSourceEventArgumentsReason {
+ NEW,
+ CHANGED,
+ REMOVED
+}
+
+/**
+ * The event indicates that the debugger has begun debugging a new process. Either one that it has launched, or
+ * one that it has attached to.
+ */
+@JsonRpcData
+class ProcessEventArguments {
+ /**
+ * The logical name of the process. This is usually the full path to process's executable file. Example:
+ * /home/example/myproj/program.js.
+ */
+ @NonNull
+ String name;
+ /**
+ * The system process id of the debugged process. This property will be missing for non-system processes.
+ * <p>
+ * This is an optional property.
+ */
+ Integer systemProcessId;
+ /**
+ * If true, the process is running on the same computer as the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean isLocalProcess;
+ /**
+ * Describes how the debug engine started debugging this process.
+ * <p>
+ * This is an optional property.
+ */
+ ProcessEventArgumentsStartMethod startMethod;
+ /**
+ * The size of a pointer or address for this process, in bits. This value may be used by clients when formatting
+ * addresses for display.
+ * <p>
+ * This is an optional property.
+ */
+ Integer pointerSize;
+}
+
+/**
+ * Describes how the debug engine started debugging this process.
+ */
+enum ProcessEventArgumentsStartMethod {
+ /**
+ * Process was launched under the debugger.
+ */
+ LAUNCH,
+ /**
+ * Debugger attached to an existing process.
+ */
+ ATTACH,
+ /**
+ * A project launcher component has launched a new process in a suspended state and then asked the debugger to
+ * attach.
+ */
+ ATTACH_FOR_SUSPENDED_LAUNCH
+}
+
+/**
+ * The event indicates that one or more capabilities have changed.
+ * <p>
+ * Since the capabilities are dependent on the frontend and its UI, it might not be possible to change that at
+ * random times (or too late).
+ * <p>
+ * Consequently this event has a hint characteristic: a frontend can only be expected to make a 'best effort' in
+ * honouring individual capabilities but there are no guarantees.
+ * <p>
+ * Only changed capabilities need to be included, all other capabilities keep their values.
+ */
+@JsonRpcData
+class CapabilitiesEventArguments {
+ /**
+ * The set of updated capabilities.
+ */
+ @NonNull
+ Capabilities capabilities;
+}
+
+/**
+ * The event signals that a long running operation is about to start and
+ * <p>
+ * provides additional information for the client to set up a corresponding progress and cancellation UI.
+ * <p>
+ * The client is free to delay the showing of the UI in order to reduce flicker.
+ * <p>
+ * This event should only be sent if the client has passed the value true for the 'supportsProgressReporting'
+ * capability of the 'initialize' request.
+ */
+@JsonRpcData
+class ProgressStartEventArguments {
+ /**
+ * An ID that must be used in subsequent 'progressUpdate' and 'progressEnd' events to make them refer to the same
+ * progress reporting.
+ * <p>
+ * IDs must be unique within a debug session.
+ */
+ @NonNull
+ String progressId;
+ /**
+ * Mandatory (short) title of the progress reporting. Shown in the UI to describe the long running operation.
+ */
+ @NonNull
+ String title;
+ /**
+ * The request ID that this progress report is related to. If specified a debug adapter is expected to emit
+ * <p>
+ * progress events for the long running request until the request has been either completed or cancelled.
+ * <p>
+ * If the request ID is omitted, the progress report is assumed to be related to some general activity of the
+ * debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ Integer requestId;
+ /**
+ * If true, the request that reports progress may be canceled with a 'cancel' request.
+ * <p>
+ * So this property basically controls whether the client should use UX that supports cancellation.
+ * <p>
+ * Clients that don't support cancellation are allowed to ignore the setting.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean cancellable;
+ /**
+ * Optional, more detailed progress message.
+ * <p>
+ * This is an optional property.
+ */
+ String message;
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ Double percentage;
+}
+
+/**
+ * The event signals that the progress reporting needs to updated with a new message and/or percentage.
+ * <p>
+ * The client does not have to update the UI immediately, but the clients needs to keep track of the message
+ * and/or percentage values.
+ * <p>
+ * This event should only be sent if the client has passed the value true for the 'supportsProgressReporting'
+ * capability of the 'initialize' request.
+ */
+@JsonRpcData
+class ProgressUpdateEventArguments {
+ /**
+ * The ID that was introduced in the initial 'progressStart' event.
+ */
+ @NonNull
+ String progressId;
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ String message;
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ Double percentage;
+}
+
+/**
+ * The event signals the end of the progress reporting with an optional final message.
+ * <p>
+ * This event should only be sent if the client has passed the value true for the 'supportsProgressReporting'
+ * capability of the 'initialize' request.
+ */
+@JsonRpcData
+class ProgressEndEventArguments {
+ /**
+ * The ID that was introduced in the initial 'ProgressStartEvent'.
+ */
+ @NonNull
+ String progressId;
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ String message;
+}
+
+/**
+ * This event signals that some state in the debug adapter has changed and requires that the client needs to
+ * re-render the data snapshot previously requested.
+ * <p>
+ * Debug adapters do not have to emit this event for runtime changes like stopped or thread events because in that
+ * case the client refetches the new state anyway. But the event can be used for example to refresh the UI after
+ * rendering formatting has changed in the debug adapter.
+ * <p>
+ * This event should only be sent if the debug adapter has received a value true for the
+ * 'supportsInvalidatedEvent' capability of the 'initialize' request.
+ */
+@JsonRpcData
+class InvalidatedEventArguments {
+ /**
+ * Optional set of logical areas that got invalidated. This property has a hint characteristic: a client can only
+ * be expected to make a 'best effort' in honouring the areas but there are no guarantees. If this property is
+ * missing, empty, or if values are not understand the client should assume a single value 'all'.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InvalidatedAreas}
+ */
+ String[] areas;
+ /**
+ * If specified, the client only needs to refetch data related to this thread.
+ * <p>
+ * This is an optional property.
+ */
+ Integer threadId;
+ /**
+ * If specified, the client only needs to refetch data related to this stack frame (and the 'threadId' is
+ * ignored).
+ * <p>
+ * This is an optional property.
+ */
+ Integer stackFrameId;
+}
+
+/**
+ * Response to 'runInTerminal' request.
+ */
+@JsonRpcData
+class RunInTerminalResponse {
+ /**
+ * The process ID. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer processId;
+ /**
+ * The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer shellProcessId;
+}
+
+/**
+ * Arguments for 'runInTerminal' request.
+ */
+@JsonRpcData
+class RunInTerminalRequestArguments {
+ /**
+ * What kind of terminal to launch.
+ * <p>
+ * This is an optional property.
+ */
+ RunInTerminalRequestArgumentsKind kind;
+ /**
+ * Optional title of the terminal.
+ * <p>
+ * This is an optional property.
+ */
+ String title;
+ /**
+ * Working directory for the command. For non-empty, valid paths this typically results in execution of a change
+ * directory command.
+ */
+ @NonNull
+ String cwd;
+ /**
+ * List of arguments. The first argument is the command to run.
+ */
+ @NonNull
+ String[] args;
+ /**
+ * Environment key-value pairs that are added to or removed from the default environment.
+ * <p>
+ * This is an optional property.
+ */
+ Map<String, String> env;
+}
+
+/**
+ * What kind of terminal to launch.
+ */
+enum RunInTerminalRequestArgumentsKind {
+ INTEGRATED,
+ EXTERNAL
+}
+
+/**
+ * Arguments for 'initialize' request.
+ */
+@JsonRpcData
+class InitializeRequestArguments {
+ /**
+ * The ID of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ String clientID;
+ /**
+ * The human readable name of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ String clientName;
+ /**
+ * The ID of the debug adapter.
+ */
+ @NonNull
+ String adapterID;
+ /**
+ * The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US or de-CH.
+ * <p>
+ * This is an optional property.
+ */
+ String locale;
+ /**
+ * If true all line numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ Boolean linesStartAt1;
+ /**
+ * If true all column numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ Boolean columnsStartAt1;
+ /**
+ * Determines in what format paths are specified. The default is 'path', which is the native format.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InitializeRequestArgumentsPathFormat}
+ */
+ String pathFormat;
+ /**
+ * Client supports the optional type attribute for variables.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsVariableType;
+ /**
+ * Client supports the paging of variables.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsVariablePaging;
+ /**
+ * Client supports the runInTerminal request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsRunInTerminalRequest;
+ /**
+ * Client supports memory references.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsMemoryReferences;
+ /**
+ * Client supports progress reporting.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsProgressReporting;
+ /**
+ * Client supports the invalidated event.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsInvalidatedEvent;
+}
+
+/**
+ * Determines in what format paths are specified. The default is 'path', which is the native format.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InitializeRequestArgumentsPathFormat}
+ */
+interface InitializeRequestArgumentsPathFormat {
+ public static final String PATH = "path";
+ public static final String URI = "uri";
+}
+
+/**
+ * Arguments for 'configurationDone' request.
+ */
+@JsonRpcData
+class ConfigurationDoneArguments {
+}
+
+/**
+ * Arguments for 'launch' request. Additional attributes are implementation specific.
+ */
+@JsonRpcData
+class LaunchRequestArguments {
+ /**
+ * If noDebug is true the launch request should launch the program without enabling debugging.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean noDebug;
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ Object __restart;
+}
+
+/**
+ * Arguments for 'attach' request. Additional attributes are implementation specific.
+ */
+@JsonRpcData
+class AttachRequestArguments {
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ Object __restart;
+}
+
+/**
+ * Arguments for 'restart' request.
+ */
+@JsonRpcData
+class RestartArguments {
+}
+
+/**
+ * Arguments for 'disconnect' request.
+ */
+@JsonRpcData
+class DisconnectArguments {
+ /**
+ * A value of true indicates that this 'disconnect' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean restart;
+ /**
+ * Indicates whether the debuggee should be terminated when the debugger is disconnected.
+ * <p>
+ * If unspecified, the debug adapter is free to do whatever it thinks is best.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportTerminateDebuggee' is true.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean terminateDebuggee;
+}
+
+/**
+ * Arguments for 'terminate' request.
+ */
+@JsonRpcData
+class TerminateArguments {
+ /**
+ * A value of true indicates that this 'terminate' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean restart;
+}
+
+/**
+ * Response to 'breakpointLocations' request.
+ * <p>
+ * Contains possible locations for source breakpoints.
+ */
+@JsonRpcData
+class BreakpointLocationsResponse {
+ /**
+ * Sorted set of possible breakpoint locations.
+ */
+ @NonNull
+ BreakpointLocation[] breakpoints;
+}
+
+/**
+ * Arguments for 'breakpointLocations' request.
+ */
+@JsonRpcData
+class BreakpointLocationsArguments {
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ @NonNull
+ Source source;
+ /**
+ * Start line of range to search possible breakpoint locations in. If only the line is specified, the request
+ * returns all possible locations in that line.
+ */
+ int line;
+ /**
+ * Optional start column of range to search possible breakpoint locations in. If no start column is given, the
+ * first column in the start line is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * Optional end line of range to search possible breakpoint locations in. If no end line is given, then the end
+ * line is assumed to be the start line.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * Optional end column of range to search possible breakpoint locations in. If no end column is given, then it is
+ * assumed to be in the last column of the end line.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+}
+
+/**
+ * Response to 'setBreakpoints' request.
+ * <p>
+ * Returned is information about each breakpoint created by this request.
+ * <p>
+ * This includes the actual code location and whether the breakpoint could be verified.
+ * <p>
+ * The breakpoints returned are in the same order as the elements of the 'breakpoints'
+ * <p>
+ * (or the deprecated 'lines') array in the arguments.
+ */
+@JsonRpcData
+class SetBreakpointsResponse {
+ /**
+ * Information about the breakpoints.
+ * <p>
+ * The array elements are in the same order as the elements of the 'breakpoints' (or the deprecated 'lines') array
+ * in the arguments.
+ */
+ @NonNull
+ Breakpoint[] breakpoints;
+}
+
+/**
+ * Arguments for 'setBreakpoints' request.
+ */
+@JsonRpcData
+class SetBreakpointsArguments {
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ @NonNull
+ Source source;
+ /**
+ * The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ SourceBreakpoint[] breakpoints;
+ /**
+ * Deprecated: The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * @deprecated Use the line field in the breakpoints property instead.
+ */
+ @Deprecated
+ int[] lines;
+ /**
+ * A value of true indicates that the underlying source has been modified which results in new breakpoint
+ * locations.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean sourceModified;
+}
+
+/**
+ * Response to 'setFunctionBreakpoints' request.
+ * <p>
+ * Returned is information about each breakpoint created by this request.
+ */
+@JsonRpcData
+class SetFunctionBreakpointsResponse {
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ @NonNull
+ Breakpoint[] breakpoints;
+}
+
+/**
+ * Arguments for 'setFunctionBreakpoints' request.
+ */
+@JsonRpcData
+class SetFunctionBreakpointsArguments {
+ /**
+ * The function names of the breakpoints.
+ */
+ @NonNull
+ FunctionBreakpoint[] breakpoints;
+}
+
+/**
+ * Arguments for 'setExceptionBreakpoints' request.
+ */
+@JsonRpcData
+class SetExceptionBreakpointsArguments {
+ /**
+ * Set of exception filters specified by their ID. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. The 'filter' and 'filterOptions' sets are additive.
+ */
+ @NonNull
+ String[] filters;
+ /**
+ * Set of exception filters and their options. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. This attribute is only honored by a debug adapter if the capability
+ * 'supportsExceptionFilterOptions' is true. The 'filter' and 'filterOptions' sets are additive.
+ * <p>
+ * This is an optional property.
+ */
+ ExceptionFilterOptions[] filterOptions;
+ /**
+ * Configuration options for selected exceptions.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsExceptionOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ ExceptionOptions[] exceptionOptions;
+}
+
+/**
+ * Response to 'dataBreakpointInfo' request.
+ */
+@JsonRpcData
+class DataBreakpointInfoResponse {
+ /**
+ * An identifier for the data on which a data breakpoint can be registered with the setDataBreakpoints request or
+ * null if no data breakpoint is available.
+ */
+ String dataId;
+ /**
+ * UI string that describes on what data the breakpoint is set on or why a data breakpoint is not available.
+ */
+ @NonNull
+ String description;
+ /**
+ * Optional attribute listing the available access types for a potential data breakpoint. A UI frontend could
+ * surface this information.
+ * <p>
+ * This is an optional property.
+ */
+ DataBreakpointAccessType[] accessTypes;
+ /**
+ * Optional attribute indicating that a potential data breakpoint could be persisted across sessions.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean canPersist;
+}
+
+/**
+ * Arguments for 'dataBreakpointInfo' request.
+ */
+@JsonRpcData
+class DataBreakpointInfoArguments {
+ /**
+ * Reference to the Variable container if the data breakpoint is requested for a child of the container.
+ * <p>
+ * This is an optional property.
+ */
+ Integer variablesReference;
+ /**
+ * The name of the Variable's child to obtain data breakpoint information for.
+ * <p>
+ * If variablesReference isn’t provided, this can be an expression.
+ */
+ @NonNull
+ String name;
+}
+
+/**
+ * Response to 'setDataBreakpoints' request.
+ * <p>
+ * Returned is information about each breakpoint created by this request.
+ */
+@JsonRpcData
+class SetDataBreakpointsResponse {
+ /**
+ * Information about the data breakpoints. The array elements correspond to the elements of the input argument
+ * 'breakpoints' array.
+ */
+ @NonNull
+ Breakpoint[] breakpoints;
+}
+
+/**
+ * Arguments for 'setDataBreakpoints' request.
+ */
+@JsonRpcData
+class SetDataBreakpointsArguments {
+ /**
+ * The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints.
+ */
+ @NonNull
+ DataBreakpoint[] breakpoints;
+}
+
+/**
+ * Response to 'setInstructionBreakpoints' request
+ */
+@JsonRpcData
+class SetInstructionBreakpointsResponse {
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ @NonNull
+ Breakpoint[] breakpoints;
+}
+
+/**
+ * Arguments for 'setInstructionBreakpoints' request
+ */
+@JsonRpcData
+class SetInstructionBreakpointsArguments {
+ /**
+ * The instruction references of the breakpoints
+ */
+ @NonNull
+ InstructionBreakpoint[] breakpoints;
+}
+
+/**
+ * Response to 'continue' request.
+ */
+@JsonRpcData
+class ContinueResponse {
+ /**
+ * If true, the 'continue' request has ignored the specified thread and continued all threads instead.
+ * <p>
+ * If this attribute is missing a value of 'true' is assumed for backward compatibility.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean allThreadsContinued;
+}
+
+/**
+ * Arguments for 'continue' request.
+ */
+@JsonRpcData
+class ContinueArguments {
+ /**
+ * Continue execution for the specified thread (if possible).
+ * <p>
+ * If the backend cannot continue on a single thread but will continue on all threads, it should set the
+ * 'allThreadsContinued' attribute in the response to true.
+ */
+ int threadId;
+}
+
+/**
+ * Arguments for 'next' request.
+ */
+@JsonRpcData
+class NextArguments {
+ /**
+ * Execute 'next' for this thread.
+ */
+ int threadId;
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ SteppingGranularity granularity;
+}
+
+/**
+ * Arguments for 'stepIn' request.
+ */
+@JsonRpcData
+class StepInArguments {
+ /**
+ * Execute 'stepIn' for this thread.
+ */
+ int threadId;
+ /**
+ * Optional id of the target to step into.
+ * <p>
+ * This is an optional property.
+ */
+ Integer targetId;
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ SteppingGranularity granularity;
+}
+
+/**
+ * Arguments for 'stepOut' request.
+ */
+@JsonRpcData
+class StepOutArguments {
+ /**
+ * Execute 'stepOut' for this thread.
+ */
+ int threadId;
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ SteppingGranularity granularity;
+}
+
+/**
+ * Arguments for 'stepBack' request.
+ */
+@JsonRpcData
+class StepBackArguments {
+ /**
+ * Execute 'stepBack' for this thread.
+ */
+ int threadId;
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ SteppingGranularity granularity;
+}
+
+/**
+ * Arguments for 'reverseContinue' request.
+ */
+@JsonRpcData
+class ReverseContinueArguments {
+ /**
+ * Execute 'reverseContinue' for this thread.
+ */
+ int threadId;
+}
+
+/**
+ * Arguments for 'restartFrame' request.
+ */
+@JsonRpcData
+class RestartFrameArguments {
+ /**
+ * Restart this stackframe.
+ */
+ int frameId;
+}
+
+/**
+ * Arguments for 'goto' request.
+ */
+@JsonRpcData
+class GotoArguments {
+ /**
+ * Set the goto target for this thread.
+ */
+ int threadId;
+ /**
+ * The location where the debuggee will continue to run.
+ */
+ int targetId;
+}
+
+/**
+ * Arguments for 'pause' request.
+ */
+@JsonRpcData
+class PauseArguments {
+ /**
+ * Pause execution for this thread.
+ */
+ int threadId;
+}
+
+/**
+ * Response to 'stackTrace' request.
+ */
+@JsonRpcData
+class StackTraceResponse {
+ /**
+ * The frames of the stackframe. If the array has length zero, there are no stackframes available.
+ * <p>
+ * This means that there is no location information available.
+ */
+ @NonNull
+ StackFrame[] stackFrames;
+ /**
+ * The total number of frames available in the stack. If omitted or if totalFrames is larger than the available
+ * frames, a client is expected to request frames until a request returns less frames than requested (which
+ * indicates the end of the stack). Returning monotonically increasing totalFrames values for subsequent requests
+ * can be used to enforce paging in the client.
+ * <p>
+ * This is an optional property.
+ */
+ Integer totalFrames;
+}
+
+/**
+ * Arguments for 'stackTrace' request.
+ */
+@JsonRpcData
+class StackTraceArguments {
+ /**
+ * Retrieve the stacktrace for this thread.
+ */
+ int threadId;
+ /**
+ * The index of the first frame to return; if omitted frames start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ Integer startFrame;
+ /**
+ * The maximum number of frames to return. If levels is not specified or 0, all frames are returned.
+ * <p>
+ * This is an optional property.
+ */
+ Integer levels;
+ /**
+ * Specifies details on how to format the stack frames.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ StackFrameFormat format;
+}
+
+/**
+ * Response to 'scopes' request.
+ */
+@JsonRpcData
+class ScopesResponse {
+ /**
+ * The scopes of the stackframe. If the array has length zero, there are no scopes available.
+ */
+ @NonNull
+ Scope[] scopes;
+}
+
+/**
+ * Arguments for 'scopes' request.
+ */
+@JsonRpcData
+class ScopesArguments {
+ /**
+ * Retrieve the scopes for this stackframe.
+ */
+ int frameId;
+}
+
+/**
+ * Response to 'variables' request.
+ */
+@JsonRpcData
+class VariablesResponse {
+ /**
+ * All (or a range) of variables for the given variable reference.
+ */
+ @NonNull
+ Variable[] variables;
+}
+
+/**
+ * Arguments for 'variables' request.
+ */
+@JsonRpcData
+class VariablesArguments {
+ /**
+ * The Variable reference.
+ */
+ int variablesReference;
+ /**
+ * Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched.
+ * <p>
+ * This is an optional property.
+ */
+ VariablesArgumentsFilter filter;
+ /**
+ * The index of the first variable to return; if omitted children start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ Integer start;
+ /**
+ * The number of variables to return. If count is missing or 0, all variables are returned.
+ * <p>
+ * This is an optional property.
+ */
+ Integer count;
+ /**
+ * Specifies details on how to format the Variable values.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ ValueFormat format;
+}
+
+/**
+ * Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched.
+ */
+enum VariablesArgumentsFilter {
+ INDEXED,
+ NAMED
+}
+
+/**
+ * Response to 'setVariable' request.
+ */
+@JsonRpcData
+class SetVariableResponse {
+ /**
+ * The new value of the variable.
+ */
+ @NonNull
+ String value;
+ /**
+ * The type of the new value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This is an optional property.
+ */
+ String type;
+ /**
+ * If variablesReference is > 0, the new value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer variablesReference;
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer namedVariables;
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer indexedVariables;
+}
+
+/**
+ * Arguments for 'setVariable' request.
+ */
+@JsonRpcData
+class SetVariableArguments {
+ /**
+ * The reference of the variable container.
+ */
+ int variablesReference;
+ /**
+ * The name of the variable in the container.
+ */
+ @NonNull
+ String name;
+ /**
+ * The value of the variable.
+ */
+ @NonNull
+ String value;
+ /**
+ * Specifies details on how to format the response value.
+ * <p>
+ * This is an optional property.
+ */
+ ValueFormat format;
+}
+
+/**
+ * Response to 'source' request.
+ */
+@JsonRpcData
+class SourceResponse {
+ /**
+ * Content of the source reference.
+ */
+ @NonNull
+ String content;
+ /**
+ * Optional content type (mime type) of the source.
+ * <p>
+ * This is an optional property.
+ */
+ String mimeType;
+}
+
+/**
+ * Arguments for 'source' request.
+ */
+@JsonRpcData
+class SourceArguments {
+ /**
+ * Specifies the source content to load. Either source.path or source.sourceReference must be specified.
+ * <p>
+ * This is an optional property.
+ */
+ Source source;
+ /**
+ * The reference to the source. This is the same as source.sourceReference.
+ * <p>
+ * This is provided for backward compatibility since old backends do not understand the 'source' attribute.
+ */
+ int sourceReference;
+}
+
+/**
+ * Response to 'threads' request.
+ */
+@JsonRpcData
+class ThreadsResponse {
+ /**
+ * All threads.
+ */
+ @NonNull
+ Thread[] threads;
+}
+
+/**
+ * Arguments for 'terminateThreads' request.
+ */
+@JsonRpcData
+class TerminateThreadsArguments {
+ /**
+ * Ids of threads to be terminated.
+ * <p>
+ * This is an optional property.
+ */
+ int[] threadIds;
+}
+
+/**
+ * Response to 'modules' request.
+ */
+@JsonRpcData
+class ModulesResponse {
+ /**
+ * All modules or range of modules.
+ */
+ @NonNull
+ Module[] modules;
+ /**
+ * The total number of modules available.
+ * <p>
+ * This is an optional property.
+ */
+ Integer totalModules;
+}
+
+/**
+ * Arguments for 'modules' request.
+ */
+@JsonRpcData
+class ModulesArguments {
+ /**
+ * The index of the first module to return; if omitted modules start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ Integer startModule;
+ /**
+ * The number of modules to return. If moduleCount is not specified or 0, all modules are returned.
+ * <p>
+ * This is an optional property.
+ */
+ Integer moduleCount;
+}
+
+/**
+ * Response to 'loadedSources' request.
+ */
+@JsonRpcData
+class LoadedSourcesResponse {
+ /**
+ * Set of loaded sources.
+ */
+ @NonNull
+ Source[] sources;
+}
+
+/**
+ * Arguments for 'loadedSources' request.
+ */
+@JsonRpcData
+class LoadedSourcesArguments {
+}
+
+/**
+ * Response to 'evaluate' request.
+ */
+@JsonRpcData
+class EvaluateResponse {
+ /**
+ * The result of the evaluate request.
+ */
+ @NonNull
+ String result;
+ /**
+ * The optional type of the evaluate result.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ String type;
+ /**
+ * Properties of a evaluate result that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ VariablePresentationHint presentationHint;
+ /**
+ * If variablesReference is > 0, the evaluate result is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ */
+ int variablesReference;
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer namedVariables;
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer indexedVariables;
+ /**
+ * Optional memory reference to a location appropriate for this result.
+ * <p>
+ * For pointer type eval results, this is generally a reference to the memory address contained in the pointer.
+ * <p>
+ * This attribute should be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsMemoryReferences' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ String memoryReference;
+}
+
+/**
+ * Arguments for 'evaluate' request.
+ */
+@JsonRpcData
+class EvaluateArguments {
+ /**
+ * The expression to evaluate.
+ */
+ @NonNull
+ String expression;
+ /**
+ * Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer frameId;
+ /**
+ * The context in which the evaluate request is run.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link EvaluateArgumentsContext}
+ */
+ String context;
+ /**
+ * Specifies details on how to format the Evaluate result.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ ValueFormat format;
+}
+
+/**
+ * The context in which the evaluate request is run.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link EvaluateArgumentsContext}
+ */
+interface EvaluateArgumentsContext {
+ /**
+ * evaluate is run in a watch.
+ */
+ public static final String WATCH = "watch";
+ /**
+ * evaluate is run from REPL console.
+ */
+ public static final String REPL = "repl";
+ /**
+ * evaluate is run from a data hover.
+ */
+ public static final String HOVER = "hover";
+ /**
+ * evaluate is run to generate the value that will be stored in the clipboard.
+ * The attribute is only honored by a
+ * debug adapter if the capability 'supportsClipboardContext' is true.
+ */
+ public static final String CLIPBOARD = "clipboard";
+}
+
+/**
+ * Response to 'setExpression' request.
+ */
+@JsonRpcData
+class SetExpressionResponse {
+ /**
+ * The new value of the expression.
+ */
+ @NonNull
+ String value;
+ /**
+ * The optional type of the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ String type;
+ /**
+ * Properties of a value that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ VariablePresentationHint presentationHint;
+ /**
+ * If variablesReference is > 0, the value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer variablesReference;
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer namedVariables;
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer indexedVariables;
+}
+
+/**
+ * Arguments for 'setExpression' request.
+ */
+@JsonRpcData
+class SetExpressionArguments {
+ /**
+ * The l-value expression to assign to.
+ */
+ @NonNull
+ String expression;
+ /**
+ * The value expression to assign to the l-value expression.
+ */
+ @NonNull
+ String value;
+ /**
+ * Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in
+ * the global scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer frameId;
+ /**
+ * Specifies how the resulting value should be formatted.
+ * <p>
+ * This is an optional property.
+ */
+ ValueFormat format;
+}
+
+/**
+ * Response to 'stepInTargets' request.
+ */
+@JsonRpcData
+class StepInTargetsResponse {
+ /**
+ * The possible stepIn targets of the specified source location.
+ */
+ @NonNull
+ StepInTarget[] targets;
+}
+
+/**
+ * Arguments for 'stepInTargets' request.
+ */
+@JsonRpcData
+class StepInTargetsArguments {
+ /**
+ * The stack frame for which to retrieve the possible stepIn targets.
+ */
+ int frameId;
+}
+
+/**
+ * Response to 'gotoTargets' request.
+ */
+@JsonRpcData
+class GotoTargetsResponse {
+ /**
+ * The possible goto targets of the specified location.
+ */
+ @NonNull
+ GotoTarget[] targets;
+}
+
+/**
+ * Arguments for 'gotoTargets' request.
+ */
+@JsonRpcData
+class GotoTargetsArguments {
+ /**
+ * The source location for which the goto targets are determined.
+ */
+ @NonNull
+ Source source;
+ /**
+ * The line location for which the goto targets are determined.
+ */
+ int line;
+ /**
+ * An optional column location for which the goto targets are determined.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+}
+
+/**
+ * Response to 'completions' request.
+ */
+@JsonRpcData
+class CompletionsResponse {
+ /**
+ * The possible completions for .
+ */
+ @NonNull
+ CompletionItem[] targets;
+}
+
+/**
+ * Arguments for 'completions' request.
+ */
+@JsonRpcData
+class CompletionsArguments {
+ /**
+ * Returns completions in the scope of this stack frame. If not specified, the completions are returned for the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer frameId;
+ /**
+ * One or more source lines. Typically this is the text a user has typed into the debug console before he asked
+ * for completion.
+ */
+ @NonNull
+ String text;
+ /**
+ * The character position for which to determine the completion proposals.
+ */
+ int column;
+ /**
+ * An optional line for which to determine the completion proposals. If missing the first line of the text is
+ * assumed.
+ * <p>
+ * This is an optional property.
+ */
+ Integer line;
+}
+
+/**
+ * Response to 'exceptionInfo' request.
+ */
+@JsonRpcData
+class ExceptionInfoResponse {
+ /**
+ * ID of the exception that was thrown.
+ */
+ @NonNull
+ String exceptionId;
+ /**
+ * Descriptive text for the exception provided by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ String description;
+ /**
+ * Mode that caused the exception notification to be raised.
+ */
+ @NonNull
+ ExceptionBreakMode breakMode;
+ /**
+ * Detailed information about the exception.
+ * <p>
+ * This is an optional property.
+ */
+ ExceptionDetails details;
+}
+
+/**
+ * Arguments for 'exceptionInfo' request.
+ */
+@JsonRpcData
+class ExceptionInfoArguments {
+ /**
+ * Thread for which exception information should be retrieved.
+ */
+ int threadId;
+}
+
+/**
+ * Response to 'readMemory' request.
+ */
+@JsonRpcData
+class ReadMemoryResponse {
+ /**
+ * The address of the first byte of data returned.
+ * <p>
+ * Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ @NonNull
+ String address;
+ /**
+ * The number of unreadable bytes encountered after the last successfully read byte.
+ * <p>
+ * This can be used to determine the number of bytes that must be skipped before a subsequent 'readMemory' request
+ * will succeed.
+ * <p>
+ * This is an optional property.
+ */
+ Integer unreadableBytes;
+ /**
+ * The bytes read from memory, encoded using base64.
+ * <p>
+ * This is an optional property.
+ */
+ String data;
+}
+
+/**
+ * Arguments for 'readMemory' request.
+ */
+@JsonRpcData
+class ReadMemoryArguments {
+ /**
+ * Memory reference to the base location from which data should be read.
+ */
+ @NonNull
+ String memoryReference;
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before reading data. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ Integer offset;
+ /**
+ * Number of bytes to read at the specified location and offset.
+ */
+ int count;
+}
+
+/**
+ * Response to 'disassemble' request.
+ */
+@JsonRpcData
+class DisassembleResponse {
+ /**
+ * The list of disassembled instructions.
+ */
+ @NonNull
+ DisassembledInstruction[] instructions;
+}
+
+/**
+ * Arguments for 'disassemble' request.
+ */
+@JsonRpcData
+class DisassembleArguments {
+ /**
+ * Memory reference to the base location containing the instructions to disassemble.
+ */
+ @NonNull
+ String memoryReference;
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before disassembling. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ Integer offset;
+ /**
+ * Optional offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be
+ * negative.
+ * <p>
+ * This is an optional property.
+ */
+ Integer instructionOffset;
+ /**
+ * Number of instructions to disassemble starting at the specified location and offset.
+ * <p>
+ * An adapter must return exactly this number of instructions - any unavailable instructions should be replaced
+ * with an implementation-defined 'invalid instruction' value.
+ */
+ int instructionCount;
+ /**
+ * If true, the adapter should attempt to resolve memory addresses and other values to symbolic names.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean resolveSymbols;
+}
+
+/**
+ * Information about the capabilities of a debug adapter.
+ */
+@JsonRpcData
+class Capabilities {
+ /**
+ * The debug adapter supports the 'configurationDone' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsConfigurationDoneRequest;
+ /**
+ * The debug adapter supports function breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsFunctionBreakpoints;
+ /**
+ * The debug adapter supports conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsConditionalBreakpoints;
+ /**
+ * The debug adapter supports breakpoints that break execution after a specified number of hits.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsHitConditionalBreakpoints;
+ /**
+ * The debug adapter supports a (side effect free) evaluate request for data hovers.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsEvaluateForHovers;
+ /**
+ * Available exception filter options for the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ ExceptionBreakpointsFilter[] exceptionBreakpointFilters;
+ /**
+ * The debug adapter supports stepping back via the 'stepBack' and 'reverseContinue' requests.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsStepBack;
+ /**
+ * The debug adapter supports setting a variable to a value.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsSetVariable;
+ /**
+ * The debug adapter supports restarting a frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsRestartFrame;
+ /**
+ * The debug adapter supports the 'gotoTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsGotoTargetsRequest;
+ /**
+ * The debug adapter supports the 'stepInTargets' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsStepInTargetsRequest;
+ /**
+ * The debug adapter supports the 'completions' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsCompletionsRequest;
+ /**
+ * The set of characters that should trigger completion in a REPL. If not specified, the UI should assume the '.'
+ * character.
+ * <p>
+ * This is an optional property.
+ */
+ String[] completionTriggerCharacters;
+ /**
+ * The debug adapter supports the 'modules' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsModulesRequest;
+ /**
+ * The set of additional module information exposed by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ ColumnDescriptor[] additionalModuleColumns;
+ /**
+ * Checksum algorithms supported by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ ChecksumAlgorithm[] supportedChecksumAlgorithms;
+ /**
+ * The debug adapter supports the 'restart' request. In this case a client should not implement 'restart' by
+ * terminating and relaunching the adapter but by calling the RestartRequest.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsRestartRequest;
+ /**
+ * The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsExceptionOptions;
+ /**
+ * The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and
+ * evaluateRequest.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsValueFormattingOptions;
+ /**
+ * The debug adapter supports the 'exceptionInfo' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsExceptionInfoRequest;
+ /**
+ * The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportTerminateDebuggee;
+ /**
+ * The debug adapter supports the delayed loading of parts of the stack, which requires that both the 'startFrame'
+ * and 'levels' arguments and an optional 'totalFrames' result of the 'StackTrace' request are supported.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsDelayedStackTraceLoading;
+ /**
+ * The debug adapter supports the 'loadedSources' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsLoadedSourcesRequest;
+ /**
+ * The debug adapter supports logpoints by interpreting the 'logMessage' attribute of the SourceBreakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsLogPoints;
+ /**
+ * The debug adapter supports the 'terminateThreads' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsTerminateThreadsRequest;
+ /**
+ * The debug adapter supports the 'setExpression' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsSetExpression;
+ /**
+ * The debug adapter supports the 'terminate' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsTerminateRequest;
+ /**
+ * The debug adapter supports data breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsDataBreakpoints;
+ /**
+ * The debug adapter supports the 'readMemory' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsReadMemoryRequest;
+ /**
+ * The debug adapter supports the 'disassemble' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsDisassembleRequest;
+ /**
+ * The debug adapter supports the 'cancel' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsCancelRequest;
+ /**
+ * The debug adapter supports the 'breakpointLocations' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsBreakpointLocationsRequest;
+ /**
+ * The debug adapter supports the 'clipboard' context value in the 'evaluate' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsClipboardContext;
+ /**
+ * The debug adapter supports stepping granularities (argument 'granularity') for the stepping requests.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsSteppingGranularity;
+ /**
+ * The debug adapter supports adding breakpoints based on instruction references.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsInstructionBreakpoints;
+ /**
+ * The debug adapter supports 'filterOptions' as an argument on the 'setExceptionBreakpoints' request.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsExceptionFilterOptions;
+}
+
+/**
+ * An ExceptionBreakpointsFilter is shown in the UI as an filter option for configuring how exceptions are dealt
+ * with.
+ */
+@JsonRpcData
+class ExceptionBreakpointsFilter {
+ /**
+ * The internal ID of the filter option. This value is passed to the 'setExceptionBreakpoints' request.
+ */
+ @NonNull
+ String filter;
+ /**
+ * The name of the filter option. This will be shown in the UI.
+ */
+ @NonNull
+ String label;
+ /**
+ * Initial value of the filter option. If not specified a value 'false' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @SerializedName(value="default")
+ Boolean default_;
+ /**
+ * Controls whether a condition can be specified for this filter option. If false or missing, a condition can not
+ * be set.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean supportsCondition;
+}
+
+/**
+ * A structured message object. Used to return errors from requests.
+ */
+@JsonRpcData
+class Message {
+ /**
+ * Unique identifier for the message.
+ */
+ int id;
+ /**
+ * A format string for the message. Embedded variables have the form '{name}'.
+ * <p>
+ * If variable name starts with an underscore character, the variable does not contain user data (PII) and can be
+ * safely used for telemetry purposes.
+ */
+ @NonNull
+ String format;
+ /**
+ * An object used as a dictionary for looking up the variables in the format string.
+ * <p>
+ * This is an optional property.
+ */
+ Map<String, String> variables;
+ /**
+ * If true send to telemetry.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean sendTelemetry;
+ /**
+ * If true show user.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean showUser;
+ /**
+ * An optional url where additional information about this message can be found.
+ * <p>
+ * This is an optional property.
+ */
+ String url;
+ /**
+ * An optional label that is presented to the user as the UI for opening the url.
+ * <p>
+ * This is an optional property.
+ */
+ String urlLabel;
+}
+
+/**
+ * A Module object represents a row in the modules view.
+ * <p>
+ * Two attributes are mandatory: an id identifies a module in the modules view and is used in a ModuleEvent for
+ * identifying a module for adding, updating or deleting.
+ * <p>
+ * The name is used to minimally render the module in the UI.
+ * <p>
+
+ * <p>
+ * Additional attributes can be added to the module. They will show up in the module View if they have a
+ * corresponding ColumnDescriptor.
+ * <p>
+
+ * <p>
+ * To avoid an unnecessary proliferation of additional attributes with similar semantics but different names
+ * <p>
+ * we recommend to re-use attributes from the 'recommended' list below first, and only introduce new attributes if
+ * nothing appropriate could be found.
+ */
+@JsonRpcData
+class Module {
+ /**
+ * Unique identifier for the module.
+ */
+ @NonNull
+ Either<Integer, String> id;
+ /**
+ * A name of the module.
+ */
+ @NonNull
+ String name;
+ /**
+ * optional but recommended attributes.
+ * <p>
+ * always try to use these first before introducing additional attributes.
+ * <p>
+
+ * <p>
+ * Logical full path to the module. The exact definition is implementation defined, but usually this would be a
+ * full path to the on-disk file for the module.
+ * <p>
+ * This is an optional property.
+ */
+ String path;
+ /**
+ * True if the module is optimized.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean isOptimized;
+ /**
+ * True if the module is considered 'user code' by a debugger that supports 'Just My Code'.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean isUserCode;
+ /**
+ * Version of Module.
+ * <p>
+ * This is an optional property.
+ */
+ String version;
+ /**
+ * User understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not
+ * found', etc.
+ * <p>
+ * This is an optional property.
+ */
+ String symbolStatus;
+ /**
+ * Logical full path to the symbol file. The exact definition is implementation defined.
+ * <p>
+ * This is an optional property.
+ */
+ String symbolFilePath;
+ /**
+ * Module created or modified.
+ * <p>
+ * This is an optional property.
+ */
+ String dateTimeStamp;
+ /**
+ * Address range covered by this module.
+ * <p>
+ * This is an optional property.
+ */
+ String addressRange;
+}
+
+/**
+ * A ColumnDescriptor specifies what module attribute to show in a column of the ModulesView, how to format it,
+ * <p>
+ * and what the column's label should be.
+ * <p>
+ * It is only used if the underlying UI actually supports this level of customization.
+ */
+@JsonRpcData
+class ColumnDescriptor {
+ /**
+ * Name of the attribute rendered in this column.
+ */
+ @NonNull
+ String attributeName;
+ /**
+ * Header UI label of column.
+ */
+ @NonNull
+ String label;
+ /**
+ * Format to use for the rendered values in this column. TBD how the format strings looks like.
+ * <p>
+ * This is an optional property.
+ */
+ String format;
+ /**
+ * Datatype of values in this column. Defaults to 'string' if not specified.
+ * <p>
+ * This is an optional property.
+ */
+ ColumnDescriptorType type;
+ /**
+ * Width of this column in characters (hint only).
+ * <p>
+ * This is an optional property.
+ */
+ Integer width;
+}
+
+/**
+ * Datatype of values in this column. Defaults to 'string' if not specified.
+ */
+enum ColumnDescriptorType {
+ STRING,
+ NUMBER,
+ BOOLEAN,
+ @SerializedName("unixTimestampUTC")
+ UNIX_TIMESTAMP_UTC
+}
+
+/**
+ * The ModulesViewDescriptor is the container for all declarative configuration options of a ModuleView.
+ * <p>
+ * For now it only specifies the columns to be shown in the modules view.
+ */
+@JsonRpcData
+class ModulesViewDescriptor {
+ /**
+
+ */
+ @NonNull
+ ColumnDescriptor[] columns;
+}
+
+/**
+ * A Thread
+ */
+@JsonRpcData
+class Thread {
+ /**
+ * Unique identifier for the thread.
+ */
+ int id;
+ /**
+ * A name of the thread.
+ */
+ @NonNull
+ String name;
+}
+
+/**
+ * A Source is a descriptor for source code.
+ * <p>
+ * It is returned from the debug adapter as part of a StackFrame and it is used by clients when specifying
+ * breakpoints.
+ */
+@JsonRpcData
+class Source {
+ /**
+ * The short name of the source. Every source returned from the debug adapter has a name.
+ * <p>
+ * When sending a source to the debug adapter this name is optional.
+ * <p>
+ * This is an optional property.
+ */
+ String name;
+ /**
+ * The path of the source to be shown in the UI.
+ * <p>
+ * It is only used to locate and load the content of the source if no sourceReference is specified (or its value
+ * is 0).
+ * <p>
+ * This is an optional property.
+ */
+ String path;
+ /**
+ * If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a
+ * path is specified).
+ * <p>
+ * A sourceReference is only valid for a session, so it must not be used to persist a source.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ Integer sourceReference;
+ /**
+ * An optional hint for how to present the source in the UI.
+ * <p>
+ * A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on
+ * stepping.
+ * <p>
+ * This is an optional property.
+ */
+ SourcePresentationHint presentationHint;
+ /**
+ * The (optional) origin of this source: possible values 'internal module', 'inlined content from source map',
+ * etc.
+ * <p>
+ * This is an optional property.
+ */
+ String origin;
+ /**
+ * An optional list of sources that are related to this source. These may be the source that generated this
+ * source.
+ * <p>
+ * This is an optional property.
+ */
+ Source[] sources;
+ /**
+ * Optional data that a debug adapter might want to loop through the client.
+ * <p>
+ * The client should leave the data intact and persist it across sessions. The client should not interpret the
+ * data.
+ * <p>
+ * This is an optional property.
+ */
+ Object adapterData;
+ /**
+ * The checksums associated with this file.
+ * <p>
+ * This is an optional property.
+ */
+ Checksum[] checksums;
+}
+
+/**
+ * An optional hint for how to present the source in the UI.
+ * <p>
+ * A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on
+ * stepping.
+ */
+enum SourcePresentationHint {
+ NORMAL,
+ EMPHASIZE,
+ DEEMPHASIZE
+}
+
+/**
+ * A Stackframe contains the source location.
+ */
+@JsonRpcData
+class StackFrame {
+ /**
+ * An identifier for the stack frame. It must be unique across all threads.
+ * <p>
+ * This id can be used to retrieve the scopes of the frame with the 'scopesRequest' or to restart the execution of
+ * a stackframe.
+ */
+ int id;
+ /**
+ * The name of the stack frame, typically a method name.
+ */
+ @NonNull
+ String name;
+ /**
+ * The optional source of the frame.
+ * <p>
+ * This is an optional property.
+ */
+ Source source;
+ /**
+ * The line within the file of the frame. If source is null or doesn't exist, line is 0 and must be ignored.
+ */
+ int line;
+ /**
+ * The column within the line. If source is null or doesn't exist, column is 0 and must be ignored.
+ */
+ int column;
+ /**
+ * An optional end line of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * An optional end column of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+ /**
+ * Optional memory reference for the current instruction pointer in this frame.
+ * <p>
+ * This is an optional property.
+ */
+ String instructionPointerReference;
+ /**
+ * The module associated with this frame, if any.
+ * <p>
+ * This is an optional property.
+ */
+ Either<Integer, String> moduleId;
+ /**
+ * An optional hint for how to present this frame in the UI.
+ * <p>
+ * A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label
+ * or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way.
+ * <p>
+ * This is an optional property.
+ */
+ StackFramePresentationHint presentationHint;
+}
+
+/**
+ * An optional hint for how to present this frame in the UI.
+ * <p>
+ * A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label
+ * or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way.
+ */
+enum StackFramePresentationHint {
+ NORMAL,
+ LABEL,
+ SUBTLE
+}
+
+/**
+ * A Scope is a named container for variables. Optionally a scope can map to a source or a range within a source.
+ */
+@JsonRpcData
+class Scope {
+ /**
+ * Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can
+ * be translated.
+ */
+ @NonNull
+ String name;
+ /**
+ * An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with
+ * a generic UI.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ScopePresentationHint}
+ */
+ String presentationHint;
+ /**
+ * The variables of this scope can be retrieved by passing the value of variablesReference to the
+ * VariablesRequest.
+ */
+ int variablesReference;
+ /**
+ * The number of named variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ Integer namedVariables;
+ /**
+ * The number of indexed variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ Integer indexedVariables;
+ /**
+ * If true, the number of variables in this scope is large or expensive to retrieve.
+ */
+ boolean expensive;
+ /**
+ * Optional source for this scope.
+ * <p>
+ * This is an optional property.
+ */
+ Source source;
+ /**
+ * Optional start line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer line;
+ /**
+ * Optional start column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * Optional end line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * Optional end column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+}
+
+/**
+ * An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with
+ * a generic UI.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ScopePresentationHint}
+ */
+interface ScopePresentationHint {
+ /**
+ * Scope contains method arguments.
+ */
+ public static final String ARGUMENTS = "arguments";
+ /**
+ * Scope contains local variables.
+ */
+ public static final String LOCALS = "locals";
+ /**
+ * Scope contains registers. Only a single 'registers' scope should be returned from a 'scopes' request.
+ */
+ public static final String REGISTERS = "registers";
+}
+
+/**
+ * A Variable is a name/value pair.
+ * <p>
+ * Optionally a variable can have a 'type' that is shown if space permits or when hovering over the variable's
+ * name.
+ * <p>
+ * An optional 'kind' is used to render additional properties of the variable, e.g. different icons can be used to
+ * indicate that a variable is public or private.
+ * <p>
+ * If the value is structured (has children), a handle is provided to retrieve the children with the
+ * VariablesRequest.
+ * <p>
+ * If the number of named or indexed children is large, the numbers should be returned via the optional
+ * 'namedVariables' and 'indexedVariables' attributes.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ */
+@JsonRpcData
+class Variable {
+ /**
+ * The variable's name.
+ */
+ @NonNull
+ String name;
+ /**
+ * The variable's value. This can be a multi-line text, e.g. for a function the body of a function.
+ */
+ @NonNull
+ String value;
+ /**
+ * The type of the variable's value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ String type;
+ /**
+ * Properties of a variable that can be used to determine how to render the variable in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ VariablePresentationHint presentationHint;
+ /**
+ * Optional evaluatable name of this variable which can be passed to the 'EvaluateRequest' to fetch the variable's
+ * value.
+ * <p>
+ * This is an optional property.
+ */
+ String evaluateName;
+ /**
+ * If variablesReference is > 0, the variable is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ */
+ int variablesReference;
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ Integer namedVariables;
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ Integer indexedVariables;
+ /**
+ * Optional memory reference for the variable if the variable represents executable code, such as a function
+ * pointer.
+ * <p>
+ * This attribute is only required if the client has passed the value true for the 'supportsMemoryReferences'
+ * capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ String memoryReference;
+}
+
+/**
+ * Optional properties of a variable that can be used to determine how to render the variable in the UI.
+ */
+@JsonRpcData
+class VariablePresentationHint {
+ /**
+ * The kind of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintKind}
+ */
+ String kind;
+ /**
+ * Set of attributes represented as an array of strings. Before introducing additional values, try to use the
+ * listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintAttributes}
+ */
+ String[] attributes;
+ /**
+ * Visibility of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintVisibility}
+ */
+ String visibility;
+}
+
+/**
+ * The kind of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintKind}
+ */
+interface VariablePresentationHintKind {
+ /**
+ * Indicates that the object is a property.
+ */
+ public static final String PROPERTY = "property";
+ /**
+ * Indicates that the object is a method.
+ */
+ public static final String METHOD = "method";
+ /**
+ * Indicates that the object is a class.
+ */
+ public static final String CLASS = "class";
+ /**
+ * Indicates that the object is data.
+ */
+ public static final String DATA = "data";
+ /**
+ * Indicates that the object is an event.
+ */
+ public static final String EVENT = "event";
+ /**
+ * Indicates that the object is a base class.
+ */
+ public static final String BASE_CLASS = "baseClass";
+ /**
+ * Indicates that the object is an inner class.
+ */
+ public static final String INNER_CLASS = "innerClass";
+ /**
+ * Indicates that the object is an interface.
+ */
+ public static final String INTERFACE = "interface";
+ /**
+ * Indicates that the object is the most derived class.
+ */
+ public static final String MOST_DERIVED_CLASS = "mostDerivedClass";
+ /**
+ * Indicates that the object is virtual, that means it is a synthetic object introducedby the
+ * adapter for
+ * rendering purposes, e.g. an index range for large arrays.
+ */
+ public static final String VIRTUAL = "virtual";
+ /**
+ * Deprecated: Indicates that a data breakpoint is registered for the object. The 'hasDataBreakpoint' attribute
+ * should generally be used instead.
+ * <p>
+ * @deprecated The 'hasDataBreakpoint' attribute should generally be used instead.
+ */
+ @Deprecated
+ public static final String DATA_BREAKPOINT = "dataBreakpoint";
+}
+
+/**
+
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintAttributes}
+ */
+interface VariablePresentationHintAttributes {
+ /**
+ * Indicates that the object is static.
+ */
+ public static final String STATIC = "static";
+ /**
+ * Indicates that the object is a constant.
+ */
+ public static final String CONSTANT = "constant";
+ /**
+ * Indicates that the object is read only.
+ */
+ public static final String READ_ONLY = "readOnly";
+ /**
+ * Indicates that the object is a raw string.
+ */
+ public static final String RAW_STRING = "rawString";
+ /**
+ * Indicates that the object can have an Object ID created for it.
+ */
+ public static final String HAS_OBJECT_ID = "hasObjectId";
+ /**
+ * Indicates that the object has an Object ID associated with it.
+ */
+ public static final String CAN_HAVE_OBJECT_ID = "canHaveObjectId";
+ /**
+ * Indicates that the evaluation had side effects.
+ */
+ public static final String HAS_SIDE_EFFECTS = "hasSideEffects";
+ /**
+ * Indicates that the object has its value tracked by a data breakpoint.
+ */
+ public static final String HAS_DATA_BREAKPOINT = "hasDataBreakpoint";
+}
+
+/**
+ * Visibility of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintVisibility}
+ */
+interface VariablePresentationHintVisibility {
+ public static final String PUBLIC = "public";
+ public static final String PRIVATE = "private";
+ public static final String PROTECTED = "protected";
+ public static final String INTERNAL = "internal";
+ public static final String FINAL = "final";
+}
+
+/**
+ * Properties of a breakpoint location returned from the 'breakpointLocations' request.
+ */
+@JsonRpcData
+class BreakpointLocation {
+ /**
+ * Start line of breakpoint location.
+ */
+ int line;
+ /**
+ * Optional start column of breakpoint location.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * Optional end line of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * Optional end column of breakpoint location if the location covers a range.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+}
+
+/**
+ * Properties of a breakpoint or logpoint passed to the setBreakpoints request.
+ */
+@JsonRpcData
+class SourceBreakpoint {
+ /**
+ * The source line of the breakpoint or logpoint.
+ */
+ int line;
+ /**
+ * An optional source column of the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String condition;
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String hitCondition;
+ /**
+ * If this attribute exists and is non-empty, the backend must not 'break' (stop)
+ * <p>
+ * but log the message instead. Expressions within {} are interpolated.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsLogPoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String logMessage;
+}
+
+/**
+ * Properties of a breakpoint passed to the setFunctionBreakpoints request.
+ */
+@JsonRpcData
+class FunctionBreakpoint {
+ /**
+ * The name of the function.
+ */
+ @NonNull
+ String name;
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String condition;
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String hitCondition;
+}
+
+/**
+ * This enumeration defines all possible access types for data breakpoints.
+ */
+enum DataBreakpointAccessType {
+ READ,
+ WRITE,
+ READ_WRITE
+}
+
+/**
+ * Properties of a data breakpoint passed to the setDataBreakpoints request.
+ */
+@JsonRpcData
+class DataBreakpoint {
+ /**
+ * An id representing the data. This id is returned from the dataBreakpointInfo request.
+ */
+ @NonNull
+ String dataId;
+ /**
+ * The access type of the data.
+ * <p>
+ * This is an optional property.
+ */
+ DataBreakpointAccessType accessType;
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ String condition;
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * This is an optional property.
+ */
+ String hitCondition;
+}
+
+/**
+ * Properties of a breakpoint passed to the setInstructionBreakpoints request
+ */
+@JsonRpcData
+class InstructionBreakpoint {
+ /**
+ * The instruction reference of the breakpoint.
+ * <p>
+ * This should be a memory or instruction pointer reference from an EvaluateResponse, Variable, StackFrame,
+ * GotoTarget, or Breakpoint.
+ */
+ @NonNull
+ String instructionReference;
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ Integer offset;
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String condition;
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ String hitCondition;
+}
+
+/**
+ * Information about a Breakpoint created in setBreakpoints, setFunctionBreakpoints, setInstructionBreakpoints, or
+ * setDataBreakpoints.
+ */
+@JsonRpcData
+class Breakpoint {
+ /**
+ * An optional identifier for the breakpoint. It is needed if breakpoint events are used to update or remove
+ * breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ Integer id;
+ /**
+ * If true breakpoint could be set (but not necessarily at the desired location).
+ */
+ boolean verified;
+ /**
+ * An optional message about the state of the breakpoint.
+ * <p>
+ * This is shown to the user and can be used to explain why a breakpoint could not be verified.
+ * <p>
+ * This is an optional property.
+ */
+ String message;
+ /**
+ * The source where the breakpoint is located.
+ * <p>
+ * This is an optional property.
+ */
+ Source source;
+ /**
+ * The start line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ Integer line;
+ /**
+ * An optional start column of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * An optional end line of the actual range covered by the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * An optional end column of the actual range covered by the breakpoint.
+ * <p>
+ * If no end line is given, then the end column is assumed to be in the start line.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+ /**
+ * An optional memory reference to where the breakpoint is set.
+ * <p>
+ * This is an optional property.
+ */
+ String instructionReference;
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ Integer offset;
+}
+
+/**
+ * The granularity of one 'step' in the stepping requests 'next', 'stepIn', 'stepOut', and 'stepBack'.
+ */
+enum SteppingGranularity {
+ /**
+ * The step should allow the program to run until the current statement has finished executing.
+ * The meaning of a
+ * statement is determined by the adapter and it may be considered equivalent to a line.
+ * For example 'for(int i =
+ * 0; i < 10; i++) could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'.
+ */
+ STATEMENT,
+ /**
+ * The step should allow the program to run until the current source line has executed.
+ */
+ LINE,
+ /**
+ * The step should allow one instruction to execute (e.g. one x86 instruction).
+ */
+ INSTRUCTION
+}
+
+/**
+ * A StepInTarget can be used in the 'stepIn' request and determines into which single target the stepIn request
+ * should step.
+ */
+@JsonRpcData
+class StepInTarget {
+ /**
+ * Unique identifier for a stepIn target.
+ */
+ int id;
+ /**
+ * The name of the stepIn target (shown in the UI).
+ */
+ @NonNull
+ String label;
+}
+
+/**
+ * A GotoTarget describes a code location that can be used as a target in the 'goto' request.
+ * <p>
+ * The possible goto targets can be determined via the 'gotoTargets' request.
+ */
+@JsonRpcData
+class GotoTarget {
+ /**
+ * Unique identifier for a goto target. This is used in the goto request.
+ */
+ int id;
+ /**
+ * The name of the goto target (shown in the UI).
+ */
+ @NonNull
+ String label;
+ /**
+ * The line of the goto target.
+ */
+ int line;
+ /**
+ * An optional column of the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * An optional end line of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * An optional end column of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+ /**
+ * Optional memory reference for the instruction pointer value represented by this target.
+ * <p>
+ * This is an optional property.
+ */
+ String instructionPointerReference;
+}
+
+/**
+ * CompletionItems are the suggestions returned from the CompletionsRequest.
+ */
+@JsonRpcData
+class CompletionItem {
+ /**
+ * The label of this completion item. By default this is also the text that is inserted when selecting this
+ * completion.
+ */
+ @NonNull
+ String label;
+ /**
+ * If text is not falsy then it is inserted instead of the label.
+ * <p>
+ * This is an optional property.
+ */
+ String text;
+ /**
+ * A string that should be used when comparing this item with other items. When `falsy` the label is used.
+ * <p>
+ * This is an optional property.
+ */
+ String sortText;
+ /**
+ * The item's type. Typically the client uses this information to render the item in the UI with an icon.
+ * <p>
+ * This is an optional property.
+ */
+ CompletionItemType type;
+ /**
+ * This value determines the location (in the CompletionsRequest's 'text' attribute) where the completion text is
+ * added.
+ * <p>
+ * If missing the text is added at the location specified by the CompletionsRequest's 'column' attribute.
+ * <p>
+ * This is an optional property.
+ */
+ Integer start;
+ /**
+ * This value determines how many characters are overwritten by the completion text.
+ * <p>
+ * If missing the value 0 is assumed which results in the completion text being inserted.
+ * <p>
+ * This is an optional property.
+ */
+ Integer length;
+ /**
+ * Determines the start of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The start position must in the range 0 and length of the completion text.
+ * <p>
+ * If omitted the selection starts at the end of the completion text.
+ * <p>
+ * This is an optional property.
+ */
+ Integer selectionStart;
+ /**
+ * Determines the length of the new selection after the text has been inserted (or replaced).
+ * <p>
+ * The selection can not extend beyond the bounds of the completion text.
+ * <p>
+ * If omitted the length is assumed to be 0.
+ * <p>
+ * This is an optional property.
+ */
+ Integer selectionLength;
+}
+
+/**
+ * Some predefined types for the CompletionItem. Please note that not all clients have specific icons for all of
+ * them.
+ */
+enum CompletionItemType {
+ METHOD,
+ FUNCTION,
+ CONSTRUCTOR,
+ FIELD,
+ VARIABLE,
+ CLASS,
+ INTERFACE,
+ MODULE,
+ PROPERTY,
+ UNIT,
+ VALUE,
+ ENUM,
+ KEYWORD,
+ SNIPPET,
+ TEXT,
+ COLOR,
+ FILE,
+ REFERENCE,
+ CUSTOMCOLOR
+}
+
+/**
+ * Names of checksum algorithms that may be supported by a debug adapter.
+ */
+enum ChecksumAlgorithm {
+ @SerializedName("MD5")
+ MD5,
+ @SerializedName("SHA1")
+ SHA1,
+ @SerializedName("SHA256")
+ SHA256,
+ TIMESTAMP
+}
+
+/**
+ * The checksum of an item calculated by the specified algorithm.
+ */
+@JsonRpcData
+class Checksum {
+ /**
+ * The algorithm used to calculate this checksum.
+ */
+ @NonNull
+ ChecksumAlgorithm algorithm;
+ /**
+ * Value of the checksum.
+ */
+ @NonNull
+ String checksum;
+}
+
+/**
+ * Provides formatting information for a value.
+ */
+@JsonRpcData
+class ValueFormat {
+ /**
+ * Display the value in hex.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean hex;
+}
+
+/**
+ * Provides formatting information for a stack frame.
+ */
+@JsonRpcData
+class StackFrameFormat extends ValueFormat {
+ /**
+ * Displays parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean parameters;
+ /**
+ * Displays the types of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean parameterTypes;
+ /**
+ * Displays the names of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean parameterNames;
+ /**
+ * Displays the values of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean parameterValues;
+ /**
+ * Displays the line number of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean line;
+ /**
+ * Displays the module of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean module;
+ /**
+ * Includes all stack frames, including those the debug adapter might otherwise hide.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean includeAll;
+}
+
+/**
+ * An ExceptionFilterOptions is used to specify an exception filter together with a condition for the
+ * setExceptionsFilter request.
+ */
+@JsonRpcData
+class ExceptionFilterOptions {
+ /**
+ * ID of an exception filter returned by the 'exceptionBreakpointFilters' capability.
+ */
+ @NonNull
+ String filterId;
+ /**
+ * An optional expression for conditional exceptions.
+ * <p>
+ * The exception will break into the debugger if the result of the condition is true.
+ * <p>
+ * This is an optional property.
+ */
+ String condition;
+}
+
+/**
+ * An ExceptionOptions assigns configuration options to a set of exceptions.
+ */
+@JsonRpcData
+class ExceptionOptions {
+ /**
+ * A path that selects a single or multiple exceptions in a tree. If 'path' is missing, the whole tree is
+ * selected.
+ * <p>
+ * By convention the first segment of the path is a category that is used to group exceptions in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ ExceptionPathSegment[] path;
+ /**
+ * Condition when a thrown exception should result in a break.
+ */
+ @NonNull
+ ExceptionBreakMode breakMode;
+}
+
+/**
+ * This enumeration defines all possible conditions when a thrown exception should result in a break.
+ * <p>
+ * never: never breaks,
+ * <p>
+ * always: always breaks,
+ * <p>
+ * unhandled: breaks when exception unhandled,
+ * <p>
+ * userUnhandled: breaks if the exception is not handled by user code.
+ */
+enum ExceptionBreakMode {
+ NEVER,
+ ALWAYS,
+ UNHANDLED,
+ USER_UNHANDLED
+}
+
+/**
+ * An ExceptionPathSegment represents a segment in a path that is used to match leafs or nodes in a tree of
+ * exceptions.
+ * <p>
+ * If a segment consists of more than one name, it matches the names provided if 'negate' is false or missing or
+ * <p>
+ * it matches anything except the names provided if 'negate' is true.
+ */
+@JsonRpcData
+class ExceptionPathSegment {
+ /**
+ * If false or missing this segment matches the names provided, otherwise it matches anything except the names
+ * provided.
+ * <p>
+ * This is an optional property.
+ */
+ Boolean negate;
+ /**
+ * Depending on the value of 'negate' the names that should match or not match.
+ */
+ @NonNull
+ String[] names;
+}
+
+/**
+ * Detailed information about an exception that has occurred.
+ */
+@JsonRpcData
+class ExceptionDetails {
+ /**
+ * Message contained in the exception.
+ * <p>
+ * This is an optional property.
+ */
+ String message;
+ /**
+ * Short type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ String typeName;
+ /**
+ * Fully-qualified type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ String fullTypeName;
+ /**
+ * Optional expression that can be evaluated in the current scope to obtain the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ String evaluateName;
+ /**
+ * Stack trace at the time the exception was thrown.
+ * <p>
+ * This is an optional property.
+ */
+ String stackTrace;
+ /**
+ * Details of the exception contained by this exception, if any.
+ * <p>
+ * This is an optional property.
+ */
+ ExceptionDetails[] innerException;
+}
+
+/**
+ * Represents a single disassembled instruction.
+ */
+@JsonRpcData
+class DisassembledInstruction {
+ /**
+ * The address of the instruction. Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ @NonNull
+ String address;
+ /**
+ * Optional raw bytes representing the instruction and its operands, in an implementation-defined format.
+ * <p>
+ * This is an optional property.
+ */
+ String instructionBytes;
+ /**
+ * Text representing the instruction and its operands, in an implementation-defined format.
+ */
+ @NonNull
+ String instruction;
+ /**
+ * Name of the symbol that corresponds with the location of this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ String symbol;
+ /**
+ * Source location that corresponds to this instruction, if any.
+ * <p>
+ * Should always be set (if available) on the first instruction returned,
+ * <p>
+ * but can be omitted afterwards if this instruction maps to the same source file as the previous instruction.
+ * <p>
+ * This is an optional property.
+ */
+ Source location;
+ /**
+ * The line within the source location that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ Integer line;
+ /**
+ * The column within the line that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ Integer column;
+ /**
+ * The end line of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endLine;
+ /**
+ * The end column of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ Integer endColumn;
+}
+
+/**
+ * Logical areas that can be invalidated by the 'invalidated' event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InvalidatedAreas}
+ */
+interface InvalidatedAreas {
+ /**
+ * All previously fetched data has become invalid and needs to be refetched.
+ */
+ public static final String ALL = "all";
+ /**
+ * Previously fetched stack related data has become invalid and needs to be refetched.
+ */
+ public static final String STACKS = "stacks";
+ /**
+ * Previously fetched thread related data has become invalid and needs to be refetched.
+ */
+ public static final String THREADS = "threads";
+ /**
+ * Previously fetched variable data has become invalid and needs to be refetched.
+ */
+ public static final String VARIABLES = "variables";
+}
diff --git a/java/org/eclipse/lsp4j/debug/DisassembleArguments.java b/java/org/eclipse/lsp4j/debug/DisassembleArguments.java
new file mode 100644
index 0000000..1d0ab81
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DisassembleArguments.java
@@ -0,0 +1,214 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'disassemble' request.
+ */
+@SuppressWarnings("all")
+public class DisassembleArguments {
+ /**
+ * Memory reference to the base location containing the instructions to disassemble.
+ */
+ @NonNull
+ private String memoryReference;
+
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before disassembling. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer offset;
+
+ /**
+ * Optional offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be
+ * negative.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer instructionOffset;
+
+ /**
+ * Number of instructions to disassemble starting at the specified location and offset.
+ * <p>
+ * An adapter must return exactly this number of instructions - any unavailable instructions should be replaced
+ * with an implementation-defined 'invalid instruction' value.
+ */
+ private int instructionCount;
+
+ /**
+ * If true, the adapter should attempt to resolve memory addresses and other values to symbolic names.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean resolveSymbols;
+
+ /**
+ * Memory reference to the base location containing the instructions to disassemble.
+ */
+ @Pure
+ @NonNull
+ public String getMemoryReference() {
+ return this.memoryReference;
+ }
+
+ /**
+ * Memory reference to the base location containing the instructions to disassemble.
+ */
+ public void setMemoryReference(@NonNull final String memoryReference) {
+ this.memoryReference = Preconditions.checkNotNull(memoryReference, "memoryReference");
+ }
+
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before disassembling. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getOffset() {
+ return this.offset;
+ }
+
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before disassembling. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ public void setOffset(final Integer offset) {
+ this.offset = offset;
+ }
+
+ /**
+ * Optional offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be
+ * negative.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getInstructionOffset() {
+ return this.instructionOffset;
+ }
+
+ /**
+ * Optional offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be
+ * negative.
+ * <p>
+ * This is an optional property.
+ */
+ public void setInstructionOffset(final Integer instructionOffset) {
+ this.instructionOffset = instructionOffset;
+ }
+
+ /**
+ * Number of instructions to disassemble starting at the specified location and offset.
+ * <p>
+ * An adapter must return exactly this number of instructions - any unavailable instructions should be replaced
+ * with an implementation-defined 'invalid instruction' value.
+ */
+ @Pure
+ public int getInstructionCount() {
+ return this.instructionCount;
+ }
+
+ /**
+ * Number of instructions to disassemble starting at the specified location and offset.
+ * <p>
+ * An adapter must return exactly this number of instructions - any unavailable instructions should be replaced
+ * with an implementation-defined 'invalid instruction' value.
+ */
+ public void setInstructionCount(final int instructionCount) {
+ this.instructionCount = instructionCount;
+ }
+
+ /**
+ * If true, the adapter should attempt to resolve memory addresses and other values to symbolic names.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getResolveSymbols() {
+ return this.resolveSymbols;
+ }
+
+ /**
+ * If true, the adapter should attempt to resolve memory addresses and other values to symbolic names.
+ * <p>
+ * This is an optional property.
+ */
+ public void setResolveSymbols(final Boolean resolveSymbols) {
+ this.resolveSymbols = resolveSymbols;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("memoryReference", this.memoryReference);
+ b.add("offset", this.offset);
+ b.add("instructionOffset", this.instructionOffset);
+ b.add("instructionCount", this.instructionCount);
+ b.add("resolveSymbols", this.resolveSymbols);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DisassembleArguments other = (DisassembleArguments) obj;
+ if (this.memoryReference == null) {
+ if (other.memoryReference != null)
+ return false;
+ } else if (!this.memoryReference.equals(other.memoryReference))
+ return false;
+ if (this.offset == null) {
+ if (other.offset != null)
+ return false;
+ } else if (!this.offset.equals(other.offset))
+ return false;
+ if (this.instructionOffset == null) {
+ if (other.instructionOffset != null)
+ return false;
+ } else if (!this.instructionOffset.equals(other.instructionOffset))
+ return false;
+ if (other.instructionCount != this.instructionCount)
+ return false;
+ if (this.resolveSymbols == null) {
+ if (other.resolveSymbols != null)
+ return false;
+ } else if (!this.resolveSymbols.equals(other.resolveSymbols))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.memoryReference== null) ? 0 : this.memoryReference.hashCode());
+ result = prime * result + ((this.offset== null) ? 0 : this.offset.hashCode());
+ result = prime * result + ((this.instructionOffset== null) ? 0 : this.instructionOffset.hashCode());
+ result = prime * result + this.instructionCount;
+ return prime * result + ((this.resolveSymbols== null) ? 0 : this.resolveSymbols.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DisassembleResponse.java b/java/org/eclipse/lsp4j/debug/DisassembleResponse.java
new file mode 100644
index 0000000..2798c94
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DisassembleResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.DisassembledInstruction;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'disassemble' request.
+ */
+@SuppressWarnings("all")
+public class DisassembleResponse {
+ /**
+ * The list of disassembled instructions.
+ */
+ @NonNull
+ private DisassembledInstruction[] instructions;
+
+ /**
+ * The list of disassembled instructions.
+ */
+ @Pure
+ @NonNull
+ public DisassembledInstruction[] getInstructions() {
+ return this.instructions;
+ }
+
+ /**
+ * The list of disassembled instructions.
+ */
+ public void setInstructions(@NonNull final DisassembledInstruction[] instructions) {
+ this.instructions = Preconditions.checkNotNull(instructions, "instructions");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("instructions", this.instructions);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DisassembleResponse other = (DisassembleResponse) obj;
+ if (this.instructions == null) {
+ if (other.instructions != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.instructions, other.instructions))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.instructions== null) ? 0 : Arrays.deepHashCode(this.instructions));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DisassembledInstruction.java b/java/org/eclipse/lsp4j/debug/DisassembledInstruction.java
new file mode 100644
index 0000000..ffc74ae
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DisassembledInstruction.java
@@ -0,0 +1,352 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Represents a single disassembled instruction.
+ */
+@SuppressWarnings("all")
+public class DisassembledInstruction {
+ /**
+ * The address of the instruction. Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ @NonNull
+ private String address;
+
+ /**
+ * Optional raw bytes representing the instruction and its operands, in an implementation-defined format.
+ * <p>
+ * This is an optional property.
+ */
+ private String instructionBytes;
+
+ /**
+ * Text representing the instruction and its operands, in an implementation-defined format.
+ */
+ @NonNull
+ private String instruction;
+
+ /**
+ * Name of the symbol that corresponds with the location of this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private String symbol;
+
+ /**
+ * Source location that corresponds to this instruction, if any.
+ * <p>
+ * Should always be set (if available) on the first instruction returned,
+ * <p>
+ * but can be omitted afterwards if this instruction maps to the same source file as the previous instruction.
+ * <p>
+ * This is an optional property.
+ */
+ private Source location;
+
+ /**
+ * The line within the source location that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer line;
+
+ /**
+ * The column within the line that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * The end line of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * The end column of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * The address of the instruction. Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ @Pure
+ @NonNull
+ public String getAddress() {
+ return this.address;
+ }
+
+ /**
+ * The address of the instruction. Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ public void setAddress(@NonNull final String address) {
+ this.address = Preconditions.checkNotNull(address, "address");
+ }
+
+ /**
+ * Optional raw bytes representing the instruction and its operands, in an implementation-defined format.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getInstructionBytes() {
+ return this.instructionBytes;
+ }
+
+ /**
+ * Optional raw bytes representing the instruction and its operands, in an implementation-defined format.
+ * <p>
+ * This is an optional property.
+ */
+ public void setInstructionBytes(final String instructionBytes) {
+ this.instructionBytes = instructionBytes;
+ }
+
+ /**
+ * Text representing the instruction and its operands, in an implementation-defined format.
+ */
+ @Pure
+ @NonNull
+ public String getInstruction() {
+ return this.instruction;
+ }
+
+ /**
+ * Text representing the instruction and its operands, in an implementation-defined format.
+ */
+ public void setInstruction(@NonNull final String instruction) {
+ this.instruction = Preconditions.checkNotNull(instruction, "instruction");
+ }
+
+ /**
+ * Name of the symbol that corresponds with the location of this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getSymbol() {
+ return this.symbol;
+ }
+
+ /**
+ * Name of the symbol that corresponds with the location of this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSymbol(final String symbol) {
+ this.symbol = symbol;
+ }
+
+ /**
+ * Source location that corresponds to this instruction, if any.
+ * <p>
+ * Should always be set (if available) on the first instruction returned,
+ * <p>
+ * but can be omitted afterwards if this instruction maps to the same source file as the previous instruction.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source getLocation() {
+ return this.location;
+ }
+
+ /**
+ * Source location that corresponds to this instruction, if any.
+ * <p>
+ * Should always be set (if available) on the first instruction returned,
+ * <p>
+ * but can be omitted afterwards if this instruction maps to the same source file as the previous instruction.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLocation(final Source location) {
+ this.location = location;
+ }
+
+ /**
+ * The line within the source location that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLine() {
+ return this.line;
+ }
+
+ /**
+ * The line within the source location that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLine(final Integer line) {
+ this.line = line;
+ }
+
+ /**
+ * The column within the line that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * The column within the line that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * The end line of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * The end line of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * The end column of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * The end column of the range that corresponds to this instruction, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("address", this.address);
+ b.add("instructionBytes", this.instructionBytes);
+ b.add("instruction", this.instruction);
+ b.add("symbol", this.symbol);
+ b.add("location", this.location);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DisassembledInstruction other = (DisassembledInstruction) obj;
+ if (this.address == null) {
+ if (other.address != null)
+ return false;
+ } else if (!this.address.equals(other.address))
+ return false;
+ if (this.instructionBytes == null) {
+ if (other.instructionBytes != null)
+ return false;
+ } else if (!this.instructionBytes.equals(other.instructionBytes))
+ return false;
+ if (this.instruction == null) {
+ if (other.instruction != null)
+ return false;
+ } else if (!this.instruction.equals(other.instruction))
+ return false;
+ if (this.symbol == null) {
+ if (other.symbol != null)
+ return false;
+ } else if (!this.symbol.equals(other.symbol))
+ return false;
+ if (this.location == null) {
+ if (other.location != null)
+ return false;
+ } else if (!this.location.equals(other.location))
+ return false;
+ if (this.line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!this.line.equals(other.line))
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.address== null) ? 0 : this.address.hashCode());
+ result = prime * result + ((this.instructionBytes== null) ? 0 : this.instructionBytes.hashCode());
+ result = prime * result + ((this.instruction== null) ? 0 : this.instruction.hashCode());
+ result = prime * result + ((this.symbol== null) ? 0 : this.symbol.hashCode());
+ result = prime * result + ((this.location== null) ? 0 : this.location.hashCode());
+ result = prime * result + ((this.line== null) ? 0 : this.line.hashCode());
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ return prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/DisconnectArguments.java b/java/org/eclipse/lsp4j/debug/DisconnectArguments.java
new file mode 100644
index 0000000..2f64405
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/DisconnectArguments.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'disconnect' request.
+ */
+@SuppressWarnings("all")
+public class DisconnectArguments {
+ /**
+ * A value of true indicates that this 'disconnect' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean restart;
+
+ /**
+ * Indicates whether the debuggee should be terminated when the debugger is disconnected.
+ * <p>
+ * If unspecified, the debug adapter is free to do whatever it thinks is best.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportTerminateDebuggee' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean terminateDebuggee;
+
+ /**
+ * A value of true indicates that this 'disconnect' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getRestart() {
+ return this.restart;
+ }
+
+ /**
+ * A value of true indicates that this 'disconnect' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ public void setRestart(final Boolean restart) {
+ this.restart = restart;
+ }
+
+ /**
+ * Indicates whether the debuggee should be terminated when the debugger is disconnected.
+ * <p>
+ * If unspecified, the debug adapter is free to do whatever it thinks is best.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportTerminateDebuggee' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getTerminateDebuggee() {
+ return this.terminateDebuggee;
+ }
+
+ /**
+ * Indicates whether the debuggee should be terminated when the debugger is disconnected.
+ * <p>
+ * If unspecified, the debug adapter is free to do whatever it thinks is best.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportTerminateDebuggee' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setTerminateDebuggee(final Boolean terminateDebuggee) {
+ this.terminateDebuggee = terminateDebuggee;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("restart", this.restart);
+ b.add("terminateDebuggee", this.terminateDebuggee);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DisconnectArguments other = (DisconnectArguments) obj;
+ if (this.restart == null) {
+ if (other.restart != null)
+ return false;
+ } else if (!this.restart.equals(other.restart))
+ return false;
+ if (this.terminateDebuggee == null) {
+ if (other.terminateDebuggee != null)
+ return false;
+ } else if (!this.terminateDebuggee.equals(other.terminateDebuggee))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.restart== null) ? 0 : this.restart.hashCode());
+ return prime * result + ((this.terminateDebuggee== null) ? 0 : this.terminateDebuggee.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/EvaluateArguments.java b/java/org/eclipse/lsp4j/debug/EvaluateArguments.java
new file mode 100644
index 0000000..634b49a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/EvaluateArguments.java
@@ -0,0 +1,194 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ValueFormat;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'evaluate' request.
+ */
+@SuppressWarnings("all")
+public class EvaluateArguments {
+ /**
+ * The expression to evaluate.
+ */
+ @NonNull
+ private String expression;
+
+ /**
+ * Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer frameId;
+
+ /**
+ * The context in which the evaluate request is run.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link EvaluateArgumentsContext}
+ */
+ private String context;
+
+ /**
+ * Specifies details on how to format the Evaluate result.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private ValueFormat format;
+
+ /**
+ * The expression to evaluate.
+ */
+ @Pure
+ @NonNull
+ public String getExpression() {
+ return this.expression;
+ }
+
+ /**
+ * The expression to evaluate.
+ */
+ public void setExpression(@NonNull final String expression) {
+ this.expression = Preconditions.checkNotNull(expression, "expression");
+ }
+
+ /**
+ * Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getFrameId() {
+ return this.frameId;
+ }
+
+ /**
+ * Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the
+ * global scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFrameId(final Integer frameId) {
+ this.frameId = frameId;
+ }
+
+ /**
+ * The context in which the evaluate request is run.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link EvaluateArgumentsContext}
+ */
+ @Pure
+ public String getContext() {
+ return this.context;
+ }
+
+ /**
+ * The context in which the evaluate request is run.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link EvaluateArgumentsContext}
+ */
+ public void setContext(final String context) {
+ this.context = context;
+ }
+
+ /**
+ * Specifies details on how to format the Evaluate result.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ValueFormat getFormat() {
+ return this.format;
+ }
+
+ /**
+ * Specifies details on how to format the Evaluate result.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFormat(final ValueFormat format) {
+ this.format = format;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("expression", this.expression);
+ b.add("frameId", this.frameId);
+ b.add("context", this.context);
+ b.add("format", this.format);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ EvaluateArguments other = (EvaluateArguments) obj;
+ if (this.expression == null) {
+ if (other.expression != null)
+ return false;
+ } else if (!this.expression.equals(other.expression))
+ return false;
+ if (this.frameId == null) {
+ if (other.frameId != null)
+ return false;
+ } else if (!this.frameId.equals(other.frameId))
+ return false;
+ if (this.context == null) {
+ if (other.context != null)
+ return false;
+ } else if (!this.context.equals(other.context))
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.expression== null) ? 0 : this.expression.hashCode());
+ result = prime * result + ((this.frameId== null) ? 0 : this.frameId.hashCode());
+ result = prime * result + ((this.context== null) ? 0 : this.context.hashCode());
+ return prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/EvaluateArgumentsContext.java b/java/org/eclipse/lsp4j/debug/EvaluateArgumentsContext.java
new file mode 100644
index 0000000..0fa2764
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/EvaluateArgumentsContext.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The context in which the evaluate request is run.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link EvaluateArgumentsContext}
+ */
+@SuppressWarnings("all")
+public interface EvaluateArgumentsContext {
+ /**
+ * evaluate is run in a watch.
+ */
+ static final String WATCH = "watch";
+
+ /**
+ * evaluate is run from REPL console.
+ */
+ static final String REPL = "repl";
+
+ /**
+ * evaluate is run from a data hover.
+ */
+ static final String HOVER = "hover";
+
+ /**
+ * evaluate is run to generate the value that will be stored in the clipboard.
+ * The attribute is only honored by a
+ * debug adapter if the capability 'supportsClipboardContext' is true.
+ */
+ static final String CLIPBOARD = "clipboard";
+}
diff --git a/java/org/eclipse/lsp4j/debug/EvaluateResponse.java b/java/org/eclipse/lsp4j/debug/EvaluateResponse.java
new file mode 100644
index 0000000..eaa3742
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/EvaluateResponse.java
@@ -0,0 +1,326 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.VariablePresentationHint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'evaluate' request.
+ */
+@SuppressWarnings("all")
+public class EvaluateResponse {
+ /**
+ * The result of the evaluate request.
+ */
+ @NonNull
+ private String result;
+
+ /**
+ * The optional type of the evaluate result.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ private String type;
+
+ /**
+ * Properties of a evaluate result that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ private VariablePresentationHint presentationHint;
+
+ /**
+ * If variablesReference is > 0, the evaluate result is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ */
+ private int variablesReference;
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer namedVariables;
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer indexedVariables;
+
+ /**
+ * Optional memory reference to a location appropriate for this result.
+ * <p>
+ * For pointer type eval results, this is generally a reference to the memory address contained in the pointer.
+ * <p>
+ * This attribute should be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsMemoryReferences' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ private String memoryReference;
+
+ /**
+ * The result of the evaluate request.
+ */
+ @Pure
+ @NonNull
+ public String getResult() {
+ return this.result;
+ }
+
+ /**
+ * The result of the evaluate request.
+ */
+ public void setResult(@NonNull final String result) {
+ this.result = Preconditions.checkNotNull(result, "result");
+ }
+
+ /**
+ * The optional type of the evaluate result.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getType() {
+ return this.type;
+ }
+
+ /**
+ * The optional type of the evaluate result.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setType(final String type) {
+ this.type = type;
+ }
+
+ /**
+ * Properties of a evaluate result that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public VariablePresentationHint getPresentationHint() {
+ return this.presentationHint;
+ }
+
+ /**
+ * Properties of a evaluate result that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPresentationHint(final VariablePresentationHint presentationHint) {
+ this.presentationHint = presentationHint;
+ }
+
+ /**
+ * If variablesReference is > 0, the evaluate result is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ */
+ @Pure
+ public int getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * If variablesReference is > 0, the evaluate result is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ */
+ public void setVariablesReference(final int variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getNamedVariables() {
+ return this.namedVariables;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setNamedVariables(final Integer namedVariables) {
+ this.namedVariables = namedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getIndexedVariables() {
+ return this.indexedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setIndexedVariables(final Integer indexedVariables) {
+ this.indexedVariables = indexedVariables;
+ }
+
+ /**
+ * Optional memory reference to a location appropriate for this result.
+ * <p>
+ * For pointer type eval results, this is generally a reference to the memory address contained in the pointer.
+ * <p>
+ * This attribute should be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsMemoryReferences' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMemoryReference() {
+ return this.memoryReference;
+ }
+
+ /**
+ * Optional memory reference to a location appropriate for this result.
+ * <p>
+ * For pointer type eval results, this is generally a reference to the memory address contained in the pointer.
+ * <p>
+ * This attribute should be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsMemoryReferences' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMemoryReference(final String memoryReference) {
+ this.memoryReference = memoryReference;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("result", this.result);
+ b.add("type", this.type);
+ b.add("presentationHint", this.presentationHint);
+ b.add("variablesReference", this.variablesReference);
+ b.add("namedVariables", this.namedVariables);
+ b.add("indexedVariables", this.indexedVariables);
+ b.add("memoryReference", this.memoryReference);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ EvaluateResponse other = (EvaluateResponse) obj;
+ if (this.result == null) {
+ if (other.result != null)
+ return false;
+ } else if (!this.result.equals(other.result))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.presentationHint == null) {
+ if (other.presentationHint != null)
+ return false;
+ } else if (!this.presentationHint.equals(other.presentationHint))
+ return false;
+ if (other.variablesReference != this.variablesReference)
+ return false;
+ if (this.namedVariables == null) {
+ if (other.namedVariables != null)
+ return false;
+ } else if (!this.namedVariables.equals(other.namedVariables))
+ return false;
+ if (this.indexedVariables == null) {
+ if (other.indexedVariables != null)
+ return false;
+ } else if (!this.indexedVariables.equals(other.indexedVariables))
+ return false;
+ if (this.memoryReference == null) {
+ if (other.memoryReference != null)
+ return false;
+ } else if (!this.memoryReference.equals(other.memoryReference))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.result== null) ? 0 : this.result.hashCode());
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ result = prime * result + ((this.presentationHint== null) ? 0 : this.presentationHint.hashCode());
+ result = prime * result + this.variablesReference;
+ result = prime * result + ((this.namedVariables== null) ? 0 : this.namedVariables.hashCode());
+ result = prime * result + ((this.indexedVariables== null) ? 0 : this.indexedVariables.hashCode());
+ return prime * result + ((this.memoryReference== null) ? 0 : this.memoryReference.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionBreakMode.java b/java/org/eclipse/lsp4j/debug/ExceptionBreakMode.java
new file mode 100644
index 0000000..b1b57c1
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionBreakMode.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * This enumeration defines all possible conditions when a thrown exception should result in a break.
+ * <p>
+ * never: never breaks,
+ * <p>
+ * always: always breaks,
+ * <p>
+ * unhandled: breaks when exception unhandled,
+ * <p>
+ * userUnhandled: breaks if the exception is not handled by user code.
+ */
+@SuppressWarnings("all")
+public enum ExceptionBreakMode {
+ NEVER,
+
+ ALWAYS,
+
+ UNHANDLED,
+
+ USER_UNHANDLED;
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionBreakpointsFilter.java b/java/org/eclipse/lsp4j/debug/ExceptionBreakpointsFilter.java
new file mode 100644
index 0000000..0576a05
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionBreakpointsFilter.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import com.google.gson.annotations.SerializedName;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An ExceptionBreakpointsFilter is shown in the UI as an filter option for configuring how exceptions are dealt
+ * with.
+ */
+@SuppressWarnings("all")
+public class ExceptionBreakpointsFilter {
+ /**
+ * The internal ID of the filter option. This value is passed to the 'setExceptionBreakpoints' request.
+ */
+ @NonNull
+ private String filter;
+
+ /**
+ * The name of the filter option. This will be shown in the UI.
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * Initial value of the filter option. If not specified a value 'false' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @SerializedName(value = "default")
+ private Boolean default_;
+
+ /**
+ * Controls whether a condition can be specified for this filter option. If false or missing, a condition can not
+ * be set.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsCondition;
+
+ /**
+ * The internal ID of the filter option. This value is passed to the 'setExceptionBreakpoints' request.
+ */
+ @Pure
+ @NonNull
+ public String getFilter() {
+ return this.filter;
+ }
+
+ /**
+ * The internal ID of the filter option. This value is passed to the 'setExceptionBreakpoints' request.
+ */
+ public void setFilter(@NonNull final String filter) {
+ this.filter = Preconditions.checkNotNull(filter, "filter");
+ }
+
+ /**
+ * The name of the filter option. This will be shown in the UI.
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The name of the filter option. This will be shown in the UI.
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * Initial value of the filter option. If not specified a value 'false' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getDefault_() {
+ return this.default_;
+ }
+
+ /**
+ * Initial value of the filter option. If not specified a value 'false' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setDefault_(final Boolean default_) {
+ this.default_ = default_;
+ }
+
+ /**
+ * Controls whether a condition can be specified for this filter option. If false or missing, a condition can not
+ * be set.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsCondition() {
+ return this.supportsCondition;
+ }
+
+ /**
+ * Controls whether a condition can be specified for this filter option. If false or missing, a condition can not
+ * be set.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsCondition(final Boolean supportsCondition) {
+ this.supportsCondition = supportsCondition;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("filter", this.filter);
+ b.add("label", this.label);
+ b.add("default_", this.default_);
+ b.add("supportsCondition", this.supportsCondition);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionBreakpointsFilter other = (ExceptionBreakpointsFilter) obj;
+ if (this.filter == null) {
+ if (other.filter != null)
+ return false;
+ } else if (!this.filter.equals(other.filter))
+ return false;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (this.default_ == null) {
+ if (other.default_ != null)
+ return false;
+ } else if (!this.default_.equals(other.default_))
+ return false;
+ if (this.supportsCondition == null) {
+ if (other.supportsCondition != null)
+ return false;
+ } else if (!this.supportsCondition.equals(other.supportsCondition))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.filter== null) ? 0 : this.filter.hashCode());
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + ((this.default_== null) ? 0 : this.default_.hashCode());
+ return prime * result + ((this.supportsCondition== null) ? 0 : this.supportsCondition.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionDetails.java b/java/org/eclipse/lsp4j/debug/ExceptionDetails.java
new file mode 100644
index 0000000..fcfd19c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionDetails.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Detailed information about an exception that has occurred.
+ */
+@SuppressWarnings("all")
+public class ExceptionDetails {
+ /**
+ * Message contained in the exception.
+ * <p>
+ * This is an optional property.
+ */
+ private String message;
+
+ /**
+ * Short type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ private String typeName;
+
+ /**
+ * Fully-qualified type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ private String fullTypeName;
+
+ /**
+ * Optional expression that can be evaluated in the current scope to obtain the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ private String evaluateName;
+
+ /**
+ * Stack trace at the time the exception was thrown.
+ * <p>
+ * This is an optional property.
+ */
+ private String stackTrace;
+
+ /**
+ * Details of the exception contained by this exception, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private ExceptionDetails[] innerException;
+
+ /**
+ * Message contained in the exception.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Message contained in the exception.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ /**
+ * Short type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getTypeName() {
+ return this.typeName;
+ }
+
+ /**
+ * Short type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ public void setTypeName(final String typeName) {
+ this.typeName = typeName;
+ }
+
+ /**
+ * Fully-qualified type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getFullTypeName() {
+ return this.fullTypeName;
+ }
+
+ /**
+ * Fully-qualified type name of the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFullTypeName(final String fullTypeName) {
+ this.fullTypeName = fullTypeName;
+ }
+
+ /**
+ * Optional expression that can be evaluated in the current scope to obtain the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getEvaluateName() {
+ return this.evaluateName;
+ }
+
+ /**
+ * Optional expression that can be evaluated in the current scope to obtain the exception object.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEvaluateName(final String evaluateName) {
+ this.evaluateName = evaluateName;
+ }
+
+ /**
+ * Stack trace at the time the exception was thrown.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getStackTrace() {
+ return this.stackTrace;
+ }
+
+ /**
+ * Stack trace at the time the exception was thrown.
+ * <p>
+ * This is an optional property.
+ */
+ public void setStackTrace(final String stackTrace) {
+ this.stackTrace = stackTrace;
+ }
+
+ /**
+ * Details of the exception contained by this exception, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ExceptionDetails[] getInnerException() {
+ return this.innerException;
+ }
+
+ /**
+ * Details of the exception contained by this exception, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setInnerException(final ExceptionDetails[] innerException) {
+ this.innerException = innerException;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("message", this.message);
+ b.add("typeName", this.typeName);
+ b.add("fullTypeName", this.fullTypeName);
+ b.add("evaluateName", this.evaluateName);
+ b.add("stackTrace", this.stackTrace);
+ b.add("innerException", this.innerException);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionDetails other = (ExceptionDetails) obj;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.typeName == null) {
+ if (other.typeName != null)
+ return false;
+ } else if (!this.typeName.equals(other.typeName))
+ return false;
+ if (this.fullTypeName == null) {
+ if (other.fullTypeName != null)
+ return false;
+ } else if (!this.fullTypeName.equals(other.fullTypeName))
+ return false;
+ if (this.evaluateName == null) {
+ if (other.evaluateName != null)
+ return false;
+ } else if (!this.evaluateName.equals(other.evaluateName))
+ return false;
+ if (this.stackTrace == null) {
+ if (other.stackTrace != null)
+ return false;
+ } else if (!this.stackTrace.equals(other.stackTrace))
+ return false;
+ if (this.innerException == null) {
+ if (other.innerException != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.innerException, other.innerException))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ result = prime * result + ((this.typeName== null) ? 0 : this.typeName.hashCode());
+ result = prime * result + ((this.fullTypeName== null) ? 0 : this.fullTypeName.hashCode());
+ result = prime * result + ((this.evaluateName== null) ? 0 : this.evaluateName.hashCode());
+ result = prime * result + ((this.stackTrace== null) ? 0 : this.stackTrace.hashCode());
+ return prime * result + ((this.innerException== null) ? 0 : Arrays.deepHashCode(this.innerException));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionFilterOptions.java b/java/org/eclipse/lsp4j/debug/ExceptionFilterOptions.java
new file mode 100644
index 0000000..17a1339
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionFilterOptions.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An ExceptionFilterOptions is used to specify an exception filter together with a condition for the
+ * setExceptionsFilter request.
+ */
+@SuppressWarnings("all")
+public class ExceptionFilterOptions {
+ /**
+ * ID of an exception filter returned by the 'exceptionBreakpointFilters' capability.
+ */
+ @NonNull
+ private String filterId;
+
+ /**
+ * An optional expression for conditional exceptions.
+ * <p>
+ * The exception will break into the debugger if the result of the condition is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String condition;
+
+ /**
+ * ID of an exception filter returned by the 'exceptionBreakpointFilters' capability.
+ */
+ @Pure
+ @NonNull
+ public String getFilterId() {
+ return this.filterId;
+ }
+
+ /**
+ * ID of an exception filter returned by the 'exceptionBreakpointFilters' capability.
+ */
+ public void setFilterId(@NonNull final String filterId) {
+ this.filterId = Preconditions.checkNotNull(filterId, "filterId");
+ }
+
+ /**
+ * An optional expression for conditional exceptions.
+ * <p>
+ * The exception will break into the debugger if the result of the condition is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getCondition() {
+ return this.condition;
+ }
+
+ /**
+ * An optional expression for conditional exceptions.
+ * <p>
+ * The exception will break into the debugger if the result of the condition is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCondition(final String condition) {
+ this.condition = condition;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("filterId", this.filterId);
+ b.add("condition", this.condition);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionFilterOptions other = (ExceptionFilterOptions) obj;
+ if (this.filterId == null) {
+ if (other.filterId != null)
+ return false;
+ } else if (!this.filterId.equals(other.filterId))
+ return false;
+ if (this.condition == null) {
+ if (other.condition != null)
+ return false;
+ } else if (!this.condition.equals(other.condition))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.filterId== null) ? 0 : this.filterId.hashCode());
+ return prime * result + ((this.condition== null) ? 0 : this.condition.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionInfoArguments.java b/java/org/eclipse/lsp4j/debug/ExceptionInfoArguments.java
new file mode 100644
index 0000000..e49d42d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionInfoArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'exceptionInfo' request.
+ */
+@SuppressWarnings("all")
+public class ExceptionInfoArguments {
+ /**
+ * Thread for which exception information should be retrieved.
+ */
+ private int threadId;
+
+ /**
+ * Thread for which exception information should be retrieved.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Thread for which exception information should be retrieved.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionInfoArguments other = (ExceptionInfoArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.threadId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionInfoResponse.java b/java/org/eclipse/lsp4j/debug/ExceptionInfoResponse.java
new file mode 100644
index 0000000..8223c6d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionInfoResponse.java
@@ -0,0 +1,176 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ExceptionBreakMode;
+import org.eclipse.lsp4j.debug.ExceptionDetails;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'exceptionInfo' request.
+ */
+@SuppressWarnings("all")
+public class ExceptionInfoResponse {
+ /**
+ * ID of the exception that was thrown.
+ */
+ @NonNull
+ private String exceptionId;
+
+ /**
+ * Descriptive text for the exception provided by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private String description;
+
+ /**
+ * Mode that caused the exception notification to be raised.
+ */
+ @NonNull
+ private ExceptionBreakMode breakMode;
+
+ /**
+ * Detailed information about the exception.
+ * <p>
+ * This is an optional property.
+ */
+ private ExceptionDetails details;
+
+ /**
+ * ID of the exception that was thrown.
+ */
+ @Pure
+ @NonNull
+ public String getExceptionId() {
+ return this.exceptionId;
+ }
+
+ /**
+ * ID of the exception that was thrown.
+ */
+ public void setExceptionId(@NonNull final String exceptionId) {
+ this.exceptionId = Preconditions.checkNotNull(exceptionId, "exceptionId");
+ }
+
+ /**
+ * Descriptive text for the exception provided by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getDescription() {
+ return this.description;
+ }
+
+ /**
+ * Descriptive text for the exception provided by the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ /**
+ * Mode that caused the exception notification to be raised.
+ */
+ @Pure
+ @NonNull
+ public ExceptionBreakMode getBreakMode() {
+ return this.breakMode;
+ }
+
+ /**
+ * Mode that caused the exception notification to be raised.
+ */
+ public void setBreakMode(@NonNull final ExceptionBreakMode breakMode) {
+ this.breakMode = Preconditions.checkNotNull(breakMode, "breakMode");
+ }
+
+ /**
+ * Detailed information about the exception.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ExceptionDetails getDetails() {
+ return this.details;
+ }
+
+ /**
+ * Detailed information about the exception.
+ * <p>
+ * This is an optional property.
+ */
+ public void setDetails(final ExceptionDetails details) {
+ this.details = details;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("exceptionId", this.exceptionId);
+ b.add("description", this.description);
+ b.add("breakMode", this.breakMode);
+ b.add("details", this.details);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionInfoResponse other = (ExceptionInfoResponse) obj;
+ if (this.exceptionId == null) {
+ if (other.exceptionId != null)
+ return false;
+ } else if (!this.exceptionId.equals(other.exceptionId))
+ return false;
+ if (this.description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!this.description.equals(other.description))
+ return false;
+ if (this.breakMode == null) {
+ if (other.breakMode != null)
+ return false;
+ } else if (!this.breakMode.equals(other.breakMode))
+ return false;
+ if (this.details == null) {
+ if (other.details != null)
+ return false;
+ } else if (!this.details.equals(other.details))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.exceptionId== null) ? 0 : this.exceptionId.hashCode());
+ result = prime * result + ((this.description== null) ? 0 : this.description.hashCode());
+ result = prime * result + ((this.breakMode== null) ? 0 : this.breakMode.hashCode());
+ return prime * result + ((this.details== null) ? 0 : this.details.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionOptions.java b/java/org/eclipse/lsp4j/debug/ExceptionOptions.java
new file mode 100644
index 0000000..25dadf3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionOptions.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.ExceptionBreakMode;
+import org.eclipse.lsp4j.debug.ExceptionPathSegment;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An ExceptionOptions assigns configuration options to a set of exceptions.
+ */
+@SuppressWarnings("all")
+public class ExceptionOptions {
+ /**
+ * A path that selects a single or multiple exceptions in a tree. If 'path' is missing, the whole tree is
+ * selected.
+ * <p>
+ * By convention the first segment of the path is a category that is used to group exceptions in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ private ExceptionPathSegment[] path;
+
+ /**
+ * Condition when a thrown exception should result in a break.
+ */
+ @NonNull
+ private ExceptionBreakMode breakMode;
+
+ /**
+ * A path that selects a single or multiple exceptions in a tree. If 'path' is missing, the whole tree is
+ * selected.
+ * <p>
+ * By convention the first segment of the path is a category that is used to group exceptions in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ExceptionPathSegment[] getPath() {
+ return this.path;
+ }
+
+ /**
+ * A path that selects a single or multiple exceptions in a tree. If 'path' is missing, the whole tree is
+ * selected.
+ * <p>
+ * By convention the first segment of the path is a category that is used to group exceptions in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPath(final ExceptionPathSegment[] path) {
+ this.path = path;
+ }
+
+ /**
+ * Condition when a thrown exception should result in a break.
+ */
+ @Pure
+ @NonNull
+ public ExceptionBreakMode getBreakMode() {
+ return this.breakMode;
+ }
+
+ /**
+ * Condition when a thrown exception should result in a break.
+ */
+ public void setBreakMode(@NonNull final ExceptionBreakMode breakMode) {
+ this.breakMode = Preconditions.checkNotNull(breakMode, "breakMode");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("path", this.path);
+ b.add("breakMode", this.breakMode);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionOptions other = (ExceptionOptions) obj;
+ if (this.path == null) {
+ if (other.path != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.path, other.path))
+ return false;
+ if (this.breakMode == null) {
+ if (other.breakMode != null)
+ return false;
+ } else if (!this.breakMode.equals(other.breakMode))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.path== null) ? 0 : Arrays.deepHashCode(this.path));
+ return prime * result + ((this.breakMode== null) ? 0 : this.breakMode.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExceptionPathSegment.java b/java/org/eclipse/lsp4j/debug/ExceptionPathSegment.java
new file mode 100644
index 0000000..a9270d5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExceptionPathSegment.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * An ExceptionPathSegment represents a segment in a path that is used to match leafs or nodes in a tree of
+ * exceptions.
+ * <p>
+ * If a segment consists of more than one name, it matches the names provided if 'negate' is false or missing or
+ * <p>
+ * it matches anything except the names provided if 'negate' is true.
+ */
+@SuppressWarnings("all")
+public class ExceptionPathSegment {
+ /**
+ * If false or missing this segment matches the names provided, otherwise it matches anything except the names
+ * provided.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean negate;
+
+ /**
+ * Depending on the value of 'negate' the names that should match or not match.
+ */
+ @NonNull
+ private String[] names;
+
+ /**
+ * If false or missing this segment matches the names provided, otherwise it matches anything except the names
+ * provided.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getNegate() {
+ return this.negate;
+ }
+
+ /**
+ * If false or missing this segment matches the names provided, otherwise it matches anything except the names
+ * provided.
+ * <p>
+ * This is an optional property.
+ */
+ public void setNegate(final Boolean negate) {
+ this.negate = negate;
+ }
+
+ /**
+ * Depending on the value of 'negate' the names that should match or not match.
+ */
+ @Pure
+ @NonNull
+ public String[] getNames() {
+ return this.names;
+ }
+
+ /**
+ * Depending on the value of 'negate' the names that should match or not match.
+ */
+ public void setNames(@NonNull final String[] names) {
+ this.names = Preconditions.checkNotNull(names, "names");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("negate", this.negate);
+ b.add("names", this.names);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExceptionPathSegment other = (ExceptionPathSegment) obj;
+ if (this.negate == null) {
+ if (other.negate != null)
+ return false;
+ } else if (!this.negate.equals(other.negate))
+ return false;
+ if (this.names == null) {
+ if (other.names != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.names, other.names))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.negate== null) ? 0 : this.negate.hashCode());
+ return prime * result + ((this.names== null) ? 0 : Arrays.deepHashCode(this.names));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ExitedEventArguments.java b/java/org/eclipse/lsp4j/debug/ExitedEventArguments.java
new file mode 100644
index 0000000..7e69e53
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ExitedEventArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that the debuggee has exited and returns its exit code.
+ */
+@SuppressWarnings("all")
+public class ExitedEventArguments {
+ /**
+ * The exit code returned from the debuggee.
+ */
+ private int exitCode;
+
+ /**
+ * The exit code returned from the debuggee.
+ */
+ @Pure
+ public int getExitCode() {
+ return this.exitCode;
+ }
+
+ /**
+ * The exit code returned from the debuggee.
+ */
+ public void setExitCode(final int exitCode) {
+ this.exitCode = exitCode;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("exitCode", this.exitCode);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ExitedEventArguments other = (ExitedEventArguments) obj;
+ if (other.exitCode != this.exitCode)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.exitCode;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/FunctionBreakpoint.java b/java/org/eclipse/lsp4j/debug/FunctionBreakpoint.java
new file mode 100644
index 0000000..6167245
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/FunctionBreakpoint.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Properties of a breakpoint passed to the setFunctionBreakpoints request.
+ */
+@SuppressWarnings("all")
+public class FunctionBreakpoint {
+ /**
+ * The name of the function.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String condition;
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String hitCondition;
+
+ /**
+ * The name of the function.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the function.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getCondition() {
+ return this.condition;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCondition(final String condition) {
+ this.condition = condition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getHitCondition() {
+ return this.hitCondition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setHitCondition(final String hitCondition) {
+ this.hitCondition = hitCondition;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("condition", this.condition);
+ b.add("hitCondition", this.hitCondition);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ FunctionBreakpoint other = (FunctionBreakpoint) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.condition == null) {
+ if (other.condition != null)
+ return false;
+ } else if (!this.condition.equals(other.condition))
+ return false;
+ if (this.hitCondition == null) {
+ if (other.hitCondition != null)
+ return false;
+ } else if (!this.hitCondition.equals(other.hitCondition))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.condition== null) ? 0 : this.condition.hashCode());
+ return prime * result + ((this.hitCondition== null) ? 0 : this.hitCondition.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/GotoArguments.java b/java/org/eclipse/lsp4j/debug/GotoArguments.java
new file mode 100644
index 0000000..bf699c2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/GotoArguments.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'goto' request.
+ */
+@SuppressWarnings("all")
+public class GotoArguments {
+ /**
+ * Set the goto target for this thread.
+ */
+ private int threadId;
+
+ /**
+ * The location where the debuggee will continue to run.
+ */
+ private int targetId;
+
+ /**
+ * Set the goto target for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Set the goto target for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * The location where the debuggee will continue to run.
+ */
+ @Pure
+ public int getTargetId() {
+ return this.targetId;
+ }
+
+ /**
+ * The location where the debuggee will continue to run.
+ */
+ public void setTargetId(final int targetId) {
+ this.targetId = targetId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("targetId", this.targetId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ GotoArguments other = (GotoArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (other.targetId != this.targetId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ return prime * result + this.targetId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/GotoTarget.java b/java/org/eclipse/lsp4j/debug/GotoTarget.java
new file mode 100644
index 0000000..5d64972
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/GotoTarget.java
@@ -0,0 +1,261 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A GotoTarget describes a code location that can be used as a target in the 'goto' request.
+ * <p>
+ * The possible goto targets can be determined via the 'gotoTargets' request.
+ */
+@SuppressWarnings("all")
+public class GotoTarget {
+ /**
+ * Unique identifier for a goto target. This is used in the goto request.
+ */
+ private int id;
+
+ /**
+ * The name of the goto target (shown in the UI).
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * The line of the goto target.
+ */
+ private int line;
+
+ /**
+ * An optional column of the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * An optional end line of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * An optional end column of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * Optional memory reference for the instruction pointer value represented by this target.
+ * <p>
+ * This is an optional property.
+ */
+ private String instructionPointerReference;
+
+ /**
+ * Unique identifier for a goto target. This is used in the goto request.
+ */
+ @Pure
+ public int getId() {
+ return this.id;
+ }
+
+ /**
+ * Unique identifier for a goto target. This is used in the goto request.
+ */
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ /**
+ * The name of the goto target (shown in the UI).
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The name of the goto target (shown in the UI).
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ /**
+ * The line of the goto target.
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * The line of the goto target.
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * An optional column of the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * An optional column of the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * An optional end line of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * An optional end line of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * An optional end column of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * An optional end column of the range covered by the goto target.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ /**
+ * Optional memory reference for the instruction pointer value represented by this target.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getInstructionPointerReference() {
+ return this.instructionPointerReference;
+ }
+
+ /**
+ * Optional memory reference for the instruction pointer value represented by this target.
+ * <p>
+ * This is an optional property.
+ */
+ public void setInstructionPointerReference(final String instructionPointerReference) {
+ this.instructionPointerReference = instructionPointerReference;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("label", this.label);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ b.add("instructionPointerReference", this.instructionPointerReference);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ GotoTarget other = (GotoTarget) obj;
+ if (other.id != this.id)
+ return false;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ if (other.line != this.line)
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ if (this.instructionPointerReference == null) {
+ if (other.instructionPointerReference != null)
+ return false;
+ } else if (!this.instructionPointerReference.equals(other.instructionPointerReference))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.id;
+ result = prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ result = prime * result + this.line;
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ result = prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ return prime * result + ((this.instructionPointerReference== null) ? 0 : this.instructionPointerReference.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/GotoTargetsArguments.java b/java/org/eclipse/lsp4j/debug/GotoTargetsArguments.java
new file mode 100644
index 0000000..27aedd7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/GotoTargetsArguments.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'gotoTargets' request.
+ */
+@SuppressWarnings("all")
+public class GotoTargetsArguments {
+ /**
+ * The source location for which the goto targets are determined.
+ */
+ @NonNull
+ private Source source;
+
+ /**
+ * The line location for which the goto targets are determined.
+ */
+ private int line;
+
+ /**
+ * An optional column location for which the goto targets are determined.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * The source location for which the goto targets are determined.
+ */
+ @Pure
+ @NonNull
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * The source location for which the goto targets are determined.
+ */
+ public void setSource(@NonNull final Source source) {
+ this.source = Preconditions.checkNotNull(source, "source");
+ }
+
+ /**
+ * The line location for which the goto targets are determined.
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * The line location for which the goto targets are determined.
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * An optional column location for which the goto targets are determined.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * An optional column location for which the goto targets are determined.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("source", this.source);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ GotoTargetsArguments other = (GotoTargetsArguments) obj;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (other.line != this.line)
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + this.line;
+ return prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/GotoTargetsResponse.java b/java/org/eclipse/lsp4j/debug/GotoTargetsResponse.java
new file mode 100644
index 0000000..1ad134d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/GotoTargetsResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.GotoTarget;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'gotoTargets' request.
+ */
+@SuppressWarnings("all")
+public class GotoTargetsResponse {
+ /**
+ * The possible goto targets of the specified location.
+ */
+ @NonNull
+ private GotoTarget[] targets;
+
+ /**
+ * The possible goto targets of the specified location.
+ */
+ @Pure
+ @NonNull
+ public GotoTarget[] getTargets() {
+ return this.targets;
+ }
+
+ /**
+ * The possible goto targets of the specified location.
+ */
+ public void setTargets(@NonNull final GotoTarget[] targets) {
+ this.targets = Preconditions.checkNotNull(targets, "targets");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("targets", this.targets);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ GotoTargetsResponse other = (GotoTargetsResponse) obj;
+ if (this.targets == null) {
+ if (other.targets != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.targets, other.targets))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.targets== null) ? 0 : Arrays.deepHashCode(this.targets));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/InitializeRequestArguments.java b/java/org/eclipse/lsp4j/debug/InitializeRequestArguments.java
new file mode 100644
index 0000000..2f1d520
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/InitializeRequestArguments.java
@@ -0,0 +1,481 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'initialize' request.
+ */
+@SuppressWarnings("all")
+public class InitializeRequestArguments {
+ /**
+ * The ID of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private String clientID;
+
+ /**
+ * The human readable name of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private String clientName;
+
+ /**
+ * The ID of the debug adapter.
+ */
+ @NonNull
+ private String adapterID;
+
+ /**
+ * The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US or de-CH.
+ * <p>
+ * This is an optional property.
+ */
+ private String locale;
+
+ /**
+ * If true all line numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean linesStartAt1;
+
+ /**
+ * If true all column numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean columnsStartAt1;
+
+ /**
+ * Determines in what format paths are specified. The default is 'path', which is the native format.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InitializeRequestArgumentsPathFormat}
+ */
+ private String pathFormat;
+
+ /**
+ * Client supports the optional type attribute for variables.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsVariableType;
+
+ /**
+ * Client supports the paging of variables.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsVariablePaging;
+
+ /**
+ * Client supports the runInTerminal request.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsRunInTerminalRequest;
+
+ /**
+ * Client supports memory references.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsMemoryReferences;
+
+ /**
+ * Client supports progress reporting.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsProgressReporting;
+
+ /**
+ * Client supports the invalidated event.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean supportsInvalidatedEvent;
+
+ /**
+ * The ID of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getClientID() {
+ return this.clientID;
+ }
+
+ /**
+ * The ID of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setClientID(final String clientID) {
+ this.clientID = clientID;
+ }
+
+ /**
+ * The human readable name of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getClientName() {
+ return this.clientName;
+ }
+
+ /**
+ * The human readable name of the (frontend) client using this adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setClientName(final String clientName) {
+ this.clientName = clientName;
+ }
+
+ /**
+ * The ID of the debug adapter.
+ */
+ @Pure
+ @NonNull
+ public String getAdapterID() {
+ return this.adapterID;
+ }
+
+ /**
+ * The ID of the debug adapter.
+ */
+ public void setAdapterID(@NonNull final String adapterID) {
+ this.adapterID = Preconditions.checkNotNull(adapterID, "adapterID");
+ }
+
+ /**
+ * The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US or de-CH.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getLocale() {
+ return this.locale;
+ }
+
+ /**
+ * The ISO-639 locale of the (frontend) client using this adapter, e.g. en-US or de-CH.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLocale(final String locale) {
+ this.locale = locale;
+ }
+
+ /**
+ * If true all line numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getLinesStartAt1() {
+ return this.linesStartAt1;
+ }
+
+ /**
+ * If true all line numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ public void setLinesStartAt1(final Boolean linesStartAt1) {
+ this.linesStartAt1 = linesStartAt1;
+ }
+
+ /**
+ * If true all column numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getColumnsStartAt1() {
+ return this.columnsStartAt1;
+ }
+
+ /**
+ * If true all column numbers are 1-based (default).
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumnsStartAt1(final Boolean columnsStartAt1) {
+ this.columnsStartAt1 = columnsStartAt1;
+ }
+
+ /**
+ * Determines in what format paths are specified. The default is 'path', which is the native format.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InitializeRequestArgumentsPathFormat}
+ */
+ @Pure
+ public String getPathFormat() {
+ return this.pathFormat;
+ }
+
+ /**
+ * Determines in what format paths are specified. The default is 'path', which is the native format.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InitializeRequestArgumentsPathFormat}
+ */
+ public void setPathFormat(final String pathFormat) {
+ this.pathFormat = pathFormat;
+ }
+
+ /**
+ * Client supports the optional type attribute for variables.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsVariableType() {
+ return this.supportsVariableType;
+ }
+
+ /**
+ * Client supports the optional type attribute for variables.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsVariableType(final Boolean supportsVariableType) {
+ this.supportsVariableType = supportsVariableType;
+ }
+
+ /**
+ * Client supports the paging of variables.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsVariablePaging() {
+ return this.supportsVariablePaging;
+ }
+
+ /**
+ * Client supports the paging of variables.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsVariablePaging(final Boolean supportsVariablePaging) {
+ this.supportsVariablePaging = supportsVariablePaging;
+ }
+
+ /**
+ * Client supports the runInTerminal request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsRunInTerminalRequest() {
+ return this.supportsRunInTerminalRequest;
+ }
+
+ /**
+ * Client supports the runInTerminal request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsRunInTerminalRequest(final Boolean supportsRunInTerminalRequest) {
+ this.supportsRunInTerminalRequest = supportsRunInTerminalRequest;
+ }
+
+ /**
+ * Client supports memory references.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsMemoryReferences() {
+ return this.supportsMemoryReferences;
+ }
+
+ /**
+ * Client supports memory references.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsMemoryReferences(final Boolean supportsMemoryReferences) {
+ this.supportsMemoryReferences = supportsMemoryReferences;
+ }
+
+ /**
+ * Client supports progress reporting.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsProgressReporting() {
+ return this.supportsProgressReporting;
+ }
+
+ /**
+ * Client supports progress reporting.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsProgressReporting(final Boolean supportsProgressReporting) {
+ this.supportsProgressReporting = supportsProgressReporting;
+ }
+
+ /**
+ * Client supports the invalidated event.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSupportsInvalidatedEvent() {
+ return this.supportsInvalidatedEvent;
+ }
+
+ /**
+ * Client supports the invalidated event.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSupportsInvalidatedEvent(final Boolean supportsInvalidatedEvent) {
+ this.supportsInvalidatedEvent = supportsInvalidatedEvent;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("clientID", this.clientID);
+ b.add("clientName", this.clientName);
+ b.add("adapterID", this.adapterID);
+ b.add("locale", this.locale);
+ b.add("linesStartAt1", this.linesStartAt1);
+ b.add("columnsStartAt1", this.columnsStartAt1);
+ b.add("pathFormat", this.pathFormat);
+ b.add("supportsVariableType", this.supportsVariableType);
+ b.add("supportsVariablePaging", this.supportsVariablePaging);
+ b.add("supportsRunInTerminalRequest", this.supportsRunInTerminalRequest);
+ b.add("supportsMemoryReferences", this.supportsMemoryReferences);
+ b.add("supportsProgressReporting", this.supportsProgressReporting);
+ b.add("supportsInvalidatedEvent", this.supportsInvalidatedEvent);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InitializeRequestArguments other = (InitializeRequestArguments) obj;
+ if (this.clientID == null) {
+ if (other.clientID != null)
+ return false;
+ } else if (!this.clientID.equals(other.clientID))
+ return false;
+ if (this.clientName == null) {
+ if (other.clientName != null)
+ return false;
+ } else if (!this.clientName.equals(other.clientName))
+ return false;
+ if (this.adapterID == null) {
+ if (other.adapterID != null)
+ return false;
+ } else if (!this.adapterID.equals(other.adapterID))
+ return false;
+ if (this.locale == null) {
+ if (other.locale != null)
+ return false;
+ } else if (!this.locale.equals(other.locale))
+ return false;
+ if (this.linesStartAt1 == null) {
+ if (other.linesStartAt1 != null)
+ return false;
+ } else if (!this.linesStartAt1.equals(other.linesStartAt1))
+ return false;
+ if (this.columnsStartAt1 == null) {
+ if (other.columnsStartAt1 != null)
+ return false;
+ } else if (!this.columnsStartAt1.equals(other.columnsStartAt1))
+ return false;
+ if (this.pathFormat == null) {
+ if (other.pathFormat != null)
+ return false;
+ } else if (!this.pathFormat.equals(other.pathFormat))
+ return false;
+ if (this.supportsVariableType == null) {
+ if (other.supportsVariableType != null)
+ return false;
+ } else if (!this.supportsVariableType.equals(other.supportsVariableType))
+ return false;
+ if (this.supportsVariablePaging == null) {
+ if (other.supportsVariablePaging != null)
+ return false;
+ } else if (!this.supportsVariablePaging.equals(other.supportsVariablePaging))
+ return false;
+ if (this.supportsRunInTerminalRequest == null) {
+ if (other.supportsRunInTerminalRequest != null)
+ return false;
+ } else if (!this.supportsRunInTerminalRequest.equals(other.supportsRunInTerminalRequest))
+ return false;
+ if (this.supportsMemoryReferences == null) {
+ if (other.supportsMemoryReferences != null)
+ return false;
+ } else if (!this.supportsMemoryReferences.equals(other.supportsMemoryReferences))
+ return false;
+ if (this.supportsProgressReporting == null) {
+ if (other.supportsProgressReporting != null)
+ return false;
+ } else if (!this.supportsProgressReporting.equals(other.supportsProgressReporting))
+ return false;
+ if (this.supportsInvalidatedEvent == null) {
+ if (other.supportsInvalidatedEvent != null)
+ return false;
+ } else if (!this.supportsInvalidatedEvent.equals(other.supportsInvalidatedEvent))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.clientID== null) ? 0 : this.clientID.hashCode());
+ result = prime * result + ((this.clientName== null) ? 0 : this.clientName.hashCode());
+ result = prime * result + ((this.adapterID== null) ? 0 : this.adapterID.hashCode());
+ result = prime * result + ((this.locale== null) ? 0 : this.locale.hashCode());
+ result = prime * result + ((this.linesStartAt1== null) ? 0 : this.linesStartAt1.hashCode());
+ result = prime * result + ((this.columnsStartAt1== null) ? 0 : this.columnsStartAt1.hashCode());
+ result = prime * result + ((this.pathFormat== null) ? 0 : this.pathFormat.hashCode());
+ result = prime * result + ((this.supportsVariableType== null) ? 0 : this.supportsVariableType.hashCode());
+ result = prime * result + ((this.supportsVariablePaging== null) ? 0 : this.supportsVariablePaging.hashCode());
+ result = prime * result + ((this.supportsRunInTerminalRequest== null) ? 0 : this.supportsRunInTerminalRequest.hashCode());
+ result = prime * result + ((this.supportsMemoryReferences== null) ? 0 : this.supportsMemoryReferences.hashCode());
+ result = prime * result + ((this.supportsProgressReporting== null) ? 0 : this.supportsProgressReporting.hashCode());
+ return prime * result + ((this.supportsInvalidatedEvent== null) ? 0 : this.supportsInvalidatedEvent.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/InitializeRequestArgumentsPathFormat.java b/java/org/eclipse/lsp4j/debug/InitializeRequestArgumentsPathFormat.java
new file mode 100644
index 0000000..ff643b0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/InitializeRequestArgumentsPathFormat.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Determines in what format paths are specified. The default is 'path', which is the native format.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InitializeRequestArgumentsPathFormat}
+ */
+@SuppressWarnings("all")
+public interface InitializeRequestArgumentsPathFormat {
+ static final String PATH = "path";
+
+ static final String URI = "uri";
+}
diff --git a/java/org/eclipse/lsp4j/debug/InstructionBreakpoint.java b/java/org/eclipse/lsp4j/debug/InstructionBreakpoint.java
new file mode 100644
index 0000000..190f1a0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/InstructionBreakpoint.java
@@ -0,0 +1,211 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Properties of a breakpoint passed to the setInstructionBreakpoints request
+ */
+@SuppressWarnings("all")
+public class InstructionBreakpoint {
+ /**
+ * The instruction reference of the breakpoint.
+ * <p>
+ * This should be a memory or instruction pointer reference from an EvaluateResponse, Variable, StackFrame,
+ * GotoTarget, or Breakpoint.
+ */
+ @NonNull
+ private String instructionReference;
+
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer offset;
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String condition;
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String hitCondition;
+
+ /**
+ * The instruction reference of the breakpoint.
+ * <p>
+ * This should be a memory or instruction pointer reference from an EvaluateResponse, Variable, StackFrame,
+ * GotoTarget, or Breakpoint.
+ */
+ @Pure
+ @NonNull
+ public String getInstructionReference() {
+ return this.instructionReference;
+ }
+
+ /**
+ * The instruction reference of the breakpoint.
+ * <p>
+ * This should be a memory or instruction pointer reference from an EvaluateResponse, Variable, StackFrame,
+ * GotoTarget, or Breakpoint.
+ */
+ public void setInstructionReference(@NonNull final String instructionReference) {
+ this.instructionReference = Preconditions.checkNotNull(instructionReference, "instructionReference");
+ }
+
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getOffset() {
+ return this.offset;
+ }
+
+ /**
+ * An optional offset from the instruction reference.
+ * <p>
+ * This can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ public void setOffset(final Integer offset) {
+ this.offset = offset;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getCondition() {
+ return this.condition;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCondition(final String condition) {
+ this.condition = condition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getHitCondition() {
+ return this.hitCondition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setHitCondition(final String hitCondition) {
+ this.hitCondition = hitCondition;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("instructionReference", this.instructionReference);
+ b.add("offset", this.offset);
+ b.add("condition", this.condition);
+ b.add("hitCondition", this.hitCondition);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InstructionBreakpoint other = (InstructionBreakpoint) obj;
+ if (this.instructionReference == null) {
+ if (other.instructionReference != null)
+ return false;
+ } else if (!this.instructionReference.equals(other.instructionReference))
+ return false;
+ if (this.offset == null) {
+ if (other.offset != null)
+ return false;
+ } else if (!this.offset.equals(other.offset))
+ return false;
+ if (this.condition == null) {
+ if (other.condition != null)
+ return false;
+ } else if (!this.condition.equals(other.condition))
+ return false;
+ if (this.hitCondition == null) {
+ if (other.hitCondition != null)
+ return false;
+ } else if (!this.hitCondition.equals(other.hitCondition))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.instructionReference== null) ? 0 : this.instructionReference.hashCode());
+ result = prime * result + ((this.offset== null) ? 0 : this.offset.hashCode());
+ result = prime * result + ((this.condition== null) ? 0 : this.condition.hashCode());
+ return prime * result + ((this.hitCondition== null) ? 0 : this.hitCondition.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/InvalidatedAreas.java b/java/org/eclipse/lsp4j/debug/InvalidatedAreas.java
new file mode 100644
index 0000000..a4681f2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/InvalidatedAreas.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Logical areas that can be invalidated by the 'invalidated' event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InvalidatedAreas}
+ */
+@SuppressWarnings("all")
+public interface InvalidatedAreas {
+ /**
+ * All previously fetched data has become invalid and needs to be refetched.
+ */
+ static final String ALL = "all";
+
+ /**
+ * Previously fetched stack related data has become invalid and needs to be refetched.
+ */
+ static final String STACKS = "stacks";
+
+ /**
+ * Previously fetched thread related data has become invalid and needs to be refetched.
+ */
+ static final String THREADS = "threads";
+
+ /**
+ * Previously fetched variable data has become invalid and needs to be refetched.
+ */
+ static final String VARIABLES = "variables";
+}
diff --git a/java/org/eclipse/lsp4j/debug/InvalidatedEventArguments.java b/java/org/eclipse/lsp4j/debug/InvalidatedEventArguments.java
new file mode 100644
index 0000000..9022799
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/InvalidatedEventArguments.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * This event signals that some state in the debug adapter has changed and requires that the client needs to
+ * re-render the data snapshot previously requested.
+ * <p>
+ * Debug adapters do not have to emit this event for runtime changes like stopped or thread events because in that
+ * case the client refetches the new state anyway. But the event can be used for example to refresh the UI after
+ * rendering formatting has changed in the debug adapter.
+ * <p>
+ * This event should only be sent if the debug adapter has received a value true for the
+ * 'supportsInvalidatedEvent' capability of the 'initialize' request.
+ */
+@SuppressWarnings("all")
+public class InvalidatedEventArguments {
+ /**
+ * Optional set of logical areas that got invalidated. This property has a hint characteristic: a client can only
+ * be expected to make a 'best effort' in honouring the areas but there are no guarantees. If this property is
+ * missing, empty, or if values are not understand the client should assume a single value 'all'.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InvalidatedAreas}
+ */
+ private String[] areas;
+
+ /**
+ * If specified, the client only needs to refetch data related to this thread.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer threadId;
+
+ /**
+ * If specified, the client only needs to refetch data related to this stack frame (and the 'threadId' is
+ * ignored).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer stackFrameId;
+
+ /**
+ * Optional set of logical areas that got invalidated. This property has a hint characteristic: a client can only
+ * be expected to make a 'best effort' in honouring the areas but there are no guarantees. If this property is
+ * missing, empty, or if values are not understand the client should assume a single value 'all'.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InvalidatedAreas}
+ */
+ @Pure
+ public String[] getAreas() {
+ return this.areas;
+ }
+
+ /**
+ * Optional set of logical areas that got invalidated. This property has a hint characteristic: a client can only
+ * be expected to make a 'best effort' in honouring the areas but there are no guarantees. If this property is
+ * missing, empty, or if values are not understand the client should assume a single value 'all'.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link InvalidatedAreas}
+ */
+ public void setAreas(final String[] areas) {
+ this.areas = areas;
+ }
+
+ /**
+ * If specified, the client only needs to refetch data related to this thread.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * If specified, the client only needs to refetch data related to this thread.
+ * <p>
+ * This is an optional property.
+ */
+ public void setThreadId(final Integer threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * If specified, the client only needs to refetch data related to this stack frame (and the 'threadId' is
+ * ignored).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getStackFrameId() {
+ return this.stackFrameId;
+ }
+
+ /**
+ * If specified, the client only needs to refetch data related to this stack frame (and the 'threadId' is
+ * ignored).
+ * <p>
+ * This is an optional property.
+ */
+ public void setStackFrameId(final Integer stackFrameId) {
+ this.stackFrameId = stackFrameId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("areas", this.areas);
+ b.add("threadId", this.threadId);
+ b.add("stackFrameId", this.stackFrameId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ InvalidatedEventArguments other = (InvalidatedEventArguments) obj;
+ if (this.areas == null) {
+ if (other.areas != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.areas, other.areas))
+ return false;
+ if (this.threadId == null) {
+ if (other.threadId != null)
+ return false;
+ } else if (!this.threadId.equals(other.threadId))
+ return false;
+ if (this.stackFrameId == null) {
+ if (other.stackFrameId != null)
+ return false;
+ } else if (!this.stackFrameId.equals(other.stackFrameId))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.areas== null) ? 0 : Arrays.deepHashCode(this.areas));
+ result = prime * result + ((this.threadId== null) ? 0 : this.threadId.hashCode());
+ return prime * result + ((this.stackFrameId== null) ? 0 : this.stackFrameId.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/LaunchRequestArguments.java b/java/org/eclipse/lsp4j/debug/LaunchRequestArguments.java
new file mode 100644
index 0000000..925b437
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/LaunchRequestArguments.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'launch' request. Additional attributes are implementation specific.
+ */
+@SuppressWarnings("all")
+public class LaunchRequestArguments {
+ /**
+ * If noDebug is true the launch request should launch the program without enabling debugging.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean noDebug;
+
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ private Object __restart;
+
+ /**
+ * If noDebug is true the launch request should launch the program without enabling debugging.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getNoDebug() {
+ return this.noDebug;
+ }
+
+ /**
+ * If noDebug is true the launch request should launch the program without enabling debugging.
+ * <p>
+ * This is an optional property.
+ */
+ public void setNoDebug(final Boolean noDebug) {
+ this.noDebug = noDebug;
+ }
+
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Object get__restart() {
+ return this.__restart;
+ }
+
+ /**
+ * Optional data from the previous, restarted session.
+ * <p>
+ * The data is sent as the 'restart' attribute of the 'terminated' event.
+ * <p>
+ * The client should leave the data intact.
+ * <p>
+ * This is an optional property.
+ */
+ public void set__restart(final Object __restart) {
+ this.__restart = __restart;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("noDebug", this.noDebug);
+ b.add("__restart", this.__restart);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LaunchRequestArguments other = (LaunchRequestArguments) obj;
+ if (this.noDebug == null) {
+ if (other.noDebug != null)
+ return false;
+ } else if (!this.noDebug.equals(other.noDebug))
+ return false;
+ if (this.__restart == null) {
+ if (other.__restart != null)
+ return false;
+ } else if (!this.__restart.equals(other.__restart))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.noDebug== null) ? 0 : this.noDebug.hashCode());
+ return prime * result + ((this.__restart== null) ? 0 : this.__restart.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/LoadedSourceEventArguments.java b/java/org/eclipse/lsp4j/debug/LoadedSourceEventArguments.java
new file mode 100644
index 0000000..aa9b500
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/LoadedSourceEventArguments.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.LoadedSourceEventArgumentsReason;
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that some source has been added, changed, or removed from the set of all loaded sources.
+ */
+@SuppressWarnings("all")
+public class LoadedSourceEventArguments {
+ /**
+ * The reason for the event.
+ */
+ @NonNull
+ private LoadedSourceEventArgumentsReason reason;
+
+ /**
+ * The new, changed, or removed source.
+ */
+ @NonNull
+ private Source source;
+
+ /**
+ * The reason for the event.
+ */
+ @Pure
+ @NonNull
+ public LoadedSourceEventArgumentsReason getReason() {
+ return this.reason;
+ }
+
+ /**
+ * The reason for the event.
+ */
+ public void setReason(@NonNull final LoadedSourceEventArgumentsReason reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ /**
+ * The new, changed, or removed source.
+ */
+ @Pure
+ @NonNull
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * The new, changed, or removed source.
+ */
+ public void setSource(@NonNull final Source source) {
+ this.source = Preconditions.checkNotNull(source, "source");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("reason", this.reason);
+ b.add("source", this.source);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LoadedSourceEventArguments other = (LoadedSourceEventArguments) obj;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.reason== null) ? 0 : this.reason.hashCode());
+ return prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/LoadedSourceEventArgumentsReason.java b/java/org/eclipse/lsp4j/debug/LoadedSourceEventArgumentsReason.java
new file mode 100644
index 0000000..2b5fd7b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/LoadedSourceEventArgumentsReason.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The reason for the event.
+ */
+@SuppressWarnings("all")
+public enum LoadedSourceEventArgumentsReason {
+ NEW,
+
+ CHANGED,
+
+ REMOVED;
+}
diff --git a/java/org/eclipse/lsp4j/debug/LoadedSourcesArguments.java b/java/org/eclipse/lsp4j/debug/LoadedSourcesArguments.java
new file mode 100644
index 0000000..0f20af4
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/LoadedSourcesArguments.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'loadedSources' request.
+ */
+@SuppressWarnings("all")
+public class LoadedSourcesArguments {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 1;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/LoadedSourcesResponse.java b/java/org/eclipse/lsp4j/debug/LoadedSourcesResponse.java
new file mode 100644
index 0000000..bd96e8c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/LoadedSourcesResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'loadedSources' request.
+ */
+@SuppressWarnings("all")
+public class LoadedSourcesResponse {
+ /**
+ * Set of loaded sources.
+ */
+ @NonNull
+ private Source[] sources;
+
+ /**
+ * Set of loaded sources.
+ */
+ @Pure
+ @NonNull
+ public Source[] getSources() {
+ return this.sources;
+ }
+
+ /**
+ * Set of loaded sources.
+ */
+ public void setSources(@NonNull final Source[] sources) {
+ this.sources = Preconditions.checkNotNull(sources, "sources");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("sources", this.sources);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LoadedSourcesResponse other = (LoadedSourcesResponse) obj;
+ if (this.sources == null) {
+ if (other.sources != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.sources, other.sources))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.sources== null) ? 0 : Arrays.deepHashCode(this.sources));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Message.java b/java/org/eclipse/lsp4j/debug/Message.java
new file mode 100644
index 0000000..c90ad2f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Message.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Map;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A structured message object. Used to return errors from requests.
+ */
+@SuppressWarnings("all")
+public class Message {
+ /**
+ * Unique identifier for the message.
+ */
+ private int id;
+
+ /**
+ * A format string for the message. Embedded variables have the form '{name}'.
+ * <p>
+ * If variable name starts with an underscore character, the variable does not contain user data (PII) and can be
+ * safely used for telemetry purposes.
+ */
+ @NonNull
+ private String format;
+
+ /**
+ * An object used as a dictionary for looking up the variables in the format string.
+ * <p>
+ * This is an optional property.
+ */
+ private Map<String, String> variables;
+
+ /**
+ * If true send to telemetry.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean sendTelemetry;
+
+ /**
+ * If true show user.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean showUser;
+
+ /**
+ * An optional url where additional information about this message can be found.
+ * <p>
+ * This is an optional property.
+ */
+ private String url;
+
+ /**
+ * An optional label that is presented to the user as the UI for opening the url.
+ * <p>
+ * This is an optional property.
+ */
+ private String urlLabel;
+
+ /**
+ * Unique identifier for the message.
+ */
+ @Pure
+ public int getId() {
+ return this.id;
+ }
+
+ /**
+ * Unique identifier for the message.
+ */
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ /**
+ * A format string for the message. Embedded variables have the form '{name}'.
+ * <p>
+ * If variable name starts with an underscore character, the variable does not contain user data (PII) and can be
+ * safely used for telemetry purposes.
+ */
+ @Pure
+ @NonNull
+ public String getFormat() {
+ return this.format;
+ }
+
+ /**
+ * A format string for the message. Embedded variables have the form '{name}'.
+ * <p>
+ * If variable name starts with an underscore character, the variable does not contain user data (PII) and can be
+ * safely used for telemetry purposes.
+ */
+ public void setFormat(@NonNull final String format) {
+ this.format = Preconditions.checkNotNull(format, "format");
+ }
+
+ /**
+ * An object used as a dictionary for looking up the variables in the format string.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Map<String, String> getVariables() {
+ return this.variables;
+ }
+
+ /**
+ * An object used as a dictionary for looking up the variables in the format string.
+ * <p>
+ * This is an optional property.
+ */
+ public void setVariables(final Map<String, String> variables) {
+ this.variables = variables;
+ }
+
+ /**
+ * If true send to telemetry.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSendTelemetry() {
+ return this.sendTelemetry;
+ }
+
+ /**
+ * If true send to telemetry.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSendTelemetry(final Boolean sendTelemetry) {
+ this.sendTelemetry = sendTelemetry;
+ }
+
+ /**
+ * If true show user.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getShowUser() {
+ return this.showUser;
+ }
+
+ /**
+ * If true show user.
+ * <p>
+ * This is an optional property.
+ */
+ public void setShowUser(final Boolean showUser) {
+ this.showUser = showUser;
+ }
+
+ /**
+ * An optional url where additional information about this message can be found.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getUrl() {
+ return this.url;
+ }
+
+ /**
+ * An optional url where additional information about this message can be found.
+ * <p>
+ * This is an optional property.
+ */
+ public void setUrl(final String url) {
+ this.url = url;
+ }
+
+ /**
+ * An optional label that is presented to the user as the UI for opening the url.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getUrlLabel() {
+ return this.urlLabel;
+ }
+
+ /**
+ * An optional label that is presented to the user as the UI for opening the url.
+ * <p>
+ * This is an optional property.
+ */
+ public void setUrlLabel(final String urlLabel) {
+ this.urlLabel = urlLabel;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("format", this.format);
+ b.add("variables", this.variables);
+ b.add("sendTelemetry", this.sendTelemetry);
+ b.add("showUser", this.showUser);
+ b.add("url", this.url);
+ b.add("urlLabel", this.urlLabel);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Message other = (Message) obj;
+ if (other.id != this.id)
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ if (this.variables == null) {
+ if (other.variables != null)
+ return false;
+ } else if (!this.variables.equals(other.variables))
+ return false;
+ if (this.sendTelemetry == null) {
+ if (other.sendTelemetry != null)
+ return false;
+ } else if (!this.sendTelemetry.equals(other.sendTelemetry))
+ return false;
+ if (this.showUser == null) {
+ if (other.showUser != null)
+ return false;
+ } else if (!this.showUser.equals(other.showUser))
+ return false;
+ if (this.url == null) {
+ if (other.url != null)
+ return false;
+ } else if (!this.url.equals(other.url))
+ return false;
+ if (this.urlLabel == null) {
+ if (other.urlLabel != null)
+ return false;
+ } else if (!this.urlLabel.equals(other.urlLabel))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.id;
+ result = prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ result = prime * result + ((this.variables== null) ? 0 : this.variables.hashCode());
+ result = prime * result + ((this.sendTelemetry== null) ? 0 : this.sendTelemetry.hashCode());
+ result = prime * result + ((this.showUser== null) ? 0 : this.showUser.hashCode());
+ result = prime * result + ((this.url== null) ? 0 : this.url.hashCode());
+ return prime * result + ((this.urlLabel== null) ? 0 : this.urlLabel.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Module.java b/java/org/eclipse/lsp4j/debug/Module.java
new file mode 100644
index 0000000..bf93646
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Module.java
@@ -0,0 +1,432 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A Module object represents a row in the modules view.
+ * <p>
+ * Two attributes are mandatory: an id identifies a module in the modules view and is used in a ModuleEvent for
+ * identifying a module for adding, updating or deleting.
+ * <p>
+ * The name is used to minimally render the module in the UI.
+ * <p>
+ *
+ * <p>
+ * Additional attributes can be added to the module. They will show up in the module View if they have a
+ * corresponding ColumnDescriptor.
+ * <p>
+ *
+ * <p>
+ * To avoid an unnecessary proliferation of additional attributes with similar semantics but different names
+ * <p>
+ * we recommend to re-use attributes from the 'recommended' list below first, and only introduce new attributes if
+ * nothing appropriate could be found.
+ */
+@SuppressWarnings("all")
+public class Module {
+ /**
+ * Unique identifier for the module.
+ */
+ @NonNull
+ private Either<Integer, String> id;
+
+ /**
+ * A name of the module.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * optional but recommended attributes.
+ * <p>
+ * always try to use these first before introducing additional attributes.
+ * <p>
+ *
+ * <p>
+ * Logical full path to the module. The exact definition is implementation defined, but usually this would be a
+ * full path to the on-disk file for the module.
+ * <p>
+ * This is an optional property.
+ */
+ private String path;
+
+ /**
+ * True if the module is optimized.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean isOptimized;
+
+ /**
+ * True if the module is considered 'user code' by a debugger that supports 'Just My Code'.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean isUserCode;
+
+ /**
+ * Version of Module.
+ * <p>
+ * This is an optional property.
+ */
+ private String version;
+
+ /**
+ * User understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not
+ * found', etc.
+ * <p>
+ * This is an optional property.
+ */
+ private String symbolStatus;
+
+ /**
+ * Logical full path to the symbol file. The exact definition is implementation defined.
+ * <p>
+ * This is an optional property.
+ */
+ private String symbolFilePath;
+
+ /**
+ * Module created or modified.
+ * <p>
+ * This is an optional property.
+ */
+ private String dateTimeStamp;
+
+ /**
+ * Address range covered by this module.
+ * <p>
+ * This is an optional property.
+ */
+ private String addressRange;
+
+ /**
+ * Unique identifier for the module.
+ */
+ @Pure
+ @NonNull
+ public Either<Integer, String> getId() {
+ return this.id;
+ }
+
+ /**
+ * Unique identifier for the module.
+ */
+ public void setId(@NonNull final Either<Integer, String> id) {
+ this.id = Preconditions.checkNotNull(id, "id");
+ }
+
+ public void setId(final Integer id) {
+ if (id == null) {
+ Preconditions.checkNotNull(id, "id");
+ this.id = null;
+ return;
+ }
+ this.id = Either.forLeft(id);
+ }
+
+ public void setId(final String id) {
+ if (id == null) {
+ Preconditions.checkNotNull(id, "id");
+ this.id = null;
+ return;
+ }
+ this.id = Either.forRight(id);
+ }
+
+ /**
+ * A name of the module.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * A name of the module.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * optional but recommended attributes.
+ * <p>
+ * always try to use these first before introducing additional attributes.
+ * <p>
+ *
+ * <p>
+ * Logical full path to the module. The exact definition is implementation defined, but usually this would be a
+ * full path to the on-disk file for the module.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getPath() {
+ return this.path;
+ }
+
+ /**
+ * optional but recommended attributes.
+ * <p>
+ * always try to use these first before introducing additional attributes.
+ * <p>
+ *
+ * <p>
+ * Logical full path to the module. The exact definition is implementation defined, but usually this would be a
+ * full path to the on-disk file for the module.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPath(final String path) {
+ this.path = path;
+ }
+
+ /**
+ * True if the module is optimized.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getIsOptimized() {
+ return this.isOptimized;
+ }
+
+ /**
+ * True if the module is optimized.
+ * <p>
+ * This is an optional property.
+ */
+ public void setIsOptimized(final Boolean isOptimized) {
+ this.isOptimized = isOptimized;
+ }
+
+ /**
+ * True if the module is considered 'user code' by a debugger that supports 'Just My Code'.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getIsUserCode() {
+ return this.isUserCode;
+ }
+
+ /**
+ * True if the module is considered 'user code' by a debugger that supports 'Just My Code'.
+ * <p>
+ * This is an optional property.
+ */
+ public void setIsUserCode(final Boolean isUserCode) {
+ this.isUserCode = isUserCode;
+ }
+
+ /**
+ * Version of Module.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getVersion() {
+ return this.version;
+ }
+
+ /**
+ * Version of Module.
+ * <p>
+ * This is an optional property.
+ */
+ public void setVersion(final String version) {
+ this.version = version;
+ }
+
+ /**
+ * User understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not
+ * found', etc.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getSymbolStatus() {
+ return this.symbolStatus;
+ }
+
+ /**
+ * User understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not
+ * found', etc.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSymbolStatus(final String symbolStatus) {
+ this.symbolStatus = symbolStatus;
+ }
+
+ /**
+ * Logical full path to the symbol file. The exact definition is implementation defined.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getSymbolFilePath() {
+ return this.symbolFilePath;
+ }
+
+ /**
+ * Logical full path to the symbol file. The exact definition is implementation defined.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSymbolFilePath(final String symbolFilePath) {
+ this.symbolFilePath = symbolFilePath;
+ }
+
+ /**
+ * Module created or modified.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getDateTimeStamp() {
+ return this.dateTimeStamp;
+ }
+
+ /**
+ * Module created or modified.
+ * <p>
+ * This is an optional property.
+ */
+ public void setDateTimeStamp(final String dateTimeStamp) {
+ this.dateTimeStamp = dateTimeStamp;
+ }
+
+ /**
+ * Address range covered by this module.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getAddressRange() {
+ return this.addressRange;
+ }
+
+ /**
+ * Address range covered by this module.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAddressRange(final String addressRange) {
+ this.addressRange = addressRange;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("name", this.name);
+ b.add("path", this.path);
+ b.add("isOptimized", this.isOptimized);
+ b.add("isUserCode", this.isUserCode);
+ b.add("version", this.version);
+ b.add("symbolStatus", this.symbolStatus);
+ b.add("symbolFilePath", this.symbolFilePath);
+ b.add("dateTimeStamp", this.dateTimeStamp);
+ b.add("addressRange", this.addressRange);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Module other = (Module) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.path == null) {
+ if (other.path != null)
+ return false;
+ } else if (!this.path.equals(other.path))
+ return false;
+ if (this.isOptimized == null) {
+ if (other.isOptimized != null)
+ return false;
+ } else if (!this.isOptimized.equals(other.isOptimized))
+ return false;
+ if (this.isUserCode == null) {
+ if (other.isUserCode != null)
+ return false;
+ } else if (!this.isUserCode.equals(other.isUserCode))
+ return false;
+ if (this.version == null) {
+ if (other.version != null)
+ return false;
+ } else if (!this.version.equals(other.version))
+ return false;
+ if (this.symbolStatus == null) {
+ if (other.symbolStatus != null)
+ return false;
+ } else if (!this.symbolStatus.equals(other.symbolStatus))
+ return false;
+ if (this.symbolFilePath == null) {
+ if (other.symbolFilePath != null)
+ return false;
+ } else if (!this.symbolFilePath.equals(other.symbolFilePath))
+ return false;
+ if (this.dateTimeStamp == null) {
+ if (other.dateTimeStamp != null)
+ return false;
+ } else if (!this.dateTimeStamp.equals(other.dateTimeStamp))
+ return false;
+ if (this.addressRange == null) {
+ if (other.addressRange != null)
+ return false;
+ } else if (!this.addressRange.equals(other.addressRange))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.id== null) ? 0 : this.id.hashCode());
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.path== null) ? 0 : this.path.hashCode());
+ result = prime * result + ((this.isOptimized== null) ? 0 : this.isOptimized.hashCode());
+ result = prime * result + ((this.isUserCode== null) ? 0 : this.isUserCode.hashCode());
+ result = prime * result + ((this.version== null) ? 0 : this.version.hashCode());
+ result = prime * result + ((this.symbolStatus== null) ? 0 : this.symbolStatus.hashCode());
+ result = prime * result + ((this.symbolFilePath== null) ? 0 : this.symbolFilePath.hashCode());
+ result = prime * result + ((this.dateTimeStamp== null) ? 0 : this.dateTimeStamp.hashCode());
+ return prime * result + ((this.addressRange== null) ? 0 : this.addressRange.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ModuleEventArguments.java b/java/org/eclipse/lsp4j/debug/ModuleEventArguments.java
new file mode 100644
index 0000000..97005d3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ModuleEventArguments.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ModuleEventArgumentsReason;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that some information about a module has changed.
+ */
+@SuppressWarnings("all")
+public class ModuleEventArguments {
+ /**
+ * The reason for the event.
+ */
+ @NonNull
+ private ModuleEventArgumentsReason reason;
+
+ /**
+ * The new, changed, or removed module. In case of 'removed' only the module id is used.
+ */
+ @NonNull
+ private org.eclipse.lsp4j.debug.Module module;
+
+ /**
+ * The reason for the event.
+ */
+ @Pure
+ @NonNull
+ public ModuleEventArgumentsReason getReason() {
+ return this.reason;
+ }
+
+ /**
+ * The reason for the event.
+ */
+ public void setReason(@NonNull final ModuleEventArgumentsReason reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ /**
+ * The new, changed, or removed module. In case of 'removed' only the module id is used.
+ */
+ @Pure
+ @NonNull
+ public org.eclipse.lsp4j.debug.Module getModule() {
+ return this.module;
+ }
+
+ /**
+ * The new, changed, or removed module. In case of 'removed' only the module id is used.
+ */
+ public void setModule(@NonNull final org.eclipse.lsp4j.debug.Module module) {
+ this.module = Preconditions.checkNotNull(module, "module");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("reason", this.reason);
+ b.add("module", this.module);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ModuleEventArguments other = (ModuleEventArguments) obj;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ if (this.module == null) {
+ if (other.module != null)
+ return false;
+ } else if (!this.module.equals(other.module))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.reason== null) ? 0 : this.reason.hashCode());
+ return prime * result + ((this.module== null) ? 0 : this.module.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ModuleEventArgumentsReason.java b/java/org/eclipse/lsp4j/debug/ModuleEventArgumentsReason.java
new file mode 100644
index 0000000..b328e26
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ModuleEventArgumentsReason.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The reason for the event.
+ */
+@SuppressWarnings("all")
+public enum ModuleEventArgumentsReason {
+ NEW,
+
+ CHANGED,
+
+ REMOVED;
+}
diff --git a/java/org/eclipse/lsp4j/debug/ModulesArguments.java b/java/org/eclipse/lsp4j/debug/ModulesArguments.java
new file mode 100644
index 0000000..37a4f36
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ModulesArguments.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'modules' request.
+ */
+@SuppressWarnings("all")
+public class ModulesArguments {
+ /**
+ * The index of the first module to return; if omitted modules start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer startModule;
+
+ /**
+ * The number of modules to return. If moduleCount is not specified or 0, all modules are returned.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer moduleCount;
+
+ /**
+ * The index of the first module to return; if omitted modules start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getStartModule() {
+ return this.startModule;
+ }
+
+ /**
+ * The index of the first module to return; if omitted modules start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ public void setStartModule(final Integer startModule) {
+ this.startModule = startModule;
+ }
+
+ /**
+ * The number of modules to return. If moduleCount is not specified or 0, all modules are returned.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getModuleCount() {
+ return this.moduleCount;
+ }
+
+ /**
+ * The number of modules to return. If moduleCount is not specified or 0, all modules are returned.
+ * <p>
+ * This is an optional property.
+ */
+ public void setModuleCount(final Integer moduleCount) {
+ this.moduleCount = moduleCount;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("startModule", this.startModule);
+ b.add("moduleCount", this.moduleCount);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ModulesArguments other = (ModulesArguments) obj;
+ if (this.startModule == null) {
+ if (other.startModule != null)
+ return false;
+ } else if (!this.startModule.equals(other.startModule))
+ return false;
+ if (this.moduleCount == null) {
+ if (other.moduleCount != null)
+ return false;
+ } else if (!this.moduleCount.equals(other.moduleCount))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.startModule== null) ? 0 : this.startModule.hashCode());
+ return prime * result + ((this.moduleCount== null) ? 0 : this.moduleCount.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ModulesResponse.java b/java/org/eclipse/lsp4j/debug/ModulesResponse.java
new file mode 100644
index 0000000..bf2df1d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ModulesResponse.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'modules' request.
+ */
+@SuppressWarnings("all")
+public class ModulesResponse {
+ /**
+ * All modules or range of modules.
+ */
+ @NonNull
+ private org.eclipse.lsp4j.debug.Module[] modules;
+
+ /**
+ * The total number of modules available.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer totalModules;
+
+ /**
+ * All modules or range of modules.
+ */
+ @Pure
+ @NonNull
+ public org.eclipse.lsp4j.debug.Module[] getModules() {
+ return this.modules;
+ }
+
+ /**
+ * All modules or range of modules.
+ */
+ public void setModules(@NonNull final org.eclipse.lsp4j.debug.Module[] modules) {
+ this.modules = Preconditions.checkNotNull(modules, "modules");
+ }
+
+ /**
+ * The total number of modules available.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getTotalModules() {
+ return this.totalModules;
+ }
+
+ /**
+ * The total number of modules available.
+ * <p>
+ * This is an optional property.
+ */
+ public void setTotalModules(final Integer totalModules) {
+ this.totalModules = totalModules;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("modules", this.modules);
+ b.add("totalModules", this.totalModules);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ModulesResponse other = (ModulesResponse) obj;
+ if (this.modules == null) {
+ if (other.modules != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.modules, other.modules))
+ return false;
+ if (this.totalModules == null) {
+ if (other.totalModules != null)
+ return false;
+ } else if (!this.totalModules.equals(other.totalModules))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.modules== null) ? 0 : Arrays.deepHashCode(this.modules));
+ return prime * result + ((this.totalModules== null) ? 0 : this.totalModules.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ModulesViewDescriptor.java b/java/org/eclipse/lsp4j/debug/ModulesViewDescriptor.java
new file mode 100644
index 0000000..42e30ce
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ModulesViewDescriptor.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.ColumnDescriptor;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The ModulesViewDescriptor is the container for all declarative configuration options of a ModuleView.
+ * <p>
+ * For now it only specifies the columns to be shown in the modules view.
+ */
+@SuppressWarnings("all")
+public class ModulesViewDescriptor {
+ @NonNull
+ private ColumnDescriptor[] columns;
+
+ @Pure
+ @NonNull
+ public ColumnDescriptor[] getColumns() {
+ return this.columns;
+ }
+
+ public void setColumns(@NonNull final ColumnDescriptor[] columns) {
+ this.columns = Preconditions.checkNotNull(columns, "columns");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("columns", this.columns);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ModulesViewDescriptor other = (ModulesViewDescriptor) obj;
+ if (this.columns == null) {
+ if (other.columns != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.columns, other.columns))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.columns== null) ? 0 : Arrays.deepHashCode(this.columns));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/NextArguments.java b/java/org/eclipse/lsp4j/debug/NextArguments.java
new file mode 100644
index 0000000..61964fc
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/NextArguments.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.SteppingGranularity;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'next' request.
+ */
+@SuppressWarnings("all")
+public class NextArguments {
+ /**
+ * Execute 'next' for this thread.
+ */
+ private int threadId;
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ private SteppingGranularity granularity;
+
+ /**
+ * Execute 'next' for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Execute 'next' for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public SteppingGranularity getGranularity() {
+ return this.granularity;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setGranularity(final SteppingGranularity granularity) {
+ this.granularity = granularity;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("granularity", this.granularity);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ NextArguments other = (NextArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (this.granularity == null) {
+ if (other.granularity != null)
+ return false;
+ } else if (!this.granularity.equals(other.granularity))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ return prime * result + ((this.granularity== null) ? 0 : this.granularity.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/OutputEventArguments.java b/java/org/eclipse/lsp4j/debug/OutputEventArguments.java
new file mode 100644
index 0000000..5f70a0d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/OutputEventArguments.java
@@ -0,0 +1,327 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.OutputEventArgumentsGroup;
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that the target has produced some output.
+ */
+@SuppressWarnings("all")
+public class OutputEventArguments {
+ /**
+ * The output category. If not specified, 'console' is assumed.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link OutputEventArgumentsCategory}
+ */
+ private String category;
+
+ /**
+ * The output to report.
+ */
+ @NonNull
+ private String output;
+
+ /**
+ * Support for keeping an output log organized by grouping related messages.
+ * <p>
+ * This is an optional property.
+ */
+ private OutputEventArgumentsGroup group;
+
+ /**
+ * If an attribute 'variablesReference' exists and its value is > 0, the output contains objects which can be
+ * retrieved by passing 'variablesReference' to the 'variables' request. The value should be less than or equal to
+ * 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer variablesReference;
+
+ /**
+ * An optional source location where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ private Source source;
+
+ /**
+ * An optional source location line where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer line;
+
+ /**
+ * An optional source location column where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * Optional data to report. For the 'telemetry' category the data will be sent to telemetry, for the other
+ * categories the data is shown in JSON format.
+ * <p>
+ * This is an optional property.
+ */
+ private Object data;
+
+ /**
+ * The output category. If not specified, 'console' is assumed.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link OutputEventArgumentsCategory}
+ */
+ @Pure
+ public String getCategory() {
+ return this.category;
+ }
+
+ /**
+ * The output category. If not specified, 'console' is assumed.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link OutputEventArgumentsCategory}
+ */
+ public void setCategory(final String category) {
+ this.category = category;
+ }
+
+ /**
+ * The output to report.
+ */
+ @Pure
+ @NonNull
+ public String getOutput() {
+ return this.output;
+ }
+
+ /**
+ * The output to report.
+ */
+ public void setOutput(@NonNull final String output) {
+ this.output = Preconditions.checkNotNull(output, "output");
+ }
+
+ /**
+ * Support for keeping an output log organized by grouping related messages.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public OutputEventArgumentsGroup getGroup() {
+ return this.group;
+ }
+
+ /**
+ * Support for keeping an output log organized by grouping related messages.
+ * <p>
+ * This is an optional property.
+ */
+ public void setGroup(final OutputEventArgumentsGroup group) {
+ this.group = group;
+ }
+
+ /**
+ * If an attribute 'variablesReference' exists and its value is > 0, the output contains objects which can be
+ * retrieved by passing 'variablesReference' to the 'variables' request. The value should be less than or equal to
+ * 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * If an attribute 'variablesReference' exists and its value is > 0, the output contains objects which can be
+ * retrieved by passing 'variablesReference' to the 'variables' request. The value should be less than or equal to
+ * 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setVariablesReference(final Integer variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * An optional source location where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * An optional source location where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSource(final Source source) {
+ this.source = source;
+ }
+
+ /**
+ * An optional source location line where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLine() {
+ return this.line;
+ }
+
+ /**
+ * An optional source location line where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLine(final Integer line) {
+ this.line = line;
+ }
+
+ /**
+ * An optional source location column where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * An optional source location column where the output was produced.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * Optional data to report. For the 'telemetry' category the data will be sent to telemetry, for the other
+ * categories the data is shown in JSON format.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Object getData() {
+ return this.data;
+ }
+
+ /**
+ * Optional data to report. For the 'telemetry' category the data will be sent to telemetry, for the other
+ * categories the data is shown in JSON format.
+ * <p>
+ * This is an optional property.
+ */
+ public void setData(final Object data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("category", this.category);
+ b.add("output", this.output);
+ b.add("group", this.group);
+ b.add("variablesReference", this.variablesReference);
+ b.add("source", this.source);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OutputEventArguments other = (OutputEventArguments) obj;
+ if (this.category == null) {
+ if (other.category != null)
+ return false;
+ } else if (!this.category.equals(other.category))
+ return false;
+ if (this.output == null) {
+ if (other.output != null)
+ return false;
+ } else if (!this.output.equals(other.output))
+ return false;
+ if (this.group == null) {
+ if (other.group != null)
+ return false;
+ } else if (!this.group.equals(other.group))
+ return false;
+ if (this.variablesReference == null) {
+ if (other.variablesReference != null)
+ return false;
+ } else if (!this.variablesReference.equals(other.variablesReference))
+ return false;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (this.line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!this.line.equals(other.line))
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.category== null) ? 0 : this.category.hashCode());
+ result = prime * result + ((this.output== null) ? 0 : this.output.hashCode());
+ result = prime * result + ((this.group== null) ? 0 : this.group.hashCode());
+ result = prime * result + ((this.variablesReference== null) ? 0 : this.variablesReference.hashCode());
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + ((this.line== null) ? 0 : this.line.hashCode());
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/OutputEventArgumentsCategory.java b/java/org/eclipse/lsp4j/debug/OutputEventArgumentsCategory.java
new file mode 100644
index 0000000..37bfa73
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/OutputEventArgumentsCategory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The output category. If not specified, 'console' is assumed.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link OutputEventArgumentsCategory}
+ */
+@SuppressWarnings("all")
+public interface OutputEventArgumentsCategory {
+ static final String CONSOLE = "console";
+
+ static final String STDOUT = "stdout";
+
+ static final String STDERR = "stderr";
+
+ static final String TELEMETRY = "telemetry";
+}
diff --git a/java/org/eclipse/lsp4j/debug/OutputEventArgumentsGroup.java b/java/org/eclipse/lsp4j/debug/OutputEventArgumentsGroup.java
new file mode 100644
index 0000000..226ce54
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/OutputEventArgumentsGroup.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Support for keeping an output log organized by grouping related messages.
+ */
+@SuppressWarnings("all")
+public enum OutputEventArgumentsGroup {
+ /**
+ * Start a new group in expanded mode. Subsequent output events are members of the group and should be shown
+ * indented.
+ * The 'output' attribute becomes the name of the group and is not indented.
+ */
+ START,
+
+ /**
+ * Start a new group in collapsed mode. Subsequent output events are members of the group and should be shown
+ * indented (as soon as the group is expanded).
+ * The 'output' attribute becomes the name of the group and is not
+ * indented.
+ */
+ START_COLLAPSED,
+
+ /**
+ * End the current group and decreases the indentation of subsequent output events.
+ * A non empty 'output' attribute
+ * is shown as the unindented end of the group.
+ */
+ END;
+}
diff --git a/java/org/eclipse/lsp4j/debug/PauseArguments.java b/java/org/eclipse/lsp4j/debug/PauseArguments.java
new file mode 100644
index 0000000..db07728
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/PauseArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'pause' request.
+ */
+@SuppressWarnings("all")
+public class PauseArguments {
+ /**
+ * Pause execution for this thread.
+ */
+ private int threadId;
+
+ /**
+ * Pause execution for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Pause execution for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ PauseArguments other = (PauseArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.threadId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ProcessEventArguments.java b/java/org/eclipse/lsp4j/debug/ProcessEventArguments.java
new file mode 100644
index 0000000..da87ede
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ProcessEventArguments.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ProcessEventArgumentsStartMethod;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that the debugger has begun debugging a new process. Either one that it has launched, or
+ * one that it has attached to.
+ */
+@SuppressWarnings("all")
+public class ProcessEventArguments {
+ /**
+ * The logical name of the process. This is usually the full path to process's executable file. Example:
+ * /home/example/myproj/program.js.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The system process id of the debugged process. This property will be missing for non-system processes.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer systemProcessId;
+
+ /**
+ * If true, the process is running on the same computer as the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean isLocalProcess;
+
+ /**
+ * Describes how the debug engine started debugging this process.
+ * <p>
+ * This is an optional property.
+ */
+ private ProcessEventArgumentsStartMethod startMethod;
+
+ /**
+ * The size of a pointer or address for this process, in bits. This value may be used by clients when formatting
+ * addresses for display.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer pointerSize;
+
+ /**
+ * The logical name of the process. This is usually the full path to process's executable file. Example:
+ * /home/example/myproj/program.js.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The logical name of the process. This is usually the full path to process's executable file. Example:
+ * /home/example/myproj/program.js.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The system process id of the debugged process. This property will be missing for non-system processes.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getSystemProcessId() {
+ return this.systemProcessId;
+ }
+
+ /**
+ * The system process id of the debugged process. This property will be missing for non-system processes.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSystemProcessId(final Integer systemProcessId) {
+ this.systemProcessId = systemProcessId;
+ }
+
+ /**
+ * If true, the process is running on the same computer as the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getIsLocalProcess() {
+ return this.isLocalProcess;
+ }
+
+ /**
+ * If true, the process is running on the same computer as the debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setIsLocalProcess(final Boolean isLocalProcess) {
+ this.isLocalProcess = isLocalProcess;
+ }
+
+ /**
+ * Describes how the debug engine started debugging this process.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ProcessEventArgumentsStartMethod getStartMethod() {
+ return this.startMethod;
+ }
+
+ /**
+ * Describes how the debug engine started debugging this process.
+ * <p>
+ * This is an optional property.
+ */
+ public void setStartMethod(final ProcessEventArgumentsStartMethod startMethod) {
+ this.startMethod = startMethod;
+ }
+
+ /**
+ * The size of a pointer or address for this process, in bits. This value may be used by clients when formatting
+ * addresses for display.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getPointerSize() {
+ return this.pointerSize;
+ }
+
+ /**
+ * The size of a pointer or address for this process, in bits. This value may be used by clients when formatting
+ * addresses for display.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPointerSize(final Integer pointerSize) {
+ this.pointerSize = pointerSize;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("systemProcessId", this.systemProcessId);
+ b.add("isLocalProcess", this.isLocalProcess);
+ b.add("startMethod", this.startMethod);
+ b.add("pointerSize", this.pointerSize);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ProcessEventArguments other = (ProcessEventArguments) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.systemProcessId == null) {
+ if (other.systemProcessId != null)
+ return false;
+ } else if (!this.systemProcessId.equals(other.systemProcessId))
+ return false;
+ if (this.isLocalProcess == null) {
+ if (other.isLocalProcess != null)
+ return false;
+ } else if (!this.isLocalProcess.equals(other.isLocalProcess))
+ return false;
+ if (this.startMethod == null) {
+ if (other.startMethod != null)
+ return false;
+ } else if (!this.startMethod.equals(other.startMethod))
+ return false;
+ if (this.pointerSize == null) {
+ if (other.pointerSize != null)
+ return false;
+ } else if (!this.pointerSize.equals(other.pointerSize))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.systemProcessId== null) ? 0 : this.systemProcessId.hashCode());
+ result = prime * result + ((this.isLocalProcess== null) ? 0 : this.isLocalProcess.hashCode());
+ result = prime * result + ((this.startMethod== null) ? 0 : this.startMethod.hashCode());
+ return prime * result + ((this.pointerSize== null) ? 0 : this.pointerSize.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ProcessEventArgumentsStartMethod.java b/java/org/eclipse/lsp4j/debug/ProcessEventArgumentsStartMethod.java
new file mode 100644
index 0000000..c25fe11
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ProcessEventArgumentsStartMethod.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Describes how the debug engine started debugging this process.
+ */
+@SuppressWarnings("all")
+public enum ProcessEventArgumentsStartMethod {
+ /**
+ * Process was launched under the debugger.
+ */
+ LAUNCH,
+
+ /**
+ * Debugger attached to an existing process.
+ */
+ ATTACH,
+
+ /**
+ * A project launcher component has launched a new process in a suspended state and then asked the debugger to
+ * attach.
+ */
+ ATTACH_FOR_SUSPENDED_LAUNCH;
+}
diff --git a/java/org/eclipse/lsp4j/debug/ProgressEndEventArguments.java b/java/org/eclipse/lsp4j/debug/ProgressEndEventArguments.java
new file mode 100644
index 0000000..db29beb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ProgressEndEventArguments.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event signals the end of the progress reporting with an optional final message.
+ * <p>
+ * This event should only be sent if the client has passed the value true for the 'supportsProgressReporting'
+ * capability of the 'initialize' request.
+ */
+@SuppressWarnings("all")
+public class ProgressEndEventArguments {
+ /**
+ * The ID that was introduced in the initial 'ProgressStartEvent'.
+ */
+ @NonNull
+ private String progressId;
+
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ private String message;
+
+ /**
+ * The ID that was introduced in the initial 'ProgressStartEvent'.
+ */
+ @Pure
+ @NonNull
+ public String getProgressId() {
+ return this.progressId;
+ }
+
+ /**
+ * The ID that was introduced in the initial 'ProgressStartEvent'.
+ */
+ public void setProgressId(@NonNull final String progressId) {
+ this.progressId = Preconditions.checkNotNull(progressId, "progressId");
+ }
+
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("progressId", this.progressId);
+ b.add("message", this.message);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ProgressEndEventArguments other = (ProgressEndEventArguments) obj;
+ if (this.progressId == null) {
+ if (other.progressId != null)
+ return false;
+ } else if (!this.progressId.equals(other.progressId))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.progressId== null) ? 0 : this.progressId.hashCode());
+ return prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ProgressStartEventArguments.java b/java/org/eclipse/lsp4j/debug/ProgressStartEventArguments.java
new file mode 100644
index 0000000..b5cf28a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ProgressStartEventArguments.java
@@ -0,0 +1,283 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event signals that a long running operation is about to start and
+ * <p>
+ * provides additional information for the client to set up a corresponding progress and cancellation UI.
+ * <p>
+ * The client is free to delay the showing of the UI in order to reduce flicker.
+ * <p>
+ * This event should only be sent if the client has passed the value true for the 'supportsProgressReporting'
+ * capability of the 'initialize' request.
+ */
+@SuppressWarnings("all")
+public class ProgressStartEventArguments {
+ /**
+ * An ID that must be used in subsequent 'progressUpdate' and 'progressEnd' events to make them refer to the same
+ * progress reporting.
+ * <p>
+ * IDs must be unique within a debug session.
+ */
+ @NonNull
+ private String progressId;
+
+ /**
+ * Mandatory (short) title of the progress reporting. Shown in the UI to describe the long running operation.
+ */
+ @NonNull
+ private String title;
+
+ /**
+ * The request ID that this progress report is related to. If specified a debug adapter is expected to emit
+ * <p>
+ * progress events for the long running request until the request has been either completed or cancelled.
+ * <p>
+ * If the request ID is omitted, the progress report is assumed to be related to some general activity of the
+ * debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer requestId;
+
+ /**
+ * If true, the request that reports progress may be canceled with a 'cancel' request.
+ * <p>
+ * So this property basically controls whether the client should use UX that supports cancellation.
+ * <p>
+ * Clients that don't support cancellation are allowed to ignore the setting.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean cancellable;
+
+ /**
+ * Optional, more detailed progress message.
+ * <p>
+ * This is an optional property.
+ */
+ private String message;
+
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ private Double percentage;
+
+ /**
+ * An ID that must be used in subsequent 'progressUpdate' and 'progressEnd' events to make them refer to the same
+ * progress reporting.
+ * <p>
+ * IDs must be unique within a debug session.
+ */
+ @Pure
+ @NonNull
+ public String getProgressId() {
+ return this.progressId;
+ }
+
+ /**
+ * An ID that must be used in subsequent 'progressUpdate' and 'progressEnd' events to make them refer to the same
+ * progress reporting.
+ * <p>
+ * IDs must be unique within a debug session.
+ */
+ public void setProgressId(@NonNull final String progressId) {
+ this.progressId = Preconditions.checkNotNull(progressId, "progressId");
+ }
+
+ /**
+ * Mandatory (short) title of the progress reporting. Shown in the UI to describe the long running operation.
+ */
+ @Pure
+ @NonNull
+ public String getTitle() {
+ return this.title;
+ }
+
+ /**
+ * Mandatory (short) title of the progress reporting. Shown in the UI to describe the long running operation.
+ */
+ public void setTitle(@NonNull final String title) {
+ this.title = Preconditions.checkNotNull(title, "title");
+ }
+
+ /**
+ * The request ID that this progress report is related to. If specified a debug adapter is expected to emit
+ * <p>
+ * progress events for the long running request until the request has been either completed or cancelled.
+ * <p>
+ * If the request ID is omitted, the progress report is assumed to be related to some general activity of the
+ * debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getRequestId() {
+ return this.requestId;
+ }
+
+ /**
+ * The request ID that this progress report is related to. If specified a debug adapter is expected to emit
+ * <p>
+ * progress events for the long running request until the request has been either completed or cancelled.
+ * <p>
+ * If the request ID is omitted, the progress report is assumed to be related to some general activity of the
+ * debug adapter.
+ * <p>
+ * This is an optional property.
+ */
+ public void setRequestId(final Integer requestId) {
+ this.requestId = requestId;
+ }
+
+ /**
+ * If true, the request that reports progress may be canceled with a 'cancel' request.
+ * <p>
+ * So this property basically controls whether the client should use UX that supports cancellation.
+ * <p>
+ * Clients that don't support cancellation are allowed to ignore the setting.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getCancellable() {
+ return this.cancellable;
+ }
+
+ /**
+ * If true, the request that reports progress may be canceled with a 'cancel' request.
+ * <p>
+ * So this property basically controls whether the client should use UX that supports cancellation.
+ * <p>
+ * Clients that don't support cancellation are allowed to ignore the setting.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCancellable(final Boolean cancellable) {
+ this.cancellable = cancellable;
+ }
+
+ /**
+ * Optional, more detailed progress message.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Optional, more detailed progress message.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Double getPercentage() {
+ return this.percentage;
+ }
+
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPercentage(final Double percentage) {
+ this.percentage = percentage;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("progressId", this.progressId);
+ b.add("title", this.title);
+ b.add("requestId", this.requestId);
+ b.add("cancellable", this.cancellable);
+ b.add("message", this.message);
+ b.add("percentage", this.percentage);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ProgressStartEventArguments other = (ProgressStartEventArguments) obj;
+ if (this.progressId == null) {
+ if (other.progressId != null)
+ return false;
+ } else if (!this.progressId.equals(other.progressId))
+ return false;
+ if (this.title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!this.title.equals(other.title))
+ return false;
+ if (this.requestId == null) {
+ if (other.requestId != null)
+ return false;
+ } else if (!this.requestId.equals(other.requestId))
+ return false;
+ if (this.cancellable == null) {
+ if (other.cancellable != null)
+ return false;
+ } else if (!this.cancellable.equals(other.cancellable))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.percentage == null) {
+ if (other.percentage != null)
+ return false;
+ } else if (!this.percentage.equals(other.percentage))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.progressId== null) ? 0 : this.progressId.hashCode());
+ result = prime * result + ((this.title== null) ? 0 : this.title.hashCode());
+ result = prime * result + ((this.requestId== null) ? 0 : this.requestId.hashCode());
+ result = prime * result + ((this.cancellable== null) ? 0 : this.cancellable.hashCode());
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ return prime * result + ((this.percentage== null) ? 0 : this.percentage.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ProgressUpdateEventArguments.java b/java/org/eclipse/lsp4j/debug/ProgressUpdateEventArguments.java
new file mode 100644
index 0000000..24f819b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ProgressUpdateEventArguments.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event signals that the progress reporting needs to updated with a new message and/or percentage.
+ * <p>
+ * The client does not have to update the UI immediately, but the clients needs to keep track of the message
+ * and/or percentage values.
+ * <p>
+ * This event should only be sent if the client has passed the value true for the 'supportsProgressReporting'
+ * capability of the 'initialize' request.
+ */
+@SuppressWarnings("all")
+public class ProgressUpdateEventArguments {
+ /**
+ * The ID that was introduced in the initial 'progressStart' event.
+ */
+ @NonNull
+ private String progressId;
+
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ private String message;
+
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ private Double percentage;
+
+ /**
+ * The ID that was introduced in the initial 'progressStart' event.
+ */
+ @Pure
+ @NonNull
+ public String getProgressId() {
+ return this.progressId;
+ }
+
+ /**
+ * The ID that was introduced in the initial 'progressStart' event.
+ */
+ public void setProgressId(@NonNull final String progressId) {
+ this.progressId = Preconditions.checkNotNull(progressId, "progressId");
+ }
+
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMessage() {
+ return this.message;
+ }
+
+ /**
+ * Optional, more detailed progress message. If omitted, the previous message (if any) is used.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMessage(final String message) {
+ this.message = message;
+ }
+
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Double getPercentage() {
+ return this.percentage;
+ }
+
+ /**
+ * Optional progress percentage to display (value range: 0 to 100). If omitted no percentage will be shown.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPercentage(final Double percentage) {
+ this.percentage = percentage;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("progressId", this.progressId);
+ b.add("message", this.message);
+ b.add("percentage", this.percentage);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ProgressUpdateEventArguments other = (ProgressUpdateEventArguments) obj;
+ if (this.progressId == null) {
+ if (other.progressId != null)
+ return false;
+ } else if (!this.progressId.equals(other.progressId))
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.percentage == null) {
+ if (other.percentage != null)
+ return false;
+ } else if (!this.percentage.equals(other.percentage))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.progressId== null) ? 0 : this.progressId.hashCode());
+ result = prime * result + ((this.message== null) ? 0 : this.message.hashCode());
+ return prime * result + ((this.percentage== null) ? 0 : this.percentage.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ReadMemoryArguments.java b/java/org/eclipse/lsp4j/debug/ReadMemoryArguments.java
new file mode 100644
index 0000000..56b5fe8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ReadMemoryArguments.java
@@ -0,0 +1,136 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'readMemory' request.
+ */
+@SuppressWarnings("all")
+public class ReadMemoryArguments {
+ /**
+ * Memory reference to the base location from which data should be read.
+ */
+ @NonNull
+ private String memoryReference;
+
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before reading data. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer offset;
+
+ /**
+ * Number of bytes to read at the specified location and offset.
+ */
+ private int count;
+
+ /**
+ * Memory reference to the base location from which data should be read.
+ */
+ @Pure
+ @NonNull
+ public String getMemoryReference() {
+ return this.memoryReference;
+ }
+
+ /**
+ * Memory reference to the base location from which data should be read.
+ */
+ public void setMemoryReference(@NonNull final String memoryReference) {
+ this.memoryReference = Preconditions.checkNotNull(memoryReference, "memoryReference");
+ }
+
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before reading data. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getOffset() {
+ return this.offset;
+ }
+
+ /**
+ * Optional offset (in bytes) to be applied to the reference location before reading data. Can be negative.
+ * <p>
+ * This is an optional property.
+ */
+ public void setOffset(final Integer offset) {
+ this.offset = offset;
+ }
+
+ /**
+ * Number of bytes to read at the specified location and offset.
+ */
+ @Pure
+ public int getCount() {
+ return this.count;
+ }
+
+ /**
+ * Number of bytes to read at the specified location and offset.
+ */
+ public void setCount(final int count) {
+ this.count = count;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("memoryReference", this.memoryReference);
+ b.add("offset", this.offset);
+ b.add("count", this.count);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ReadMemoryArguments other = (ReadMemoryArguments) obj;
+ if (this.memoryReference == null) {
+ if (other.memoryReference != null)
+ return false;
+ } else if (!this.memoryReference.equals(other.memoryReference))
+ return false;
+ if (this.offset == null) {
+ if (other.offset != null)
+ return false;
+ } else if (!this.offset.equals(other.offset))
+ return false;
+ if (other.count != this.count)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.memoryReference== null) ? 0 : this.memoryReference.hashCode());
+ result = prime * result + ((this.offset== null) ? 0 : this.offset.hashCode());
+ return prime * result + this.count;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ReadMemoryResponse.java b/java/org/eclipse/lsp4j/debug/ReadMemoryResponse.java
new file mode 100644
index 0000000..6db549f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ReadMemoryResponse.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'readMemory' request.
+ */
+@SuppressWarnings("all")
+public class ReadMemoryResponse {
+ /**
+ * The address of the first byte of data returned.
+ * <p>
+ * Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ @NonNull
+ private String address;
+
+ /**
+ * The number of unreadable bytes encountered after the last successfully read byte.
+ * <p>
+ * This can be used to determine the number of bytes that must be skipped before a subsequent 'readMemory' request
+ * will succeed.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer unreadableBytes;
+
+ /**
+ * The bytes read from memory, encoded using base64.
+ * <p>
+ * This is an optional property.
+ */
+ private String data;
+
+ /**
+ * The address of the first byte of data returned.
+ * <p>
+ * Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ @Pure
+ @NonNull
+ public String getAddress() {
+ return this.address;
+ }
+
+ /**
+ * The address of the first byte of data returned.
+ * <p>
+ * Treated as a hex value if prefixed with '0x', or as a decimal value otherwise.
+ */
+ public void setAddress(@NonNull final String address) {
+ this.address = Preconditions.checkNotNull(address, "address");
+ }
+
+ /**
+ * The number of unreadable bytes encountered after the last successfully read byte.
+ * <p>
+ * This can be used to determine the number of bytes that must be skipped before a subsequent 'readMemory' request
+ * will succeed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getUnreadableBytes() {
+ return this.unreadableBytes;
+ }
+
+ /**
+ * The number of unreadable bytes encountered after the last successfully read byte.
+ * <p>
+ * This can be used to determine the number of bytes that must be skipped before a subsequent 'readMemory' request
+ * will succeed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setUnreadableBytes(final Integer unreadableBytes) {
+ this.unreadableBytes = unreadableBytes;
+ }
+
+ /**
+ * The bytes read from memory, encoded using base64.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getData() {
+ return this.data;
+ }
+
+ /**
+ * The bytes read from memory, encoded using base64.
+ * <p>
+ * This is an optional property.
+ */
+ public void setData(final String data) {
+ this.data = data;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("address", this.address);
+ b.add("unreadableBytes", this.unreadableBytes);
+ b.add("data", this.data);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ReadMemoryResponse other = (ReadMemoryResponse) obj;
+ if (this.address == null) {
+ if (other.address != null)
+ return false;
+ } else if (!this.address.equals(other.address))
+ return false;
+ if (this.unreadableBytes == null) {
+ if (other.unreadableBytes != null)
+ return false;
+ } else if (!this.unreadableBytes.equals(other.unreadableBytes))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.address== null) ? 0 : this.address.hashCode());
+ result = prime * result + ((this.unreadableBytes== null) ? 0 : this.unreadableBytes.hashCode());
+ return prime * result + ((this.data== null) ? 0 : this.data.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/RestartArguments.java b/java/org/eclipse/lsp4j/debug/RestartArguments.java
new file mode 100644
index 0000000..0a19d03
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/RestartArguments.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'restart' request.
+ */
+@SuppressWarnings("all")
+public class RestartArguments {
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 1;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/RestartFrameArguments.java b/java/org/eclipse/lsp4j/debug/RestartFrameArguments.java
new file mode 100644
index 0000000..1505820
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/RestartFrameArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'restartFrame' request.
+ */
+@SuppressWarnings("all")
+public class RestartFrameArguments {
+ /**
+ * Restart this stackframe.
+ */
+ private int frameId;
+
+ /**
+ * Restart this stackframe.
+ */
+ @Pure
+ public int getFrameId() {
+ return this.frameId;
+ }
+
+ /**
+ * Restart this stackframe.
+ */
+ public void setFrameId(final int frameId) {
+ this.frameId = frameId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("frameId", this.frameId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RestartFrameArguments other = (RestartFrameArguments) obj;
+ if (other.frameId != this.frameId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.frameId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ReverseContinueArguments.java b/java/org/eclipse/lsp4j/debug/ReverseContinueArguments.java
new file mode 100644
index 0000000..d7ca1a2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ReverseContinueArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'reverseContinue' request.
+ */
+@SuppressWarnings("all")
+public class ReverseContinueArguments {
+ /**
+ * Execute 'reverseContinue' for this thread.
+ */
+ private int threadId;
+
+ /**
+ * Execute 'reverseContinue' for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Execute 'reverseContinue' for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ReverseContinueArguments other = (ReverseContinueArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.threadId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/RunInTerminalRequestArguments.java b/java/org/eclipse/lsp4j/debug/RunInTerminalRequestArguments.java
new file mode 100644
index 0000000..f403010
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/RunInTerminalRequestArguments.java
@@ -0,0 +1,213 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import java.util.Map;
+import org.eclipse.lsp4j.debug.RunInTerminalRequestArgumentsKind;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'runInTerminal' request.
+ */
+@SuppressWarnings("all")
+public class RunInTerminalRequestArguments {
+ /**
+ * What kind of terminal to launch.
+ * <p>
+ * This is an optional property.
+ */
+ private RunInTerminalRequestArgumentsKind kind;
+
+ /**
+ * Optional title of the terminal.
+ * <p>
+ * This is an optional property.
+ */
+ private String title;
+
+ /**
+ * Working directory for the command. For non-empty, valid paths this typically results in execution of a change
+ * directory command.
+ */
+ @NonNull
+ private String cwd;
+
+ /**
+ * List of arguments. The first argument is the command to run.
+ */
+ @NonNull
+ private String[] args;
+
+ /**
+ * Environment key-value pairs that are added to or removed from the default environment.
+ * <p>
+ * This is an optional property.
+ */
+ private Map<String, String> env;
+
+ /**
+ * What kind of terminal to launch.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public RunInTerminalRequestArgumentsKind getKind() {
+ return this.kind;
+ }
+
+ /**
+ * What kind of terminal to launch.
+ * <p>
+ * This is an optional property.
+ */
+ public void setKind(final RunInTerminalRequestArgumentsKind kind) {
+ this.kind = kind;
+ }
+
+ /**
+ * Optional title of the terminal.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getTitle() {
+ return this.title;
+ }
+
+ /**
+ * Optional title of the terminal.
+ * <p>
+ * This is an optional property.
+ */
+ public void setTitle(final String title) {
+ this.title = title;
+ }
+
+ /**
+ * Working directory for the command. For non-empty, valid paths this typically results in execution of a change
+ * directory command.
+ */
+ @Pure
+ @NonNull
+ public String getCwd() {
+ return this.cwd;
+ }
+
+ /**
+ * Working directory for the command. For non-empty, valid paths this typically results in execution of a change
+ * directory command.
+ */
+ public void setCwd(@NonNull final String cwd) {
+ this.cwd = Preconditions.checkNotNull(cwd, "cwd");
+ }
+
+ /**
+ * List of arguments. The first argument is the command to run.
+ */
+ @Pure
+ @NonNull
+ public String[] getArgs() {
+ return this.args;
+ }
+
+ /**
+ * List of arguments. The first argument is the command to run.
+ */
+ public void setArgs(@NonNull final String[] args) {
+ this.args = Preconditions.checkNotNull(args, "args");
+ }
+
+ /**
+ * Environment key-value pairs that are added to or removed from the default environment.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Map<String, String> getEnv() {
+ return this.env;
+ }
+
+ /**
+ * Environment key-value pairs that are added to or removed from the default environment.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEnv(final Map<String, String> env) {
+ this.env = env;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("kind", this.kind);
+ b.add("title", this.title);
+ b.add("cwd", this.cwd);
+ b.add("args", this.args);
+ b.add("env", this.env);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RunInTerminalRequestArguments other = (RunInTerminalRequestArguments) obj;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!this.title.equals(other.title))
+ return false;
+ if (this.cwd == null) {
+ if (other.cwd != null)
+ return false;
+ } else if (!this.cwd.equals(other.cwd))
+ return false;
+ if (this.args == null) {
+ if (other.args != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.args, other.args))
+ return false;
+ if (this.env == null) {
+ if (other.env != null)
+ return false;
+ } else if (!this.env.equals(other.env))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.title== null) ? 0 : this.title.hashCode());
+ result = prime * result + ((this.cwd== null) ? 0 : this.cwd.hashCode());
+ result = prime * result + ((this.args== null) ? 0 : Arrays.deepHashCode(this.args));
+ return prime * result + ((this.env== null) ? 0 : this.env.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/RunInTerminalRequestArgumentsKind.java b/java/org/eclipse/lsp4j/debug/RunInTerminalRequestArgumentsKind.java
new file mode 100644
index 0000000..f579038
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/RunInTerminalRequestArgumentsKind.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * What kind of terminal to launch.
+ */
+@SuppressWarnings("all")
+public enum RunInTerminalRequestArgumentsKind {
+ INTEGRATED,
+
+ EXTERNAL;
+}
diff --git a/java/org/eclipse/lsp4j/debug/RunInTerminalResponse.java b/java/org/eclipse/lsp4j/debug/RunInTerminalResponse.java
new file mode 100644
index 0000000..8d84fc0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/RunInTerminalResponse.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'runInTerminal' request.
+ */
+@SuppressWarnings("all")
+public class RunInTerminalResponse {
+ /**
+ * The process ID. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer processId;
+
+ /**
+ * The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer shellProcessId;
+
+ /**
+ * The process ID. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getProcessId() {
+ return this.processId;
+ }
+
+ /**
+ * The process ID. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setProcessId(final Integer processId) {
+ this.processId = processId;
+ }
+
+ /**
+ * The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getShellProcessId() {
+ return this.shellProcessId;
+ }
+
+ /**
+ * The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setShellProcessId(final Integer shellProcessId) {
+ this.shellProcessId = shellProcessId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("processId", this.processId);
+ b.add("shellProcessId", this.shellProcessId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RunInTerminalResponse other = (RunInTerminalResponse) obj;
+ if (this.processId == null) {
+ if (other.processId != null)
+ return false;
+ } else if (!this.processId.equals(other.processId))
+ return false;
+ if (this.shellProcessId == null) {
+ if (other.shellProcessId != null)
+ return false;
+ } else if (!this.shellProcessId.equals(other.shellProcessId))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.processId== null) ? 0 : this.processId.hashCode());
+ return prime * result + ((this.shellProcessId== null) ? 0 : this.shellProcessId.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Scope.java b/java/org/eclipse/lsp4j/debug/Scope.java
new file mode 100644
index 0000000..c4fedc3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Scope.java
@@ -0,0 +1,419 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A Scope is a named container for variables. Optionally a scope can map to a source or a range within a source.
+ */
+@SuppressWarnings("all")
+public class Scope {
+ /**
+ * Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can
+ * be translated.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with
+ * a generic UI.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ScopePresentationHint}
+ */
+ private String presentationHint;
+
+ /**
+ * The variables of this scope can be retrieved by passing the value of variablesReference to the
+ * VariablesRequest.
+ */
+ private int variablesReference;
+
+ /**
+ * The number of named variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer namedVariables;
+
+ /**
+ * The number of indexed variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer indexedVariables;
+
+ /**
+ * If true, the number of variables in this scope is large or expensive to retrieve.
+ */
+ private boolean expensive;
+
+ /**
+ * Optional source for this scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Source source;
+
+ /**
+ * Optional start line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer line;
+
+ /**
+ * Optional start column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * Optional end line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * Optional end column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can
+ * be translated.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * Name of the scope such as 'Arguments', 'Locals', or 'Registers'. This string is shown in the UI as is and can
+ * be translated.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with
+ * a generic UI.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ScopePresentationHint}
+ */
+ @Pure
+ public String getPresentationHint() {
+ return this.presentationHint;
+ }
+
+ /**
+ * An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with
+ * a generic UI.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ScopePresentationHint}
+ */
+ public void setPresentationHint(final String presentationHint) {
+ this.presentationHint = presentationHint;
+ }
+
+ /**
+ * The variables of this scope can be retrieved by passing the value of variablesReference to the
+ * VariablesRequest.
+ */
+ @Pure
+ public int getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * The variables of this scope can be retrieved by passing the value of variablesReference to the
+ * VariablesRequest.
+ */
+ public void setVariablesReference(final int variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The number of named variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getNamedVariables() {
+ return this.namedVariables;
+ }
+
+ /**
+ * The number of named variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ public void setNamedVariables(final Integer namedVariables) {
+ this.namedVariables = namedVariables;
+ }
+
+ /**
+ * The number of indexed variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getIndexedVariables() {
+ return this.indexedVariables;
+ }
+
+ /**
+ * The number of indexed variables in this scope.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ public void setIndexedVariables(final Integer indexedVariables) {
+ this.indexedVariables = indexedVariables;
+ }
+
+ /**
+ * If true, the number of variables in this scope is large or expensive to retrieve.
+ */
+ @Pure
+ public boolean isExpensive() {
+ return this.expensive;
+ }
+
+ /**
+ * If true, the number of variables in this scope is large or expensive to retrieve.
+ */
+ public void setExpensive(final boolean expensive) {
+ this.expensive = expensive;
+ }
+
+ /**
+ * Optional source for this scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * Optional source for this scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSource(final Source source) {
+ this.source = source;
+ }
+
+ /**
+ * Optional start line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLine() {
+ return this.line;
+ }
+
+ /**
+ * Optional start line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLine(final Integer line) {
+ this.line = line;
+ }
+
+ /**
+ * Optional start column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * Optional start column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * Optional end line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * Optional end line of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * Optional end column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * Optional end column of the range covered by this scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("presentationHint", this.presentationHint);
+ b.add("variablesReference", this.variablesReference);
+ b.add("namedVariables", this.namedVariables);
+ b.add("indexedVariables", this.indexedVariables);
+ b.add("expensive", this.expensive);
+ b.add("source", this.source);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Scope other = (Scope) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.presentationHint == null) {
+ if (other.presentationHint != null)
+ return false;
+ } else if (!this.presentationHint.equals(other.presentationHint))
+ return false;
+ if (other.variablesReference != this.variablesReference)
+ return false;
+ if (this.namedVariables == null) {
+ if (other.namedVariables != null)
+ return false;
+ } else if (!this.namedVariables.equals(other.namedVariables))
+ return false;
+ if (this.indexedVariables == null) {
+ if (other.indexedVariables != null)
+ return false;
+ } else if (!this.indexedVariables.equals(other.indexedVariables))
+ return false;
+ if (other.expensive != this.expensive)
+ return false;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (this.line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!this.line.equals(other.line))
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.presentationHint== null) ? 0 : this.presentationHint.hashCode());
+ result = prime * result + this.variablesReference;
+ result = prime * result + ((this.namedVariables== null) ? 0 : this.namedVariables.hashCode());
+ result = prime * result + ((this.indexedVariables== null) ? 0 : this.indexedVariables.hashCode());
+ result = prime * result + (this.expensive ? 1231 : 1237);
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + ((this.line== null) ? 0 : this.line.hashCode());
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ return prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ScopePresentationHint.java b/java/org/eclipse/lsp4j/debug/ScopePresentationHint.java
new file mode 100644
index 0000000..3412230
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ScopePresentationHint.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * An optional hint for how to present this scope in the UI. If this attribute is missing, the scope is shown with
+ * a generic UI.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ScopePresentationHint}
+ */
+@SuppressWarnings("all")
+public interface ScopePresentationHint {
+ /**
+ * Scope contains method arguments.
+ */
+ static final String ARGUMENTS = "arguments";
+
+ /**
+ * Scope contains local variables.
+ */
+ static final String LOCALS = "locals";
+
+ /**
+ * Scope contains registers. Only a single 'registers' scope should be returned from a 'scopes' request.
+ */
+ static final String REGISTERS = "registers";
+}
diff --git a/java/org/eclipse/lsp4j/debug/ScopesArguments.java b/java/org/eclipse/lsp4j/debug/ScopesArguments.java
new file mode 100644
index 0000000..ccbf180
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ScopesArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'scopes' request.
+ */
+@SuppressWarnings("all")
+public class ScopesArguments {
+ /**
+ * Retrieve the scopes for this stackframe.
+ */
+ private int frameId;
+
+ /**
+ * Retrieve the scopes for this stackframe.
+ */
+ @Pure
+ public int getFrameId() {
+ return this.frameId;
+ }
+
+ /**
+ * Retrieve the scopes for this stackframe.
+ */
+ public void setFrameId(final int frameId) {
+ this.frameId = frameId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("frameId", this.frameId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ScopesArguments other = (ScopesArguments) obj;
+ if (other.frameId != this.frameId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.frameId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ScopesResponse.java b/java/org/eclipse/lsp4j/debug/ScopesResponse.java
new file mode 100644
index 0000000..136c530
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ScopesResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Scope;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'scopes' request.
+ */
+@SuppressWarnings("all")
+public class ScopesResponse {
+ /**
+ * The scopes of the stackframe. If the array has length zero, there are no scopes available.
+ */
+ @NonNull
+ private Scope[] scopes;
+
+ /**
+ * The scopes of the stackframe. If the array has length zero, there are no scopes available.
+ */
+ @Pure
+ @NonNull
+ public Scope[] getScopes() {
+ return this.scopes;
+ }
+
+ /**
+ * The scopes of the stackframe. If the array has length zero, there are no scopes available.
+ */
+ public void setScopes(@NonNull final Scope[] scopes) {
+ this.scopes = Preconditions.checkNotNull(scopes, "scopes");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("scopes", this.scopes);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ScopesResponse other = (ScopesResponse) obj;
+ if (this.scopes == null) {
+ if (other.scopes != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.scopes, other.scopes))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.scopes== null) ? 0 : Arrays.deepHashCode(this.scopes));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetBreakpointsArguments.java b/java/org/eclipse/lsp4j/debug/SetBreakpointsArguments.java
new file mode 100644
index 0000000..2235942
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetBreakpointsArguments.java
@@ -0,0 +1,193 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.SourceBreakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setBreakpoints' request.
+ */
+@SuppressWarnings("all")
+public class SetBreakpointsArguments {
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ @NonNull
+ private Source source;
+
+ /**
+ * The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ private SourceBreakpoint[] breakpoints;
+
+ /**
+ * Deprecated: The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * @deprecated Use the line field in the breakpoints property instead.
+ */
+ @Deprecated
+ private int[] lines;
+
+ /**
+ * A value of true indicates that the underlying source has been modified which results in new breakpoint
+ * locations.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean sourceModified;
+
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ @Pure
+ @NonNull
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * The source location of the breakpoints; either 'source.path' or 'source.reference' must be specified.
+ */
+ public void setSource(@NonNull final Source source) {
+ this.source = Preconditions.checkNotNull(source, "source");
+ }
+
+ /**
+ * The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public SourceBreakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ */
+ public void setBreakpoints(final SourceBreakpoint[] breakpoints) {
+ this.breakpoints = breakpoints;
+ }
+
+ /**
+ * Deprecated: The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * @deprecated Use the line field in the breakpoints property instead.
+ */
+ @Pure
+ @Deprecated
+ public int[] getLines() {
+ return this.lines;
+ }
+
+ /**
+ * Deprecated: The code locations of the breakpoints.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * @deprecated Use the line field in the breakpoints property instead.
+ */
+ @Deprecated
+ public void setLines(final int[] lines) {
+ this.lines = lines;
+ }
+
+ /**
+ * A value of true indicates that the underlying source has been modified which results in new breakpoint
+ * locations.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getSourceModified() {
+ return this.sourceModified;
+ }
+
+ /**
+ * A value of true indicates that the underlying source has been modified which results in new breakpoint
+ * locations.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSourceModified(final Boolean sourceModified) {
+ this.sourceModified = sourceModified;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("source", this.source);
+ b.add("breakpoints", this.breakpoints);
+ b.add("lines", this.lines);
+ b.add("sourceModified", this.sourceModified);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetBreakpointsArguments other = (SetBreakpointsArguments) obj;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ if (this.lines == null) {
+ if (other.lines != null)
+ return false;
+ } else if (!Arrays.equals(this.lines, other.lines))
+ return false;
+ if (this.sourceModified == null) {
+ if (other.sourceModified != null)
+ return false;
+ } else if (!this.sourceModified.equals(other.sourceModified))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ result = prime * result + ((this.lines== null) ? 0 : Arrays.hashCode(this.lines));
+ return prime * result + ((this.sourceModified== null) ? 0 : this.sourceModified.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetBreakpointsResponse.java b/java/org/eclipse/lsp4j/debug/SetBreakpointsResponse.java
new file mode 100644
index 0000000..4d64102
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetBreakpointsResponse.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Breakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'setBreakpoints' request.
+ * <p>
+ * Returned is information about each breakpoint created by this request.
+ * <p>
+ * This includes the actual code location and whether the breakpoint could be verified.
+ * <p>
+ * The breakpoints returned are in the same order as the elements of the 'breakpoints'
+ * <p>
+ * (or the deprecated 'lines') array in the arguments.
+ */
+@SuppressWarnings("all")
+public class SetBreakpointsResponse {
+ /**
+ * Information about the breakpoints.
+ * <p>
+ * The array elements are in the same order as the elements of the 'breakpoints' (or the deprecated 'lines') array
+ * in the arguments.
+ */
+ @NonNull
+ private Breakpoint[] breakpoints;
+
+ /**
+ * Information about the breakpoints.
+ * <p>
+ * The array elements are in the same order as the elements of the 'breakpoints' (or the deprecated 'lines') array
+ * in the arguments.
+ */
+ @Pure
+ @NonNull
+ public Breakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * Information about the breakpoints.
+ * <p>
+ * The array elements are in the same order as the elements of the 'breakpoints' (or the deprecated 'lines') array
+ * in the arguments.
+ */
+ public void setBreakpoints(@NonNull final Breakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetBreakpointsResponse other = (SetBreakpointsResponse) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetDataBreakpointsArguments.java b/java/org/eclipse/lsp4j/debug/SetDataBreakpointsArguments.java
new file mode 100644
index 0000000..7b60d47
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetDataBreakpointsArguments.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.DataBreakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setDataBreakpoints' request.
+ */
+@SuppressWarnings("all")
+public class SetDataBreakpointsArguments {
+ /**
+ * The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints.
+ */
+ @NonNull
+ private DataBreakpoint[] breakpoints;
+
+ /**
+ * The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints.
+ */
+ @Pure
+ @NonNull
+ public DataBreakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * The contents of this array replaces all existing data breakpoints. An empty array clears all data breakpoints.
+ */
+ public void setBreakpoints(@NonNull final DataBreakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetDataBreakpointsArguments other = (SetDataBreakpointsArguments) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetDataBreakpointsResponse.java b/java/org/eclipse/lsp4j/debug/SetDataBreakpointsResponse.java
new file mode 100644
index 0000000..545a59c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetDataBreakpointsResponse.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Breakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'setDataBreakpoints' request.
+ * <p>
+ * Returned is information about each breakpoint created by this request.
+ */
+@SuppressWarnings("all")
+public class SetDataBreakpointsResponse {
+ /**
+ * Information about the data breakpoints. The array elements correspond to the elements of the input argument
+ * 'breakpoints' array.
+ */
+ @NonNull
+ private Breakpoint[] breakpoints;
+
+ /**
+ * Information about the data breakpoints. The array elements correspond to the elements of the input argument
+ * 'breakpoints' array.
+ */
+ @Pure
+ @NonNull
+ public Breakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * Information about the data breakpoints. The array elements correspond to the elements of the input argument
+ * 'breakpoints' array.
+ */
+ public void setBreakpoints(@NonNull final Breakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetDataBreakpointsResponse other = (SetDataBreakpointsResponse) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetExceptionBreakpointsArguments.java b/java/org/eclipse/lsp4j/debug/SetExceptionBreakpointsArguments.java
new file mode 100644
index 0000000..2ac9697
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetExceptionBreakpointsArguments.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.ExceptionFilterOptions;
+import org.eclipse.lsp4j.debug.ExceptionOptions;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setExceptionBreakpoints' request.
+ */
+@SuppressWarnings("all")
+public class SetExceptionBreakpointsArguments {
+ /**
+ * Set of exception filters specified by their ID. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. The 'filter' and 'filterOptions' sets are additive.
+ */
+ @NonNull
+ private String[] filters;
+
+ /**
+ * Set of exception filters and their options. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. This attribute is only honored by a debug adapter if the capability
+ * 'supportsExceptionFilterOptions' is true. The 'filter' and 'filterOptions' sets are additive.
+ * <p>
+ * This is an optional property.
+ */
+ private ExceptionFilterOptions[] filterOptions;
+
+ /**
+ * Configuration options for selected exceptions.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsExceptionOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private ExceptionOptions[] exceptionOptions;
+
+ /**
+ * Set of exception filters specified by their ID. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. The 'filter' and 'filterOptions' sets are additive.
+ */
+ @Pure
+ @NonNull
+ public String[] getFilters() {
+ return this.filters;
+ }
+
+ /**
+ * Set of exception filters specified by their ID. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. The 'filter' and 'filterOptions' sets are additive.
+ */
+ public void setFilters(@NonNull final String[] filters) {
+ this.filters = Preconditions.checkNotNull(filters, "filters");
+ }
+
+ /**
+ * Set of exception filters and their options. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. This attribute is only honored by a debug adapter if the capability
+ * 'supportsExceptionFilterOptions' is true. The 'filter' and 'filterOptions' sets are additive.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ExceptionFilterOptions[] getFilterOptions() {
+ return this.filterOptions;
+ }
+
+ /**
+ * Set of exception filters and their options. The set of all possible exception filters is defined by the
+ * 'exceptionBreakpointFilters' capability. This attribute is only honored by a debug adapter if the capability
+ * 'supportsExceptionFilterOptions' is true. The 'filter' and 'filterOptions' sets are additive.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFilterOptions(final ExceptionFilterOptions[] filterOptions) {
+ this.filterOptions = filterOptions;
+ }
+
+ /**
+ * Configuration options for selected exceptions.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsExceptionOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ExceptionOptions[] getExceptionOptions() {
+ return this.exceptionOptions;
+ }
+
+ /**
+ * Configuration options for selected exceptions.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsExceptionOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setExceptionOptions(final ExceptionOptions[] exceptionOptions) {
+ this.exceptionOptions = exceptionOptions;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("filters", this.filters);
+ b.add("filterOptions", this.filterOptions);
+ b.add("exceptionOptions", this.exceptionOptions);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetExceptionBreakpointsArguments other = (SetExceptionBreakpointsArguments) obj;
+ if (this.filters == null) {
+ if (other.filters != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.filters, other.filters))
+ return false;
+ if (this.filterOptions == null) {
+ if (other.filterOptions != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.filterOptions, other.filterOptions))
+ return false;
+ if (this.exceptionOptions == null) {
+ if (other.exceptionOptions != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.exceptionOptions, other.exceptionOptions))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.filters== null) ? 0 : Arrays.deepHashCode(this.filters));
+ result = prime * result + ((this.filterOptions== null) ? 0 : Arrays.deepHashCode(this.filterOptions));
+ return prime * result + ((this.exceptionOptions== null) ? 0 : Arrays.deepHashCode(this.exceptionOptions));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetExpressionArguments.java b/java/org/eclipse/lsp4j/debug/SetExpressionArguments.java
new file mode 100644
index 0000000..54097f9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetExpressionArguments.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ValueFormat;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setExpression' request.
+ */
+@SuppressWarnings("all")
+public class SetExpressionArguments {
+ /**
+ * The l-value expression to assign to.
+ */
+ @NonNull
+ private String expression;
+
+ /**
+ * The value expression to assign to the l-value expression.
+ */
+ @NonNull
+ private String value;
+
+ /**
+ * Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in
+ * the global scope.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer frameId;
+
+ /**
+ * Specifies how the resulting value should be formatted.
+ * <p>
+ * This is an optional property.
+ */
+ private ValueFormat format;
+
+ /**
+ * The l-value expression to assign to.
+ */
+ @Pure
+ @NonNull
+ public String getExpression() {
+ return this.expression;
+ }
+
+ /**
+ * The l-value expression to assign to.
+ */
+ public void setExpression(@NonNull final String expression) {
+ this.expression = Preconditions.checkNotNull(expression, "expression");
+ }
+
+ /**
+ * The value expression to assign to the l-value expression.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The value expression to assign to the l-value expression.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ /**
+ * Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in
+ * the global scope.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getFrameId() {
+ return this.frameId;
+ }
+
+ /**
+ * Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in
+ * the global scope.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFrameId(final Integer frameId) {
+ this.frameId = frameId;
+ }
+
+ /**
+ * Specifies how the resulting value should be formatted.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ValueFormat getFormat() {
+ return this.format;
+ }
+
+ /**
+ * Specifies how the resulting value should be formatted.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFormat(final ValueFormat format) {
+ this.format = format;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("expression", this.expression);
+ b.add("value", this.value);
+ b.add("frameId", this.frameId);
+ b.add("format", this.format);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetExpressionArguments other = (SetExpressionArguments) obj;
+ if (this.expression == null) {
+ if (other.expression != null)
+ return false;
+ } else if (!this.expression.equals(other.expression))
+ return false;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ if (this.frameId == null) {
+ if (other.frameId != null)
+ return false;
+ } else if (!this.frameId.equals(other.frameId))
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.expression== null) ? 0 : this.expression.hashCode());
+ result = prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ result = prime * result + ((this.frameId== null) ? 0 : this.frameId.hashCode());
+ return prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetExpressionResponse.java b/java/org/eclipse/lsp4j/debug/SetExpressionResponse.java
new file mode 100644
index 0000000..2a1fb9c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetExpressionResponse.java
@@ -0,0 +1,287 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.VariablePresentationHint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'setExpression' request.
+ */
+@SuppressWarnings("all")
+public class SetExpressionResponse {
+ /**
+ * The new value of the expression.
+ */
+ @NonNull
+ private String value;
+
+ /**
+ * The optional type of the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ private String type;
+
+ /**
+ * Properties of a value that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ private VariablePresentationHint presentationHint;
+
+ /**
+ * If variablesReference is > 0, the value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer variablesReference;
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer namedVariables;
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer indexedVariables;
+
+ /**
+ * The new value of the expression.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The new value of the expression.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ /**
+ * The optional type of the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getType() {
+ return this.type;
+ }
+
+ /**
+ * The optional type of the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setType(final String type) {
+ this.type = type;
+ }
+
+ /**
+ * Properties of a value that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public VariablePresentationHint getPresentationHint() {
+ return this.presentationHint;
+ }
+
+ /**
+ * Properties of a value that can be used to determine how to render the result in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPresentationHint(final VariablePresentationHint presentationHint) {
+ this.presentationHint = presentationHint;
+ }
+
+ /**
+ * If variablesReference is > 0, the value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * If variablesReference is > 0, the value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setVariablesReference(final Integer variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getNamedVariables() {
+ return this.namedVariables;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setNamedVariables(final Integer namedVariables) {
+ this.namedVariables = namedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getIndexedVariables() {
+ return this.indexedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setIndexedVariables(final Integer indexedVariables) {
+ this.indexedVariables = indexedVariables;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("value", this.value);
+ b.add("type", this.type);
+ b.add("presentationHint", this.presentationHint);
+ b.add("variablesReference", this.variablesReference);
+ b.add("namedVariables", this.namedVariables);
+ b.add("indexedVariables", this.indexedVariables);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetExpressionResponse other = (SetExpressionResponse) obj;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.presentationHint == null) {
+ if (other.presentationHint != null)
+ return false;
+ } else if (!this.presentationHint.equals(other.presentationHint))
+ return false;
+ if (this.variablesReference == null) {
+ if (other.variablesReference != null)
+ return false;
+ } else if (!this.variablesReference.equals(other.variablesReference))
+ return false;
+ if (this.namedVariables == null) {
+ if (other.namedVariables != null)
+ return false;
+ } else if (!this.namedVariables.equals(other.namedVariables))
+ return false;
+ if (this.indexedVariables == null) {
+ if (other.indexedVariables != null)
+ return false;
+ } else if (!this.indexedVariables.equals(other.indexedVariables))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ result = prime * result + ((this.presentationHint== null) ? 0 : this.presentationHint.hashCode());
+ result = prime * result + ((this.variablesReference== null) ? 0 : this.variablesReference.hashCode());
+ result = prime * result + ((this.namedVariables== null) ? 0 : this.namedVariables.hashCode());
+ return prime * result + ((this.indexedVariables== null) ? 0 : this.indexedVariables.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetFunctionBreakpointsArguments.java b/java/org/eclipse/lsp4j/debug/SetFunctionBreakpointsArguments.java
new file mode 100644
index 0000000..f4c70fb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetFunctionBreakpointsArguments.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.FunctionBreakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setFunctionBreakpoints' request.
+ */
+@SuppressWarnings("all")
+public class SetFunctionBreakpointsArguments {
+ /**
+ * The function names of the breakpoints.
+ */
+ @NonNull
+ private FunctionBreakpoint[] breakpoints;
+
+ /**
+ * The function names of the breakpoints.
+ */
+ @Pure
+ @NonNull
+ public FunctionBreakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * The function names of the breakpoints.
+ */
+ public void setBreakpoints(@NonNull final FunctionBreakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetFunctionBreakpointsArguments other = (SetFunctionBreakpointsArguments) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetFunctionBreakpointsResponse.java b/java/org/eclipse/lsp4j/debug/SetFunctionBreakpointsResponse.java
new file mode 100644
index 0000000..94991b0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetFunctionBreakpointsResponse.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Breakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'setFunctionBreakpoints' request.
+ * <p>
+ * Returned is information about each breakpoint created by this request.
+ */
+@SuppressWarnings("all")
+public class SetFunctionBreakpointsResponse {
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ @NonNull
+ private Breakpoint[] breakpoints;
+
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ @Pure
+ @NonNull
+ public Breakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ public void setBreakpoints(@NonNull final Breakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetFunctionBreakpointsResponse other = (SetFunctionBreakpointsResponse) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetInstructionBreakpointsArguments.java b/java/org/eclipse/lsp4j/debug/SetInstructionBreakpointsArguments.java
new file mode 100644
index 0000000..e887bd5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetInstructionBreakpointsArguments.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.InstructionBreakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setInstructionBreakpoints' request
+ */
+@SuppressWarnings("all")
+public class SetInstructionBreakpointsArguments {
+ /**
+ * The instruction references of the breakpoints
+ */
+ @NonNull
+ private InstructionBreakpoint[] breakpoints;
+
+ /**
+ * The instruction references of the breakpoints
+ */
+ @Pure
+ @NonNull
+ public InstructionBreakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * The instruction references of the breakpoints
+ */
+ public void setBreakpoints(@NonNull final InstructionBreakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetInstructionBreakpointsArguments other = (SetInstructionBreakpointsArguments) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetInstructionBreakpointsResponse.java b/java/org/eclipse/lsp4j/debug/SetInstructionBreakpointsResponse.java
new file mode 100644
index 0000000..238b839
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetInstructionBreakpointsResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Breakpoint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'setInstructionBreakpoints' request
+ */
+@SuppressWarnings("all")
+public class SetInstructionBreakpointsResponse {
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ @NonNull
+ private Breakpoint[] breakpoints;
+
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ @Pure
+ @NonNull
+ public Breakpoint[] getBreakpoints() {
+ return this.breakpoints;
+ }
+
+ /**
+ * Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array.
+ */
+ public void setBreakpoints(@NonNull final Breakpoint[] breakpoints) {
+ this.breakpoints = Preconditions.checkNotNull(breakpoints, "breakpoints");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("breakpoints", this.breakpoints);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetInstructionBreakpointsResponse other = (SetInstructionBreakpointsResponse) obj;
+ if (this.breakpoints == null) {
+ if (other.breakpoints != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.breakpoints, other.breakpoints))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.breakpoints== null) ? 0 : Arrays.deepHashCode(this.breakpoints));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetVariableArguments.java b/java/org/eclipse/lsp4j/debug/SetVariableArguments.java
new file mode 100644
index 0000000..689e812
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetVariableArguments.java
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ValueFormat;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'setVariable' request.
+ */
+@SuppressWarnings("all")
+public class SetVariableArguments {
+ /**
+ * The reference of the variable container.
+ */
+ private int variablesReference;
+
+ /**
+ * The name of the variable in the container.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The value of the variable.
+ */
+ @NonNull
+ private String value;
+
+ /**
+ * Specifies details on how to format the response value.
+ * <p>
+ * This is an optional property.
+ */
+ private ValueFormat format;
+
+ /**
+ * The reference of the variable container.
+ */
+ @Pure
+ public int getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * The reference of the variable container.
+ */
+ public void setVariablesReference(final int variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The name of the variable in the container.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the variable in the container.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The value of the variable.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The value of the variable.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ /**
+ * Specifies details on how to format the response value.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ValueFormat getFormat() {
+ return this.format;
+ }
+
+ /**
+ * Specifies details on how to format the response value.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFormat(final ValueFormat format) {
+ this.format = format;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("variablesReference", this.variablesReference);
+ b.add("name", this.name);
+ b.add("value", this.value);
+ b.add("format", this.format);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetVariableArguments other = (SetVariableArguments) obj;
+ if (other.variablesReference != this.variablesReference)
+ return false;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.variablesReference;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ return prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SetVariableResponse.java b/java/org/eclipse/lsp4j/debug/SetVariableResponse.java
new file mode 100644
index 0000000..d633619
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SetVariableResponse.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'setVariable' request.
+ */
+@SuppressWarnings("all")
+public class SetVariableResponse {
+ /**
+ * The new value of the variable.
+ */
+ @NonNull
+ private String value;
+
+ /**
+ * The type of the new value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This is an optional property.
+ */
+ private String type;
+
+ /**
+ * If variablesReference is > 0, the new value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer variablesReference;
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer namedVariables;
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer indexedVariables;
+
+ /**
+ * The new value of the variable.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The new value of the variable.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ /**
+ * The type of the new value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getType() {
+ return this.type;
+ }
+
+ /**
+ * The type of the new value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This is an optional property.
+ */
+ public void setType(final String type) {
+ this.type = type;
+ }
+
+ /**
+ * If variablesReference is > 0, the new value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * If variablesReference is > 0, the new value is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setVariablesReference(final Integer variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getNamedVariables() {
+ return this.namedVariables;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setNamedVariables(final Integer namedVariables) {
+ this.namedVariables = namedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getIndexedVariables() {
+ return this.indexedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the variables in a paged UI and fetch them in chunks.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setIndexedVariables(final Integer indexedVariables) {
+ this.indexedVariables = indexedVariables;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("value", this.value);
+ b.add("type", this.type);
+ b.add("variablesReference", this.variablesReference);
+ b.add("namedVariables", this.namedVariables);
+ b.add("indexedVariables", this.indexedVariables);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SetVariableResponse other = (SetVariableResponse) obj;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.variablesReference == null) {
+ if (other.variablesReference != null)
+ return false;
+ } else if (!this.variablesReference.equals(other.variablesReference))
+ return false;
+ if (this.namedVariables == null) {
+ if (other.namedVariables != null)
+ return false;
+ } else if (!this.namedVariables.equals(other.namedVariables))
+ return false;
+ if (this.indexedVariables == null) {
+ if (other.indexedVariables != null)
+ return false;
+ } else if (!this.indexedVariables.equals(other.indexedVariables))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ result = prime * result + ((this.variablesReference== null) ? 0 : this.variablesReference.hashCode());
+ result = prime * result + ((this.namedVariables== null) ? 0 : this.namedVariables.hashCode());
+ return prime * result + ((this.indexedVariables== null) ? 0 : this.indexedVariables.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Source.java b/java/org/eclipse/lsp4j/debug/Source.java
new file mode 100644
index 0000000..6d9e1ac
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Source.java
@@ -0,0 +1,372 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Checksum;
+import org.eclipse.lsp4j.debug.SourcePresentationHint;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A Source is a descriptor for source code.
+ * <p>
+ * It is returned from the debug adapter as part of a StackFrame and it is used by clients when specifying
+ * breakpoints.
+ */
+@SuppressWarnings("all")
+public class Source {
+ /**
+ * The short name of the source. Every source returned from the debug adapter has a name.
+ * <p>
+ * When sending a source to the debug adapter this name is optional.
+ * <p>
+ * This is an optional property.
+ */
+ private String name;
+
+ /**
+ * The path of the source to be shown in the UI.
+ * <p>
+ * It is only used to locate and load the content of the source if no sourceReference is specified (or its value
+ * is 0).
+ * <p>
+ * This is an optional property.
+ */
+ private String path;
+
+ /**
+ * If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a
+ * path is specified).
+ * <p>
+ * A sourceReference is only valid for a session, so it must not be used to persist a source.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ private Integer sourceReference;
+
+ /**
+ * An optional hint for how to present the source in the UI.
+ * <p>
+ * A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on
+ * stepping.
+ * <p>
+ * This is an optional property.
+ */
+ private SourcePresentationHint presentationHint;
+
+ /**
+ * The (optional) origin of this source: possible values 'internal module', 'inlined content from source map',
+ * etc.
+ * <p>
+ * This is an optional property.
+ */
+ private String origin;
+
+ /**
+ * An optional list of sources that are related to this source. These may be the source that generated this
+ * source.
+ * <p>
+ * This is an optional property.
+ */
+ private Source[] sources;
+
+ /**
+ * Optional data that a debug adapter might want to loop through the client.
+ * <p>
+ * The client should leave the data intact and persist it across sessions. The client should not interpret the
+ * data.
+ * <p>
+ * This is an optional property.
+ */
+ private Object adapterData;
+
+ /**
+ * The checksums associated with this file.
+ * <p>
+ * This is an optional property.
+ */
+ private Checksum[] checksums;
+
+ /**
+ * The short name of the source. Every source returned from the debug adapter has a name.
+ * <p>
+ * When sending a source to the debug adapter this name is optional.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The short name of the source. Every source returned from the debug adapter has a name.
+ * <p>
+ * When sending a source to the debug adapter this name is optional.
+ * <p>
+ * This is an optional property.
+ */
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ /**
+ * The path of the source to be shown in the UI.
+ * <p>
+ * It is only used to locate and load the content of the source if no sourceReference is specified (or its value
+ * is 0).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getPath() {
+ return this.path;
+ }
+
+ /**
+ * The path of the source to be shown in the UI.
+ * <p>
+ * It is only used to locate and load the content of the source if no sourceReference is specified (or its value
+ * is 0).
+ * <p>
+ * This is an optional property.
+ */
+ public void setPath(final String path) {
+ this.path = path;
+ }
+
+ /**
+ * If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a
+ * path is specified).
+ * <p>
+ * A sourceReference is only valid for a session, so it must not be used to persist a source.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getSourceReference() {
+ return this.sourceReference;
+ }
+
+ /**
+ * If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a
+ * path is specified).
+ * <p>
+ * A sourceReference is only valid for a session, so it must not be used to persist a source.
+ * <p>
+ * The value should be less than or equal to 2147483647 (2^31-1).
+ * <p>
+ * This is an optional property.
+ */
+ public void setSourceReference(final Integer sourceReference) {
+ this.sourceReference = sourceReference;
+ }
+
+ /**
+ * An optional hint for how to present the source in the UI.
+ * <p>
+ * A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on
+ * stepping.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public SourcePresentationHint getPresentationHint() {
+ return this.presentationHint;
+ }
+
+ /**
+ * An optional hint for how to present the source in the UI.
+ * <p>
+ * A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on
+ * stepping.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPresentationHint(final SourcePresentationHint presentationHint) {
+ this.presentationHint = presentationHint;
+ }
+
+ /**
+ * The (optional) origin of this source: possible values 'internal module', 'inlined content from source map',
+ * etc.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getOrigin() {
+ return this.origin;
+ }
+
+ /**
+ * The (optional) origin of this source: possible values 'internal module', 'inlined content from source map',
+ * etc.
+ * <p>
+ * This is an optional property.
+ */
+ public void setOrigin(final String origin) {
+ this.origin = origin;
+ }
+
+ /**
+ * An optional list of sources that are related to this source. These may be the source that generated this
+ * source.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source[] getSources() {
+ return this.sources;
+ }
+
+ /**
+ * An optional list of sources that are related to this source. These may be the source that generated this
+ * source.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSources(final Source[] sources) {
+ this.sources = sources;
+ }
+
+ /**
+ * Optional data that a debug adapter might want to loop through the client.
+ * <p>
+ * The client should leave the data intact and persist it across sessions. The client should not interpret the
+ * data.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Object getAdapterData() {
+ return this.adapterData;
+ }
+
+ /**
+ * Optional data that a debug adapter might want to loop through the client.
+ * <p>
+ * The client should leave the data intact and persist it across sessions. The client should not interpret the
+ * data.
+ * <p>
+ * This is an optional property.
+ */
+ public void setAdapterData(final Object adapterData) {
+ this.adapterData = adapterData;
+ }
+
+ /**
+ * The checksums associated with this file.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Checksum[] getChecksums() {
+ return this.checksums;
+ }
+
+ /**
+ * The checksums associated with this file.
+ * <p>
+ * This is an optional property.
+ */
+ public void setChecksums(final Checksum[] checksums) {
+ this.checksums = checksums;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("path", this.path);
+ b.add("sourceReference", this.sourceReference);
+ b.add("presentationHint", this.presentationHint);
+ b.add("origin", this.origin);
+ b.add("sources", this.sources);
+ b.add("adapterData", this.adapterData);
+ b.add("checksums", this.checksums);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Source other = (Source) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.path == null) {
+ if (other.path != null)
+ return false;
+ } else if (!this.path.equals(other.path))
+ return false;
+ if (this.sourceReference == null) {
+ if (other.sourceReference != null)
+ return false;
+ } else if (!this.sourceReference.equals(other.sourceReference))
+ return false;
+ if (this.presentationHint == null) {
+ if (other.presentationHint != null)
+ return false;
+ } else if (!this.presentationHint.equals(other.presentationHint))
+ return false;
+ if (this.origin == null) {
+ if (other.origin != null)
+ return false;
+ } else if (!this.origin.equals(other.origin))
+ return false;
+ if (this.sources == null) {
+ if (other.sources != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.sources, other.sources))
+ return false;
+ if (this.adapterData == null) {
+ if (other.adapterData != null)
+ return false;
+ } else if (!this.adapterData.equals(other.adapterData))
+ return false;
+ if (this.checksums == null) {
+ if (other.checksums != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.checksums, other.checksums))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.path== null) ? 0 : this.path.hashCode());
+ result = prime * result + ((this.sourceReference== null) ? 0 : this.sourceReference.hashCode());
+ result = prime * result + ((this.presentationHint== null) ? 0 : this.presentationHint.hashCode());
+ result = prime * result + ((this.origin== null) ? 0 : this.origin.hashCode());
+ result = prime * result + ((this.sources== null) ? 0 : Arrays.deepHashCode(this.sources));
+ result = prime * result + ((this.adapterData== null) ? 0 : this.adapterData.hashCode());
+ return prime * result + ((this.checksums== null) ? 0 : Arrays.deepHashCode(this.checksums));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SourceArguments.java b/java/org/eclipse/lsp4j/debug/SourceArguments.java
new file mode 100644
index 0000000..d335244
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SourceArguments.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'source' request.
+ */
+@SuppressWarnings("all")
+public class SourceArguments {
+ /**
+ * Specifies the source content to load. Either source.path or source.sourceReference must be specified.
+ * <p>
+ * This is an optional property.
+ */
+ private Source source;
+
+ /**
+ * The reference to the source. This is the same as source.sourceReference.
+ * <p>
+ * This is provided for backward compatibility since old backends do not understand the 'source' attribute.
+ */
+ private int sourceReference;
+
+ /**
+ * Specifies the source content to load. Either source.path or source.sourceReference must be specified.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * Specifies the source content to load. Either source.path or source.sourceReference must be specified.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSource(final Source source) {
+ this.source = source;
+ }
+
+ /**
+ * The reference to the source. This is the same as source.sourceReference.
+ * <p>
+ * This is provided for backward compatibility since old backends do not understand the 'source' attribute.
+ */
+ @Pure
+ public int getSourceReference() {
+ return this.sourceReference;
+ }
+
+ /**
+ * The reference to the source. This is the same as source.sourceReference.
+ * <p>
+ * This is provided for backward compatibility since old backends do not understand the 'source' attribute.
+ */
+ public void setSourceReference(final int sourceReference) {
+ this.sourceReference = sourceReference;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("source", this.source);
+ b.add("sourceReference", this.sourceReference);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SourceArguments other = (SourceArguments) obj;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (other.sourceReference != this.sourceReference)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ return prime * result + this.sourceReference;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SourceBreakpoint.java b/java/org/eclipse/lsp4j/debug/SourceBreakpoint.java
new file mode 100644
index 0000000..d7562ee
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SourceBreakpoint.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Properties of a breakpoint or logpoint passed to the setBreakpoints request.
+ */
+@SuppressWarnings("all")
+public class SourceBreakpoint {
+ /**
+ * The source line of the breakpoint or logpoint.
+ */
+ private int line;
+
+ /**
+ * An optional source column of the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer column;
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String condition;
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String hitCondition;
+
+ /**
+ * If this attribute exists and is non-empty, the backend must not 'break' (stop)
+ * <p>
+ * but log the message instead. Expressions within {} are interpolated.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsLogPoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private String logMessage;
+
+ /**
+ * The source line of the breakpoint or logpoint.
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * The source line of the breakpoint or logpoint.
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * An optional source column of the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getColumn() {
+ return this.column;
+ }
+
+ /**
+ * An optional source column of the breakpoint.
+ * <p>
+ * This is an optional property.
+ */
+ public void setColumn(final Integer column) {
+ this.column = column;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getCondition() {
+ return this.condition;
+ }
+
+ /**
+ * An optional expression for conditional breakpoints.
+ * <p>
+ * It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCondition(final String condition) {
+ this.condition = condition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getHitCondition() {
+ return this.hitCondition;
+ }
+
+ /**
+ * An optional expression that controls how many hits of the breakpoint are ignored.
+ * <p>
+ * The backend is expected to interpret the expression as needed.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setHitCondition(final String hitCondition) {
+ this.hitCondition = hitCondition;
+ }
+
+ /**
+ * If this attribute exists and is non-empty, the backend must not 'break' (stop)
+ * <p>
+ * but log the message instead. Expressions within {} are interpolated.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsLogPoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getLogMessage() {
+ return this.logMessage;
+ }
+
+ /**
+ * If this attribute exists and is non-empty, the backend must not 'break' (stop)
+ * <p>
+ * but log the message instead. Expressions within {} are interpolated.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsLogPoints' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLogMessage(final String logMessage) {
+ this.logMessage = logMessage;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("condition", this.condition);
+ b.add("hitCondition", this.hitCondition);
+ b.add("logMessage", this.logMessage);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SourceBreakpoint other = (SourceBreakpoint) obj;
+ if (other.line != this.line)
+ return false;
+ if (this.column == null) {
+ if (other.column != null)
+ return false;
+ } else if (!this.column.equals(other.column))
+ return false;
+ if (this.condition == null) {
+ if (other.condition != null)
+ return false;
+ } else if (!this.condition.equals(other.condition))
+ return false;
+ if (this.hitCondition == null) {
+ if (other.hitCondition != null)
+ return false;
+ } else if (!this.hitCondition.equals(other.hitCondition))
+ return false;
+ if (this.logMessage == null) {
+ if (other.logMessage != null)
+ return false;
+ } else if (!this.logMessage.equals(other.logMessage))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.line;
+ result = prime * result + ((this.column== null) ? 0 : this.column.hashCode());
+ result = prime * result + ((this.condition== null) ? 0 : this.condition.hashCode());
+ result = prime * result + ((this.hitCondition== null) ? 0 : this.hitCondition.hashCode());
+ return prime * result + ((this.logMessage== null) ? 0 : this.logMessage.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SourcePresentationHint.java b/java/org/eclipse/lsp4j/debug/SourcePresentationHint.java
new file mode 100644
index 0000000..2043777
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SourcePresentationHint.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * An optional hint for how to present the source in the UI.
+ * <p>
+ * A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on
+ * stepping.
+ */
+@SuppressWarnings("all")
+public enum SourcePresentationHint {
+ NORMAL,
+
+ EMPHASIZE,
+
+ DEEMPHASIZE;
+}
diff --git a/java/org/eclipse/lsp4j/debug/SourceResponse.java b/java/org/eclipse/lsp4j/debug/SourceResponse.java
new file mode 100644
index 0000000..4303b68
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SourceResponse.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'source' request.
+ */
+@SuppressWarnings("all")
+public class SourceResponse {
+ /**
+ * Content of the source reference.
+ */
+ @NonNull
+ private String content;
+
+ /**
+ * Optional content type (mime type) of the source.
+ * <p>
+ * This is an optional property.
+ */
+ private String mimeType;
+
+ /**
+ * Content of the source reference.
+ */
+ @Pure
+ @NonNull
+ public String getContent() {
+ return this.content;
+ }
+
+ /**
+ * Content of the source reference.
+ */
+ public void setContent(@NonNull final String content) {
+ this.content = Preconditions.checkNotNull(content, "content");
+ }
+
+ /**
+ * Optional content type (mime type) of the source.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMimeType() {
+ return this.mimeType;
+ }
+
+ /**
+ * Optional content type (mime type) of the source.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMimeType(final String mimeType) {
+ this.mimeType = mimeType;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("content", this.content);
+ b.add("mimeType", this.mimeType);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SourceResponse other = (SourceResponse) obj;
+ if (this.content == null) {
+ if (other.content != null)
+ return false;
+ } else if (!this.content.equals(other.content))
+ return false;
+ if (this.mimeType == null) {
+ if (other.mimeType != null)
+ return false;
+ } else if (!this.mimeType.equals(other.mimeType))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.content== null) ? 0 : this.content.hashCode());
+ return prime * result + ((this.mimeType== null) ? 0 : this.mimeType.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StackFrame.java b/java/org/eclipse/lsp4j/debug/StackFrame.java
new file mode 100644
index 0000000..696eecb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StackFrame.java
@@ -0,0 +1,386 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.Source;
+import org.eclipse.lsp4j.debug.StackFramePresentationHint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A Stackframe contains the source location.
+ */
+@SuppressWarnings("all")
+public class StackFrame {
+ /**
+ * An identifier for the stack frame. It must be unique across all threads.
+ * <p>
+ * This id can be used to retrieve the scopes of the frame with the 'scopesRequest' or to restart the execution of
+ * a stackframe.
+ */
+ private int id;
+
+ /**
+ * The name of the stack frame, typically a method name.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The optional source of the frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Source source;
+
+ /**
+ * The line within the file of the frame. If source is null or doesn't exist, line is 0 and must be ignored.
+ */
+ private int line;
+
+ /**
+ * The column within the line. If source is null or doesn't exist, column is 0 and must be ignored.
+ */
+ private int column;
+
+ /**
+ * An optional end line of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endLine;
+
+ /**
+ * An optional end column of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer endColumn;
+
+ /**
+ * Optional memory reference for the current instruction pointer in this frame.
+ * <p>
+ * This is an optional property.
+ */
+ private String instructionPointerReference;
+
+ /**
+ * The module associated with this frame, if any.
+ * <p>
+ * This is an optional property.
+ */
+ private Either<Integer, String> moduleId;
+
+ /**
+ * An optional hint for how to present this frame in the UI.
+ * <p>
+ * A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label
+ * or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way.
+ * <p>
+ * This is an optional property.
+ */
+ private StackFramePresentationHint presentationHint;
+
+ /**
+ * An identifier for the stack frame. It must be unique across all threads.
+ * <p>
+ * This id can be used to retrieve the scopes of the frame with the 'scopesRequest' or to restart the execution of
+ * a stackframe.
+ */
+ @Pure
+ public int getId() {
+ return this.id;
+ }
+
+ /**
+ * An identifier for the stack frame. It must be unique across all threads.
+ * <p>
+ * This id can be used to retrieve the scopes of the frame with the 'scopesRequest' or to restart the execution of
+ * a stackframe.
+ */
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ /**
+ * The name of the stack frame, typically a method name.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The name of the stack frame, typically a method name.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The optional source of the frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Source getSource() {
+ return this.source;
+ }
+
+ /**
+ * The optional source of the frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setSource(final Source source) {
+ this.source = source;
+ }
+
+ /**
+ * The line within the file of the frame. If source is null or doesn't exist, line is 0 and must be ignored.
+ */
+ @Pure
+ public int getLine() {
+ return this.line;
+ }
+
+ /**
+ * The line within the file of the frame. If source is null or doesn't exist, line is 0 and must be ignored.
+ */
+ public void setLine(final int line) {
+ this.line = line;
+ }
+
+ /**
+ * The column within the line. If source is null or doesn't exist, column is 0 and must be ignored.
+ */
+ @Pure
+ public int getColumn() {
+ return this.column;
+ }
+
+ /**
+ * The column within the line. If source is null or doesn't exist, column is 0 and must be ignored.
+ */
+ public void setColumn(final int column) {
+ this.column = column;
+ }
+
+ /**
+ * An optional end line of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndLine() {
+ return this.endLine;
+ }
+
+ /**
+ * An optional end line of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndLine(final Integer endLine) {
+ this.endLine = endLine;
+ }
+
+ /**
+ * An optional end column of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getEndColumn() {
+ return this.endColumn;
+ }
+
+ /**
+ * An optional end column of the range covered by the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEndColumn(final Integer endColumn) {
+ this.endColumn = endColumn;
+ }
+
+ /**
+ * Optional memory reference for the current instruction pointer in this frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getInstructionPointerReference() {
+ return this.instructionPointerReference;
+ }
+
+ /**
+ * Optional memory reference for the current instruction pointer in this frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setInstructionPointerReference(final String instructionPointerReference) {
+ this.instructionPointerReference = instructionPointerReference;
+ }
+
+ /**
+ * The module associated with this frame, if any.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Either<Integer, String> getModuleId() {
+ return this.moduleId;
+ }
+
+ /**
+ * The module associated with this frame, if any.
+ * <p>
+ * This is an optional property.
+ */
+ public void setModuleId(final Either<Integer, String> moduleId) {
+ this.moduleId = moduleId;
+ }
+
+ public void setModuleId(final Integer moduleId) {
+ if (moduleId == null) {
+ this.moduleId = null;
+ return;
+ }
+ this.moduleId = Either.forLeft(moduleId);
+ }
+
+ public void setModuleId(final String moduleId) {
+ if (moduleId == null) {
+ this.moduleId = null;
+ return;
+ }
+ this.moduleId = Either.forRight(moduleId);
+ }
+
+ /**
+ * An optional hint for how to present this frame in the UI.
+ * <p>
+ * A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label
+ * or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public StackFramePresentationHint getPresentationHint() {
+ return this.presentationHint;
+ }
+
+ /**
+ * An optional hint for how to present this frame in the UI.
+ * <p>
+ * A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label
+ * or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPresentationHint(final StackFramePresentationHint presentationHint) {
+ this.presentationHint = presentationHint;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("name", this.name);
+ b.add("source", this.source);
+ b.add("line", this.line);
+ b.add("column", this.column);
+ b.add("endLine", this.endLine);
+ b.add("endColumn", this.endColumn);
+ b.add("instructionPointerReference", this.instructionPointerReference);
+ b.add("moduleId", this.moduleId);
+ b.add("presentationHint", this.presentationHint);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StackFrame other = (StackFrame) obj;
+ if (other.id != this.id)
+ return false;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.source == null) {
+ if (other.source != null)
+ return false;
+ } else if (!this.source.equals(other.source))
+ return false;
+ if (other.line != this.line)
+ return false;
+ if (other.column != this.column)
+ return false;
+ if (this.endLine == null) {
+ if (other.endLine != null)
+ return false;
+ } else if (!this.endLine.equals(other.endLine))
+ return false;
+ if (this.endColumn == null) {
+ if (other.endColumn != null)
+ return false;
+ } else if (!this.endColumn.equals(other.endColumn))
+ return false;
+ if (this.instructionPointerReference == null) {
+ if (other.instructionPointerReference != null)
+ return false;
+ } else if (!this.instructionPointerReference.equals(other.instructionPointerReference))
+ return false;
+ if (this.moduleId == null) {
+ if (other.moduleId != null)
+ return false;
+ } else if (!this.moduleId.equals(other.moduleId))
+ return false;
+ if (this.presentationHint == null) {
+ if (other.presentationHint != null)
+ return false;
+ } else if (!this.presentationHint.equals(other.presentationHint))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.id;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.source== null) ? 0 : this.source.hashCode());
+ result = prime * result + this.line;
+ result = prime * result + this.column;
+ result = prime * result + ((this.endLine== null) ? 0 : this.endLine.hashCode());
+ result = prime * result + ((this.endColumn== null) ? 0 : this.endColumn.hashCode());
+ result = prime * result + ((this.instructionPointerReference== null) ? 0 : this.instructionPointerReference.hashCode());
+ result = prime * result + ((this.moduleId== null) ? 0 : this.moduleId.hashCode());
+ return prime * result + ((this.presentationHint== null) ? 0 : this.presentationHint.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StackFrameFormat.java b/java/org/eclipse/lsp4j/debug/StackFrameFormat.java
new file mode 100644
index 0000000..6bfb3fe
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StackFrameFormat.java
@@ -0,0 +1,283 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ValueFormat;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Provides formatting information for a stack frame.
+ */
+@SuppressWarnings("all")
+public class StackFrameFormat extends ValueFormat {
+ /**
+ * Displays parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean parameters;
+
+ /**
+ * Displays the types of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean parameterTypes;
+
+ /**
+ * Displays the names of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean parameterNames;
+
+ /**
+ * Displays the values of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean parameterValues;
+
+ /**
+ * Displays the line number of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean line;
+
+ /**
+ * Displays the module of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean module;
+
+ /**
+ * Includes all stack frames, including those the debug adapter might otherwise hide.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean includeAll;
+
+ /**
+ * Displays parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getParameters() {
+ return this.parameters;
+ }
+
+ /**
+ * Displays parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setParameters(final Boolean parameters) {
+ this.parameters = parameters;
+ }
+
+ /**
+ * Displays the types of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getParameterTypes() {
+ return this.parameterTypes;
+ }
+
+ /**
+ * Displays the types of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setParameterTypes(final Boolean parameterTypes) {
+ this.parameterTypes = parameterTypes;
+ }
+
+ /**
+ * Displays the names of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getParameterNames() {
+ return this.parameterNames;
+ }
+
+ /**
+ * Displays the names of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setParameterNames(final Boolean parameterNames) {
+ this.parameterNames = parameterNames;
+ }
+
+ /**
+ * Displays the values of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getParameterValues() {
+ return this.parameterValues;
+ }
+
+ /**
+ * Displays the values of parameters for the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setParameterValues(final Boolean parameterValues) {
+ this.parameterValues = parameterValues;
+ }
+
+ /**
+ * Displays the line number of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getLine() {
+ return this.line;
+ }
+
+ /**
+ * Displays the line number of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLine(final Boolean line) {
+ this.line = line;
+ }
+
+ /**
+ * Displays the module of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getModule() {
+ return this.module;
+ }
+
+ /**
+ * Displays the module of the stack frame.
+ * <p>
+ * This is an optional property.
+ */
+ public void setModule(final Boolean module) {
+ this.module = module;
+ }
+
+ /**
+ * Includes all stack frames, including those the debug adapter might otherwise hide.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getIncludeAll() {
+ return this.includeAll;
+ }
+
+ /**
+ * Includes all stack frames, including those the debug adapter might otherwise hide.
+ * <p>
+ * This is an optional property.
+ */
+ public void setIncludeAll(final Boolean includeAll) {
+ this.includeAll = includeAll;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("parameters", this.parameters);
+ b.add("parameterTypes", this.parameterTypes);
+ b.add("parameterNames", this.parameterNames);
+ b.add("parameterValues", this.parameterValues);
+ b.add("line", this.line);
+ b.add("module", this.module);
+ b.add("includeAll", this.includeAll);
+ b.add("hex", getHex());
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ StackFrameFormat other = (StackFrameFormat) obj;
+ if (this.parameters == null) {
+ if (other.parameters != null)
+ return false;
+ } else if (!this.parameters.equals(other.parameters))
+ return false;
+ if (this.parameterTypes == null) {
+ if (other.parameterTypes != null)
+ return false;
+ } else if (!this.parameterTypes.equals(other.parameterTypes))
+ return false;
+ if (this.parameterNames == null) {
+ if (other.parameterNames != null)
+ return false;
+ } else if (!this.parameterNames.equals(other.parameterNames))
+ return false;
+ if (this.parameterValues == null) {
+ if (other.parameterValues != null)
+ return false;
+ } else if (!this.parameterValues.equals(other.parameterValues))
+ return false;
+ if (this.line == null) {
+ if (other.line != null)
+ return false;
+ } else if (!this.line.equals(other.line))
+ return false;
+ if (this.module == null) {
+ if (other.module != null)
+ return false;
+ } else if (!this.module.equals(other.module))
+ return false;
+ if (this.includeAll == null) {
+ if (other.includeAll != null)
+ return false;
+ } else if (!this.includeAll.equals(other.includeAll))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.parameters== null) ? 0 : this.parameters.hashCode());
+ result = prime * result + ((this.parameterTypes== null) ? 0 : this.parameterTypes.hashCode());
+ result = prime * result + ((this.parameterNames== null) ? 0 : this.parameterNames.hashCode());
+ result = prime * result + ((this.parameterValues== null) ? 0 : this.parameterValues.hashCode());
+ result = prime * result + ((this.line== null) ? 0 : this.line.hashCode());
+ result = prime * result + ((this.module== null) ? 0 : this.module.hashCode());
+ return prime * result + ((this.includeAll== null) ? 0 : this.includeAll.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StackFramePresentationHint.java b/java/org/eclipse/lsp4j/debug/StackFramePresentationHint.java
new file mode 100644
index 0000000..3cd726c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StackFramePresentationHint.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * An optional hint for how to present this frame in the UI.
+ * <p>
+ * A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label
+ * or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way.
+ */
+@SuppressWarnings("all")
+public enum StackFramePresentationHint {
+ NORMAL,
+
+ LABEL,
+
+ SUBTLE;
+}
diff --git a/java/org/eclipse/lsp4j/debug/StackTraceArguments.java b/java/org/eclipse/lsp4j/debug/StackTraceArguments.java
new file mode 100644
index 0000000..46ed37e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StackTraceArguments.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.StackFrameFormat;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'stackTrace' request.
+ */
+@SuppressWarnings("all")
+public class StackTraceArguments {
+ /**
+ * Retrieve the stacktrace for this thread.
+ */
+ private int threadId;
+
+ /**
+ * The index of the first frame to return; if omitted frames start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer startFrame;
+
+ /**
+ * The maximum number of frames to return. If levels is not specified or 0, all frames are returned.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer levels;
+
+ /**
+ * Specifies details on how to format the stack frames.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private StackFrameFormat format;
+
+ /**
+ * Retrieve the stacktrace for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Retrieve the stacktrace for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * The index of the first frame to return; if omitted frames start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getStartFrame() {
+ return this.startFrame;
+ }
+
+ /**
+ * The index of the first frame to return; if omitted frames start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ public void setStartFrame(final Integer startFrame) {
+ this.startFrame = startFrame;
+ }
+
+ /**
+ * The maximum number of frames to return. If levels is not specified or 0, all frames are returned.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getLevels() {
+ return this.levels;
+ }
+
+ /**
+ * The maximum number of frames to return. If levels is not specified or 0, all frames are returned.
+ * <p>
+ * This is an optional property.
+ */
+ public void setLevels(final Integer levels) {
+ this.levels = levels;
+ }
+
+ /**
+ * Specifies details on how to format the stack frames.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public StackFrameFormat getFormat() {
+ return this.format;
+ }
+
+ /**
+ * Specifies details on how to format the stack frames.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFormat(final StackFrameFormat format) {
+ this.format = format;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("startFrame", this.startFrame);
+ b.add("levels", this.levels);
+ b.add("format", this.format);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StackTraceArguments other = (StackTraceArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (this.startFrame == null) {
+ if (other.startFrame != null)
+ return false;
+ } else if (!this.startFrame.equals(other.startFrame))
+ return false;
+ if (this.levels == null) {
+ if (other.levels != null)
+ return false;
+ } else if (!this.levels.equals(other.levels))
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ result = prime * result + ((this.startFrame== null) ? 0 : this.startFrame.hashCode());
+ result = prime * result + ((this.levels== null) ? 0 : this.levels.hashCode());
+ return prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StackTraceResponse.java b/java/org/eclipse/lsp4j/debug/StackTraceResponse.java
new file mode 100644
index 0000000..61a97b9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StackTraceResponse.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.StackFrame;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'stackTrace' request.
+ */
+@SuppressWarnings("all")
+public class StackTraceResponse {
+ /**
+ * The frames of the stackframe. If the array has length zero, there are no stackframes available.
+ * <p>
+ * This means that there is no location information available.
+ */
+ @NonNull
+ private StackFrame[] stackFrames;
+
+ /**
+ * The total number of frames available in the stack. If omitted or if totalFrames is larger than the available
+ * frames, a client is expected to request frames until a request returns less frames than requested (which
+ * indicates the end of the stack). Returning monotonically increasing totalFrames values for subsequent requests
+ * can be used to enforce paging in the client.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer totalFrames;
+
+ /**
+ * The frames of the stackframe. If the array has length zero, there are no stackframes available.
+ * <p>
+ * This means that there is no location information available.
+ */
+ @Pure
+ @NonNull
+ public StackFrame[] getStackFrames() {
+ return this.stackFrames;
+ }
+
+ /**
+ * The frames of the stackframe. If the array has length zero, there are no stackframes available.
+ * <p>
+ * This means that there is no location information available.
+ */
+ public void setStackFrames(@NonNull final StackFrame[] stackFrames) {
+ this.stackFrames = Preconditions.checkNotNull(stackFrames, "stackFrames");
+ }
+
+ /**
+ * The total number of frames available in the stack. If omitted or if totalFrames is larger than the available
+ * frames, a client is expected to request frames until a request returns less frames than requested (which
+ * indicates the end of the stack). Returning monotonically increasing totalFrames values for subsequent requests
+ * can be used to enforce paging in the client.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getTotalFrames() {
+ return this.totalFrames;
+ }
+
+ /**
+ * The total number of frames available in the stack. If omitted or if totalFrames is larger than the available
+ * frames, a client is expected to request frames until a request returns less frames than requested (which
+ * indicates the end of the stack). Returning monotonically increasing totalFrames values for subsequent requests
+ * can be used to enforce paging in the client.
+ * <p>
+ * This is an optional property.
+ */
+ public void setTotalFrames(final Integer totalFrames) {
+ this.totalFrames = totalFrames;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("stackFrames", this.stackFrames);
+ b.add("totalFrames", this.totalFrames);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StackTraceResponse other = (StackTraceResponse) obj;
+ if (this.stackFrames == null) {
+ if (other.stackFrames != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.stackFrames, other.stackFrames))
+ return false;
+ if (this.totalFrames == null) {
+ if (other.totalFrames != null)
+ return false;
+ } else if (!this.totalFrames.equals(other.totalFrames))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.stackFrames== null) ? 0 : Arrays.deepHashCode(this.stackFrames));
+ return prime * result + ((this.totalFrames== null) ? 0 : this.totalFrames.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StepBackArguments.java b/java/org/eclipse/lsp4j/debug/StepBackArguments.java
new file mode 100644
index 0000000..46444bf
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StepBackArguments.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.SteppingGranularity;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'stepBack' request.
+ */
+@SuppressWarnings("all")
+public class StepBackArguments {
+ /**
+ * Execute 'stepBack' for this thread.
+ */
+ private int threadId;
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ private SteppingGranularity granularity;
+
+ /**
+ * Execute 'stepBack' for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Execute 'stepBack' for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public SteppingGranularity getGranularity() {
+ return this.granularity;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setGranularity(final SteppingGranularity granularity) {
+ this.granularity = granularity;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("granularity", this.granularity);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StepBackArguments other = (StepBackArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (this.granularity == null) {
+ if (other.granularity != null)
+ return false;
+ } else if (!this.granularity.equals(other.granularity))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ return prime * result + ((this.granularity== null) ? 0 : this.granularity.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StepInArguments.java b/java/org/eclipse/lsp4j/debug/StepInArguments.java
new file mode 100644
index 0000000..8d902fb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StepInArguments.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.SteppingGranularity;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'stepIn' request.
+ */
+@SuppressWarnings("all")
+public class StepInArguments {
+ /**
+ * Execute 'stepIn' for this thread.
+ */
+ private int threadId;
+
+ /**
+ * Optional id of the target to step into.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer targetId;
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ private SteppingGranularity granularity;
+
+ /**
+ * Execute 'stepIn' for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Execute 'stepIn' for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * Optional id of the target to step into.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getTargetId() {
+ return this.targetId;
+ }
+
+ /**
+ * Optional id of the target to step into.
+ * <p>
+ * This is an optional property.
+ */
+ public void setTargetId(final Integer targetId) {
+ this.targetId = targetId;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public SteppingGranularity getGranularity() {
+ return this.granularity;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setGranularity(final SteppingGranularity granularity) {
+ this.granularity = granularity;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("targetId", this.targetId);
+ b.add("granularity", this.granularity);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StepInArguments other = (StepInArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (this.targetId == null) {
+ if (other.targetId != null)
+ return false;
+ } else if (!this.targetId.equals(other.targetId))
+ return false;
+ if (this.granularity == null) {
+ if (other.granularity != null)
+ return false;
+ } else if (!this.granularity.equals(other.granularity))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ result = prime * result + ((this.targetId== null) ? 0 : this.targetId.hashCode());
+ return prime * result + ((this.granularity== null) ? 0 : this.granularity.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StepInTarget.java b/java/org/eclipse/lsp4j/debug/StepInTarget.java
new file mode 100644
index 0000000..d02f201
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StepInTarget.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A StepInTarget can be used in the 'stepIn' request and determines into which single target the stepIn request
+ * should step.
+ */
+@SuppressWarnings("all")
+public class StepInTarget {
+ /**
+ * Unique identifier for a stepIn target.
+ */
+ private int id;
+
+ /**
+ * The name of the stepIn target (shown in the UI).
+ */
+ @NonNull
+ private String label;
+
+ /**
+ * Unique identifier for a stepIn target.
+ */
+ @Pure
+ public int getId() {
+ return this.id;
+ }
+
+ /**
+ * Unique identifier for a stepIn target.
+ */
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ /**
+ * The name of the stepIn target (shown in the UI).
+ */
+ @Pure
+ @NonNull
+ public String getLabel() {
+ return this.label;
+ }
+
+ /**
+ * The name of the stepIn target (shown in the UI).
+ */
+ public void setLabel(@NonNull final String label) {
+ this.label = Preconditions.checkNotNull(label, "label");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("label", this.label);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StepInTarget other = (StepInTarget) obj;
+ if (other.id != this.id)
+ return false;
+ if (this.label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!this.label.equals(other.label))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.id;
+ return prime * result + ((this.label== null) ? 0 : this.label.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StepInTargetsArguments.java b/java/org/eclipse/lsp4j/debug/StepInTargetsArguments.java
new file mode 100644
index 0000000..7c4cfdf
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StepInTargetsArguments.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'stepInTargets' request.
+ */
+@SuppressWarnings("all")
+public class StepInTargetsArguments {
+ /**
+ * The stack frame for which to retrieve the possible stepIn targets.
+ */
+ private int frameId;
+
+ /**
+ * The stack frame for which to retrieve the possible stepIn targets.
+ */
+ @Pure
+ public int getFrameId() {
+ return this.frameId;
+ }
+
+ /**
+ * The stack frame for which to retrieve the possible stepIn targets.
+ */
+ public void setFrameId(final int frameId) {
+ this.frameId = frameId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("frameId", this.frameId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StepInTargetsArguments other = (StepInTargetsArguments) obj;
+ if (other.frameId != this.frameId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + this.frameId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StepInTargetsResponse.java b/java/org/eclipse/lsp4j/debug/StepInTargetsResponse.java
new file mode 100644
index 0000000..aefbcc9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StepInTargetsResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.StepInTarget;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'stepInTargets' request.
+ */
+@SuppressWarnings("all")
+public class StepInTargetsResponse {
+ /**
+ * The possible stepIn targets of the specified source location.
+ */
+ @NonNull
+ private StepInTarget[] targets;
+
+ /**
+ * The possible stepIn targets of the specified source location.
+ */
+ @Pure
+ @NonNull
+ public StepInTarget[] getTargets() {
+ return this.targets;
+ }
+
+ /**
+ * The possible stepIn targets of the specified source location.
+ */
+ public void setTargets(@NonNull final StepInTarget[] targets) {
+ this.targets = Preconditions.checkNotNull(targets, "targets");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("targets", this.targets);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StepInTargetsResponse other = (StepInTargetsResponse) obj;
+ if (this.targets == null) {
+ if (other.targets != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.targets, other.targets))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.targets== null) ? 0 : Arrays.deepHashCode(this.targets));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StepOutArguments.java b/java/org/eclipse/lsp4j/debug/StepOutArguments.java
new file mode 100644
index 0000000..01bd701
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StepOutArguments.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.SteppingGranularity;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'stepOut' request.
+ */
+@SuppressWarnings("all")
+public class StepOutArguments {
+ /**
+ * Execute 'stepOut' for this thread.
+ */
+ private int threadId;
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ private SteppingGranularity granularity;
+
+ /**
+ * Execute 'stepOut' for this thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * Execute 'stepOut' for this thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public SteppingGranularity getGranularity() {
+ return this.granularity;
+ }
+
+ /**
+ * Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed.
+ * <p>
+ * This is an optional property.
+ */
+ public void setGranularity(final SteppingGranularity granularity) {
+ this.granularity = granularity;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadId", this.threadId);
+ b.add("granularity", this.granularity);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StepOutArguments other = (StepOutArguments) obj;
+ if (other.threadId != this.threadId)
+ return false;
+ if (this.granularity == null) {
+ if (other.granularity != null)
+ return false;
+ } else if (!this.granularity.equals(other.granularity))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.threadId;
+ return prime * result + ((this.granularity== null) ? 0 : this.granularity.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/SteppingGranularity.java b/java/org/eclipse/lsp4j/debug/SteppingGranularity.java
new file mode 100644
index 0000000..4385a9a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/SteppingGranularity.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The granularity of one 'step' in the stepping requests 'next', 'stepIn', 'stepOut', and 'stepBack'.
+ */
+@SuppressWarnings("all")
+public enum SteppingGranularity {
+ /**
+ * The step should allow the program to run until the current statement has finished executing.
+ * The meaning of a
+ * statement is determined by the adapter and it may be considered equivalent to a line.
+ * For example 'for(int i =
+ * 0; i < 10; i++) could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'.
+ */
+ STATEMENT,
+
+ /**
+ * The step should allow the program to run until the current source line has executed.
+ */
+ LINE,
+
+ /**
+ * The step should allow one instruction to execute (e.g. one x86 instruction).
+ */
+ INSTRUCTION;
+}
diff --git a/java/org/eclipse/lsp4j/debug/StoppedEventArguments.java b/java/org/eclipse/lsp4j/debug/StoppedEventArguments.java
new file mode 100644
index 0000000..bf74eac
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StoppedEventArguments.java
@@ -0,0 +1,283 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that the execution of the debuggee has stopped due to some condition.
+ * <p>
+ * This can be caused by a break point previously set, a stepping request has completed, by executing a debugger
+ * statement etc.
+ */
+@SuppressWarnings("all")
+public class StoppedEventArguments {
+ /**
+ * The reason for the event.
+ * <p>
+ * For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it
+ * must not be translated).
+ * <p>
+ * Possible values include - but not limited to those defined in {@link StoppedEventArgumentsReason}
+ */
+ @NonNull
+ private String reason;
+
+ /**
+ * The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and must be
+ * translated.
+ * <p>
+ * This is an optional property.
+ */
+ private String description;
+
+ /**
+ * The thread which was stopped.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer threadId;
+
+ /**
+ * A value of true hints to the frontend that this event should not change the focus.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean preserveFocusHint;
+
+ /**
+ * Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown
+ * in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ private String text;
+
+ /**
+ * If 'allThreadsStopped' is true, a debug adapter can announce that all threads have stopped.
+ * <ul>
+ * <li>The client should use this information to enable that all threads can be expanded to access their
+ * stacktraces.</li>
+ * <li>If the attribute is missing or false, only the thread with the given threadId can be expanded.</li>
+ * </ul>
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean allThreadsStopped;
+
+ /**
+ * The reason for the event.
+ * <p>
+ * For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it
+ * must not be translated).
+ * <p>
+ * Possible values include - but not limited to those defined in {@link StoppedEventArgumentsReason}
+ */
+ @Pure
+ @NonNull
+ public String getReason() {
+ return this.reason;
+ }
+
+ /**
+ * The reason for the event.
+ * <p>
+ * For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it
+ * must not be translated).
+ * <p>
+ * Possible values include - but not limited to those defined in {@link StoppedEventArgumentsReason}
+ */
+ public void setReason(@NonNull final String reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ /**
+ * The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and must be
+ * translated.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getDescription() {
+ return this.description;
+ }
+
+ /**
+ * The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and must be
+ * translated.
+ * <p>
+ * This is an optional property.
+ */
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ /**
+ * The thread which was stopped.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * The thread which was stopped.
+ * <p>
+ * This is an optional property.
+ */
+ public void setThreadId(final Integer threadId) {
+ this.threadId = threadId;
+ }
+
+ /**
+ * A value of true hints to the frontend that this event should not change the focus.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getPreserveFocusHint() {
+ return this.preserveFocusHint;
+ }
+
+ /**
+ * A value of true hints to the frontend that this event should not change the focus.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPreserveFocusHint(final Boolean preserveFocusHint) {
+ this.preserveFocusHint = preserveFocusHint;
+ }
+
+ /**
+ * Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown
+ * in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getText() {
+ return this.text;
+ }
+
+ /**
+ * Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown
+ * in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ public void setText(final String text) {
+ this.text = text;
+ }
+
+ /**
+ * If 'allThreadsStopped' is true, a debug adapter can announce that all threads have stopped.
+ * <ul>
+ * <li>The client should use this information to enable that all threads can be expanded to access their
+ * stacktraces.</li>
+ * <li>If the attribute is missing or false, only the thread with the given threadId can be expanded.</li>
+ * </ul>
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getAllThreadsStopped() {
+ return this.allThreadsStopped;
+ }
+
+ /**
+ * If 'allThreadsStopped' is true, a debug adapter can announce that all threads have stopped.
+ * <ul>
+ * <li>The client should use this information to enable that all threads can be expanded to access their
+ * stacktraces.</li>
+ * <li>If the attribute is missing or false, only the thread with the given threadId can be expanded.</li>
+ * </ul>
+ * <p>
+ * This is an optional property.
+ */
+ public void setAllThreadsStopped(final Boolean allThreadsStopped) {
+ this.allThreadsStopped = allThreadsStopped;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("reason", this.reason);
+ b.add("description", this.description);
+ b.add("threadId", this.threadId);
+ b.add("preserveFocusHint", this.preserveFocusHint);
+ b.add("text", this.text);
+ b.add("allThreadsStopped", this.allThreadsStopped);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StoppedEventArguments other = (StoppedEventArguments) obj;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ if (this.description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!this.description.equals(other.description))
+ return false;
+ if (this.threadId == null) {
+ if (other.threadId != null)
+ return false;
+ } else if (!this.threadId.equals(other.threadId))
+ return false;
+ if (this.preserveFocusHint == null) {
+ if (other.preserveFocusHint != null)
+ return false;
+ } else if (!this.preserveFocusHint.equals(other.preserveFocusHint))
+ return false;
+ if (this.text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!this.text.equals(other.text))
+ return false;
+ if (this.allThreadsStopped == null) {
+ if (other.allThreadsStopped != null)
+ return false;
+ } else if (!this.allThreadsStopped.equals(other.allThreadsStopped))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.reason== null) ? 0 : this.reason.hashCode());
+ result = prime * result + ((this.description== null) ? 0 : this.description.hashCode());
+ result = prime * result + ((this.threadId== null) ? 0 : this.threadId.hashCode());
+ result = prime * result + ((this.preserveFocusHint== null) ? 0 : this.preserveFocusHint.hashCode());
+ result = prime * result + ((this.text== null) ? 0 : this.text.hashCode());
+ return prime * result + ((this.allThreadsStopped== null) ? 0 : this.allThreadsStopped.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/StoppedEventArgumentsReason.java b/java/org/eclipse/lsp4j/debug/StoppedEventArgumentsReason.java
new file mode 100644
index 0000000..0b72e75
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/StoppedEventArgumentsReason.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The reason for the event.
+ * <p>
+ * For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it
+ * must not be translated).
+ * <p>
+ * Possible values include - but not limited to those defined in {@link StoppedEventArgumentsReason}
+ */
+@SuppressWarnings("all")
+public interface StoppedEventArgumentsReason {
+ static final String STEP = "step";
+
+ static final String BREAKPOINT = "breakpoint";
+
+ static final String EXCEPTION = "exception";
+
+ static final String PAUSE = "pause";
+
+ static final String ENTRY = "entry";
+
+ static final String GOTO = "goto";
+
+ static final String FUNCTION_BREAKPOINT = "function breakpoint";
+
+ static final String DATA_BREAKPOINT = "data breakpoint";
+
+ static final String INSTRUCTION_BREAKPOINT = "instruction breakpoint";
+}
diff --git a/java/org/eclipse/lsp4j/debug/TerminateArguments.java b/java/org/eclipse/lsp4j/debug/TerminateArguments.java
new file mode 100644
index 0000000..1a6e57a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/TerminateArguments.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'terminate' request.
+ */
+@SuppressWarnings("all")
+public class TerminateArguments {
+ /**
+ * A value of true indicates that this 'terminate' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean restart;
+
+ /**
+ * A value of true indicates that this 'terminate' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getRestart() {
+ return this.restart;
+ }
+
+ /**
+ * A value of true indicates that this 'terminate' request is part of a restart sequence.
+ * <p>
+ * This is an optional property.
+ */
+ public void setRestart(final Boolean restart) {
+ this.restart = restart;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("restart", this.restart);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TerminateArguments other = (TerminateArguments) obj;
+ if (this.restart == null) {
+ if (other.restart != null)
+ return false;
+ } else if (!this.restart.equals(other.restart))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.restart== null) ? 0 : this.restart.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/TerminateThreadsArguments.java b/java/org/eclipse/lsp4j/debug/TerminateThreadsArguments.java
new file mode 100644
index 0000000..a5a9497
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/TerminateThreadsArguments.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'terminateThreads' request.
+ */
+@SuppressWarnings("all")
+public class TerminateThreadsArguments {
+ /**
+ * Ids of threads to be terminated.
+ * <p>
+ * This is an optional property.
+ */
+ private int[] threadIds;
+
+ /**
+ * Ids of threads to be terminated.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public int[] getThreadIds() {
+ return this.threadIds;
+ }
+
+ /**
+ * Ids of threads to be terminated.
+ * <p>
+ * This is an optional property.
+ */
+ public void setThreadIds(final int[] threadIds) {
+ this.threadIds = threadIds;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threadIds", this.threadIds);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TerminateThreadsArguments other = (TerminateThreadsArguments) obj;
+ if (this.threadIds == null) {
+ if (other.threadIds != null)
+ return false;
+ } else if (!Arrays.equals(this.threadIds, other.threadIds))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.threadIds== null) ? 0 : Arrays.hashCode(this.threadIds));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/TerminatedEventArguments.java b/java/org/eclipse/lsp4j/debug/TerminatedEventArguments.java
new file mode 100644
index 0000000..3721682
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/TerminatedEventArguments.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that debugging of the debuggee has terminated. This does **not** mean that the debuggee
+ * itself has exited.
+ */
+@SuppressWarnings("all")
+public class TerminatedEventArguments {
+ /**
+ * A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts
+ * the session.
+ * <p>
+ * The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the 'launch'
+ * and 'attach' requests.
+ * <p>
+ * This is an optional property.
+ */
+ private Object restart;
+
+ /**
+ * A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts
+ * the session.
+ * <p>
+ * The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the 'launch'
+ * and 'attach' requests.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Object getRestart() {
+ return this.restart;
+ }
+
+ /**
+ * A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts
+ * the session.
+ * <p>
+ * The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the 'launch'
+ * and 'attach' requests.
+ * <p>
+ * This is an optional property.
+ */
+ public void setRestart(final Object restart) {
+ this.restart = restart;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("restart", this.restart);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TerminatedEventArguments other = (TerminatedEventArguments) obj;
+ if (this.restart == null) {
+ if (other.restart != null)
+ return false;
+ } else if (!this.restart.equals(other.restart))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.restart== null) ? 0 : this.restart.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Thread.java b/java/org/eclipse/lsp4j/debug/Thread.java
new file mode 100644
index 0000000..bb976ca
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Thread.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A Thread
+ */
+@SuppressWarnings("all")
+public class Thread {
+ /**
+ * Unique identifier for the thread.
+ */
+ private int id;
+
+ /**
+ * A name of the thread.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * Unique identifier for the thread.
+ */
+ @Pure
+ public int getId() {
+ return this.id;
+ }
+
+ /**
+ * Unique identifier for the thread.
+ */
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ /**
+ * A name of the thread.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * A name of the thread.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("id", this.id);
+ b.add("name", this.name);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Thread other = (Thread) obj;
+ if (other.id != this.id)
+ return false;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.id;
+ return prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ThreadEventArguments.java b/java/org/eclipse/lsp4j/debug/ThreadEventArguments.java
new file mode 100644
index 0000000..9e66cc2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ThreadEventArguments.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * The event indicates that a thread has started or exited.
+ */
+@SuppressWarnings("all")
+public class ThreadEventArguments {
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ThreadEventArgumentsReason}
+ */
+ @NonNull
+ private String reason;
+
+ /**
+ * The identifier of the thread.
+ */
+ private int threadId;
+
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ThreadEventArgumentsReason}
+ */
+ @Pure
+ @NonNull
+ public String getReason() {
+ return this.reason;
+ }
+
+ /**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ThreadEventArgumentsReason}
+ */
+ public void setReason(@NonNull final String reason) {
+ this.reason = Preconditions.checkNotNull(reason, "reason");
+ }
+
+ /**
+ * The identifier of the thread.
+ */
+ @Pure
+ public int getThreadId() {
+ return this.threadId;
+ }
+
+ /**
+ * The identifier of the thread.
+ */
+ public void setThreadId(final int threadId) {
+ this.threadId = threadId;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("reason", this.reason);
+ b.add("threadId", this.threadId);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ThreadEventArguments other = (ThreadEventArguments) obj;
+ if (this.reason == null) {
+ if (other.reason != null)
+ return false;
+ } else if (!this.reason.equals(other.reason))
+ return false;
+ if (other.threadId != this.threadId)
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.reason== null) ? 0 : this.reason.hashCode());
+ return prime * result + this.threadId;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ThreadEventArgumentsReason.java b/java/org/eclipse/lsp4j/debug/ThreadEventArgumentsReason.java
new file mode 100644
index 0000000..62e4347
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ThreadEventArgumentsReason.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The reason for the event.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link ThreadEventArgumentsReason}
+ */
+@SuppressWarnings("all")
+public interface ThreadEventArgumentsReason {
+ static final String STARTED = "started";
+
+ static final String EXITED = "exited";
+}
diff --git a/java/org/eclipse/lsp4j/debug/ThreadsResponse.java b/java/org/eclipse/lsp4j/debug/ThreadsResponse.java
new file mode 100644
index 0000000..6c47565
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ThreadsResponse.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'threads' request.
+ */
+@SuppressWarnings("all")
+public class ThreadsResponse {
+ /**
+ * All threads.
+ */
+ @NonNull
+ private org.eclipse.lsp4j.debug.Thread[] threads;
+
+ /**
+ * All threads.
+ */
+ @Pure
+ @NonNull
+ public org.eclipse.lsp4j.debug.Thread[] getThreads() {
+ return this.threads;
+ }
+
+ /**
+ * All threads.
+ */
+ public void setThreads(@NonNull final org.eclipse.lsp4j.debug.Thread[] threads) {
+ this.threads = Preconditions.checkNotNull(threads, "threads");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("threads", this.threads);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ThreadsResponse other = (ThreadsResponse) obj;
+ if (this.threads == null) {
+ if (other.threads != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.threads, other.threads))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.threads== null) ? 0 : Arrays.deepHashCode(this.threads));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/ValueFormat.java b/java/org/eclipse/lsp4j/debug/ValueFormat.java
new file mode 100644
index 0000000..c53eb38
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/ValueFormat.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Provides formatting information for a value.
+ */
+@SuppressWarnings("all")
+public class ValueFormat {
+ /**
+ * Display the value in hex.
+ * <p>
+ * This is an optional property.
+ */
+ private Boolean hex;
+
+ /**
+ * Display the value in hex.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Boolean getHex() {
+ return this.hex;
+ }
+
+ /**
+ * Display the value in hex.
+ * <p>
+ * This is an optional property.
+ */
+ public void setHex(final Boolean hex) {
+ this.hex = hex;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("hex", this.hex);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ValueFormat other = (ValueFormat) obj;
+ if (this.hex == null) {
+ if (other.hex != null)
+ return false;
+ } else if (!this.hex.equals(other.hex))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.hex== null) ? 0 : this.hex.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/Variable.java b/java/org/eclipse/lsp4j/debug/Variable.java
new file mode 100644
index 0000000..b6e4a55
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/Variable.java
@@ -0,0 +1,384 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.VariablePresentationHint;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * A Variable is a name/value pair.
+ * <p>
+ * Optionally a variable can have a 'type' that is shown if space permits or when hovering over the variable's
+ * name.
+ * <p>
+ * An optional 'kind' is used to render additional properties of the variable, e.g. different icons can be used to
+ * indicate that a variable is public or private.
+ * <p>
+ * If the value is structured (has children), a handle is provided to retrieve the children with the
+ * VariablesRequest.
+ * <p>
+ * If the number of named or indexed children is large, the numbers should be returned via the optional
+ * 'namedVariables' and 'indexedVariables' attributes.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ */
+@SuppressWarnings("all")
+public class Variable {
+ /**
+ * The variable's name.
+ */
+ @NonNull
+ private String name;
+
+ /**
+ * The variable's value. This can be a multi-line text, e.g. for a function the body of a function.
+ */
+ @NonNull
+ private String value;
+
+ /**
+ * The type of the variable's value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ private String type;
+
+ /**
+ * Properties of a variable that can be used to determine how to render the variable in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ private VariablePresentationHint presentationHint;
+
+ /**
+ * Optional evaluatable name of this variable which can be passed to the 'EvaluateRequest' to fetch the variable's
+ * value.
+ * <p>
+ * This is an optional property.
+ */
+ private String evaluateName;
+
+ /**
+ * If variablesReference is > 0, the variable is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ */
+ private int variablesReference;
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer namedVariables;
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer indexedVariables;
+
+ /**
+ * Optional memory reference for the variable if the variable represents executable code, such as a function
+ * pointer.
+ * <p>
+ * This attribute is only required if the client has passed the value true for the 'supportsMemoryReferences'
+ * capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ private String memoryReference;
+
+ /**
+ * The variable's name.
+ */
+ @Pure
+ @NonNull
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * The variable's name.
+ */
+ public void setName(@NonNull final String name) {
+ this.name = Preconditions.checkNotNull(name, "name");
+ }
+
+ /**
+ * The variable's value. This can be a multi-line text, e.g. for a function the body of a function.
+ */
+ @Pure
+ @NonNull
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * The variable's value. This can be a multi-line text, e.g. for a function the body of a function.
+ */
+ public void setValue(@NonNull final String value) {
+ this.value = Preconditions.checkNotNull(value, "value");
+ }
+
+ /**
+ * The type of the variable's value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getType() {
+ return this.type;
+ }
+
+ /**
+ * The type of the variable's value. Typically shown in the UI when hovering over the value.
+ * <p>
+ * This attribute should only be returned by a debug adapter if the client has passed the value true for the
+ * 'supportsVariableType' capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setType(final String type) {
+ this.type = type;
+ }
+
+ /**
+ * Properties of a variable that can be used to determine how to render the variable in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public VariablePresentationHint getPresentationHint() {
+ return this.presentationHint;
+ }
+
+ /**
+ * Properties of a variable that can be used to determine how to render the variable in the UI.
+ * <p>
+ * This is an optional property.
+ */
+ public void setPresentationHint(final VariablePresentationHint presentationHint) {
+ this.presentationHint = presentationHint;
+ }
+
+ /**
+ * Optional evaluatable name of this variable which can be passed to the 'EvaluateRequest' to fetch the variable's
+ * value.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getEvaluateName() {
+ return this.evaluateName;
+ }
+
+ /**
+ * Optional evaluatable name of this variable which can be passed to the 'EvaluateRequest' to fetch the variable's
+ * value.
+ * <p>
+ * This is an optional property.
+ */
+ public void setEvaluateName(final String evaluateName) {
+ this.evaluateName = evaluateName;
+ }
+
+ /**
+ * If variablesReference is > 0, the variable is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ */
+ @Pure
+ public int getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * If variablesReference is > 0, the variable is structured and its children can be retrieved by passing
+ * variablesReference to the VariablesRequest.
+ */
+ public void setVariablesReference(final int variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getNamedVariables() {
+ return this.namedVariables;
+ }
+
+ /**
+ * The number of named child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ public void setNamedVariables(final Integer namedVariables) {
+ this.namedVariables = namedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getIndexedVariables() {
+ return this.indexedVariables;
+ }
+
+ /**
+ * The number of indexed child variables.
+ * <p>
+ * The client can use this optional information to present the children in a paged UI and fetch them in chunks.
+ * <p>
+ * This is an optional property.
+ */
+ public void setIndexedVariables(final Integer indexedVariables) {
+ this.indexedVariables = indexedVariables;
+ }
+
+ /**
+ * Optional memory reference for the variable if the variable represents executable code, such as a function
+ * pointer.
+ * <p>
+ * This attribute is only required if the client has passed the value true for the 'supportsMemoryReferences'
+ * capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public String getMemoryReference() {
+ return this.memoryReference;
+ }
+
+ /**
+ * Optional memory reference for the variable if the variable represents executable code, such as a function
+ * pointer.
+ * <p>
+ * This attribute is only required if the client has passed the value true for the 'supportsMemoryReferences'
+ * capability of the 'initialize' request.
+ * <p>
+ * This is an optional property.
+ */
+ public void setMemoryReference(final String memoryReference) {
+ this.memoryReference = memoryReference;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("name", this.name);
+ b.add("value", this.value);
+ b.add("type", this.type);
+ b.add("presentationHint", this.presentationHint);
+ b.add("evaluateName", this.evaluateName);
+ b.add("variablesReference", this.variablesReference);
+ b.add("namedVariables", this.namedVariables);
+ b.add("indexedVariables", this.indexedVariables);
+ b.add("memoryReference", this.memoryReference);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Variable other = (Variable) obj;
+ if (this.name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!this.name.equals(other.name))
+ return false;
+ if (this.value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!this.value.equals(other.value))
+ return false;
+ if (this.type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!this.type.equals(other.type))
+ return false;
+ if (this.presentationHint == null) {
+ if (other.presentationHint != null)
+ return false;
+ } else if (!this.presentationHint.equals(other.presentationHint))
+ return false;
+ if (this.evaluateName == null) {
+ if (other.evaluateName != null)
+ return false;
+ } else if (!this.evaluateName.equals(other.evaluateName))
+ return false;
+ if (other.variablesReference != this.variablesReference)
+ return false;
+ if (this.namedVariables == null) {
+ if (other.namedVariables != null)
+ return false;
+ } else if (!this.namedVariables.equals(other.namedVariables))
+ return false;
+ if (this.indexedVariables == null) {
+ if (other.indexedVariables != null)
+ return false;
+ } else if (!this.indexedVariables.equals(other.indexedVariables))
+ return false;
+ if (this.memoryReference == null) {
+ if (other.memoryReference != null)
+ return false;
+ } else if (!this.memoryReference.equals(other.memoryReference))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.name== null) ? 0 : this.name.hashCode());
+ result = prime * result + ((this.value== null) ? 0 : this.value.hashCode());
+ result = prime * result + ((this.type== null) ? 0 : this.type.hashCode());
+ result = prime * result + ((this.presentationHint== null) ? 0 : this.presentationHint.hashCode());
+ result = prime * result + ((this.evaluateName== null) ? 0 : this.evaluateName.hashCode());
+ result = prime * result + this.variablesReference;
+ result = prime * result + ((this.namedVariables== null) ? 0 : this.namedVariables.hashCode());
+ result = prime * result + ((this.indexedVariables== null) ? 0 : this.indexedVariables.hashCode());
+ return prime * result + ((this.memoryReference== null) ? 0 : this.memoryReference.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablePresentationHint.java b/java/org/eclipse/lsp4j/debug/VariablePresentationHint.java
new file mode 100644
index 0000000..2b8b6fa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablePresentationHint.java
@@ -0,0 +1,169 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Optional properties of a variable that can be used to determine how to render the variable in the UI.
+ */
+@SuppressWarnings("all")
+public class VariablePresentationHint {
+ /**
+ * The kind of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintKind}
+ */
+ private String kind;
+
+ /**
+ * Set of attributes represented as an array of strings. Before introducing additional values, try to use the
+ * listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintAttributes}
+ */
+ private String[] attributes;
+
+ /**
+ * Visibility of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintVisibility}
+ */
+ private String visibility;
+
+ /**
+ * The kind of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintKind}
+ */
+ @Pure
+ public String getKind() {
+ return this.kind;
+ }
+
+ /**
+ * The kind of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintKind}
+ */
+ public void setKind(final String kind) {
+ this.kind = kind;
+ }
+
+ /**
+ * Set of attributes represented as an array of strings. Before introducing additional values, try to use the
+ * listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintAttributes}
+ */
+ @Pure
+ public String[] getAttributes() {
+ return this.attributes;
+ }
+
+ /**
+ * Set of attributes represented as an array of strings. Before introducing additional values, try to use the
+ * listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintAttributes}
+ */
+ public void setAttributes(final String[] attributes) {
+ this.attributes = attributes;
+ }
+
+ /**
+ * Visibility of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintVisibility}
+ */
+ @Pure
+ public String getVisibility() {
+ return this.visibility;
+ }
+
+ /**
+ * Visibility of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * This is an optional property.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintVisibility}
+ */
+ public void setVisibility(final String visibility) {
+ this.visibility = visibility;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("kind", this.kind);
+ b.add("attributes", this.attributes);
+ b.add("visibility", this.visibility);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ VariablePresentationHint other = (VariablePresentationHint) obj;
+ if (this.kind == null) {
+ if (other.kind != null)
+ return false;
+ } else if (!this.kind.equals(other.kind))
+ return false;
+ if (this.attributes == null) {
+ if (other.attributes != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.attributes, other.attributes))
+ return false;
+ if (this.visibility == null) {
+ if (other.visibility != null)
+ return false;
+ } else if (!this.visibility.equals(other.visibility))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.kind== null) ? 0 : this.kind.hashCode());
+ result = prime * result + ((this.attributes== null) ? 0 : Arrays.deepHashCode(this.attributes));
+ return prime * result + ((this.visibility== null) ? 0 : this.visibility.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablePresentationHintAttributes.java b/java/org/eclipse/lsp4j/debug/VariablePresentationHintAttributes.java
new file mode 100644
index 0000000..1acfbf5
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablePresentationHintAttributes.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintAttributes}
+ */
+@SuppressWarnings("all")
+public interface VariablePresentationHintAttributes {
+ /**
+ * Indicates that the object is static.
+ */
+ static final String STATIC = "static";
+
+ /**
+ * Indicates that the object is a constant.
+ */
+ static final String CONSTANT = "constant";
+
+ /**
+ * Indicates that the object is read only.
+ */
+ static final String READ_ONLY = "readOnly";
+
+ /**
+ * Indicates that the object is a raw string.
+ */
+ static final String RAW_STRING = "rawString";
+
+ /**
+ * Indicates that the object can have an Object ID created for it.
+ */
+ static final String HAS_OBJECT_ID = "hasObjectId";
+
+ /**
+ * Indicates that the object has an Object ID associated with it.
+ */
+ static final String CAN_HAVE_OBJECT_ID = "canHaveObjectId";
+
+ /**
+ * Indicates that the evaluation had side effects.
+ */
+ static final String HAS_SIDE_EFFECTS = "hasSideEffects";
+
+ /**
+ * Indicates that the object has its value tracked by a data breakpoint.
+ */
+ static final String HAS_DATA_BREAKPOINT = "hasDataBreakpoint";
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablePresentationHintKind.java b/java/org/eclipse/lsp4j/debug/VariablePresentationHintKind.java
new file mode 100644
index 0000000..880a287
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablePresentationHintKind.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * The kind of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintKind}
+ */
+@SuppressWarnings("all")
+public interface VariablePresentationHintKind {
+ /**
+ * Indicates that the object is a property.
+ */
+ static final String PROPERTY = "property";
+
+ /**
+ * Indicates that the object is a method.
+ */
+ static final String METHOD = "method";
+
+ /**
+ * Indicates that the object is a class.
+ */
+ static final String CLASS = "class";
+
+ /**
+ * Indicates that the object is data.
+ */
+ static final String DATA = "data";
+
+ /**
+ * Indicates that the object is an event.
+ */
+ static final String EVENT = "event";
+
+ /**
+ * Indicates that the object is a base class.
+ */
+ static final String BASE_CLASS = "baseClass";
+
+ /**
+ * Indicates that the object is an inner class.
+ */
+ static final String INNER_CLASS = "innerClass";
+
+ /**
+ * Indicates that the object is an interface.
+ */
+ static final String INTERFACE = "interface";
+
+ /**
+ * Indicates that the object is the most derived class.
+ */
+ static final String MOST_DERIVED_CLASS = "mostDerivedClass";
+
+ /**
+ * Indicates that the object is virtual, that means it is a synthetic object introducedby the
+ * adapter for
+ * rendering purposes, e.g. an index range for large arrays.
+ */
+ static final String VIRTUAL = "virtual";
+
+ /**
+ * Deprecated: Indicates that a data breakpoint is registered for the object. The 'hasDataBreakpoint' attribute
+ * should generally be used instead.
+ * <p>
+ * @deprecated The 'hasDataBreakpoint' attribute should generally be used instead.
+ */
+ @Deprecated
+ static final String DATA_BREAKPOINT = "dataBreakpoint";
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablePresentationHintVisibility.java b/java/org/eclipse/lsp4j/debug/VariablePresentationHintVisibility.java
new file mode 100644
index 0000000..f17c68f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablePresentationHintVisibility.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Visibility of variable. Before introducing additional values, try to use the listed values.
+ * <p>
+ * Possible values include - but not limited to those defined in {@link VariablePresentationHintVisibility}
+ */
+@SuppressWarnings("all")
+public interface VariablePresentationHintVisibility {
+ static final String PUBLIC = "public";
+
+ static final String PRIVATE = "private";
+
+ static final String PROTECTED = "protected";
+
+ static final String INTERNAL = "internal";
+
+ static final String FINAL = "final";
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablesArguments.java b/java/org/eclipse/lsp4j/debug/VariablesArguments.java
new file mode 100644
index 0000000..8fa035d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablesArguments.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import org.eclipse.lsp4j.debug.ValueFormat;
+import org.eclipse.lsp4j.debug.VariablesArgumentsFilter;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Arguments for 'variables' request.
+ */
+@SuppressWarnings("all")
+public class VariablesArguments {
+ /**
+ * The Variable reference.
+ */
+ private int variablesReference;
+
+ /**
+ * Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched.
+ * <p>
+ * This is an optional property.
+ */
+ private VariablesArgumentsFilter filter;
+
+ /**
+ * The index of the first variable to return; if omitted children start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer start;
+
+ /**
+ * The number of variables to return. If count is missing or 0, all variables are returned.
+ * <p>
+ * This is an optional property.
+ */
+ private Integer count;
+
+ /**
+ * Specifies details on how to format the Variable values.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ private ValueFormat format;
+
+ /**
+ * The Variable reference.
+ */
+ @Pure
+ public int getVariablesReference() {
+ return this.variablesReference;
+ }
+
+ /**
+ * The Variable reference.
+ */
+ public void setVariablesReference(final int variablesReference) {
+ this.variablesReference = variablesReference;
+ }
+
+ /**
+ * Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public VariablesArgumentsFilter getFilter() {
+ return this.filter;
+ }
+
+ /**
+ * Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFilter(final VariablesArgumentsFilter filter) {
+ this.filter = filter;
+ }
+
+ /**
+ * The index of the first variable to return; if omitted children start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getStart() {
+ return this.start;
+ }
+
+ /**
+ * The index of the first variable to return; if omitted children start at 0.
+ * <p>
+ * This is an optional property.
+ */
+ public void setStart(final Integer start) {
+ this.start = start;
+ }
+
+ /**
+ * The number of variables to return. If count is missing or 0, all variables are returned.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public Integer getCount() {
+ return this.count;
+ }
+
+ /**
+ * The number of variables to return. If count is missing or 0, all variables are returned.
+ * <p>
+ * This is an optional property.
+ */
+ public void setCount(final Integer count) {
+ this.count = count;
+ }
+
+ /**
+ * Specifies details on how to format the Variable values.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ @Pure
+ public ValueFormat getFormat() {
+ return this.format;
+ }
+
+ /**
+ * Specifies details on how to format the Variable values.
+ * <p>
+ * The attribute is only honored by a debug adapter if the capability 'supportsValueFormattingOptions' is true.
+ * <p>
+ * This is an optional property.
+ */
+ public void setFormat(final ValueFormat format) {
+ this.format = format;
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("variablesReference", this.variablesReference);
+ b.add("filter", this.filter);
+ b.add("start", this.start);
+ b.add("count", this.count);
+ b.add("format", this.format);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ VariablesArguments other = (VariablesArguments) obj;
+ if (other.variablesReference != this.variablesReference)
+ return false;
+ if (this.filter == null) {
+ if (other.filter != null)
+ return false;
+ } else if (!this.filter.equals(other.filter))
+ return false;
+ if (this.start == null) {
+ if (other.start != null)
+ return false;
+ } else if (!this.start.equals(other.start))
+ return false;
+ if (this.count == null) {
+ if (other.count != null)
+ return false;
+ } else if (!this.count.equals(other.count))
+ return false;
+ if (this.format == null) {
+ if (other.format != null)
+ return false;
+ } else if (!this.format.equals(other.format))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.variablesReference;
+ result = prime * result + ((this.filter== null) ? 0 : this.filter.hashCode());
+ result = prime * result + ((this.start== null) ? 0 : this.start.hashCode());
+ result = prime * result + ((this.count== null) ? 0 : this.count.hashCode());
+ return prime * result + ((this.format== null) ? 0 : this.format.hashCode());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablesArgumentsFilter.java b/java/org/eclipse/lsp4j/debug/VariablesArgumentsFilter.java
new file mode 100644
index 0000000..00457b3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablesArgumentsFilter.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+/**
+ * Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched.
+ */
+@SuppressWarnings("all")
+public enum VariablesArgumentsFilter {
+ INDEXED,
+
+ NAMED;
+}
diff --git a/java/org/eclipse/lsp4j/debug/VariablesResponse.java b/java/org/eclipse/lsp4j/debug/VariablesResponse.java
new file mode 100644
index 0000000..704684b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/VariablesResponse.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.debug;
+
+import java.util.Arrays;
+import org.eclipse.lsp4j.debug.Variable;
+import org.eclipse.lsp4j.debug.util.Preconditions;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+/**
+ * Response to 'variables' request.
+ */
+@SuppressWarnings("all")
+public class VariablesResponse {
+ /**
+ * All (or a range) of variables for the given variable reference.
+ */
+ @NonNull
+ private Variable[] variables;
+
+ /**
+ * All (or a range) of variables for the given variable reference.
+ */
+ @Pure
+ @NonNull
+ public Variable[] getVariables() {
+ return this.variables;
+ }
+
+ /**
+ * All (or a range) of variables for the given variable reference.
+ */
+ public void setVariables(@NonNull final Variable[] variables) {
+ this.variables = Preconditions.checkNotNull(variables, "variables");
+ }
+
+ @Override
+ @Pure
+ public String toString() {
+ ToStringBuilder b = new ToStringBuilder(this);
+ b.add("variables", this.variables);
+ return b.toString();
+ }
+
+ @Override
+ @Pure
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ VariablesResponse other = (VariablesResponse) obj;
+ if (this.variables == null) {
+ if (other.variables != null)
+ return false;
+ } else if (!Arrays.deepEquals(this.variables, other.variables))
+ return false;
+ return true;
+ }
+
+ @Override
+ @Pure
+ public int hashCode() {
+ return 31 * 1 + ((this.variables== null) ? 0 : Arrays.deepHashCode(this.variables));
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/launch/DSPLauncher.java b/java/org/eclipse/lsp4j/debug/launch/DSPLauncher.java
new file mode 100644
index 0000000..191213d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/launch/DSPLauncher.java
@@ -0,0 +1,118 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.debug.launch;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.debug.services.IDebugProtocolClient;
+import org.eclipse.lsp4j.debug.services.IDebugProtocolServer;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.debug.DebugLauncher;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+
+/**
+ * Specialized launcher for the debug protocol.
+ */
+public final class DSPLauncher {
+
+ private DSPLauncher() {}
+
+ /**
+ * Create a new Launcher for a debug server and an input and output stream.
+ *
+ * @param server - the server that receives method calls from the remote client
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ */
+ public static Launcher<IDebugProtocolClient> createServerLauncher(IDebugProtocolServer server, InputStream in,
+ OutputStream out) {
+ return DebugLauncher.createLauncher(server, IDebugProtocolClient.class, in, out);
+ }
+
+ /**
+ * Create a new Launcher for a debug server and an input and output stream, and set up message validation and tracing.
+ *
+ * @param server - the server that receives method calls from the remote client
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param validate - whether messages should be validated with the {@link ReflectiveMessageValidator}
+ * @param trace - a writer to which incoming and outgoing messages are traced, or {@code null} to disable tracing
+ */
+ public static Launcher<IDebugProtocolClient> createServerLauncher(IDebugProtocolServer server, InputStream in,
+ OutputStream out, boolean validate, PrintWriter trace) {
+ return DebugLauncher.createLauncher(server, IDebugProtocolClient.class, in, out, validate, trace);
+ }
+
+ /**
+ * Create a new Launcher for a debug server and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and outgoing message streams so additional
+ * message handling such as validation and tracing can be included.
+ *
+ * @param server - the server that receives method calls from the remote client
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ */
+ public static Launcher<IDebugProtocolClient> createServerLauncher(IDebugProtocolServer server, InputStream in,
+ OutputStream out, ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return DebugLauncher.createLauncher(server, IDebugProtocolClient.class, in, out, executorService, wrapper);
+ }
+
+ /**
+ * Create a new Launcher for a debug client and an input and output stream.
+ *
+ * @param client - the client that receives method calls from the remote server
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ */
+ public static Launcher<IDebugProtocolServer> createClientLauncher(IDebugProtocolClient client, InputStream in,
+ OutputStream out) {
+ return DebugLauncher.createLauncher(client, IDebugProtocolServer.class, in, out);
+ }
+
+ /**
+ * Create a new Launcher for a debug client and an input and output stream, and set up message validation and tracing.
+ *
+ * @param client - the client that receives method calls from the remote server
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param validate - whether messages should be validated with the {@link ReflectiveMessageValidator}
+ * @param trace - a writer to which incoming and outgoing messages are traced, or {@code null} to disable tracing
+ */
+ public static Launcher<IDebugProtocolServer> createClientLauncher(IDebugProtocolClient client, InputStream in,
+ OutputStream out, boolean validate, PrintWriter trace) {
+ return DebugLauncher.createLauncher(client, IDebugProtocolServer.class, in, out, validate, trace);
+ }
+
+ /**
+ * Create a new Launcher for a debug client and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and outgoing message streams so additional
+ * message handling such as validation and tracing can be included.
+ *
+ * @param client - the client that receives method calls from the remote server
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ */
+ public static Launcher<IDebugProtocolServer> createClientLauncher(IDebugProtocolClient client, InputStream in,
+ OutputStream out, ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return DebugLauncher.createLauncher(client, IDebugProtocolServer.class, in, out, executorService, wrapper);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/debug/services/IDebugProtocolClient.java b/java/org/eclipse/lsp4j/debug/services/IDebugProtocolClient.java
new file mode 100644
index 0000000..7f44103
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/services/IDebugProtocolClient.java
@@ -0,0 +1,227 @@
+/******************************************************************************
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j.debug.services;
+
+import org.eclipse.lsp4j.debug.BreakpointEventArguments;
+import org.eclipse.lsp4j.debug.CapabilitiesEventArguments;
+import org.eclipse.lsp4j.debug.ContinuedEventArguments;
+import org.eclipse.lsp4j.debug.ExitedEventArguments;
+import org.eclipse.lsp4j.debug.InvalidatedEventArguments;
+import org.eclipse.lsp4j.debug.LoadedSourceEventArguments;
+import org.eclipse.lsp4j.debug.ModuleEventArguments;
+import org.eclipse.lsp4j.debug.OutputEventArguments;
+import org.eclipse.lsp4j.debug.ProcessEventArguments;
+import org.eclipse.lsp4j.debug.ProgressEndEventArguments;
+import org.eclipse.lsp4j.debug.ProgressStartEventArguments;
+import org.eclipse.lsp4j.debug.ProgressUpdateEventArguments;
+import org.eclipse.lsp4j.debug.StoppedEventArguments;
+import org.eclipse.lsp4j.debug.TerminatedEventArguments;
+import org.eclipse.lsp4j.debug.ThreadEventArguments;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+
+/**
+ * Declaration of client notifications for the
+ * <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter
+ * Protocol</a>
+ */
+public interface IDebugProtocolClient {
+ /**
+ * Version of Debug Protocol
+ */
+ public static final String SCHEMA_VERSION = "1.42.0";
+
+ /**
+ * This event indicates that the debug adapter is ready to accept configuration
+ * requests (e.g. SetBreakpointsRequest, SetExceptionBreakpointsRequest).
+ * <p>
+ * A debug adapter is expected to send this event when it is ready to accept
+ * configuration requests (but not before the 'initialize' request has
+ * finished).
+ * <p>
+ * The sequence of events/requests is as follows:
+ * <ul>
+ * <li>adapters sends 'initialized' event (after the 'initialize' request has
+ * returned)</li>
+ * <li>frontend sends zero or more 'setBreakpoints' requests</li>
+ * <li>frontend sends one 'setFunctionBreakpoints' request (if capability
+ * 'supportsFunctionBreakpoints' is true)</li>
+ * <li>frontend sends a 'setExceptionBreakpoints' request if one or more
+ * 'exceptionBreakpointFilters' have been defined (or if
+ * 'supportsConfigurationDoneRequest' is not defined or false)</li>
+ * <li>frontend sends other future configuration requests</li>
+ * <li>frontend sends one 'configurationDone' request to indicate the end of the
+ * configuration.</li>
+ * </ul>
+ */
+ @JsonNotification
+ default void initialized() {
+ }
+
+ /**
+ * The event indicates that the execution of the debuggee has stopped due to
+ * some condition.
+ * <p>
+ * This can be caused by a break point previously set, a stepping request has
+ * completed, by executing a debugger statement etc.
+ */
+ @JsonNotification
+ default void stopped(StoppedEventArguments args) {
+ }
+
+ /**
+ * The event indicates that the execution of the debuggee has continued.
+ * <p>
+ * Please note: a debug adapter is not expected to send this event in response
+ * to a request that implies that execution continues, e.g. 'launch' or
+ * 'continue'.
+ * <p>
+ * It is only necessary to send a 'continued' event if there was no previous
+ * request that implied this.
+ */
+ @JsonNotification
+ default void continued(ContinuedEventArguments args) {
+ }
+
+ /**
+ * The event indicates that the debuggee has exited and returns its exit code.
+ */
+ @JsonNotification
+ default void exited(ExitedEventArguments args) {
+ }
+
+ /**
+ * The event indicates that debugging of the debuggee has terminated. This does
+ * **not** mean that the debuggee itself has exited.
+ */
+ @JsonNotification
+ default void terminated(TerminatedEventArguments args) {
+ }
+
+ /**
+ * The event indicates that a thread has started or exited.
+ */
+ @JsonNotification
+ default void thread(ThreadEventArguments args) {
+ }
+
+ /**
+ * The event indicates that the target has produced some output.
+ */
+ @JsonNotification
+ default void output(OutputEventArguments args) {
+ }
+
+ /**
+ * The event indicates that some information about a breakpoint has changed.
+ */
+ @JsonNotification
+ default void breakpoint(BreakpointEventArguments args) {
+ }
+
+ /**
+ * The event indicates that some information about a module has changed.
+ */
+ @JsonNotification
+ default void module(ModuleEventArguments args) {
+ }
+
+ /**
+ * The event indicates that some source has been added, changed, or removed from
+ * the set of all loaded sources.
+ */
+ @JsonNotification
+ default void loadedSource(LoadedSourceEventArguments args) {
+ }
+
+ /**
+ * The event indicates that the debugger has begun debugging a new process.
+ * Either one that it has launched, or one that it has attached to.
+ */
+ @JsonNotification
+ default void process(ProcessEventArguments args) {
+ }
+
+ /**
+ * The event indicates that one or more capabilities have changed.
+ * <p>
+ * Since the capabilities are dependent on the frontend and its UI, it might not
+ * be possible to change that at random times (or too late).
+ * <p>
+ * Consequently this event has a hint characteristic: a frontend can only be
+ * expected to make a 'best effort' in honouring individual capabilities but
+ * there are no guarantees.
+ * <p>
+ * Only changed capabilities need to be included, all other capabilities keep
+ * their values.
+ */
+ @JsonNotification
+ default void capabilities(CapabilitiesEventArguments args) {
+ }
+
+ /**
+ * The event signals that a long running operation is about to start and
+ * <p>
+ * provides additional information for the client to set up a corresponding
+ * progress and cancellation UI.
+ * <p>
+ * The client is free to delay the showing of the UI in order to reduce flicker.
+ * <p>
+ * This event should only be sent if the client has passed the value true for
+ * the 'supportsProgressReporting' capability of the 'initialize' request.
+ */
+ @JsonNotification
+ default void progressStart(ProgressStartEventArguments args) {
+ }
+
+ /**
+ * The event signals that the progress reporting needs to updated with a new
+ * message and/or percentage.
+ * <p>
+ * The client does not have to update the UI immediately, but the clients needs
+ * to keep track of the message and/or percentage values.
+ * <p>
+ * This event should only be sent if the client has passed the value true for
+ * the 'supportsProgressReporting' capability of the 'initialize' request.
+ */
+ @JsonNotification
+ default void progressUpdate(ProgressUpdateEventArguments args) {
+ }
+
+ /**
+ * The event signals the end of the progress reporting with an optional final
+ * message.
+ * <p>
+ * This event should only be sent if the client has passed the value true for
+ * the 'supportsProgressReporting' capability of the 'initialize' request.
+ */
+ @JsonNotification
+ default void progressEnd(ProgressEndEventArguments args) {
+ }
+
+ /**
+ * This event signals that some state in the debug adapter has changed and
+ * requires that the client needs to re-render the data snapshot previously
+ * requested.
+ * <p>
+ * Debug adapters do not have to emit this event for runtime changes like
+ * stopped or thread events because in that case the client refetches the new
+ * state anyway. But the event can be used for example to refresh the UI after
+ * rendering formatting has changed in the debug adapter.
+ * <p>
+ * This event should only be sent if the debug adapter has received a value true
+ * for the 'supportsInvalidatedEvent' capability of the 'initialize' request.
+ */
+ @JsonNotification
+ default void invalidated(InvalidatedEventArguments args) {
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/services/IDebugProtocolServer.java b/java/org/eclipse/lsp4j/debug/services/IDebugProtocolServer.java
new file mode 100644
index 0000000..d5b33ee
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/services/IDebugProtocolServer.java
@@ -0,0 +1,680 @@
+/******************************************************************************
+ * Copyright (c) 2017, 2020 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+
+package org.eclipse.lsp4j.debug.services;
+
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.debug.BreakpointLocationsArguments;
+import org.eclipse.lsp4j.debug.BreakpointLocationsResponse;
+import org.eclipse.lsp4j.debug.CancelArguments;
+import org.eclipse.lsp4j.debug.Capabilities;
+import org.eclipse.lsp4j.debug.CompletionsArguments;
+import org.eclipse.lsp4j.debug.CompletionsResponse;
+import org.eclipse.lsp4j.debug.ConfigurationDoneArguments;
+import org.eclipse.lsp4j.debug.ContinueArguments;
+import org.eclipse.lsp4j.debug.ContinueResponse;
+import org.eclipse.lsp4j.debug.DataBreakpointInfoArguments;
+import org.eclipse.lsp4j.debug.DataBreakpointInfoResponse;
+import org.eclipse.lsp4j.debug.DisassembleArguments;
+import org.eclipse.lsp4j.debug.DisassembleResponse;
+import org.eclipse.lsp4j.debug.DisconnectArguments;
+import org.eclipse.lsp4j.debug.EvaluateArguments;
+import org.eclipse.lsp4j.debug.EvaluateResponse;
+import org.eclipse.lsp4j.debug.ExceptionInfoArguments;
+import org.eclipse.lsp4j.debug.ExceptionInfoResponse;
+import org.eclipse.lsp4j.debug.GotoArguments;
+import org.eclipse.lsp4j.debug.GotoTargetsArguments;
+import org.eclipse.lsp4j.debug.GotoTargetsResponse;
+import org.eclipse.lsp4j.debug.InitializeRequestArguments;
+import org.eclipse.lsp4j.debug.LoadedSourcesArguments;
+import org.eclipse.lsp4j.debug.LoadedSourcesResponse;
+import org.eclipse.lsp4j.debug.ModulesArguments;
+import org.eclipse.lsp4j.debug.ModulesResponse;
+import org.eclipse.lsp4j.debug.NextArguments;
+import org.eclipse.lsp4j.debug.PauseArguments;
+import org.eclipse.lsp4j.debug.ReadMemoryArguments;
+import org.eclipse.lsp4j.debug.ReadMemoryResponse;
+import org.eclipse.lsp4j.debug.RestartArguments;
+import org.eclipse.lsp4j.debug.RestartFrameArguments;
+import org.eclipse.lsp4j.debug.ReverseContinueArguments;
+import org.eclipse.lsp4j.debug.RunInTerminalRequestArguments;
+import org.eclipse.lsp4j.debug.RunInTerminalResponse;
+import org.eclipse.lsp4j.debug.ScopesArguments;
+import org.eclipse.lsp4j.debug.ScopesResponse;
+import org.eclipse.lsp4j.debug.SetBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetDataBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetDataBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetExceptionBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetExpressionArguments;
+import org.eclipse.lsp4j.debug.SetExpressionResponse;
+import org.eclipse.lsp4j.debug.SetFunctionBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetFunctionBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetInstructionBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetInstructionBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetVariableArguments;
+import org.eclipse.lsp4j.debug.SetVariableResponse;
+import org.eclipse.lsp4j.debug.SourceArguments;
+import org.eclipse.lsp4j.debug.SourceResponse;
+import org.eclipse.lsp4j.debug.StackTraceArguments;
+import org.eclipse.lsp4j.debug.StackTraceResponse;
+import org.eclipse.lsp4j.debug.StepBackArguments;
+import org.eclipse.lsp4j.debug.StepInArguments;
+import org.eclipse.lsp4j.debug.StepInTargetsArguments;
+import org.eclipse.lsp4j.debug.StepInTargetsResponse;
+import org.eclipse.lsp4j.debug.StepOutArguments;
+import org.eclipse.lsp4j.debug.TerminateArguments;
+import org.eclipse.lsp4j.debug.TerminateThreadsArguments;
+import org.eclipse.lsp4j.debug.ThreadsResponse;
+import org.eclipse.lsp4j.debug.VariablesArguments;
+import org.eclipse.lsp4j.debug.VariablesResponse;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+/**
+ * Declaration of server requests for the
+ * <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter
+ * Protocol</a>
+ */
+public interface IDebugProtocolServer {
+ /**
+ * Version of Debug Protocol
+ */
+ public static final String SCHEMA_VERSION = "1.42.0";
+
+ /**
+ * The 'cancel' request is used by the frontend in two situations:
+ * <ul>
+ * <li>to indicate that it is no longer interested in the result produced by a
+ * specific request issued earlier</li>
+ * <li>to cancel a progress sequence. Clients should only call this request if
+ * the capability 'supportsCancelRequest' is true.</li>
+ * </ul>
+ * <p>
+ * This request has a hint characteristic: a debug adapter can only be expected
+ * to make a 'best effort' in honouring this request but there are no
+ * guarantees.
+ * <p>
+ * The 'cancel' request may return an error if it could not cancel an operation
+ * but a frontend should refrain from presenting this error to end users.
+ * <p>
+ * A frontend client should only call this request if the capability
+ * 'supportsCancelRequest' is true.
+ * <p>
+ * The request that got canceled still needs to send a response back. This can
+ * either be a normal result ('success' attribute true)
+ * <p>
+ * or an error response ('success' attribute false and the 'message' set to
+ * 'cancelled').
+ * <p>
+ * Returning partial results from a cancelled request is possible but please
+ * note that a frontend client has no generic way for detecting that a response
+ * is partial or not.
+ * <p>
+ * The progress that got cancelled still needs to send a 'progressEnd' event
+ * back.
+ * <p>
+ * A client should not assume that progress just got cancelled after sending the
+ * 'cancel' request.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> cancel(CancelArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This optional request is sent from the debug adapter to the client to run a
+ * command in a terminal.
+ * <p>
+ * This is typically used to launch the debuggee in a terminal provided by the
+ * client.
+ * <p>
+ * This request should only be called if the client has passed the value true
+ * for the 'supportsRunInTerminalRequest' capability of the 'initialize'
+ * request.
+ */
+ @JsonRequest
+ default CompletableFuture<RunInTerminalResponse> runInTerminal(RunInTerminalRequestArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The 'initialize' request is sent as the first request from the client to the
+ * debug adapter
+ * <p>
+ * in order to configure it with client capabilities and to retrieve
+ * capabilities from the debug adapter.
+ * <p>
+ * Until the debug adapter has responded to with an 'initialize' response, the
+ * client must not send any additional requests or events to the debug adapter.
+ * <p>
+ * In addition the debug adapter is not allowed to send any requests or events
+ * to the client until it has responded with an 'initialize' response.
+ * <p>
+ * The 'initialize' request may only be sent once.
+ */
+ @JsonRequest
+ default CompletableFuture<Capabilities> initialize(InitializeRequestArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This optional request indicates that the client has finished initialization
+ * of the debug adapter.
+ * <p>
+ * So it is the last request in the sequence of configuration requests (which
+ * was started by the 'initialized' event).
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsConfigurationDoneRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> configurationDone(ConfigurationDoneArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This launch request is sent from the client to the debug adapter to start the
+ * debuggee with or without debugging (if 'noDebug' is true).
+ * <p>
+ * Since launching is debugger/runtime specific, the arguments for this request
+ * are not part of this specification.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> launch(Map<String, Object> args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The attach request is sent from the client to the debug adapter to attach to
+ * a debuggee that is already running.
+ * <p>
+ * Since attaching is debugger/runtime specific, the arguments for this request
+ * are not part of this specification.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> attach(Map<String, Object> args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Restarts a debug session. Clients should only call this request if the
+ * capability 'supportsRestartRequest' is true.
+ * <p>
+ * If the capability is missing or has the value false, a typical client will
+ * emulate 'restart' by terminating the debug adapter first and then launching
+ * it anew.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> restart(RestartArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The 'disconnect' request is sent from the client to the debug adapter in
+ * order to stop debugging.
+ * <p>
+ * It asks the debug adapter to disconnect from the debuggee and to terminate
+ * the debug adapter.
+ * <p>
+ * If the debuggee has been started with the 'launch' request, the 'disconnect'
+ * request terminates the debuggee.
+ * <p>
+ * If the 'attach' request was used to connect to the debuggee, 'disconnect'
+ * does not terminate the debuggee.
+ * <p>
+ * This behavior can be controlled with the 'terminateDebuggee' argument (if
+ * supported by the debug adapter).
+ */
+ @JsonRequest
+ default CompletableFuture<Void> disconnect(DisconnectArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The 'terminate' request is sent from the client to the debug adapter in order
+ * to give the debuggee a chance for terminating itself.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsTerminateRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> terminate(TerminateArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The 'breakpointLocations' request returns all possible locations for source
+ * breakpoints in a given range.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsBreakpointLocationsRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<BreakpointLocationsResponse> breakpointLocations(BreakpointLocationsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Sets multiple breakpoints for a single source and clears all previous
+ * breakpoints in that source.
+ * <p>
+ * To clear all breakpoint for a source, specify an empty array.
+ * <p>
+ * When a breakpoint is hit, a 'stopped' event (with reason 'breakpoint') is
+ * generated.
+ */
+ @JsonRequest
+ default CompletableFuture<SetBreakpointsResponse> setBreakpoints(SetBreakpointsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Replaces all existing function breakpoints with new function breakpoints.
+ * <p>
+ * To clear all function breakpoints, specify an empty array.
+ * <p>
+ * When a function breakpoint is hit, a 'stopped' event (with reason 'function
+ * breakpoint') is generated.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsFunctionBreakpoints' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<SetFunctionBreakpointsResponse> setFunctionBreakpoints(
+ SetFunctionBreakpointsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request configures the debuggers response to thrown exceptions.
+ * <p>
+ * If an exception is configured to break, a 'stopped' event is fired (with
+ * reason 'exception').
+ * <p>
+ * Clients should only call this request if the capability
+ * 'exceptionBreakpointFilters' returns one or more filters.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> setExceptionBreakpoints(SetExceptionBreakpointsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Obtains information on a possible data breakpoint that could be set on an
+ * expression or variable.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsDataBreakpoints' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<DataBreakpointInfoResponse> dataBreakpointInfo(DataBreakpointInfoArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Replaces all existing data breakpoints with new data breakpoints.
+ * <p>
+ * To clear all data breakpoints, specify an empty array.
+ * <p>
+ * When a data breakpoint is hit, a 'stopped' event (with reason 'data
+ * breakpoint') is generated.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsDataBreakpoints' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<SetDataBreakpointsResponse> setDataBreakpoints(SetDataBreakpointsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Replaces all existing instruction breakpoints. Typically, instruction
+ * breakpoints would be set from a diassembly window.
+ * <p>
+ * To clear all instruction breakpoints, specify an empty array.
+ * <p>
+ * When an instruction breakpoint is hit, a 'stopped' event (with reason
+ * 'instruction breakpoint') is generated.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsInstructionBreakpoints' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<SetInstructionBreakpointsResponse> setInstructionBreakpoints(
+ SetInstructionBreakpointsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request starts the debuggee to run again.
+ */
+ @JsonRequest(value = "continue")
+ default CompletableFuture<ContinueResponse> continue_(ContinueArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request starts the debuggee to run again for one step.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event (with
+ * reason 'step') after the step has completed.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> next(NextArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request starts the debuggee to step into a function/method if possible.
+ * <p>
+ * If it cannot step into a target, 'stepIn' behaves like 'next'.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event (with
+ * reason 'step') after the step has completed.
+ * <p>
+ * If there are multiple function/method calls (or other targets) on the source
+ * line,
+ * <p>
+ * the optional argument 'targetId' can be used to control into which target the
+ * 'stepIn' should occur.
+ * <p>
+ * The list of possible targets for a given source line can be retrieved via the
+ * 'stepInTargets' request.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> stepIn(StepInArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request starts the debuggee to run again for one step.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event (with
+ * reason 'step') after the step has completed.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> stepOut(StepOutArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request starts the debuggee to run one step backwards.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event (with
+ * reason 'step') after the step has completed.
+ * <p>
+ * Clients should only call this request if the capability 'supportsStepBack' is
+ * true.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> stepBack(StepBackArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request starts the debuggee to run backward.
+ * <p>
+ * Clients should only call this request if the capability 'supportsStepBack' is
+ * true.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> reverseContinue(ReverseContinueArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request restarts execution of the specified stackframe.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event (with
+ * reason 'restart') after the restart has completed.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsRestartFrame' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> restartFrame(RestartFrameArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request sets the location where the debuggee will continue to run.
+ * <p>
+ * This makes it possible to skip the execution of code or to executed code
+ * again.
+ * <p>
+ * The code between the current location and the goto target is not executed but
+ * skipped.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event with
+ * reason 'goto'.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsGotoTargetsRequest' is true (because only then goto targets exist
+ * that can be passed as arguments).
+ */
+ @JsonRequest(value = "goto")
+ default CompletableFuture<Void> goto_(GotoArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request suspends the debuggee.
+ * <p>
+ * The debug adapter first sends the response and then a 'stopped' event (with
+ * reason 'pause') after the thread has been paused successfully.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> pause(PauseArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request returns a stacktrace from the current execution state of a given
+ * thread.
+ * <p>
+ * A client can request all stack frames by omitting the startFrame and levels
+ * arguments. For performance conscious clients and if the debug adapter's
+ * 'supportsDelayedStackTraceLoading' capability is true, stack frames can be
+ * retrieved in a piecemeal way with the startFrame and levels arguments. The
+ * response of the stackTrace request may contain a totalFrames property that
+ * hints at the total number of frames in the stack. If a client needs this
+ * total number upfront, it can issue a request for a single (first) frame and
+ * depending on the value of totalFrames decide how to proceed. In any case a
+ * client should be prepared to receive less frames than requested, which is an
+ * indication that the end of the stack has been reached.
+ */
+ @JsonRequest
+ default CompletableFuture<StackTraceResponse> stackTrace(StackTraceArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request returns the variable scopes for a given stackframe ID.
+ */
+ @JsonRequest
+ default CompletableFuture<ScopesResponse> scopes(ScopesArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Retrieves all child variables for the given variable reference.
+ * <p>
+ * An optional filter can be used to limit the fetched children to either named
+ * or indexed children.
+ */
+ @JsonRequest
+ default CompletableFuture<VariablesResponse> variables(VariablesArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Set the variable with the given name in the variable container to a new
+ * value. Clients should only call this request if the capability
+ * 'supportsSetVariable' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<SetVariableResponse> setVariable(SetVariableArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request retrieves the source code for a given source reference.
+ */
+ @JsonRequest
+ default CompletableFuture<SourceResponse> source(SourceArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request retrieves a list of all threads.
+ */
+ @JsonRequest
+ default CompletableFuture<ThreadsResponse> threads() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request terminates the threads with the given ids.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsTerminateThreadsRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<Void> terminateThreads(TerminateThreadsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Modules can be retrieved from the debug adapter with this request which can
+ * either return all modules or a range of modules to support paging.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsModulesRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<ModulesResponse> modules(ModulesArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Retrieves the set of all sources currently loaded by the debugged process.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsLoadedSourcesRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<LoadedSourcesResponse> loadedSources(LoadedSourcesArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Evaluates the given expression in the context of the top most stack frame.
+ * <p>
+ * The expression has access to any variables and arguments that are in scope.
+ */
+ @JsonRequest
+ default CompletableFuture<EvaluateResponse> evaluate(EvaluateArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Evaluates the given 'value' expression and assigns it to the 'expression'
+ * which must be a modifiable l-value.
+ * <p>
+ * The expressions have access to any variables and arguments that are in scope
+ * of the specified frame.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsSetExpression' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<SetExpressionResponse> setExpression(SetExpressionArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This request retrieves the possible stepIn targets for the specified stack
+ * frame.
+ * <p>
+ * These targets can be used in the 'stepIn' request.
+ * <p>
+ * The StepInTargets may only be called if the 'supportsStepInTargetsRequest'
+ * capability exists and is true.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsStepInTargetsRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<StepInTargetsResponse> stepInTargets(StepInTargetsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This request retrieves the possible goto targets for the specified source
+ * location.
+ * <p>
+ * These targets can be used in the 'goto' request.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsGotoTargetsRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<GotoTargetsResponse> gotoTargets(GotoTargetsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Returns a list of possible completions for a given caret position and text.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsCompletionsRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<CompletionsResponse> completions(CompletionsArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Retrieves the details of the exception that caused this event to be raised.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsExceptionInfoRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<ExceptionInfoResponse> exceptionInfo(ExceptionInfoArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Reads bytes from memory at the provided location.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsReadMemoryRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<ReadMemoryResponse> readMemory(ReadMemoryArguments args) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Disassembles code stored at the provided location.
+ * <p>
+ * Clients should only call this request if the capability
+ * 'supportsDisassembleRequest' is true.
+ */
+ @JsonRequest
+ default CompletableFuture<DisassembleResponse> disassemble(DisassembleArguments args) {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/debug/util/Preconditions.java b/java/org/eclipse/lsp4j/debug/util/Preconditions.java
new file mode 100644
index 0000000..6892a64
--- /dev/null
+++ b/java/org/eclipse/lsp4j/debug/util/Preconditions.java
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.debug.util;
+
+/**
+ * Utilities for checking method and constructor arguments.
+ */
+public final class Preconditions {
+
+ private Preconditions() {}
+
+ private static boolean nullChecks = true;
+
+ public static void enableNullChecks(boolean enable) {
+ Preconditions.nullChecks = enable;
+ }
+
+ public static <T> T checkNotNull(T object, String propertyName) {
+ if (nullChecks && object == null) {
+ throw new IllegalArgumentException("Property must not be null: " + propertyName);
+ }
+ return object;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/generator/EitherTypeArgument.java b/java/org/eclipse/lsp4j/generator/EitherTypeArgument.java
new file mode 100644
index 0000000..f14a96e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/EitherTypeArgument.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import org.eclipse.xtend.lib.annotations.Accessors;
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor;
+import org.eclipse.xtend.lib.macro.declaration.TypeReference;
+import org.eclipse.xtext.xbase.lib.Pure;
+
+@Accessors
+@FinalFieldsConstructor
+@SuppressWarnings("all")
+public class EitherTypeArgument {
+ private final TypeReference type;
+
+ private final EitherTypeArgument parent;
+
+ private final boolean right;
+
+ public EitherTypeArgument(final TypeReference type, final EitherTypeArgument parent, final boolean right) {
+ super();
+ this.type = type;
+ this.parent = parent;
+ this.right = right;
+ }
+
+ @Pure
+ public TypeReference getType() {
+ return this.type;
+ }
+
+ @Pure
+ public EitherTypeArgument getParent() {
+ return this.parent;
+ }
+
+ @Pure
+ public boolean isRight() {
+ return this.right;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/generator/JsonRpcData.java b/java/org/eclipse/lsp4j/generator/JsonRpcData.java
new file mode 100644
index 0000000..d087138
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonRpcData.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.eclipse.lsp4j.generator.JsonRpcDataProcessor;
+import org.eclipse.xtend.lib.macro.Active;
+
+/**
+ * Generates getters and setters for all fields as well as {@code equals} and {@code hashCode} implementations.
+ * All JSON-RPC protocol classes that are written in Xtend should be annotated with this.
+ */
+@Target(ElementType.TYPE)
+@Active(JsonRpcDataProcessor.class)
+@Retention(RetentionPolicy.SOURCE)
+@SuppressWarnings("all")
+public @interface JsonRpcData {
+}
diff --git a/java/org/eclipse/lsp4j/generator/JsonRpcData.xtend b/java/org/eclipse/lsp4j/generator/JsonRpcData.xtend
new file mode 100644
index 0000000..7ee1f7c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonRpcData.xtend
@@ -0,0 +1,28 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.generator
+
+import java.lang.annotation.ElementType
+import java.lang.annotation.Retention
+import java.lang.annotation.Target
+import org.eclipse.xtend.lib.macro.Active
+
+/**
+ * Generates getters and setters for all fields as well as {@code equals} and {@code hashCode} implementations.
+ * All JSON-RPC protocol classes that are written in Xtend should be annotated with this.
+ */
+@Target(ElementType.TYPE)
+@Active(JsonRpcDataProcessor)
+@Retention(SOURCE)
+annotation JsonRpcData {
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/generator/JsonRpcDataProcessor.java b/java/org/eclipse/lsp4j/generator/JsonRpcDataProcessor.java
new file mode 100644
index 0000000..8b93e4f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonRpcDataProcessor.java
@@ -0,0 +1,346 @@
+/**
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Iterables;
+import com.google.gson.annotations.JsonAdapter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Consumer;
+import org.eclipse.lsp4j.generator.EitherTypeArgument;
+import org.eclipse.lsp4j.generator.JsonRpcData;
+import org.eclipse.lsp4j.generator.JsonRpcDataTransformationContext;
+import org.eclipse.lsp4j.generator.JsonType;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.xtend.lib.annotations.AccessorsProcessor;
+import org.eclipse.xtend.lib.annotations.EqualsHashCodeProcessor;
+import org.eclipse.xtend.lib.macro.AbstractClassProcessor;
+import org.eclipse.xtend.lib.macro.TransformationContext;
+import org.eclipse.xtend.lib.macro.declaration.AnnotationReference;
+import org.eclipse.xtend.lib.macro.declaration.AnnotationTypeDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.ClassDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.CompilationStrategy;
+import org.eclipse.xtend.lib.macro.declaration.FieldDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableFieldDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableMethodDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableParameterDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.Type;
+import org.eclipse.xtend.lib.macro.declaration.TypeDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.TypeReference;
+import org.eclipse.xtend.lib.macro.declaration.Visibility;
+import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.xtend2.lib.StringConcatenationClient;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.xtext.xbase.lib.Extension;
+import org.eclipse.xtext.xbase.lib.Functions.Function1;
+import org.eclipse.xtext.xbase.lib.IterableExtensions;
+import org.eclipse.xtext.xbase.lib.ObjectExtensions;
+import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
+import org.eclipse.xtext.xbase.lib.Pure;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+
+@SuppressWarnings("all")
+public class JsonRpcDataProcessor extends AbstractClassProcessor {
+ @Override
+ public void doTransform(final MutableClassDeclaration annotatedClass, final TransformationContext context) {
+ this.generateImpl(annotatedClass, context);
+ }
+
+ protected MutableClassDeclaration generateImpl(final MutableClassDeclaration impl, @Extension final TransformationContext context) {
+ final Function1<AnnotationReference, Boolean> _function = (AnnotationReference it) -> {
+ AnnotationTypeDeclaration _annotationTypeDeclaration = it.getAnnotationTypeDeclaration();
+ Type _findTypeGlobally = context.findTypeGlobally(JsonRpcData.class);
+ return Boolean.valueOf(Objects.equal(_annotationTypeDeclaration, _findTypeGlobally));
+ };
+ impl.removeAnnotation(IterableExtensions.findFirst(impl.getAnnotations(), _function));
+ JsonRpcDataTransformationContext _jsonRpcDataTransformationContext = new JsonRpcDataTransformationContext(context);
+ this.generateImplMembers(impl, _jsonRpcDataTransformationContext);
+ this.generateToString(impl, context);
+ Type _type = impl.getExtendedClass().getType();
+ Type _type_1 = context.newTypeReference(Object.class).getType();
+ final boolean shouldIncludeSuper = (!Objects.equal(_type, _type_1));
+ final EqualsHashCodeProcessor.Util equalsHashCodeUtil = new EqualsHashCodeProcessor.Util(context);
+ final Function1<MutableFieldDeclaration, Boolean> _function_1 = (MutableFieldDeclaration it) -> {
+ boolean _isStatic = it.isStatic();
+ return Boolean.valueOf((!_isStatic));
+ };
+ final Iterable<? extends MutableFieldDeclaration> fields = IterableExtensions.filter(impl.getDeclaredFields(), _function_1);
+ equalsHashCodeUtil.addEquals(impl, fields, shouldIncludeSuper);
+ equalsHashCodeUtil.addHashCode(impl, fields, shouldIncludeSuper);
+ return impl;
+ }
+
+ protected void generateImplMembers(final MutableClassDeclaration impl, @Extension final JsonRpcDataTransformationContext context) {
+ final Function1<MutableFieldDeclaration, Boolean> _function = (MutableFieldDeclaration it) -> {
+ boolean _isStatic = it.isStatic();
+ return Boolean.valueOf((!_isStatic));
+ };
+ final Consumer<MutableFieldDeclaration> _function_1 = (MutableFieldDeclaration field) -> {
+ final AccessorsProcessor.Util accessorsUtil = new AccessorsProcessor.Util(context);
+ final AnnotationReference deprecated = field.findAnnotation(context.findTypeGlobally(Deprecated.class));
+ accessorsUtil.addGetter(field, Visibility.PUBLIC);
+ AnnotationReference _findAnnotation = field.findAnnotation(context.newTypeReference(NonNull.class).getType());
+ final boolean hasNonNull = (_findAnnotation != null);
+ AnnotationReference _findAnnotation_1 = field.findAnnotation(context.newTypeReference(JsonAdapter.class).getType());
+ final boolean hasJsonAdapter = (_findAnnotation_1 != null);
+ MutableMethodDeclaration _findDeclaredMethod = impl.findDeclaredMethod(accessorsUtil.getGetterName(field));
+ final Procedure1<MutableMethodDeclaration> _function_2 = (MutableMethodDeclaration it) -> {
+ it.setDocComment(field.getDocComment());
+ if (hasNonNull) {
+ it.addAnnotation(context.newAnnotationReference(NonNull.class));
+ }
+ if ((deprecated != null)) {
+ it.addAnnotation(context.newAnnotationReference(Deprecated.class));
+ }
+ };
+ ObjectExtensions.<MutableMethodDeclaration>operator_doubleArrow(_findDeclaredMethod, _function_2);
+ boolean _isInferred = field.getType().isInferred();
+ boolean _not = (!_isInferred);
+ if (_not) {
+ accessorsUtil.addSetter(field, Visibility.PUBLIC);
+ final String setterName = accessorsUtil.getSetterName(field);
+ MutableMethodDeclaration _findDeclaredMethod_1 = impl.findDeclaredMethod(setterName, field.getType());
+ final Procedure1<MutableMethodDeclaration> _function_3 = (MutableMethodDeclaration it) -> {
+ it.setDocComment(field.getDocComment());
+ if (hasNonNull) {
+ final MutableParameterDeclaration parameter = IterableExtensions.head(it.getParameters());
+ parameter.addAnnotation(context.newAnnotationReference(NonNull.class));
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("this.");
+ String _simpleName = field.getSimpleName();
+ _builder.append(_simpleName);
+ _builder.append(" = ");
+ TypeReference _preconditionsUtil = JsonRpcDataProcessor.this.getPreconditionsUtil(impl, context);
+ _builder.append(_preconditionsUtil);
+ _builder.append(".checkNotNull(");
+ String _simpleName_1 = parameter.getSimpleName();
+ _builder.append(_simpleName_1);
+ _builder.append(", \"");
+ String _simpleName_2 = field.getSimpleName();
+ _builder.append(_simpleName_2);
+ _builder.append("\");");
+ _builder.newLineIfNotEmpty();
+ }
+ };
+ it.setBody(_client);
+ }
+ if ((deprecated != null)) {
+ it.addAnnotation(context.newAnnotationReference(Deprecated.class));
+ }
+ };
+ ObjectExtensions.<MutableMethodDeclaration>operator_doubleArrow(_findDeclaredMethod_1, _function_3);
+ final Collection<EitherTypeArgument> childTypes = context.getChildTypes(field.getType());
+ boolean _isEmpty = childTypes.isEmpty();
+ boolean _not_1 = (!_isEmpty);
+ if (_not_1) {
+ final Function1<EitherTypeArgument, JsonType> _function_4 = (EitherTypeArgument it) -> {
+ return context.getJsonType(it.getType());
+ };
+ final List<JsonType> jsonTypes = IterableExtensions.<JsonType>toList(IterableExtensions.<EitherTypeArgument, JsonType>map(childTypes, _function_4));
+ int _size = jsonTypes.size();
+ int _size_1 = IterableExtensions.<JsonType>toSet(jsonTypes).size();
+ boolean _tripleNotEquals = (_size != _size_1);
+ if (_tripleNotEquals) {
+ if ((!hasJsonAdapter)) {
+ StringConcatenation _builder = new StringConcatenation();
+ _builder.append("The json types of an Either must be distinct.");
+ context.addWarning(field, _builder.toString());
+ }
+ } else {
+ for (final EitherTypeArgument childType : childTypes) {
+ this.addEitherSetter(field, setterName, childType, context);
+ }
+ }
+ }
+ }
+ };
+ IterableExtensions.filter(impl.getDeclaredFields(), _function).forEach(_function_1);
+ }
+
+ protected void addEitherSetter(final MutableFieldDeclaration field, final String setterName, final EitherTypeArgument argument, @Extension final JsonRpcDataTransformationContext context) {
+ final Procedure1<MutableMethodDeclaration> _function = (MutableMethodDeclaration method) -> {
+ context.setPrimarySourceElement(method, context.getPrimarySourceElement(field));
+ method.addParameter(field.getSimpleName(), argument.getType());
+ method.setStatic(field.isStatic());
+ method.setVisibility(Visibility.PUBLIC);
+ method.setReturnType(context.getPrimitiveVoid());
+ final CompilationStrategy _function_1 = (CompilationStrategy.CompilationContext ctx) -> {
+ return this.compileEitherSetterBody(field, argument, field.getSimpleName(), ctx, context);
+ };
+ method.setBody(_function_1);
+ };
+ field.getDeclaringType().addMethod(setterName, _function);
+ }
+
+ protected CharSequence compileEitherSetterBody(final MutableFieldDeclaration field, final EitherTypeArgument argument, final String variableName, @Extension final CompilationStrategy.CompilationContext compilationContext, @Extension final JsonRpcDataTransformationContext context) {
+ CharSequence _xblockexpression = null;
+ {
+ AnnotationReference _findAnnotation = field.findAnnotation(context.newTypeReference(NonNull.class).getType());
+ final boolean hasNonNull = (_findAnnotation != null);
+ final String newVariableName = ("_" + variableName);
+ StringConcatenation _builder = new StringConcatenation();
+ String _javaCode = compilationContext.toJavaCode(context.getEitherType());
+ _builder.append(_javaCode);
+ _builder.append(".for");
+ {
+ boolean _isRight = argument.isRight();
+ if (_isRight) {
+ _builder.append("Right");
+ } else {
+ _builder.append("Left");
+ }
+ }
+ _builder.append("(");
+ _builder.append(variableName);
+ _builder.append(")");
+ final CharSequence compileNewEither = _builder;
+ StringConcatenation _builder_1 = new StringConcatenation();
+ _builder_1.append("if (");
+ _builder_1.append(variableName);
+ _builder_1.append(" == null) {");
+ _builder_1.newLineIfNotEmpty();
+ {
+ if (hasNonNull) {
+ _builder_1.append(" ");
+ TypeReference _preconditionsUtil = this.getPreconditionsUtil(field.getDeclaringType(), context);
+ _builder_1.append(_preconditionsUtil, " ");
+ _builder_1.append(".checkNotNull(");
+ _builder_1.append(variableName, " ");
+ _builder_1.append(", \"");
+ String _simpleName = field.getSimpleName();
+ _builder_1.append(_simpleName, " ");
+ _builder_1.append("\");");
+ _builder_1.newLineIfNotEmpty();
+ }
+ }
+ _builder_1.append(" ");
+ _builder_1.append("this.");
+ String _simpleName_1 = field.getSimpleName();
+ _builder_1.append(_simpleName_1, " ");
+ _builder_1.append(" = null;");
+ _builder_1.newLineIfNotEmpty();
+ _builder_1.append(" ");
+ _builder_1.append("return;");
+ _builder_1.newLine();
+ _builder_1.append("}");
+ _builder_1.newLine();
+ {
+ EitherTypeArgument _parent = argument.getParent();
+ boolean _tripleNotEquals = (_parent != null);
+ if (_tripleNotEquals) {
+ _builder_1.append("final ");
+ String _javaCode_1 = compilationContext.toJavaCode(argument.getParent().getType());
+ _builder_1.append(_javaCode_1);
+ _builder_1.append(" ");
+ _builder_1.append(newVariableName);
+ _builder_1.append(" = ");
+ _builder_1.append(compileNewEither);
+ _builder_1.append(";");
+ _builder_1.newLineIfNotEmpty();
+ CharSequence _compileEitherSetterBody = this.compileEitherSetterBody(field, argument.getParent(), newVariableName, compilationContext, context);
+ _builder_1.append(_compileEitherSetterBody);
+ _builder_1.newLineIfNotEmpty();
+ } else {
+ _builder_1.append("this.");
+ String _simpleName_2 = field.getSimpleName();
+ _builder_1.append(_simpleName_2);
+ _builder_1.append(" = ");
+ _builder_1.append(compileNewEither);
+ _builder_1.append(";");
+ _builder_1.newLineIfNotEmpty();
+ }
+ }
+ _xblockexpression = _builder_1;
+ }
+ return _xblockexpression;
+ }
+
+ protected MutableMethodDeclaration generateToString(final MutableClassDeclaration impl, @Extension final TransformationContext context) {
+ MutableMethodDeclaration _xblockexpression = null;
+ {
+ final ArrayList<FieldDeclaration> toStringFields = CollectionLiterals.<FieldDeclaration>newArrayList();
+ ClassDeclaration c = impl;
+ do {
+ {
+ Iterable<? extends FieldDeclaration> _declaredFields = c.getDeclaredFields();
+ Iterables.<FieldDeclaration>addAll(toStringFields, _declaredFields);
+ TypeReference _extendedClass = c.getExtendedClass();
+ Type _type = null;
+ if (_extendedClass!=null) {
+ _type=_extendedClass.getType();
+ }
+ c = ((ClassDeclaration) _type);
+ }
+ } while(((c != null) && (!Objects.equal(c, context.getObject()))));
+ final Procedure1<MutableMethodDeclaration> _function = (MutableMethodDeclaration it) -> {
+ it.setReturnType(context.getString());
+ it.addAnnotation(context.newAnnotationReference(Override.class));
+ it.addAnnotation(context.newAnnotationReference(Pure.class));
+ final AccessorsProcessor.Util accessorsUtil = new AccessorsProcessor.Util(context);
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append(ToStringBuilder.class);
+ _builder.append(" b = new ");
+ _builder.append(ToStringBuilder.class);
+ _builder.append("(this);");
+ _builder.newLineIfNotEmpty();
+ {
+ for(final FieldDeclaration field : toStringFields) {
+ _builder.append("b.add(\"");
+ String _simpleName = field.getSimpleName();
+ _builder.append(_simpleName);
+ _builder.append("\", ");
+ {
+ TypeDeclaration _declaringType = field.getDeclaringType();
+ boolean _equals = Objects.equal(_declaringType, impl);
+ if (_equals) {
+ _builder.append("this.");
+ String _simpleName_1 = field.getSimpleName();
+ _builder.append(_simpleName_1);
+ } else {
+ String _getterName = accessorsUtil.getGetterName(field);
+ _builder.append(_getterName);
+ _builder.append("()");
+ }
+ }
+ _builder.append(");");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ _builder.append("return b.toString();");
+ _builder.newLine();
+ }
+ };
+ it.setBody(_client);
+ };
+ _xblockexpression = impl.addMethod("toString", _function);
+ }
+ return _xblockexpression;
+ }
+
+ private TypeReference getPreconditionsUtil(final Type type, @Extension final TransformationContext context) {
+ TypeReference _xifexpression = null;
+ boolean _startsWith = type.getQualifiedName().startsWith("org.eclipse.lsp4j.debug");
+ if (_startsWith) {
+ _xifexpression = context.newTypeReference("org.eclipse.lsp4j.debug.util.Preconditions");
+ } else {
+ _xifexpression = context.newTypeReference("org.eclipse.lsp4j.util.Preconditions");
+ }
+ return _xifexpression;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/generator/JsonRpcDataProcessor.xtend b/java/org/eclipse/lsp4j/generator/JsonRpcDataProcessor.xtend
new file mode 100644
index 0000000..ce296a7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonRpcDataProcessor.xtend
@@ -0,0 +1,177 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.generator
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull
+import org.eclipse.xtend.lib.annotations.AccessorsProcessor
+import org.eclipse.xtend.lib.annotations.EqualsHashCodeProcessor
+import org.eclipse.xtend.lib.macro.AbstractClassProcessor
+import org.eclipse.xtend.lib.macro.TransformationContext
+import org.eclipse.xtend.lib.macro.declaration.ClassDeclaration
+import org.eclipse.xtend.lib.macro.declaration.CompilationStrategy.CompilationContext
+import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration
+import org.eclipse.xtend.lib.macro.declaration.MutableFieldDeclaration
+import org.eclipse.xtend.lib.macro.declaration.Type
+import org.eclipse.xtend.lib.macro.declaration.Visibility
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder
+import com.google.gson.annotations.JsonAdapter
+
+class JsonRpcDataProcessor extends AbstractClassProcessor {
+
+ override doTransform(MutableClassDeclaration annotatedClass, TransformationContext context) {
+ generateImpl(annotatedClass, context)
+ }
+
+ protected def generateImpl(MutableClassDeclaration impl, extension TransformationContext context) {
+ impl.removeAnnotation(impl.annotations.findFirst [
+ annotationTypeDeclaration == JsonRpcData.findTypeGlobally
+ ])
+ impl.generateImplMembers(new JsonRpcDataTransformationContext(context))
+
+ generateToString(impl, context)
+
+ val shouldIncludeSuper = impl.extendedClass.type != Object.newTypeReference.type
+ val equalsHashCodeUtil = new EqualsHashCodeProcessor.Util(context)
+ val fields = impl.declaredFields.filter[!static]
+ equalsHashCodeUtil.addEquals(impl, fields, shouldIncludeSuper)
+ equalsHashCodeUtil.addHashCode(impl, fields, shouldIncludeSuper)
+
+ return impl
+ }
+
+ protected def void generateImplMembers(MutableClassDeclaration impl,
+ extension JsonRpcDataTransformationContext context) {
+ impl.declaredFields.filter [
+ !static
+ ].forEach [ field |
+ val accessorsUtil = new AccessorsProcessor.Util(context)
+ val deprecated = field.findAnnotation(Deprecated.findTypeGlobally)
+ accessorsUtil.addGetter(field, Visibility.PUBLIC)
+ val hasNonNull = field.findAnnotation(NonNull.newTypeReference.type) !== null
+ val hasJsonAdapter = field.findAnnotation(JsonAdapter.newTypeReference.type) !== null
+ impl.findDeclaredMethod(accessorsUtil.getGetterName(field)) => [
+ docComment = field.docComment
+ if (hasNonNull) {
+ addAnnotation(newAnnotationReference(NonNull))
+ }
+ if (deprecated !== null)
+ addAnnotation(newAnnotationReference(Deprecated))
+ ]
+
+ if (!field.type.inferred) {
+ accessorsUtil.addSetter(field, Visibility.PUBLIC)
+ val setterName = accessorsUtil.getSetterName(field)
+ impl.findDeclaredMethod(setterName, field.type) => [
+ docComment = field.docComment
+ if (hasNonNull) {
+ val parameter = parameters.head
+ parameter.addAnnotation(newAnnotationReference(NonNull))
+ body = '''
+ this.«field.simpleName» = «getPreconditionsUtil(impl, context)».checkNotNull(«parameter.simpleName», "«field.simpleName»");
+ '''
+ }
+ if (deprecated !== null)
+ addAnnotation(newAnnotationReference(Deprecated))
+ ]
+ val childTypes = field.type.childTypes
+ if (!childTypes.empty) {
+ val jsonTypes = childTypes.map[type.jsonType].toList
+ if (jsonTypes.size !== jsonTypes.toSet.size) {
+ // If there is a JsonAdapter on the field, the warning is expected to be unneeded because
+ // the adapter will handle the resolution of the either
+ if (!hasJsonAdapter) {
+ field.addWarning('''The json types of an Either must be distinct.''')
+ }
+ } else {
+ for (childType : childTypes) {
+ field.addEitherSetter(setterName, childType, context)
+ }
+ }
+ }
+ }
+ ]
+ }
+
+ protected def void addEitherSetter(
+ MutableFieldDeclaration field,
+ String setterName,
+ EitherTypeArgument argument,
+ extension JsonRpcDataTransformationContext context
+ ) {
+ field.declaringType.addMethod(setterName) [ method |
+ method.primarySourceElement = field.primarySourceElement
+ method.addParameter(field.simpleName, argument.type)
+ method.static = field.static
+ method.visibility = Visibility.PUBLIC
+ method.returnType = primitiveVoid
+ method.body = [ctx|compileEitherSetterBody(field, argument, field.simpleName, ctx, context)]
+ ]
+ }
+
+ protected def CharSequence compileEitherSetterBody(
+ MutableFieldDeclaration field,
+ EitherTypeArgument argument,
+ String variableName,
+ extension CompilationContext compilationContext,
+ extension JsonRpcDataTransformationContext context
+ ) {
+ val hasNonNull = field.findAnnotation(NonNull.newTypeReference.type) !== null
+ val newVariableName = '_' + variableName
+ val CharSequence compileNewEither = '''«eitherType.toJavaCode».for«IF argument.right»Right«ELSE»Left«ENDIF»(«variableName»)'''
+ '''
+ if («variableName» == null) {
+ «IF hasNonNull»
+ «getPreconditionsUtil(field.declaringType, context)».checkNotNull(«variableName», "«field.simpleName»");
+ «ENDIF»
+ this.«field.simpleName» = null;
+ return;
+ }
+ «IF argument.parent !== null»
+ final «argument.parent.type.toJavaCode» «newVariableName» = «compileNewEither»;
+ «compileEitherSetterBody(field, argument.parent, newVariableName, compilationContext, context)»
+ «ELSE»
+ this.«field.simpleName» = «compileNewEither»;
+ «ENDIF»
+ '''
+ }
+
+ protected def generateToString(MutableClassDeclaration impl, extension TransformationContext context) {
+ val toStringFields = newArrayList
+ var ClassDeclaration c = impl
+ do {
+ toStringFields += c.declaredFields
+ c = c.extendedClass?.type as ClassDeclaration
+ } while (c !== null && c != object)
+ impl.addMethod("toString") [
+ returnType = string
+ addAnnotation(newAnnotationReference(Override))
+ addAnnotation(newAnnotationReference(Pure))
+ val accessorsUtil = new AccessorsProcessor.Util(context)
+ body = '''
+ «ToStringBuilder» b = new «ToStringBuilder»(this);
+ «FOR field : toStringFields»
+ b.add("«field.simpleName»", «IF field.declaringType == impl»this.«field.simpleName»«ELSE»«
+ accessorsUtil.getGetterName(field)»()«ENDIF»);
+ «ENDFOR»
+ return b.toString();
+ '''
+ ]
+ }
+
+ private def getPreconditionsUtil(Type type, extension TransformationContext context) {
+ if (type.qualifiedName.startsWith('org.eclipse.lsp4j.debug'))
+ newTypeReference('org.eclipse.lsp4j.debug.util.Preconditions')
+ else
+ newTypeReference('org.eclipse.lsp4j.util.Preconditions')
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/generator/JsonRpcDataTransformationContext.java b/java/org/eclipse/lsp4j/generator/JsonRpcDataTransformationContext.java
new file mode 100644
index 0000000..51b380b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonRpcDataTransformationContext.java
@@ -0,0 +1,418 @@
+/**
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.lsp4j.generator.EitherTypeArgument;
+import org.eclipse.lsp4j.generator.JsonType;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.xtend.lib.annotations.AccessorType;
+import org.eclipse.xtend.lib.annotations.Accessors;
+import org.eclipse.xtend.lib.annotations.Delegate;
+import org.eclipse.xtend.lib.macro.TransformationContext;
+import org.eclipse.xtend.lib.macro.declaration.AnnotationReference;
+import org.eclipse.xtend.lib.macro.declaration.Element;
+import org.eclipse.xtend.lib.macro.declaration.InterfaceDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableAnnotationTypeDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableElement;
+import org.eclipse.xtend.lib.macro.declaration.MutableEnumerationTypeDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableInterfaceDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.Type;
+import org.eclipse.xtend.lib.macro.declaration.TypeReference;
+import org.eclipse.xtend.lib.macro.file.Path;
+import org.eclipse.xtend.lib.macro.services.AnnotationReferenceBuildContext;
+import org.eclipse.xtend.lib.macro.services.Problem;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.xtext.xbase.lib.Functions.Function1;
+import org.eclipse.xtext.xbase.lib.IterableExtensions;
+import org.eclipse.xtext.xbase.lib.Procedures.Procedure0;
+import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
+import org.eclipse.xtext.xbase.lib.Pure;
+
+@SuppressWarnings("all")
+public class JsonRpcDataTransformationContext implements TransformationContext {
+ @Delegate
+ private final TransformationContext delegate;
+
+ @Accessors(AccessorType.PUBLIC_GETTER)
+ private final TypeReference eitherType;
+
+ public JsonRpcDataTransformationContext(final TransformationContext delegate) {
+ this.delegate = delegate;
+ this.eitherType = this.newTypeReference(Either.class);
+ }
+
+ public boolean isEither(final TypeReference typeReference) {
+ return ((typeReference != null) && this.eitherType.isAssignableFrom(typeReference));
+ }
+
+ public TypeReference getLeftType(final TypeReference typeReference) {
+ final Type type = typeReference.getType();
+ Type _type = this.eitherType.getType();
+ boolean _tripleEquals = (type == _type);
+ if (_tripleEquals) {
+ return IterableExtensions.<TypeReference>head(typeReference.getActualTypeArguments());
+ }
+ if ((type instanceof InterfaceDeclaration)) {
+ final Function1<TypeReference, TypeReference> _function = (TypeReference it) -> {
+ return this.getLeftType(it);
+ };
+ return IterableExtensions.<TypeReference>head(IterableExtensions.<TypeReference>filterNull(IterableExtensions.map(((InterfaceDeclaration)type).getExtendedInterfaces(), _function)));
+ }
+ return null;
+ }
+
+ public TypeReference getRightType(final TypeReference typeReference) {
+ final Type type = typeReference.getType();
+ Type _type = this.eitherType.getType();
+ boolean _tripleEquals = (type == _type);
+ if (_tripleEquals) {
+ return IterableExtensions.<TypeReference>last(typeReference.getActualTypeArguments());
+ }
+ if ((type instanceof InterfaceDeclaration)) {
+ final Function1<TypeReference, TypeReference> _function = (TypeReference it) -> {
+ return this.getRightType(it);
+ };
+ return IterableExtensions.<TypeReference>head(IterableExtensions.<TypeReference>filterNull(IterableExtensions.map(((InterfaceDeclaration)type).getExtendedInterfaces(), _function)));
+ }
+ return null;
+ }
+
+ public Collection<EitherTypeArgument> getChildTypes(final TypeReference typeReference) {
+ final ArrayList<EitherTypeArgument> types = CollectionLiterals.<EitherTypeArgument>newArrayList();
+ boolean _isEither = this.isEither(typeReference);
+ if (_isEither) {
+ this.collectChildTypes(this.getLeftType(typeReference), null, false, types);
+ this.collectChildTypes(this.getRightType(typeReference), null, true, types);
+ }
+ return types;
+ }
+
+ protected void collectChildTypes(final TypeReference type, final EitherTypeArgument parent, final boolean right, final Collection<EitherTypeArgument> types) {
+ final EitherTypeArgument argument = new EitherTypeArgument(type, parent, right);
+ boolean _isEither = this.isEither(type);
+ if (_isEither) {
+ this.collectChildTypes(this.getLeftType(type), argument, false, types);
+ this.collectChildTypes(this.getRightType(type), argument, true, types);
+ } else {
+ if ((type != null)) {
+ types.add(argument);
+ }
+ }
+ }
+
+ public boolean isJsonNull(final TypeReference type) {
+ JsonType _jsonType = this.getJsonType(type);
+ return (_jsonType == JsonType.NULL);
+ }
+
+ public boolean isJsonString(final TypeReference type) {
+ JsonType _jsonType = this.getJsonType(type);
+ return (_jsonType == JsonType.STRING);
+ }
+
+ public boolean isJsonNumber(final TypeReference type) {
+ JsonType _jsonType = this.getJsonType(type);
+ return (_jsonType == JsonType.NUMBER);
+ }
+
+ public boolean isJsonBoolean(final TypeReference type) {
+ JsonType _jsonType = this.getJsonType(type);
+ return (_jsonType == JsonType.BOOLEAN);
+ }
+
+ public boolean isJsonArray(final TypeReference type) {
+ JsonType _jsonType = this.getJsonType(type);
+ return (_jsonType == JsonType.ARRAY);
+ }
+
+ public boolean isJsonObject(final TypeReference type) {
+ JsonType _jsonType = this.getJsonType(type);
+ return (_jsonType == JsonType.OBJECT);
+ }
+
+ public JsonType getJsonType(final TypeReference type) {
+ if ((type == null)) {
+ return JsonType.NULL;
+ }
+ if ((type.isArray() || this.newTypeReference(List.class).isAssignableFrom(type))) {
+ return JsonType.ARRAY;
+ }
+ if ((this.newTypeReference(Enum.class).isAssignableFrom(type) || this.newTypeReference(Number.class).isAssignableFrom(type))) {
+ return JsonType.NUMBER;
+ }
+ boolean _isAssignableFrom = this.newTypeReference(Boolean.class).isAssignableFrom(type);
+ if (_isAssignableFrom) {
+ return JsonType.BOOLEAN;
+ }
+ if ((this.newTypeReference(String.class).isAssignableFrom(type) || this.newTypeReference(Character.class).isAssignableFrom(type))) {
+ return JsonType.STRING;
+ }
+ boolean _isPrimitive = type.isPrimitive();
+ boolean _not = (!_isPrimitive);
+ if (_not) {
+ return JsonType.OBJECT;
+ }
+ throw new IllegalStateException(("Unexpected type reference: " + type));
+ }
+
+ public void addError(final Element arg0, final String arg1) {
+ this.delegate.addError(arg0, arg1);
+ }
+
+ public void addWarning(final Element arg0, final String arg1) {
+ this.delegate.addWarning(arg0, arg1);
+ }
+
+ public boolean exists(final Path arg0) {
+ return this.delegate.exists(arg0);
+ }
+
+ public MutableAnnotationTypeDeclaration findAnnotationType(final String arg0) {
+ return this.delegate.findAnnotationType(arg0);
+ }
+
+ public MutableClassDeclaration findClass(final String arg0) {
+ return this.delegate.findClass(arg0);
+ }
+
+ public MutableEnumerationTypeDeclaration findEnumerationType(final String arg0) {
+ return this.delegate.findEnumerationType(arg0);
+ }
+
+ public MutableInterfaceDeclaration findInterface(final String arg0) {
+ return this.delegate.findInterface(arg0);
+ }
+
+ public Type findTypeGlobally(final Class<?> arg0) {
+ return this.delegate.findTypeGlobally(arg0);
+ }
+
+ public Type findTypeGlobally(final String arg0) {
+ return this.delegate.findTypeGlobally(arg0);
+ }
+
+ public TypeReference getAnyType() {
+ return this.delegate.getAnyType();
+ }
+
+ public String getCharset(final Path arg0) {
+ return this.delegate.getCharset(arg0);
+ }
+
+ public Iterable<? extends Path> getChildren(final Path arg0) {
+ return this.delegate.getChildren(arg0);
+ }
+
+ public CharSequence getContents(final Path arg0) {
+ return this.delegate.getContents(arg0);
+ }
+
+ public InputStream getContentsAsStream(final Path arg0) {
+ return this.delegate.getContentsAsStream(arg0);
+ }
+
+ public long getLastModification(final Path arg0) {
+ return this.delegate.getLastModification(arg0);
+ }
+
+ public TypeReference getList(final TypeReference arg0) {
+ return this.delegate.getList(arg0);
+ }
+
+ public TypeReference getObject() {
+ return this.delegate.getObject();
+ }
+
+ public Element getPrimaryGeneratedJavaElement(final Element arg0) {
+ return this.delegate.getPrimaryGeneratedJavaElement(arg0);
+ }
+
+ public Element getPrimarySourceElement(final Element arg0) {
+ return this.delegate.getPrimarySourceElement(arg0);
+ }
+
+ public TypeReference getPrimitiveBoolean() {
+ return this.delegate.getPrimitiveBoolean();
+ }
+
+ public TypeReference getPrimitiveByte() {
+ return this.delegate.getPrimitiveByte();
+ }
+
+ public TypeReference getPrimitiveChar() {
+ return this.delegate.getPrimitiveChar();
+ }
+
+ public TypeReference getPrimitiveDouble() {
+ return this.delegate.getPrimitiveDouble();
+ }
+
+ public TypeReference getPrimitiveFloat() {
+ return this.delegate.getPrimitiveFloat();
+ }
+
+ public TypeReference getPrimitiveInt() {
+ return this.delegate.getPrimitiveInt();
+ }
+
+ public TypeReference getPrimitiveLong() {
+ return this.delegate.getPrimitiveLong();
+ }
+
+ public TypeReference getPrimitiveShort() {
+ return this.delegate.getPrimitiveShort();
+ }
+
+ public TypeReference getPrimitiveVoid() {
+ return this.delegate.getPrimitiveVoid();
+ }
+
+ public List<? extends Problem> getProblems(final Element arg0) {
+ return this.delegate.getProblems(arg0);
+ }
+
+ public Path getProjectFolder(final Path arg0) {
+ return this.delegate.getProjectFolder(arg0);
+ }
+
+ public Set<Path> getProjectSourceFolders(final Path arg0) {
+ return this.delegate.getProjectSourceFolders(arg0);
+ }
+
+ public TypeReference getSet(final TypeReference arg0) {
+ return this.delegate.getSet(arg0);
+ }
+
+ public Path getSourceFolder(final Path arg0) {
+ return this.delegate.getSourceFolder(arg0);
+ }
+
+ public TypeReference getString() {
+ return this.delegate.getString();
+ }
+
+ public Path getTargetFolder(final Path arg0) {
+ return this.delegate.getTargetFolder(arg0);
+ }
+
+ public boolean isExternal(final Element arg0) {
+ return this.delegate.isExternal(arg0);
+ }
+
+ public boolean isFile(final Path arg0) {
+ return this.delegate.isFile(arg0);
+ }
+
+ public boolean isFolder(final Path arg0) {
+ return this.delegate.isFolder(arg0);
+ }
+
+ public boolean isGenerated(final Element arg0) {
+ return this.delegate.isGenerated(arg0);
+ }
+
+ public boolean isSource(final Element arg0) {
+ return this.delegate.isSource(arg0);
+ }
+
+ public boolean isThePrimaryGeneratedJavaElement(final Element arg0) {
+ return this.delegate.isThePrimaryGeneratedJavaElement(arg0);
+ }
+
+ public AnnotationReference newAnnotationReference(final AnnotationReference arg0) {
+ return this.delegate.newAnnotationReference(arg0);
+ }
+
+ public AnnotationReference newAnnotationReference(final AnnotationReference arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
+ return this.delegate.newAnnotationReference(arg0, arg1);
+ }
+
+ public AnnotationReference newAnnotationReference(final Class<?> arg0) {
+ return this.delegate.newAnnotationReference(arg0);
+ }
+
+ public AnnotationReference newAnnotationReference(final Class<?> arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
+ return this.delegate.newAnnotationReference(arg0, arg1);
+ }
+
+ public AnnotationReference newAnnotationReference(final String arg0) {
+ return this.delegate.newAnnotationReference(arg0);
+ }
+
+ public AnnotationReference newAnnotationReference(final String arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
+ return this.delegate.newAnnotationReference(arg0, arg1);
+ }
+
+ public AnnotationReference newAnnotationReference(final Type arg0) {
+ return this.delegate.newAnnotationReference(arg0);
+ }
+
+ public AnnotationReference newAnnotationReference(final Type arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
+ return this.delegate.newAnnotationReference(arg0, arg1);
+ }
+
+ public TypeReference newArrayTypeReference(final TypeReference arg0) {
+ return this.delegate.newArrayTypeReference(arg0);
+ }
+
+ public TypeReference newSelfTypeReference(final Type arg0) {
+ return this.delegate.newSelfTypeReference(arg0);
+ }
+
+ public TypeReference newTypeReference(final Class<?> arg0, final TypeReference... arg1) {
+ return this.delegate.newTypeReference(arg0, arg1);
+ }
+
+ public TypeReference newTypeReference(final String arg0, final TypeReference... arg1) {
+ return this.delegate.newTypeReference(arg0, arg1);
+ }
+
+ public TypeReference newTypeReference(final Type arg0, final TypeReference... arg1) {
+ return this.delegate.newTypeReference(arg0, arg1);
+ }
+
+ public TypeReference newWildcardTypeReference() {
+ return this.delegate.newWildcardTypeReference();
+ }
+
+ public TypeReference newWildcardTypeReference(final TypeReference arg0) {
+ return this.delegate.newWildcardTypeReference(arg0);
+ }
+
+ public TypeReference newWildcardTypeReferenceWithLowerBound(final TypeReference arg0) {
+ return this.delegate.newWildcardTypeReferenceWithLowerBound(arg0);
+ }
+
+ public void setPrimarySourceElement(final MutableElement arg0, final Element arg1) {
+ this.delegate.setPrimarySourceElement(arg0, arg1);
+ }
+
+ public URI toURI(final Path arg0) {
+ return this.delegate.toURI(arg0);
+ }
+
+ public void validateLater(final Procedure0 arg0) {
+ this.delegate.validateLater(arg0);
+ }
+
+ @Pure
+ public TypeReference getEitherType() {
+ return this.eitherType;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/generator/JsonRpcDataTransformationContext.xtend b/java/org/eclipse/lsp4j/generator/JsonRpcDataTransformationContext.xtend
new file mode 100644
index 0000000..f89d2fb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonRpcDataTransformationContext.xtend
@@ -0,0 +1,144 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.generator
+
+import java.util.Collection
+import java.util.List
+import org.eclipse.lsp4j.jsonrpc.messages.Either
+import org.eclipse.xtend.lib.annotations.Accessors
+import org.eclipse.xtend.lib.annotations.Delegate
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+import org.eclipse.xtend.lib.macro.TransformationContext
+import org.eclipse.xtend.lib.macro.declaration.InterfaceDeclaration
+import org.eclipse.xtend.lib.macro.declaration.TypeReference
+
+class JsonRpcDataTransformationContext implements TransformationContext {
+
+ @Delegate
+ val TransformationContext delegate
+ @Accessors(PUBLIC_GETTER)
+ val TypeReference eitherType
+
+ new(TransformationContext delegate) {
+ this.delegate = delegate
+ this.eitherType = Either.newTypeReference
+ }
+
+ def boolean isEither(TypeReference typeReference) {
+ return typeReference !== null && eitherType.isAssignableFrom(typeReference)
+ }
+
+ def TypeReference getLeftType(TypeReference typeReference) {
+ val type = typeReference.type
+ if (type === eitherType.type) {
+ return typeReference.actualTypeArguments.head
+ }
+ if (type instanceof InterfaceDeclaration) {
+ return type.extendedInterfaces.map[leftType].filterNull.head
+ }
+ return null
+ }
+
+ def TypeReference getRightType(TypeReference typeReference) {
+ val type = typeReference.type
+ if (type === eitherType.type) {
+ return typeReference.actualTypeArguments.last
+ }
+ if (type instanceof InterfaceDeclaration) {
+ return type.extendedInterfaces.map[rightType].filterNull.head
+ }
+ return null
+ }
+
+ def Collection<EitherTypeArgument> getChildTypes(TypeReference typeReference) {
+ val types = newArrayList
+ if (typeReference.either) {
+ typeReference.leftType.collectChildTypes(null, false, types)
+ typeReference.rightType.collectChildTypes(null, true, types)
+ }
+ return types
+ }
+
+ protected def void collectChildTypes(TypeReference type, EitherTypeArgument parent, boolean right, Collection<EitherTypeArgument> types) {
+ val argument = new EitherTypeArgument(type, parent, right)
+ if (type.either) {
+ type.leftType.collectChildTypes(argument, false, types)
+ type.rightType.collectChildTypes(argument, true, types)
+ } else if (type !== null) {
+ types.add(argument)
+ }
+ }
+
+ def boolean isJsonNull(TypeReference type) {
+ return type.jsonType === JsonType.NULL
+ }
+
+ def boolean isJsonString(TypeReference type) {
+ return type.jsonType === JsonType.STRING
+ }
+
+ def boolean isJsonNumber(TypeReference type) {
+ return type.jsonType === JsonType.NUMBER
+ }
+
+ def boolean isJsonBoolean(TypeReference type) {
+ return type.jsonType === JsonType.BOOLEAN
+ }
+
+ def boolean isJsonArray(TypeReference type) {
+ return type.jsonType === JsonType.ARRAY
+ }
+
+ def boolean isJsonObject(TypeReference type) {
+ return type.jsonType === JsonType.OBJECT
+ }
+
+ def JsonType getJsonType(TypeReference type) {
+ if (type === null) {
+ return JsonType.NULL
+ }
+ if (type.array || List.newTypeReference.isAssignableFrom(type)) {
+ return JsonType.ARRAY
+ }
+ if (Enum.newTypeReference.isAssignableFrom(type) || Number.newTypeReference.isAssignableFrom(type)) {
+ return JsonType.NUMBER
+ }
+ if (Boolean.newTypeReference.isAssignableFrom(type)) {
+ return JsonType.BOOLEAN
+ }
+ if (String.newTypeReference.isAssignableFrom(type) || Character.newTypeReference.isAssignableFrom(type)) {
+ return JsonType.STRING
+ }
+ if (!type.primitive) {
+ return JsonType.OBJECT
+ }
+ throw new IllegalStateException('Unexpected type reference: ' + type)
+ }
+
+}
+
+@Accessors
+@FinalFieldsConstructor
+class EitherTypeArgument {
+ val TypeReference type
+ val EitherTypeArgument parent
+ val boolean right
+}
+
+enum JsonType {
+ NULL,
+ STRING,
+ NUMBER,
+ BOOLEAN,
+ ARRAY,
+ OBJECT
+}
diff --git a/java/org/eclipse/lsp4j/generator/JsonType.java b/java/org/eclipse/lsp4j/generator/JsonType.java
new file mode 100644
index 0000000..06fc0f6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/JsonType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+@SuppressWarnings("all")
+public enum JsonType {
+ NULL,
+
+ STRING,
+
+ NUMBER,
+
+ BOOLEAN,
+
+ ARRAY,
+
+ OBJECT;
+}
diff --git a/java/org/eclipse/lsp4j/generator/LanguageServerAPI.java b/java/org/eclipse/lsp4j/generator/LanguageServerAPI.java
new file mode 100644
index 0000000..b39d10a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/LanguageServerAPI.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.eclipse.lsp4j.generator.JsonRpcDataProcessor;
+import org.eclipse.xtend.lib.macro.Active;
+
+/**
+ * @deprecated use JsonRpcData instead
+ */
+@Deprecated
+@Target(ElementType.TYPE)
+@Active(JsonRpcDataProcessor.class)
+@Retention(RetentionPolicy.SOURCE)
+@SuppressWarnings("all")
+public @interface LanguageServerAPI {
+}
diff --git a/java/org/eclipse/lsp4j/generator/LanguageServerAPI.xtend b/java/org/eclipse/lsp4j/generator/LanguageServerAPI.xtend
new file mode 100644
index 0000000..22fc964
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/LanguageServerAPI.xtend
@@ -0,0 +1,27 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.generator
+
+import java.lang.annotation.ElementType
+import java.lang.annotation.Target
+import org.eclipse.xtend.lib.macro.Active
+import java.lang.annotation.Retention
+
+/**
+ * @deprecated use JsonRpcData instead
+ */
+@Deprecated
+@Target(ElementType.TYPE)
+@Active(JsonRpcDataProcessor)
+@Retention(SOURCE)
+annotation LanguageServerAPI {
+}
diff --git a/java/org/eclipse/lsp4j/generator/TypeAdapterImpl.java b/java/org/eclipse/lsp4j/generator/TypeAdapterImpl.java
new file mode 100644
index 0000000..9c58b53
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/TypeAdapterImpl.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.eclipse.lsp4j.generator.TypeAdapterImplProcessor;
+import org.eclipse.xtend.lib.macro.Active;
+
+/**
+ * Used to simplify the implementation of Gson TypeAdapters.
+ */
+@Target(ElementType.TYPE)
+@Active(TypeAdapterImplProcessor.class)
+@Retention(RetentionPolicy.SOURCE)
+@SuppressWarnings("all")
+public @interface TypeAdapterImpl {
+ public Class<?> value();
+}
diff --git a/java/org/eclipse/lsp4j/generator/TypeAdapterImpl.xtend b/java/org/eclipse/lsp4j/generator/TypeAdapterImpl.xtend
new file mode 100644
index 0000000..1f1ebd6
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/TypeAdapterImpl.xtend
@@ -0,0 +1,29 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.generator
+
+import java.lang.annotation.ElementType
+import java.lang.annotation.Retention
+import java.lang.annotation.Target
+import org.eclipse.xtend.lib.macro.Active
+
+/**
+ * Used to simplify the implementation of Gson TypeAdapters.
+ */
+@Target(ElementType.TYPE)
+@Active(TypeAdapterImplProcessor)
+@Retention(SOURCE)
+annotation TypeAdapterImpl {
+
+ Class<?> value
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/generator/TypeAdapterImplProcessor.java b/java/org/eclipse/lsp4j/generator/TypeAdapterImplProcessor.java
new file mode 100644
index 0000000..b9cd39a
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/TypeAdapterImplProcessor.java
@@ -0,0 +1,478 @@
+/**
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+package org.eclipse.lsp4j.generator;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Iterables;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import org.eclipse.lsp4j.generator.TypeAdapterImpl;
+import org.eclipse.xtend.lib.macro.AbstractClassProcessor;
+import org.eclipse.xtend.lib.macro.RegisterGlobalsContext;
+import org.eclipse.xtend.lib.macro.TransformationContext;
+import org.eclipse.xtend.lib.macro.declaration.AnnotationReference;
+import org.eclipse.xtend.lib.macro.declaration.ClassDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.FieldDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableConstructorDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableFieldDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableMethodDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.MutableTypeParameterDeclaration;
+import org.eclipse.xtend.lib.macro.declaration.Type;
+import org.eclipse.xtend.lib.macro.declaration.TypeReference;
+import org.eclipse.xtend.lib.macro.declaration.Visibility;
+import org.eclipse.xtend2.lib.StringConcatenationClient;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.xtext.xbase.lib.Extension;
+import org.eclipse.xtext.xbase.lib.Functions.Function1;
+import org.eclipse.xtext.xbase.lib.IterableExtensions;
+import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
+import org.eclipse.xtext.xbase.lib.StringExtensions;
+
+@SuppressWarnings("all")
+public class TypeAdapterImplProcessor extends AbstractClassProcessor {
+ @Override
+ public void doRegisterGlobals(final ClassDeclaration annotatedClass, @Extension final RegisterGlobalsContext context) {
+ String _qualifiedName = annotatedClass.getQualifiedName();
+ String _plus = (_qualifiedName + ".Factory");
+ context.registerClass(_plus);
+ }
+
+ @Override
+ public void doTransform(final MutableClassDeclaration annotatedClass, @Extension final TransformationContext context) {
+ final AnnotationReference typeAdapterImplAnnotation = annotatedClass.findAnnotation(context.findTypeGlobally(TypeAdapterImpl.class));
+ final TypeReference targetType = typeAdapterImplAnnotation.getClassValue("value");
+ this.generateImpl(annotatedClass, targetType, context);
+ String _qualifiedName = annotatedClass.getQualifiedName();
+ String _plus = (_qualifiedName + ".Factory");
+ this.generateFactory(context.findClass(_plus), annotatedClass, targetType, context);
+ }
+
+ protected MutableClassDeclaration generateImpl(final MutableClassDeclaration impl, final TypeReference targetType, @Extension final TransformationContext context) {
+ final ArrayList<FieldDeclaration> targetFields = this.getTargetFields(targetType, context);
+ final Function1<FieldDeclaration, Boolean> _function = (FieldDeclaration it) -> {
+ return Boolean.valueOf(((!it.getType().isPrimitive()) && (!it.getType().getActualTypeArguments().isEmpty())));
+ };
+ Iterable<FieldDeclaration> _filter = IterableExtensions.<FieldDeclaration>filter(targetFields, _function);
+ for (final FieldDeclaration field : _filter) {
+ String _upperCase = field.getSimpleName().toUpperCase();
+ String _plus = (_upperCase + "_TYPE_TOKEN");
+ final Procedure1<MutableFieldDeclaration> _function_1 = (MutableFieldDeclaration it) -> {
+ it.setFinal(true);
+ it.setStatic(true);
+ it.setType(context.newTypeReference("com.google.gson.reflect.TypeToken", field.getType()));
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("new TypeToken<");
+ TypeReference _type = field.getType();
+ _builder.append(_type);
+ _builder.append(">() {}");
+ }
+ };
+ it.setInitializer(_client);
+ };
+ impl.addField(_plus, _function_1);
+ }
+ impl.setExtendedClass(context.newTypeReference("com.google.gson.TypeAdapter", targetType));
+ final Procedure1<MutableFieldDeclaration> _function_2 = (MutableFieldDeclaration it) -> {
+ it.setType(context.newTypeReference("com.google.gson.Gson"));
+ it.setFinal(true);
+ };
+ impl.addField("gson", _function_2);
+ final Procedure1<MutableConstructorDeclaration> _function_3 = (MutableConstructorDeclaration it) -> {
+ it.addParameter("gson", context.newTypeReference("com.google.gson.Gson"));
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("this.gson = gson;");
+ _builder.newLine();
+ }
+ };
+ it.setBody(_client);
+ };
+ impl.addConstructor(_function_3);
+ final Procedure1<MutableMethodDeclaration> _function_4 = (MutableMethodDeclaration method) -> {
+ method.addParameter("in", context.newTypeReference("com.google.gson.stream.JsonReader"));
+ method.setExceptions(context.newTypeReference(IOException.class));
+ method.setReturnType(targetType);
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ TypeReference _newTypeReference = context.newTypeReference("com.google.gson.stream.JsonToken");
+ _builder.append(_newTypeReference);
+ _builder.append(" nextToken = in.peek();");
+ _builder.newLineIfNotEmpty();
+ _builder.append("if (nextToken == JsonToken.NULL) {");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("return null;");
+ _builder.newLine();
+ _builder.append("}");
+ _builder.newLine();
+ _builder.newLine();
+ _builder.append(targetType);
+ _builder.append(" result = new ");
+ _builder.append(targetType);
+ _builder.append("();");
+ _builder.newLineIfNotEmpty();
+ _builder.append("in.beginObject();");
+ _builder.newLine();
+ _builder.append("while (in.hasNext()) {");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("String name = in.nextName();");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("switch (name) {");
+ _builder.newLine();
+ {
+ for(final FieldDeclaration field : targetFields) {
+ _builder.append("\t");
+ _builder.append("case \"");
+ String _simpleName = field.getSimpleName();
+ _builder.append(_simpleName, "\t");
+ _builder.append("\":");
+ _builder.newLineIfNotEmpty();
+ _builder.append("\t");
+ _builder.append("\t");
+ _builder.append("result.set");
+ String _firstUpper = StringExtensions.toFirstUpper(field.getSimpleName());
+ _builder.append(_firstUpper, "\t\t");
+ _builder.append("(read");
+ String _firstUpper_1 = StringExtensions.toFirstUpper(field.getSimpleName());
+ _builder.append(_firstUpper_1, "\t\t");
+ _builder.append("(in));");
+ _builder.newLineIfNotEmpty();
+ _builder.append("\t");
+ _builder.append("\t");
+ _builder.append("break;");
+ _builder.newLine();
+ }
+ }
+ _builder.append("\t");
+ _builder.append("default:");
+ _builder.newLine();
+ _builder.append("\t\t");
+ _builder.append("in.skipValue();");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("}");
+ _builder.newLine();
+ _builder.append("}");
+ _builder.newLine();
+ _builder.append("in.endObject();");
+ _builder.newLine();
+ _builder.append("return result;");
+ _builder.newLine();
+ }
+ };
+ method.setBody(_client);
+ };
+ impl.addMethod("read", _function_4);
+ for (final FieldDeclaration field_1 : targetFields) {
+ {
+ String _firstUpper = StringExtensions.toFirstUpper(field_1.getSimpleName());
+ String _plus_1 = ("read" + _firstUpper);
+ final MutableMethodDeclaration existingMethod = impl.findDeclaredMethod(_plus_1,
+ context.newTypeReference("com.google.gson.stream.JsonReader"));
+ if ((existingMethod == null)) {
+ String _firstUpper_1 = StringExtensions.toFirstUpper(field_1.getSimpleName());
+ String _plus_2 = ("read" + _firstUpper_1);
+ final Procedure1<MutableMethodDeclaration> _function_5 = (MutableMethodDeclaration it) -> {
+ it.setVisibility(Visibility.PROTECTED);
+ it.addParameter("in", context.newTypeReference("com.google.gson.stream.JsonReader"));
+ it.setExceptions(context.newTypeReference(IOException.class));
+ it.setReturnType(field_1.getType());
+ boolean _isPrimitive = field_1.getType().isPrimitive();
+ if (_isPrimitive) {
+ String _simpleName = field_1.getType().getSimpleName();
+ if (_simpleName != null) {
+ switch (_simpleName) {
+ case "boolean":
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return in.nextBoolean();");
+ }
+ };
+ it.setBody(_client);
+ break;
+ case "double":
+ StringConcatenationClient _client_1 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return in.nextDouble();");
+ }
+ };
+ it.setBody(_client_1);
+ break;
+ case "float":
+ StringConcatenationClient _client_2 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return (float) in.nextDouble();");
+ }
+ };
+ it.setBody(_client_2);
+ break;
+ case "long":
+ StringConcatenationClient _client_3 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return in.nextLong();");
+ }
+ };
+ it.setBody(_client_3);
+ break;
+ case "int":
+ StringConcatenationClient _client_4 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return in.nextInt();");
+ }
+ };
+ it.setBody(_client_4);
+ break;
+ case "short":
+ case "byte":
+ case "char":
+ StringConcatenationClient _client_5 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return (");
+ TypeReference _type = field_1.getType();
+ _builder.append(_type);
+ _builder.append(") in.nextInt();");
+ }
+ };
+ it.setBody(_client_5);
+ break;
+ }
+ }
+ } else {
+ boolean _isEmpty = field_1.getType().getActualTypeArguments().isEmpty();
+ boolean _not = (!_isEmpty);
+ if (_not) {
+ StringConcatenationClient _client_6 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return gson.fromJson(in, ");
+ String _upperCase = field_1.getSimpleName().toUpperCase();
+ _builder.append(_upperCase);
+ _builder.append("_TYPE_TOKEN.getType());");
+ }
+ };
+ it.setBody(_client_6);
+ } else {
+ StringConcatenationClient _client_7 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("return gson.fromJson(in, ");
+ TypeReference _type = field_1.getType();
+ _builder.append(_type);
+ _builder.append(".class);");
+ }
+ };
+ it.setBody(_client_7);
+ }
+ }
+ };
+ impl.addMethod(_plus_2, _function_5);
+ }
+ }
+ }
+ final Procedure1<MutableMethodDeclaration> _function_5 = (MutableMethodDeclaration method) -> {
+ method.addParameter("out", context.newTypeReference("com.google.gson.stream.JsonWriter"));
+ method.addParameter("value", targetType);
+ method.setExceptions(context.newTypeReference(IOException.class));
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("if (value == null) {");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("out.nullValue();");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("return;");
+ _builder.newLine();
+ _builder.append("}");
+ _builder.newLine();
+ _builder.newLine();
+ _builder.append("out.beginObject();");
+ _builder.newLine();
+ {
+ for(final FieldDeclaration field : targetFields) {
+ _builder.append("out.name(\"");
+ String _simpleName = field.getSimpleName();
+ _builder.append(_simpleName);
+ _builder.append("\");");
+ _builder.newLineIfNotEmpty();
+ _builder.append("write");
+ String _firstUpper = StringExtensions.toFirstUpper(field.getSimpleName());
+ _builder.append(_firstUpper);
+ _builder.append("(out, value.get");
+ String _firstUpper_1 = StringExtensions.toFirstUpper(field.getSimpleName());
+ _builder.append(_firstUpper_1);
+ _builder.append("());");
+ _builder.newLineIfNotEmpty();
+ }
+ }
+ _builder.append("out.endObject();");
+ _builder.newLine();
+ }
+ };
+ method.setBody(_client);
+ };
+ impl.addMethod("write", _function_5);
+ final Type booleanType = context.findTypeGlobally(Boolean.class);
+ final Type numberType = context.findTypeGlobally(Number.class);
+ final Type stringType = context.findTypeGlobally(String.class);
+ for (final FieldDeclaration field_2 : targetFields) {
+ {
+ String _firstUpper = StringExtensions.toFirstUpper(field_2.getSimpleName());
+ String _plus_1 = ("write" + _firstUpper);
+ final MutableMethodDeclaration existingMethod = impl.findDeclaredMethod(_plus_1,
+ context.newTypeReference("com.google.gson.stream.JsonWriter"), field_2.getType());
+ if ((existingMethod == null)) {
+ String _firstUpper_1 = StringExtensions.toFirstUpper(field_2.getSimpleName());
+ String _plus_2 = ("write" + _firstUpper_1);
+ final Procedure1<MutableMethodDeclaration> _function_6 = (MutableMethodDeclaration it) -> {
+ it.setVisibility(Visibility.PROTECTED);
+ it.addParameter("out", context.newTypeReference("com.google.gson.stream.JsonWriter"));
+ it.addParameter("value", field_2.getType());
+ it.setExceptions(context.newTypeReference(IOException.class));
+ if ((((field_2.getType().isPrimitive() || booleanType.isAssignableFrom(field_2.getType().getType())) || numberType.isAssignableFrom(field_2.getType().getType())) || stringType.isAssignableFrom(field_2.getType().getType()))) {
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("out.value(value);");
+ _builder.newLine();
+ }
+ };
+ it.setBody(_client);
+ } else {
+ boolean _isEmpty = field_2.getType().getActualTypeArguments().isEmpty();
+ boolean _not = (!_isEmpty);
+ if (_not) {
+ StringConcatenationClient _client_1 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("gson.toJson(value, ");
+ String _upperCase = field_2.getSimpleName().toUpperCase();
+ _builder.append(_upperCase);
+ _builder.append("_TYPE_TOKEN.getType(), out);");
+ _builder.newLineIfNotEmpty();
+ }
+ };
+ it.setBody(_client_1);
+ } else {
+ TypeReference _type = field_2.getType();
+ TypeReference _newTypeReference = context.newTypeReference(Object.class);
+ boolean _equals = Objects.equal(_type, _newTypeReference);
+ if (_equals) {
+ StringConcatenationClient _client_2 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("if (value == null)");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("out.nullValue();");
+ _builder.newLine();
+ _builder.append("else");
+ _builder.newLine();
+ _builder.append("\t");
+ _builder.append("gson.toJson(value, value.getClass(), out);");
+ _builder.newLine();
+ }
+ };
+ it.setBody(_client_2);
+ } else {
+ StringConcatenationClient _client_3 = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("gson.toJson(value, ");
+ TypeReference _type = field_2.getType();
+ _builder.append(_type);
+ _builder.append(".class, out);");
+ _builder.newLineIfNotEmpty();
+ }
+ };
+ it.setBody(_client_3);
+ }
+ }
+ }
+ };
+ impl.addMethod(_plus_2, _function_6);
+ }
+ }
+ }
+ return impl;
+ }
+
+ protected MutableMethodDeclaration generateFactory(final MutableClassDeclaration factory, final MutableClassDeclaration impl, final TypeReference targetType, @Extension final TransformationContext context) {
+ MutableMethodDeclaration _xblockexpression = null;
+ {
+ TypeReference _newTypeReference = context.newTypeReference("com.google.gson.TypeAdapterFactory");
+ factory.setImplementedInterfaces(Collections.<TypeReference>unmodifiableList(CollectionLiterals.<TypeReference>newArrayList(_newTypeReference)));
+ final Procedure1<MutableMethodDeclaration> _function = (MutableMethodDeclaration it) -> {
+ final MutableTypeParameterDeclaration t = it.addTypeParameter("T");
+ it.addParameter("gson", context.newTypeReference("com.google.gson.Gson"));
+ it.addParameter("typeToken", context.newTypeReference("com.google.gson.reflect.TypeToken", context.newTypeReference(t)));
+ it.setReturnType(context.newTypeReference("com.google.gson.TypeAdapter", context.newTypeReference(t)));
+ StringConcatenationClient _client = new StringConcatenationClient() {
+ @Override
+ protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
+ _builder.append("if (!");
+ _builder.append(targetType);
+ _builder.append(".class.isAssignableFrom(typeToken.getRawType())) {");
+ _builder.newLineIfNotEmpty();
+ _builder.append("\t");
+ _builder.append("return null;");
+ _builder.newLine();
+ _builder.append("}");
+ _builder.newLine();
+ _builder.append("return (TypeAdapter<T>) new ");
+ _builder.append(impl);
+ _builder.append("(gson);");
+ _builder.newLineIfNotEmpty();
+ }
+ };
+ it.setBody(_client);
+ };
+ _xblockexpression = factory.addMethod("create", _function);
+ }
+ return _xblockexpression;
+ }
+
+ private ArrayList<FieldDeclaration> getTargetFields(final TypeReference targetType, @Extension final TransformationContext context) {
+ final Type objectType = context.newTypeReference(Object.class).getType();
+ final ArrayList<FieldDeclaration> targetFields = CollectionLiterals.<FieldDeclaration>newArrayList();
+ TypeReference typeRef = targetType;
+ while ((!Objects.equal(typeRef.getType(), objectType))) {
+ {
+ Type _type = typeRef.getType();
+ final ClassDeclaration clazz = ((ClassDeclaration) _type);
+ final Function1<FieldDeclaration, Boolean> _function = (FieldDeclaration it) -> {
+ boolean _isStatic = it.isStatic();
+ return Boolean.valueOf((!_isStatic));
+ };
+ Iterable<? extends FieldDeclaration> _filter = IterableExtensions.filter(clazz.getDeclaredFields(), _function);
+ Iterables.<FieldDeclaration>addAll(targetFields, _filter);
+ typeRef = clazz.getExtendedClass();
+ }
+ }
+ return targetFields;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/generator/TypeAdapterImplProcessor.xtend b/java/org/eclipse/lsp4j/generator/TypeAdapterImplProcessor.xtend
new file mode 100644
index 0000000..665a7bd
--- /dev/null
+++ b/java/org/eclipse/lsp4j/generator/TypeAdapterImplProcessor.xtend
@@ -0,0 +1,209 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.generator
+
+import java.io.IOException
+import org.eclipse.xtend.lib.macro.AbstractClassProcessor
+import org.eclipse.xtend.lib.macro.RegisterGlobalsContext
+import org.eclipse.xtend.lib.macro.TransformationContext
+import org.eclipse.xtend.lib.macro.declaration.ClassDeclaration
+import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration
+import org.eclipse.xtend.lib.macro.declaration.TypeReference
+import org.eclipse.xtend.lib.macro.declaration.Visibility
+
+class TypeAdapterImplProcessor extends AbstractClassProcessor {
+
+ override doRegisterGlobals(ClassDeclaration annotatedClass, extension RegisterGlobalsContext context) {
+ registerClass(annotatedClass.qualifiedName + '.Factory')
+ }
+
+ override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {
+ val typeAdapterImplAnnotation = annotatedClass.findAnnotation(TypeAdapterImpl.findTypeGlobally)
+ val targetType = typeAdapterImplAnnotation.getClassValue('value')
+ generateImpl(annotatedClass, targetType, context)
+ generateFactory(findClass(annotatedClass.qualifiedName + '.Factory'), annotatedClass, targetType, context)
+ }
+
+ protected def generateImpl(MutableClassDeclaration impl, TypeReference targetType, extension TransformationContext context) {
+ val targetFields = getTargetFields(targetType, context)
+ for (field : targetFields.filter[!type.isPrimitive && !type.actualTypeArguments.empty]) {
+ impl.addField(field.simpleName.toUpperCase + '_TYPE_TOKEN') [
+ final = true
+ static = true
+ type = newTypeReference('com.google.gson.reflect.TypeToken', field.type)
+ initializer = '''new TypeToken<«field.type»>() {}'''
+ ]
+ }
+
+ impl.extendedClass = newTypeReference('com.google.gson.TypeAdapter', targetType)
+ impl.addField('gson') [
+ type = newTypeReference('com.google.gson.Gson')
+ final = true
+ ]
+ impl.addConstructor[
+ addParameter('gson', newTypeReference('com.google.gson.Gson'))
+ body = '''
+ this.gson = gson;
+ '''
+ ]
+
+ impl.addMethod('read') [ method |
+ method.addParameter('in', newTypeReference('com.google.gson.stream.JsonReader'))
+ method.exceptions = newTypeReference(IOException)
+ method.returnType = targetType
+ method.body = '''
+ «newTypeReference('com.google.gson.stream.JsonToken')» nextToken = in.peek();
+ if (nextToken == JsonToken.NULL) {
+ return null;
+ }
+
+ «targetType» result = new «targetType»();
+ in.beginObject();
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ «FOR field : targetFields»
+ case "«field.simpleName»":
+ result.set«field.simpleName.toFirstUpper»(read«field.simpleName.toFirstUpper»(in));
+ break;
+ «ENDFOR»
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+ return result;
+ '''
+ ]
+
+ for (field : targetFields) {
+ val existingMethod = impl.findDeclaredMethod('read' + field.simpleName.toFirstUpper,
+ newTypeReference('com.google.gson.stream.JsonReader'))
+ if (existingMethod === null) {
+ impl.addMethod('read' + field.simpleName.toFirstUpper) [
+ visibility = Visibility.PROTECTED
+ addParameter('in', newTypeReference('com.google.gson.stream.JsonReader'))
+ exceptions = newTypeReference(IOException)
+ returnType = field.type
+ if (field.type.isPrimitive) {
+ switch field.type.simpleName {
+ case 'boolean':
+ body = '''return in.nextBoolean();'''
+ case 'double':
+ body = '''return in.nextDouble();'''
+ case 'float':
+ body = '''return (float) in.nextDouble();'''
+ case 'long':
+ body = '''return in.nextLong();'''
+ case 'int':
+ body = '''return in.nextInt();'''
+ case 'short', case 'byte', case 'char':
+ body = '''return («field.type») in.nextInt();'''
+ }
+ } else if (!field.type.actualTypeArguments.empty) {
+ body = '''return gson.fromJson(in, «field.simpleName.toUpperCase»_TYPE_TOKEN.getType());'''
+ } else {
+ body = '''return gson.fromJson(in, «field.type».class);'''
+ }
+ ]
+ }
+ }
+
+ impl.addMethod('write') [ method |
+ method.addParameter('out', newTypeReference('com.google.gson.stream.JsonWriter'))
+ method.addParameter('value', targetType)
+ method.exceptions = newTypeReference(IOException)
+ method.body = '''
+ if (value == null) {
+ out.nullValue();
+ return;
+ }
+
+ out.beginObject();
+ «FOR field : targetFields»
+ out.name("«field.simpleName»");
+ write«field.simpleName.toFirstUpper»(out, value.get«field.simpleName.toFirstUpper»());
+ «ENDFOR»
+ out.endObject();
+ '''
+ ]
+
+ val booleanType = Boolean.findTypeGlobally
+ val numberType = Number.findTypeGlobally
+ val stringType = String.findTypeGlobally
+ for (field : targetFields) {
+ val existingMethod = impl.findDeclaredMethod('write' + field.simpleName.toFirstUpper,
+ newTypeReference('com.google.gson.stream.JsonWriter'), field.type)
+ if (existingMethod === null) {
+ impl.addMethod('write' + field.simpleName.toFirstUpper) [
+ visibility = Visibility.PROTECTED
+ addParameter('out', newTypeReference('com.google.gson.stream.JsonWriter'))
+ addParameter('value', field.type)
+ exceptions = newTypeReference(IOException)
+ if (field.type.isPrimitive || booleanType.isAssignableFrom(field.type.type) || numberType.isAssignableFrom(field.type.type)
+ || stringType.isAssignableFrom(field.type.type)) {
+ body = '''
+ out.value(value);
+ '''
+ } else if (!field.type.actualTypeArguments.empty) {
+ body = '''
+ gson.toJson(value, «field.simpleName.toUpperCase»_TYPE_TOKEN.getType(), out);
+ '''
+ } else if (field.type == Object.newTypeReference) {
+ body = '''
+ if (value == null)
+ out.nullValue();
+ else
+ gson.toJson(value, value.getClass(), out);
+ '''
+ } else {
+ body = '''
+ gson.toJson(value, «field.type».class, out);
+ '''
+ }
+ ]
+ }
+ }
+
+ return impl
+ }
+
+ protected def generateFactory(MutableClassDeclaration factory, MutableClassDeclaration impl, TypeReference targetType,
+ extension TransformationContext context) {
+ factory.implementedInterfaces = #[newTypeReference('com.google.gson.TypeAdapterFactory')]
+ factory.addMethod('create') [
+ val t = addTypeParameter('T')
+ addParameter('gson', newTypeReference('com.google.gson.Gson'))
+ addParameter('typeToken', newTypeReference('com.google.gson.reflect.TypeToken', newTypeReference(t)))
+ returnType = newTypeReference('com.google.gson.TypeAdapter', newTypeReference(t))
+ body = '''
+ if (!«targetType».class.isAssignableFrom(typeToken.getRawType())) {
+ return null;
+ }
+ return (TypeAdapter<T>) new «impl»(gson);
+ '''
+ ]
+ }
+
+ private def getTargetFields(TypeReference targetType, extension TransformationContext context) {
+ val objectType = Object.newTypeReference.type
+ val targetFields = newArrayList
+ var typeRef = targetType
+ while (typeRef.type != objectType) {
+ val clazz = typeRef.type as ClassDeclaration
+ targetFields += clazz.declaredFields.filter[!static]
+ typeRef = clazz.extendedClass
+ }
+ return targetFields
+ }
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/jsonrpc/CancelChecker.java b/java/org/eclipse/lsp4j/jsonrpc/CancelChecker.java
new file mode 100644
index 0000000..330276b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/CancelChecker.java
@@ -0,0 +1,39 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.util.concurrent.CancellationException;
+
+/**
+ * Used for processing requests with cancellation support.
+ */
+public interface CancelChecker {
+
+ /**
+ * Throw a {@link CancellationException} if the currently processed request
+ * has been canceled.
+ */
+ void checkCanceled();
+
+ /**
+ * Check for cancellation without throwing an exception.
+ */
+ default boolean isCanceled() {
+ try {
+ checkCanceled();
+ } catch (CancellationException ce) {
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/CompletableFutures.java b/java/org/eclipse/lsp4j/jsonrpc/CompletableFutures.java
new file mode 100644
index 0000000..44682f9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/CompletableFutures.java
@@ -0,0 +1,69 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.function.Function;
+
+public final class CompletableFutures {
+ private CompletableFutures() {}
+
+ /**
+ * A utility method to create a {@link CompletableFuture} with cancellation support.
+ *
+ * @param code a function that accepts a {@link CancelChecker} and returns the to be computed value
+ * @return a future
+ */
+ public static <R> CompletableFuture<R> computeAsync(Function<CancelChecker, R> code) {
+ CompletableFuture<CancelChecker> start = new CompletableFuture<>();
+ CompletableFuture<R> result = start.thenApplyAsync(code);
+ start.complete(new FutureCancelChecker(result));
+ return result;
+ }
+
+ /**
+ * A utility method to create a {@link CompletableFuture} with cancellation support.
+ *
+ * @param code a function that accepts a {@link CancelChecker} and returns the to be computed value
+ * @return a future
+ */
+ public static <R> CompletableFuture<R> computeAsync(Executor executor, Function<CancelChecker, R> code) {
+ CompletableFuture<CancelChecker> start = new CompletableFuture<>();
+ CompletableFuture<R> result = start.thenApplyAsync(code, executor);
+ start.complete(new FutureCancelChecker(result));
+ return result;
+ }
+
+ public static class FutureCancelChecker implements CancelChecker {
+
+ private final CompletableFuture<?> future;
+
+ public FutureCancelChecker(CompletableFuture<?> future) {
+ this.future = future;
+ }
+
+ @Override
+ public void checkCanceled() {
+ if (future.isCancelled())
+ throw new CancellationException();
+ }
+
+ @Override
+ public boolean isCanceled() {
+ return future.isCancelled();
+ }
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/Endpoint.java b/java/org/eclipse/lsp4j/jsonrpc/Endpoint.java
new file mode 100644
index 0000000..82cac6c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/Endpoint.java
@@ -0,0 +1,25 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * An endpoint is a generic interface that accepts jsonrpc requests and notifications.
+ */
+public interface Endpoint {
+
+ CompletableFuture<?> request(String method, Object parameter);
+
+ void notify(String method, Object parameter);
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/JsonRpcException.java b/java/org/eclipse/lsp4j/jsonrpc/JsonRpcException.java
new file mode 100644
index 0000000..7cbc786
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/JsonRpcException.java
@@ -0,0 +1,44 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.SocketException;
+import java.nio.channels.ClosedChannelException;
+
+/**
+ * An exception thrown when accessing the JSON-RPC communication channel fails.
+ */
+public class JsonRpcException extends RuntimeException {
+
+ /**
+ * Whether the given exception indicates that the currently accessed stream has been closed.
+ */
+ public static boolean indicatesStreamClosed(Throwable thr) {
+ return thr instanceof InterruptedIOException
+ || thr instanceof ClosedChannelException
+ || thr instanceof IOException && "Pipe closed".equals(thr.getMessage())
+ || thr instanceof SocketException &&
+ ("Connection reset".equals(thr.getMessage()) ||
+ "Socket closed".equals(thr.getMessage()) ||
+ "Broken pipe (Write failed)".equals(thr.getMessage()))
+ || thr instanceof JsonRpcException && indicatesStreamClosed(thr.getCause());
+ }
+
+ private static final long serialVersionUID = -7952794305289314670L;
+
+ public JsonRpcException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/Launcher.java b/java/org/eclipse/lsp4j/jsonrpc/Launcher.java
new file mode 100644
index 0000000..b543a73
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/Launcher.java
@@ -0,0 +1,442 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+
+import com.google.gson.GsonBuilder;
+
+/**
+ * This is the entry point for applications that use LSP4J. A Launcher does all the wiring that is necessary to connect
+ * your endpoint via an input stream and an output stream.
+ *
+ * @param <T> remote service interface type
+ */
+public interface Launcher<T> {
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote interface and an input and output stream.
+ *
+ * @param localService - the object that receives method calls from the remote service
+ * @param remoteInterface - an interface on which RPC methods are looked up
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ */
+ static <T> Launcher<T> createLauncher(Object localService, Class<T> remoteInterface, InputStream in, OutputStream out) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote interface and an input and output stream,
+ * and set up message validation and tracing.
+ *
+ * @param localService - the object that receives method calls from the remote service
+ * @param remoteInterface - an interface on which RPC methods are looked up
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param validate - whether messages should be validated with the {@link ReflectiveMessageValidator}
+ * @param trace - a writer to which incoming and outgoing messages are traced, or {@code null} to disable tracing
+ */
+ static <T> Launcher<T> createLauncher(Object localService, Class<T> remoteInterface, InputStream in, OutputStream out,
+ boolean validate, PrintWriter trace) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .validateMessages(validate)
+ .traceMessages(trace)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote interface and an input and output stream.
+ * Threads are started with the given executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation and tracing can be included.
+ *
+ * @param localService - the object that receives method calls from the remote service
+ * @param remoteInterface - an interface on which RPC methods are looked up
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ */
+ static <T> Launcher<T> createLauncher(Object localService, Class<T> remoteInterface, InputStream in, OutputStream out,
+ ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return createIoLauncher(localService, remoteInterface, in, out, executorService, wrapper);
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote interface and an input and output stream.
+ * Threads are started with the given executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation and tracing can be included.
+ *
+ * @param localService - the object that receives method calls from the remote service
+ * @param remoteInterface - an interface on which RPC methods are looked up
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ */
+ static <T> Launcher<T> createIoLauncher(Object localService, Class<T> remoteInterface, InputStream in, OutputStream out,
+ ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote interface and an input and output stream.
+ * Threads are started with the given executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation and tracing can be included.
+ * The {@code configureGson} function can be used to register additional type adapters in the {@link GsonBuilder}
+ * in order to support protocol classes that cannot be handled by Gson's reflective capabilities.
+ *
+ * @param localService - the object that receives method calls from the remote service
+ * @param remoteInterface - an interface on which RPC methods are looked up
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ * @param configureGson - a function for Gson configuration
+ */
+ static <T> Launcher<T> createIoLauncher(Object localService, Class<T> remoteInterface, InputStream in, OutputStream out,
+ ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper, Consumer<GsonBuilder> configureGson) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .configureGson(configureGson)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote interface and an input and output stream.
+ * Threads are started with the given executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation and tracing can be included.
+ * The {@code configureGson} function can be used to register additional type adapters in the {@link GsonBuilder}
+ * in order to support protocol classes that cannot be handled by Gson's reflective capabilities.
+ *
+ * @param localService - the object that receives method calls from the remote service
+ * @param remoteInterface - an interface on which RPC methods are looked up
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param validate - whether messages should be validated with the {@link ReflectiveMessageValidator}
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ * @param configureGson - a function for Gson configuration
+ */
+ static <T> Launcher<T> createIoLauncher(Object localService, Class<T> remoteInterface, InputStream in, OutputStream out, boolean validate,
+ ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper, Consumer<GsonBuilder> configureGson) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .validateMessages(validate)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .configureGson(configureGson)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a collection of local service objects, a collection of remote interfaces and an
+ * input and output stream. Threads are started with the given executor service. The wrapper function is applied
+ * to the incoming and outgoing message streams so additional message handling such as validation and tracing
+ * can be included. The {@code configureGson} function can be used to register additional type adapters in
+ * the {@link GsonBuilder} in order to support protocol classes that cannot be handled by Gson's reflective
+ * capabilities.
+ *
+ * @param localServices - the objects that receive method calls from the remote services
+ * @param remoteInterfaces - interfaces on which RPC methods are looked up
+ * @param classLoader - a class loader that is able to resolve all given interfaces
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ * @param configureGson - a function for Gson configuration
+ */
+ static Launcher<Object> createIoLauncher(Collection<Object> localServices, Collection<Class<?>> remoteInterfaces, ClassLoader classLoader,
+ InputStream in, OutputStream out, ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper,
+ Consumer<GsonBuilder> configureGson) {
+ return new Builder<Object>()
+ .setLocalServices(localServices)
+ .setRemoteInterfaces(remoteInterfaces)
+ .setClassLoader(classLoader)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .configureGson(configureGson)
+ .create();
+ }
+
+
+ //------------------------------ Builder Class ------------------------------//
+
+ /**
+ * The launcher builder wires up all components for JSON-RPC communication.
+ *
+ * @param <T> remote service interface type
+ */
+ public static class Builder<T> {
+
+ protected Collection<Object> localServices;
+ protected Collection<Class<? extends T>> remoteInterfaces;
+ protected InputStream input;
+ protected OutputStream output;
+ protected ExecutorService executorService;
+ protected Function<MessageConsumer, MessageConsumer> messageWrapper;
+ protected Function<Throwable, ResponseError> exceptionHandler;
+ protected boolean validateMessages;
+ protected Consumer<GsonBuilder> configureGson;
+ protected ClassLoader classLoader;
+ protected MessageTracer messageTracer;
+
+ public Builder<T> setLocalService(Object localService) {
+ this.localServices = Collections.singletonList(localService);
+ return this;
+ }
+
+ public Builder<T> setLocalServices(Collection<Object> localServices) {
+ this.localServices = localServices;
+ return this;
+ }
+
+ public Builder<T> setRemoteInterface(Class<? extends T> remoteInterface) {
+ this.remoteInterfaces = Collections.singletonList(remoteInterface);
+ return this;
+ }
+
+ public Builder<T> setRemoteInterfaces(Collection<Class<? extends T>> remoteInterfaces) {
+ this.remoteInterfaces = remoteInterfaces;
+ return this;
+ }
+
+ public Builder<T> setInput(InputStream input) {
+ this.input = input;
+ return this;
+ }
+
+ public Builder<T> setOutput(OutputStream output) {
+ this.output = output;
+ return this;
+ }
+
+ public Builder<T> setExecutorService(ExecutorService executorService) {
+ this.executorService = executorService;
+ return this;
+ }
+
+ public Builder<T> setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ return this;
+ }
+
+ public Builder<T> wrapMessages(Function<MessageConsumer, MessageConsumer> wrapper) {
+ this.messageWrapper = wrapper;
+ return this;
+ }
+
+ public Builder<T> setExceptionHandler(Function<Throwable, ResponseError> exceptionHandler) {
+ this.exceptionHandler = exceptionHandler;
+ return this;
+ }
+
+ public Builder<T> validateMessages(boolean validate) {
+ this.validateMessages = validate;
+ return this;
+ }
+
+ public Builder<T> traceMessages(PrintWriter tracer) {
+ if (tracer != null) {
+ this.messageTracer = new MessageTracer(tracer);
+ }
+ return this;
+ }
+
+ public Builder<T> configureGson(Consumer<GsonBuilder> configureGson) {
+ this.configureGson = configureGson;
+ return this;
+ }
+
+ public Launcher<T> create() {
+ // Validate input
+ if (input == null)
+ throw new IllegalStateException("Input stream must be configured.");
+ if (output == null)
+ throw new IllegalStateException("Output stream must be configured.");
+ if (localServices == null)
+ throw new IllegalStateException("Local service must be configured.");
+ if (remoteInterfaces == null)
+ throw new IllegalStateException("Remote interface must be configured.");
+
+ // Create the JSON handler, remote endpoint and remote proxy
+ MessageJsonHandler jsonHandler = createJsonHandler();
+ RemoteEndpoint remoteEndpoint = createRemoteEndpoint(jsonHandler);
+ T remoteProxy = createProxy(remoteEndpoint);
+
+ // Create the message processor
+ StreamMessageProducer reader = new StreamMessageProducer(input, jsonHandler, remoteEndpoint);
+ MessageConsumer messageConsumer = wrapMessageConsumer(remoteEndpoint);
+ ConcurrentMessageProcessor msgProcessor = createMessageProcessor(reader, messageConsumer, remoteProxy);
+ ExecutorService execService = executorService != null ? executorService : Executors.newCachedThreadPool();
+ return createLauncher(execService, remoteProxy, remoteEndpoint, msgProcessor);
+ }
+
+ /**
+ * Create the JSON handler for messages between the local and remote services.
+ */
+ protected MessageJsonHandler createJsonHandler() {
+ Map<String, JsonRpcMethod> supportedMethods = getSupportedMethods();
+ if (configureGson != null)
+ return new MessageJsonHandler(supportedMethods, configureGson);
+ else
+ return new MessageJsonHandler(supportedMethods);
+ }
+
+ /**
+ * Create the remote endpoint that communicates with the local services.
+ */
+ protected RemoteEndpoint createRemoteEndpoint(MessageJsonHandler jsonHandler) {
+ MessageConsumer outgoingMessageStream = new StreamMessageConsumer(output, jsonHandler);
+ outgoingMessageStream = wrapMessageConsumer(outgoingMessageStream);
+ Endpoint localEndpoint = ServiceEndpoints.toEndpoint(localServices);
+ RemoteEndpoint remoteEndpoint;
+ if (exceptionHandler == null)
+ remoteEndpoint = new RemoteEndpoint(outgoingMessageStream, localEndpoint);
+ else
+ remoteEndpoint = new RemoteEndpoint(outgoingMessageStream, localEndpoint, exceptionHandler);
+ jsonHandler.setMethodProvider(remoteEndpoint);
+ return remoteEndpoint;
+ }
+
+ /**
+ * Create the proxy for calling methods on the remote service.
+ */
+ @SuppressWarnings("unchecked")
+ protected T createProxy(RemoteEndpoint remoteEndpoint) {
+ if (localServices.size() == 1 && remoteInterfaces.size() == 1) {
+ return ServiceEndpoints.toServiceObject(remoteEndpoint, remoteInterfaces.iterator().next());
+ } else {
+ return (T) ServiceEndpoints.toServiceObject(remoteEndpoint, (Collection<Class<?>>) (Object) remoteInterfaces, classLoader);
+ }
+ }
+
+ /**
+ * Create the message processor that listens to the input stream.
+ */
+ protected ConcurrentMessageProcessor createMessageProcessor(MessageProducer reader,
+ MessageConsumer messageConsumer, T remoteProxy) {
+ return new ConcurrentMessageProcessor(reader, messageConsumer);
+ }
+
+ protected Launcher<T> createLauncher(ExecutorService execService, T remoteProxy, RemoteEndpoint remoteEndpoint,
+ ConcurrentMessageProcessor msgProcessor) {
+ return new StandardLauncher<T>(execService, remoteProxy, remoteEndpoint, msgProcessor);
+ }
+
+ protected MessageConsumer wrapMessageConsumer(MessageConsumer consumer) {
+ MessageConsumer result = consumer;
+ if (messageTracer != null) {
+ result = messageTracer.apply(consumer);
+ }
+ if (validateMessages) {
+ result = new ReflectiveMessageValidator(result);
+ }
+ if (messageWrapper != null) {
+ result = messageWrapper.apply(result);
+ }
+ return result;
+ }
+
+ /**
+ * Gather all JSON-RPC methods from the local and remote services.
+ */
+ protected Map<String, JsonRpcMethod> getSupportedMethods() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ // Gather the supported methods of remote interfaces
+ for (Class<?> interface_ : remoteInterfaces) {
+ supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(interface_));
+ }
+
+ // Gather the supported methods of local services
+ for (Object localService : localServices) {
+ if (localService instanceof JsonRpcMethodProvider) {
+ JsonRpcMethodProvider rpcMethodProvider = (JsonRpcMethodProvider) localService;
+ supportedMethods.putAll(rpcMethodProvider.supportedMethods());
+ } else {
+ supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(localService.getClass()));
+ }
+ }
+
+ return supportedMethods;
+ }
+ }
+
+
+ //---------------------------- Interface Methods ----------------------------//
+
+ /**
+ * Start a thread that listens to the input stream. The thread terminates when the stream is closed.
+ *
+ * @return a future that returns {@code null} when the listener thread is terminated
+ */
+ Future<Void> startListening();
+
+ /**
+ * Returns the proxy instance that implements the remote service interfaces.
+ */
+ T getRemoteProxy();
+
+ /**
+ * Returns the remote endpoint. Use this one to send generic {@code request} or {@code notify} methods
+ * to the remote services.
+ */
+ RemoteEndpoint getRemoteEndpoint();
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/MessageConsumer.java b/java/org/eclipse/lsp4j/jsonrpc/MessageConsumer.java
new file mode 100644
index 0000000..eb49465
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/MessageConsumer.java
@@ -0,0 +1,26 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+public interface MessageConsumer {
+
+ /**
+ * Consume a single message.
+ *
+ * @throws MessageIssueException when an issue is found that prevents further processing of the message
+ * @throws JsonRpcException when accessing the JSON-RPC communication channel fails
+ */
+ void consume(Message message) throws MessageIssueException, JsonRpcException;
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/MessageIssueException.java b/java/org/eclipse/lsp4j/jsonrpc/MessageIssueException.java
new file mode 100644
index 0000000..58dec38
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/MessageIssueException.java
@@ -0,0 +1,64 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+
+/**
+ * An exception thrown to notify the caller of a {@link MessageConsumer} that one or more issues were
+ * found while parsing or validating a message. This information can be passed to a {@link MessageIssueHandler}
+ * in order to construct a proper response.
+ */
+public class MessageIssueException extends RuntimeException {
+
+ private static final long serialVersionUID = 1118210473728652711L;
+
+ private final Message rpcMessage;
+ private final List<MessageIssue> issues;
+
+ public MessageIssueException(Message rpcMessage, MessageIssue issue) {
+ this.rpcMessage = rpcMessage;
+ this.issues = Collections.singletonList(issue);
+ }
+
+ public MessageIssueException(Message rpcMessage, Collection<MessageIssue> issues) {
+ this.rpcMessage = rpcMessage;
+ this.issues = Collections.unmodifiableList(new ArrayList<>(issues));
+ }
+
+ public MessageIssueException(Message rpcMessage, Stream<MessageIssue> issueStream) {
+ this.rpcMessage = rpcMessage;
+ this.issues = Collections.unmodifiableList(issueStream.collect(Collectors.toList()));
+ }
+
+ @Override
+ public String getMessage() {
+ return issues.stream().map(issue -> issue.getText()).collect(Collectors.joining("\n"));
+ }
+
+ public Message getRpcMessage() {
+ return rpcMessage;
+ }
+
+ public List<MessageIssue> getIssues() {
+ return issues;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/MessageIssueHandler.java b/java/org/eclipse/lsp4j/jsonrpc/MessageIssueHandler.java
new file mode 100644
index 0000000..768465b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/MessageIssueHandler.java
@@ -0,0 +1,26 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.util.List;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+
+public interface MessageIssueHandler {
+
+ /**
+ * Handle issues found while parsing or validating a message. The list of issues must not be empty.
+ */
+ void handle(Message message, List<MessageIssue> issues);
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java b/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java
new file mode 100644
index 0000000..30b2e51
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java
@@ -0,0 +1,24 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+public interface MessageProducer {
+
+ /**
+ * Listen to a message source and forward all messages to the given consumer. Typically this method
+ * blocks until the message source is unable to deliver more messages.
+ *
+ * @throws JsonRpcException when accessing the JSON-RPC communication channel fails
+ */
+ void listen(MessageConsumer messageConsumer) throws JsonRpcException;
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/MessageTracer.java b/java/org/eclipse/lsp4j/jsonrpc/MessageTracer.java
new file mode 100644
index 0000000..8398f6f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/MessageTracer.java
@@ -0,0 +1,41 @@
+/******************************************************************************
+ * Copyright (c) 2016-2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import org.eclipse.lsp4j.jsonrpc.TracingMessageConsumer.RequestMetadata;
+
+import java.io.PrintWriter;
+import java.time.Clock;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+
+/**
+ * Wraps a {@link MessageConsumer} with one that logs in a way that the LSP Inspector can parse. *
+ * https://microsoft.github.io/language-server-protocol/inspector/
+ */
+public class MessageTracer implements Function<MessageConsumer, MessageConsumer> {
+ private final PrintWriter printWriter;
+ private final Map<String, RequestMetadata> sentRequests = new HashMap<>();
+ private final Map<String, RequestMetadata> receivedRequests = new HashMap<>();
+
+ MessageTracer(PrintWriter printWriter) {
+ this.printWriter = Objects.requireNonNull(printWriter);
+ }
+
+ @Override
+ public MessageConsumer apply(MessageConsumer messageConsumer) {
+ return new TracingMessageConsumer(
+ messageConsumer, sentRequests, receivedRequests, printWriter, Clock.systemDefaultZone());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java b/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java
new file mode 100644
index 0000000..0907da8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java
@@ -0,0 +1,399 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.json.MessageConstants;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.MethodProvider;
+import org.eclipse.lsp4j.jsonrpc.messages.CancelParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+
+/**
+ * An endpoint that can be used to send messages to a given {@link MessageConsumer} by calling
+ * {@link #request(String, Object)} or {@link #notify(String, Object)}. When connected to a {@link MessageProducer},
+ * this class forwards received messages to the local {@link Endpoint} given in the constructor.
+ */
+public class RemoteEndpoint implements Endpoint, MessageConsumer, MessageIssueHandler, MethodProvider {
+
+ private static final Logger LOG = Logger.getLogger(RemoteEndpoint.class.getName());
+
+ public static final Function<Throwable, ResponseError> DEFAULT_EXCEPTION_HANDLER = (throwable) -> {
+ if (throwable instanceof ResponseErrorException) {
+ return ((ResponseErrorException) throwable).getResponseError();
+ } else if ((throwable instanceof CompletionException || throwable instanceof InvocationTargetException)
+ && throwable.getCause() instanceof ResponseErrorException) {
+ return ((ResponseErrorException) throwable.getCause()).getResponseError();
+ } else {
+ return fallbackResponseError("Internal error", throwable);
+ }
+ };
+
+ private static ResponseError fallbackResponseError(String header, Throwable throwable) {
+ LOG.log(Level.SEVERE, header + ": " + throwable.getMessage(), throwable);
+ ResponseError error = new ResponseError();
+ error.setMessage(header + ".");
+ error.setCode(ResponseErrorCode.InternalError);
+ ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
+ PrintWriter stackTraceWriter = new PrintWriter(stackTrace);
+ throwable.printStackTrace(stackTraceWriter);
+ stackTraceWriter.flush();
+ error.setData(stackTrace.toString());
+ return error;
+ }
+
+ private final MessageConsumer out;
+ private final Endpoint localEndpoint;
+ private final Function<Throwable, ResponseError> exceptionHandler;
+
+ private final AtomicInteger nextRequestId = new AtomicInteger();
+ private final Map<String, PendingRequestInfo> sentRequestMap = new LinkedHashMap<>();
+ private final Map<String, CompletableFuture<?>> receivedRequestMap = new LinkedHashMap<>();
+
+ /**
+ * Information about requests that have been sent and for which no response has been received yet.
+ */
+ private static class PendingRequestInfo {
+ PendingRequestInfo(RequestMessage requestMessage2, CompletableFuture<Object> future2) {
+ this.requestMessage = requestMessage2;
+ this.future = future2;
+ }
+ RequestMessage requestMessage;
+ CompletableFuture<Object> future;
+ }
+
+ /**
+ * @param out - a consumer that transmits messages to the remote service
+ * @param localEndpoint - the local service implementation
+ * @param exceptionHandler - an exception handler that should never return null.
+ */
+ public RemoteEndpoint(MessageConsumer out, Endpoint localEndpoint, Function<Throwable, ResponseError> exceptionHandler) {
+ if (out == null)
+ throw new NullPointerException("out");
+ if (localEndpoint == null)
+ throw new NullPointerException("localEndpoint");
+ if (exceptionHandler == null)
+ throw new NullPointerException("exceptionHandler");
+ this.out = out;
+ this.localEndpoint = localEndpoint;
+ this.exceptionHandler = exceptionHandler;
+ }
+
+ /**
+ * @param out - a consumer that transmits messages to the remote service
+ * @param localEndpoint - the local service implementation
+ */
+ public RemoteEndpoint(MessageConsumer out, Endpoint localEndpoint) {
+ this(out, localEndpoint, DEFAULT_EXCEPTION_HANDLER);
+ }
+
+ /**
+ * Send a notification to the remote endpoint.
+ */
+ @Override
+ public void notify(String method, Object parameter) {
+ NotificationMessage notificationMessage = createNotificationMessage(method, parameter);
+ try {
+ out.consume(notificationMessage);
+ } catch (Exception exception) {
+ Level logLevel = JsonRpcException.indicatesStreamClosed(exception) ? Level.INFO : Level.WARNING;
+ LOG.log(logLevel, "Failed to send notification message.", exception);
+ }
+ }
+
+ protected NotificationMessage createNotificationMessage(String method, Object parameter) {
+ NotificationMessage notificationMessage = new NotificationMessage();
+ notificationMessage.setJsonrpc(MessageConstants.JSONRPC_VERSION);
+ notificationMessage.setMethod(method);
+ notificationMessage.setParams(parameter);
+ return notificationMessage;
+ }
+
+ /**
+ * Send a request to the remote endpoint.
+ */
+ @Override
+ public CompletableFuture<Object> request(String method, Object parameter) {
+ final RequestMessage requestMessage = createRequestMessage(method, parameter);
+ final CompletableFuture<Object> result = new CompletableFuture<Object>() {
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ sendCancelNotification(requestMessage.getRawId());
+ return super.cancel(mayInterruptIfRunning);
+ }
+ };
+ synchronized(sentRequestMap) {
+ // Store request information so it can be handled when the response is received
+ sentRequestMap.put(requestMessage.getId(), new PendingRequestInfo(requestMessage, result));
+ }
+
+ try {
+ // Send the request to the remote service
+ out.consume(requestMessage);
+ } catch (Exception exception) {
+ // The message could not be sent, e.g. because the communication channel was closed
+ result.completeExceptionally(exception);
+ }
+ return result;
+ }
+
+ protected RequestMessage createRequestMessage(String method, Object parameter) {
+ RequestMessage requestMessage = new RequestMessage();
+ requestMessage.setId(String.valueOf(nextRequestId.incrementAndGet()));
+ requestMessage.setMethod(method);
+ requestMessage.setParams(parameter);
+ return requestMessage;
+ }
+
+ protected void sendCancelNotification(Either<String, Number> id) {
+ CancelParams cancelParams = new CancelParams();
+ cancelParams.setRawId(id);
+ notify(MessageJsonHandler.CANCEL_METHOD.getMethodName(), cancelParams);
+ }
+
+ @Override
+ public void consume(Message message) {
+ if (message instanceof NotificationMessage) {
+ NotificationMessage notificationMessage = (NotificationMessage) message;
+ handleNotification(notificationMessage);
+ } else if (message instanceof RequestMessage) {
+ RequestMessage requestMessage = (RequestMessage) message;
+ handleRequest(requestMessage);
+ } else if (message instanceof ResponseMessage) {
+ ResponseMessage responseMessage = (ResponseMessage) message;
+ handleResponse(responseMessage);
+ } else {
+ LOG.log(Level.WARNING, "Unkown message type.", message);
+ }
+ }
+
+ protected void handleResponse(ResponseMessage responseMessage) {
+ PendingRequestInfo requestInfo;
+ synchronized (sentRequestMap) {
+ requestInfo = sentRequestMap.remove(responseMessage.getId());
+ }
+ if (requestInfo == null) {
+ // We have no pending request information that matches the id given in the response
+ LOG.log(Level.WARNING, "Unmatched response message: " + responseMessage);
+ } else if (responseMessage.getError() != null) {
+ // The remote service has replied with an error
+ requestInfo.future.completeExceptionally(new ResponseErrorException(responseMessage.getError()));
+ } else {
+ // The remote service has replied with a result object
+ requestInfo.future.complete(responseMessage.getResult());
+ }
+ }
+
+ protected void handleNotification(NotificationMessage notificationMessage) {
+ if (!handleCancellation(notificationMessage)) {
+ // Forward the notification to the local endpoint
+ try {
+ localEndpoint.notify(notificationMessage.getMethod(), notificationMessage.getParams());
+ } catch (Exception exception) {
+ LOG.log(Level.WARNING, "Notification threw an exception: " + notificationMessage, exception);
+ }
+ }
+ }
+
+ /**
+ * Cancellation is handled inside this class and not forwarded to the local endpoint.
+ *
+ * @return {@code true} if the given message is a cancellation notification,
+ * {@code false} if it can be handled by the local endpoint
+ */
+ protected boolean handleCancellation(NotificationMessage notificationMessage) {
+ if (MessageJsonHandler.CANCEL_METHOD.getMethodName().equals(notificationMessage.getMethod())) {
+ Object cancelParams = notificationMessage.getParams();
+ if (cancelParams != null) {
+ if (cancelParams instanceof CancelParams) {
+ synchronized (receivedRequestMap) {
+ String id = ((CancelParams) cancelParams).getId();
+ CompletableFuture<?> future = receivedRequestMap.get(id);
+ if (future != null)
+ future.cancel(true);
+ else
+ LOG.warning("Unmatched cancel notification for request id " + id);
+ }
+ return true;
+ } else {
+ LOG.warning("Cancellation support is disabled, since the '" + MessageJsonHandler.CANCEL_METHOD.getMethodName() + "' method has been registered explicitly.");
+ }
+ } else {
+ LOG.warning("Missing 'params' attribute of cancel notification.");
+ }
+ }
+ return false;
+ }
+
+ protected void handleRequest(RequestMessage requestMessage) {
+ CompletableFuture<?> future;
+ try {
+ // Forward the request to the local endpoint
+ future = localEndpoint.request(requestMessage.getMethod(), requestMessage.getParams());
+ } catch (Throwable throwable) {
+ // The local endpoint has failed handling the request - reply with an error response
+ ResponseError errorObject = exceptionHandler.apply(throwable);
+ if (errorObject == null) {
+ errorObject = fallbackResponseError("Internal error. Exception handler provided no error object", throwable);
+ }
+ out.consume(createErrorResponseMessage(requestMessage, errorObject));
+ if (throwable instanceof Error)
+ throw (Error) throwable;
+ else
+ return;
+ }
+
+ final String messageId = requestMessage.getId();
+ synchronized (receivedRequestMap) {
+ receivedRequestMap.put(messageId, future);
+ }
+ future.thenAccept((result) -> {
+ // Reply with the result object that was computed by the local endpoint
+ out.consume(createResultResponseMessage(requestMessage, result));
+ }).exceptionally((Throwable t) -> {
+ // The local endpoint has failed computing a result - reply with an error response
+ ResponseMessage responseMessage;
+ if (isCancellation(t)) {
+ String message = "The request (id: " + messageId + ", method: '" + requestMessage.getMethod() + "') has been cancelled";
+ ResponseError errorObject = new ResponseError(ResponseErrorCode.RequestCancelled, message, null);
+ responseMessage = createErrorResponseMessage(requestMessage, errorObject);
+ } else {
+ ResponseError errorObject = exceptionHandler.apply(t);
+ if (errorObject == null) {
+ errorObject = fallbackResponseError("Internal error. Exception handler provided no error object", t);
+ }
+ responseMessage = createErrorResponseMessage(requestMessage, errorObject);
+ }
+ out.consume(responseMessage);
+ return null;
+ }).thenApply((obj) -> {
+ synchronized (receivedRequestMap) {
+ receivedRequestMap.remove(messageId);
+ }
+ return null;
+ });
+ }
+
+ @Override
+ public void handle(Message message, List<MessageIssue> issues) {
+ if (issues.isEmpty()) {
+ throw new IllegalArgumentException("The list of issues must not be empty.");
+ }
+
+ if (message instanceof RequestMessage) {
+ RequestMessage requestMessage = (RequestMessage) message;
+ handleRequestIssues(requestMessage, issues);
+ } else if (message instanceof ResponseMessage) {
+ ResponseMessage responseMessage = (ResponseMessage) message;
+ handleResponseIssues(responseMessage, issues);
+ } else {
+ logIssues(message, issues);
+ }
+ }
+
+ protected void logIssues(Message message, List<MessageIssue> issues) {
+ for (MessageIssue issue : issues) {
+ String logMessage = "Issue found in " + message.getClass().getSimpleName() + ": " + issue.getText();
+ LOG.log(Level.WARNING, logMessage, issue.getCause());
+ }
+ }
+
+ protected void handleRequestIssues(RequestMessage requestMessage, List<MessageIssue> issues) {
+ ResponseError errorObject = new ResponseError();
+ if (issues.size() == 1) {
+ MessageIssue issue = issues.get(0);
+ errorObject.setMessage(issue.getText());
+ errorObject.setCode(issue.getIssueCode());
+ errorObject.setData(issue.getCause());
+ } else {
+ if (requestMessage.getMethod() != null)
+ errorObject.setMessage("Multiple issues were found in '" + requestMessage.getMethod() + "' request.");
+ else
+ errorObject.setMessage("Multiple issues were found in request.");
+ errorObject.setCode(ResponseErrorCode.InvalidRequest);
+ errorObject.setData(issues);
+ }
+ out.consume(createErrorResponseMessage(requestMessage, errorObject));
+ }
+
+ protected void handleResponseIssues(ResponseMessage responseMessage, List<MessageIssue> issues) {
+ PendingRequestInfo requestInfo;
+ synchronized (sentRequestMap) {
+ requestInfo = sentRequestMap.remove(responseMessage.getId());
+ }
+ if (requestInfo == null) {
+ // We have no pending request information that matches the id given in the response
+ LOG.log(Level.WARNING, "Unmatched response message: " + responseMessage);
+ logIssues(responseMessage, issues);
+ } else {
+ requestInfo.future.completeExceptionally(new MessageIssueException(responseMessage, issues));
+ }
+ }
+
+ protected ResponseMessage createResponseMessage(RequestMessage requestMessage) {
+ ResponseMessage responseMessage = new ResponseMessage();
+ responseMessage.setRawId(requestMessage.getRawId());
+ responseMessage.setJsonrpc(MessageConstants.JSONRPC_VERSION);
+ return responseMessage;
+ }
+
+ protected ResponseMessage createResultResponseMessage(RequestMessage requestMessage, Object result) {
+ ResponseMessage responseMessage = createResponseMessage(requestMessage);
+ responseMessage.setResult(result);
+ return responseMessage;
+ }
+
+ protected ResponseMessage createErrorResponseMessage(RequestMessage requestMessage, ResponseError errorObject) {
+ ResponseMessage responseMessage = createResponseMessage(requestMessage);
+ responseMessage.setError(errorObject);
+ return responseMessage;
+ }
+
+ protected boolean isCancellation(Throwable t) {
+ if (t instanceof CompletionException) {
+ return isCancellation(t.getCause());
+ }
+ return (t instanceof CancellationException);
+ }
+
+ @Override
+ public String resolveMethod(String requestId) {
+ synchronized (sentRequestMap) {
+ PendingRequestInfo requestInfo = sentRequestMap.get(requestId);
+ if (requestInfo != null) {
+ return requestInfo.requestMessage.getMethod();
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/ResponseErrorException.java b/java/org/eclipse/lsp4j/jsonrpc/ResponseErrorException.java
new file mode 100644
index 0000000..d700591
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/ResponseErrorException.java
@@ -0,0 +1,36 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+
+/**
+ * An exception thrown in order to send a response with an attached {@code error} object.
+ */
+public class ResponseErrorException extends RuntimeException {
+
+ private static final long serialVersionUID = -5970739895395246885L;
+ private ResponseError responseError;
+
+ public ResponseErrorException(ResponseError responseError) {
+ this.responseError = responseError;
+ }
+
+ @Override
+ public String getMessage() {
+ return responseError.getMessage();
+ }
+
+ public ResponseError getResponseError() {
+ return responseError;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/StandardLauncher.java b/java/org/eclipse/lsp4j/jsonrpc/StandardLauncher.java
new file mode 100644
index 0000000..0dd6b14
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/StandardLauncher.java
@@ -0,0 +1,55 @@
+/******************************************************************************
+ * Copyright (c) 2018 Red Hat Inc
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+import org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer;
+
+public class StandardLauncher<T> implements Launcher<T> {
+ private final ExecutorService execService;
+ private final T remoteProxy;
+ private final RemoteEndpoint remoteEndpoint;
+ private final ConcurrentMessageProcessor msgProcessor;
+
+ public StandardLauncher(StreamMessageProducer reader, MessageConsumer messageConsumer,
+ ExecutorService execService, T remoteProxy, RemoteEndpoint remoteEndpoint) {
+ this(execService, remoteProxy, remoteEndpoint,
+ new ConcurrentMessageProcessor(reader, messageConsumer));
+ }
+
+ public StandardLauncher(
+ ExecutorService execService2, T remoteProxy2, RemoteEndpoint remoteEndpoint2,
+ ConcurrentMessageProcessor msgProcessor) {
+ this.execService = execService2;
+ this.remoteProxy = remoteProxy2;
+ this.remoteEndpoint = remoteEndpoint2;
+ this.msgProcessor = msgProcessor;
+ }
+
+ @Override
+ public Future<Void> startListening() {
+ return msgProcessor.beginProcessing(execService);
+ }
+
+ @Override
+ public T getRemoteProxy() {
+ return remoteProxy;
+ }
+
+ @Override
+ public RemoteEndpoint getRemoteEndpoint() {
+ return remoteEndpoint;
+ }
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/jsonrpc/TracingMessageConsumer.java b/java/org/eclipse/lsp4j/jsonrpc/TracingMessageConsumer.java
new file mode 100644
index 0000000..5730e11
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/TracingMessageConsumer.java
@@ -0,0 +1,219 @@
+/******************************************************************************
+ * Copyright (c) 2016-2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc;
+
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+
+import java.io.PrintWriter;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+import static java.util.logging.Level.WARNING;
+
+/**
+ * A {@link MessageConsumer} that outputs logs in a format that can be parsed by the LSP Inspector.
+ * https://microsoft.github.io/language-server-protocol/inspector/
+ */
+public class TracingMessageConsumer implements MessageConsumer {
+ private static final Logger LOG = Logger.getLogger(TracingMessageConsumer.class.getName());
+
+ private final MessageConsumer messageConsumer;
+ private final Map<String, RequestMetadata> sentRequests;
+ private final Map<String, RequestMetadata> receivedRequests;
+ private final PrintWriter printWriter;
+ private final Clock clock;
+ private final DateTimeFormatter dateTimeFormatter;
+
+ /**
+ * @param messageConsumer The {@link MessageConsumer} to wrap.
+ * @param sentRequests A map that keeps track of pending sent request data.
+ * @param receivedRequests A map that keeps track of pending received request data.
+ * @param printWriter Where to write the log to.
+ * @param clock The clock that is used to calculate timestamps and durations.
+ */
+ public TracingMessageConsumer(
+ MessageConsumer messageConsumer,
+ Map<String, RequestMetadata> sentRequests,
+ Map<String, RequestMetadata> receivedRequests,
+ PrintWriter printWriter,
+ Clock clock) {
+ this(messageConsumer, sentRequests, receivedRequests, printWriter, clock, null);
+ }
+
+ /**
+ * @param messageConsumer The {@link MessageConsumer} to wrap.
+ * @param sentRequests A map that keeps track of pending sent request data.
+ * @param receivedRequests A map that keeps track of pending received request data.
+ * @param printWriter Where to write the log to.
+ * @param clock The clock that is used to calculate timestamps and durations.
+ * @param locale THe Locale to format the timestamps and durations, or <code>null</code> to use default locale.
+ */
+ public TracingMessageConsumer(
+ MessageConsumer messageConsumer,
+ Map<String, RequestMetadata> sentRequests,
+ Map<String, RequestMetadata> receivedRequests,
+ PrintWriter printWriter,
+ Clock clock,
+ Locale locale) {
+ this.messageConsumer = Objects.requireNonNull(messageConsumer);
+ this.sentRequests = Objects.requireNonNull(sentRequests);
+ this.receivedRequests = Objects.requireNonNull(receivedRequests);
+ this.printWriter = Objects.requireNonNull(printWriter);
+ this.clock = Objects.requireNonNull(clock);
+ if (locale == null) {
+ this.dateTimeFormatter = DateTimeFormatter.ofPattern("KK:mm:ss a").withZone(clock.getZone());
+ } else {
+ this.dateTimeFormatter = DateTimeFormatter.ofPattern("KK:mm:ss a", locale).withZone(clock.getZone());
+ }
+ }
+
+ /**
+ * Constructs a log string for a given {@link Message}. The type of the {@link MessageConsumer}
+ * determines if we're sending or receiving a message. The type of the @{link Message} determines
+ * if it is a request, response, or notification.
+ */
+ @Override
+ public void consume(Message message) throws MessageIssueException, JsonRpcException {
+ final Instant now = clock.instant();
+ final String date = dateTimeFormatter.format(now);
+ final String logString;
+
+ if (messageConsumer instanceof StreamMessageConsumer) {
+ logString = consumeMessageSending(message, now, date);
+ } else if (messageConsumer instanceof RemoteEndpoint) {
+ logString = consumeMessageReceiving(message, now, date);
+ } else {
+ LOG.log(WARNING, String.format("Unknown MessageConsumer type: %s", messageConsumer));
+ logString = null;
+ }
+
+ if (logString != null) {
+ printWriter.print(logString);
+ printWriter.flush();
+ }
+
+ messageConsumer.consume(message);
+ }
+
+ private String consumeMessageSending(Message message, Instant now, String date) {
+ if (message instanceof RequestMessage) {
+ RequestMessage requestMessage = (RequestMessage) message;
+ String id = requestMessage.getId();
+ String method = requestMessage.getMethod();
+ RequestMetadata requestMetadata = new RequestMetadata(method, now);
+ sentRequests.put(id, requestMetadata);
+ Object params = requestMessage.getParams();
+ String paramsJson = MessageJsonHandler.toString(params);
+ String format = "[Trace - %s] Sending request '%s - (%s)'\nParams: %s\n\n\n";
+ return String.format(format, date, method, id, paramsJson);
+ } else if (message instanceof ResponseMessage) {
+ ResponseMessage responseMessage = (ResponseMessage) message;
+ String id = responseMessage.getId();
+ RequestMetadata requestMetadata = receivedRequests.remove(id);
+ if (requestMetadata == null) {
+ LOG.log(WARNING, String.format("Unmatched response message: %s", message));
+ return null;
+ }
+ String method = requestMetadata.method;
+ long latencyMillis = now.toEpochMilli() - requestMetadata.start.toEpochMilli();
+ Object result = responseMessage.getResult();
+ String resultJson = MessageJsonHandler.toString(result);
+ String format =
+ "[Trace - %s] Sending response '%s - (%s)'. Processing request took %sms\nResult: %s\n\n\n";
+ return String.format(format, date, method, id, latencyMillis, resultJson);
+ } else if (message instanceof NotificationMessage) {
+ NotificationMessage notificationMessage = (NotificationMessage) message;
+ String method = notificationMessage.getMethod();
+ Object params = notificationMessage.getParams();
+ String paramsJson = MessageJsonHandler.toString(params);
+ String format = "[Trace - %s] Sending notification '%s'\nParams: %s\n\n\n";
+ return String.format(format, date, method, paramsJson);
+ } else {
+ LOG.log(WARNING, String.format("Unknown message type: %s", message));
+ return null;
+ }
+ }
+
+ private String consumeMessageReceiving(Message message, Instant now, String date) {
+ if (message instanceof RequestMessage) {
+ RequestMessage requestMessage = (RequestMessage) message;
+ String method = requestMessage.getMethod();
+ String id = requestMessage.getId();
+ RequestMetadata requestMetadata = new RequestMetadata(method, now);
+ receivedRequests.put(id, requestMetadata);
+ Object params = requestMessage.getParams();
+ String paramsJson = MessageJsonHandler.toString(params);
+ String format = "[Trace - %s] Received request '%s - (%s)'\nParams: %s\n\n\n";
+ return String.format(format, date, method, id, paramsJson);
+ } else if (message instanceof ResponseMessage) {
+ ResponseMessage responseMessage = (ResponseMessage) message;
+ String id = responseMessage.getId();
+ RequestMetadata requestMetadata = sentRequests.remove(id);
+ if (requestMetadata == null) {
+ LOG.log(WARNING, String.format("Unmatched response message: %s", message));
+ return null;
+ }
+ String method = requestMetadata.method;
+ long latencyMillis = now.toEpochMilli() - requestMetadata.start.toEpochMilli();
+ Object result = responseMessage.getResult();
+ String resultJson = MessageJsonHandler.toString(result);
+ Object error = responseMessage.getError();
+ String errorJson = MessageJsonHandler.toString(error);
+ String format = "[Trace - %s] Received response '%s - (%s)' in %sms\nResult: %s\nError: %s\n\n\n";
+ return String.format(format, date, method, id, latencyMillis, resultJson, errorJson);
+ } else if (message instanceof NotificationMessage) {
+ NotificationMessage notificationMessage = (NotificationMessage) message;
+ String method = notificationMessage.getMethod();
+ Object params = notificationMessage.getParams();
+ String paramsJson = MessageJsonHandler.toString(params);
+ String format = "[Trace - %s] Received notification '%s'\nParams: %s\n\n\n";
+ return String.format(format, date, method, paramsJson);
+ } else {
+ LOG.log(WARNING, String.format("Unknown message type: %s", message));
+ return null;
+ }
+ }
+
+ /** Data class for holding pending request metadata. */
+ public static class RequestMetadata {
+ final String method;
+ final Instant start;
+
+ public RequestMetadata(String method, Instant start) {
+ this.method = method;
+ this.start = start;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RequestMetadata that = (RequestMetadata) o;
+ return Objects.equals(method, that.method) && Objects.equals(start, that.start);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(method, start);
+ }
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/DebugLauncher.java b/java/org/eclipse/lsp4j/jsonrpc/debug/DebugLauncher.java
new file mode 100644
index 0000000..6c60a43
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/DebugLauncher.java
@@ -0,0 +1,225 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.debug.json.DebugMessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+
+import com.google.gson.GsonBuilder;
+
+/**
+ * This is the entry point for applications that use the debug protocol. A DebugLauncher does
+ * all the wiring that is necessary to connect your endpoint via an input stream
+ * and an output stream.
+ */
+public final class DebugLauncher {
+
+ private DebugLauncher() {}
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ */
+ public static <T> Launcher<T> createLauncher(Object localService, Class<T> remoteInterface, InputStream in,
+ OutputStream out) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream, and set up message validation and
+ * tracing.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param validate
+ * - whether messages should be validated with the
+ * {@link ReflectiveMessageValidator}
+ * @param trace
+ * - a writer to which incoming and outgoing messages are traced, or
+ * {@code null} to disable tracing
+ */
+ public static <T> Launcher<T> createLauncher(Object localService, Class<T> remoteInterface, InputStream in,
+ OutputStream out, boolean validate, PrintWriter trace) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .validateMessages(validate)
+ .traceMessages(trace)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation
+ * and tracing can be included.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param executorService
+ * - the executor service used to start threads
+ * @param wrapper
+ * - a function for plugging in additional message consumers
+ */
+ public static <T> Launcher<T> createLauncher(Object localService, Class<T> remoteInterface, InputStream in,
+ OutputStream out, ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return createIoLauncher(localService, remoteInterface, in, out, executorService, wrapper);
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation
+ * and tracing can be included.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param executorService
+ * - the executor service used to start threads
+ * @param wrapper
+ * - a function for plugging in additional message consumers
+ */
+ public static <T> Launcher<T> createIoLauncher(Object localService, Class<T> remoteInterface, InputStream in,
+ OutputStream out, ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a given local service object, a given remote
+ * interface and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and
+ * outgoing message streams so additional message handling such as validation
+ * and tracing can be included. The {@code configureGson} function can be used
+ * to register additional type adapters in the {@link GsonBuilder} in order to
+ * support protocol classes that cannot be handled by Gson's reflective
+ * capabilities.
+ *
+ * @param localService
+ * - an object on which classes RPC methods are looked up
+ * @param remoteInterface
+ * - an interface on which RPC methods are looked up
+ * @param in
+ * - inputstream to listen for incoming messages
+ * @param out
+ * - outputstream to send outgoing messages
+ * @param executorService
+ * - the executor service used to start threads
+ * @param wrapper
+ * - a function for plugging in additional message consumers
+ * @param configureGson
+ * - a function for Gson configuration
+ */
+ public static <T> Launcher<T> createIoLauncher(Object localService, Class<T> remoteInterface, InputStream in,
+ OutputStream out, ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper,
+ Consumer<GsonBuilder> configureGson) {
+ return new Builder<T>()
+ .setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .configureGson(configureGson)
+ .create();
+ }
+
+ /**
+ * Launcher builder for the debug protocol. Adapts the JSON-RPC message classes to the JSON format used
+ * by the debug protocol.
+ */
+ public static class Builder<T> extends Launcher.Builder<T> {
+
+ @Override
+ protected MessageJsonHandler createJsonHandler() {
+ Map<String, JsonRpcMethod> supportedMethods = getSupportedMethods();
+ if (configureGson != null)
+ return new DebugMessageJsonHandler(supportedMethods, configureGson);
+ else
+ return new DebugMessageJsonHandler(supportedMethods);
+ }
+
+ @Override
+ protected RemoteEndpoint createRemoteEndpoint(MessageJsonHandler jsonHandler) {
+ MessageConsumer outgoingMessageStream = new StreamMessageConsumer(output, jsonHandler);
+ outgoingMessageStream = wrapMessageConsumer(outgoingMessageStream);
+ Endpoint localEndpoint = ServiceEndpoints.toEndpoint(localServices);
+ RemoteEndpoint remoteEndpoint;
+ if (exceptionHandler == null)
+ remoteEndpoint = new DebugRemoteEndpoint(outgoingMessageStream, localEndpoint);
+ else
+ remoteEndpoint = new DebugRemoteEndpoint(outgoingMessageStream, localEndpoint, exceptionHandler);
+ jsonHandler.setMethodProvider(remoteEndpoint);
+ return remoteEndpoint;
+ }
+
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/DebugRemoteEndpoint.java b/java/org/eclipse/lsp4j/jsonrpc/debug/DebugRemoteEndpoint.java
new file mode 100644
index 0000000..2290681
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/DebugRemoteEndpoint.java
@@ -0,0 +1,64 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugNotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugRequestMessage;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugResponseMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+
+public class DebugRemoteEndpoint extends RemoteEndpoint {
+ private final AtomicInteger nextSeqId = new AtomicInteger();
+
+ public DebugRemoteEndpoint(MessageConsumer out, Endpoint localEndpoint) {
+ super(out, localEndpoint);
+ }
+
+ public DebugRemoteEndpoint(MessageConsumer out, Endpoint localEndpoint,
+ Function<Throwable, ResponseError> exceptionHandler) {
+ super(out, localEndpoint, exceptionHandler);
+ }
+
+ @Override
+ protected DebugRequestMessage createRequestMessage(String method, Object parameter) {
+ DebugRequestMessage requestMessage = new DebugRequestMessage();
+ requestMessage.setId(nextSeqId.incrementAndGet());
+ requestMessage.setMethod(method);
+ requestMessage.setParams(parameter);
+ return requestMessage;
+ }
+
+ @Override
+ protected DebugResponseMessage createResponseMessage(RequestMessage requestMessage) {
+ DebugResponseMessage responseMessage = new DebugResponseMessage();
+ responseMessage.setResponseId(nextSeqId.incrementAndGet());
+ responseMessage.setRawId(requestMessage.getRawId());
+ responseMessage.setMethod(requestMessage.getMethod());
+ return responseMessage;
+ }
+
+ @Override
+ protected DebugNotificationMessage createNotificationMessage(String method, Object parameter) {
+ DebugNotificationMessage notificationMessage = new DebugNotificationMessage();
+ notificationMessage.setId(nextSeqId.incrementAndGet());
+ notificationMessage.setMethod(method);
+ notificationMessage.setParams(parameter);
+ return notificationMessage;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/adapters/DebugEnumTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/debug/adapters/DebugEnumTypeAdapter.java
new file mode 100644
index 0000000..21977c0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/adapters/DebugEnumTypeAdapter.java
@@ -0,0 +1,92 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.adapters;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+public class DebugEnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T> {
+ public static class Factory implements TypeAdapterFactory {
+ @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ Class<?> rawType = typeToken.getRawType();
+ if (!Enum.class.isAssignableFrom(rawType) || rawType == Enum.class)
+ return null;
+ if (!rawType.isEnum())
+ rawType = rawType.getSuperclass();
+ return new DebugEnumTypeAdapter(rawType);
+ }
+
+ }
+
+ private final Map<String, T> serializedFormToEnum = new HashMap<String, T>();
+ private final Map<T, String> enumToSerializedForm = new HashMap<T, String>();
+
+ public DebugEnumTypeAdapter(Class<T> clazz) {
+ try {
+ for (T constant : clazz.getEnumConstants()) {
+ String name = constant.name();
+ String serializedForm = getSerializedForm(name);
+ // Like default gson, allow overriding names with SerializedName
+ SerializedName annotation = clazz.getField(name).getAnnotation(SerializedName.class);
+ if (annotation != null) {
+ serializedForm = annotation.value();
+ for (String alternate : annotation.alternate()) {
+ serializedFormToEnum.put(alternate, constant);
+ }
+ }
+ serializedFormToEnum.put(serializedForm, constant);
+ enumToSerializedForm.put(constant, serializedForm);
+ }
+ } catch (NoSuchFieldException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ private String getSerializedForm(String name) {
+ name = name.toLowerCase();
+ Matcher m = Pattern.compile("_[a-z]").matcher(name);
+ StringBuffer sb = new StringBuffer();
+ while (m.find()) {
+ m.appendReplacement(sb, m.group().toUpperCase());
+ }
+ m.appendTail(sb);
+ return sb.toString().replaceAll("_", "");
+ }
+
+ @Override
+ public T read(JsonReader in) throws IOException {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+ return serializedFormToEnum.get(in.nextString());
+ }
+
+ @Override
+ public void write(JsonWriter out, T value) throws IOException {
+ out.value(value == null ? null : enumToSerializedForm.get(value));
+ }
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/adapters/DebugMessageTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/debug/adapters/DebugMessageTypeAdapter.java
new file mode 100644
index 0000000..960bacf
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/adapters/DebugMessageTypeAdapter.java
@@ -0,0 +1,483 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.adapters;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.lang.reflect.Type;
+
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugNotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugRequestMessage;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugResponseMessage;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.MethodProvider;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.MessageTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import com.google.gson.stream.MalformedJsonException;
+
+/**
+ * The {@link DebugMessageTypeAdapter} provides an adapter that maps Debug
+ * Server Protocol style JSON to/from LSP4J's JSONRPC implementation. The Debug
+ * Server Protocol (DSP) has its own message format that is quite similar to
+ * JSON-RPC 2.0. The DSP is defined in a <a href=
+ * "https://github.com/Microsoft/vscode-debugadapter-node/blob/master/debugProtocol.json">JSON
+ * schema in the VS Code Debug Adapter</a>. This section documents how LSP4J's
+ * jsonrpc classes maps to the Debug Protocol, using some extensions in the DSP
+ * code to the lsp4j's {@link Message}s.
+ * <p>
+ *
+ * <pre>
+ "ProtocolMessage": { // implemented by {@link Message}
+ "type": "object",
+ "description": "Base class of requests, responses, and events.",
+ "properties": {
+ "seq": { // implemented by (depending on type, with conversion to/from String):
+ // {@link DebugRequestMessage#getId()}, or
+ // {@link DebugNotificationMessage#getId()} or
+ // {@link DebugResponseMessage#getResponseId()}
+ "type": "integer",
+ "description": "Sequence number."
+ },
+ "type": { // implicit in type of subclass of {@link Message}
+ "type": "string",
+ "description": "Message type.",
+ "_enum": [ "request", "response", "event" ]
+ }
+ },
+ "required": [ "seq", "type" ]
+ },
+
+ "Request": { // implemented by {@link DebugRequestMessage}
+ "allOf": [ { "$ref": "#/definitions/ProtocolMessage" }, {
+ "type": "object",
+ "description": "A client or server-initiated request.",
+ "properties": {
+ "type": { // implicit by being of type {@link DebugRequestMessage}
+ "type": "string",
+ "enum": [ "request" ]
+ },
+ "command": { // implemented by {@link DebugRequestMessage#getMethod()}
+ "type": "string",
+ "description": "The command to execute."
+ },
+ "arguments": { // implemented by {@link DebugRequestMessage#getParams()}
+ "type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+ "description": "Object containing arguments for the command."
+ }
+ },
+ "required": [ "type", "command" ]
+ }]
+ },
+
+ "Event": { // implemented by {@link DebugNotificationMessage}
+ "allOf": [ { "$ref": "#/definitions/ProtocolMessage" }, {
+ "type": "object",
+ "description": "Server-initiated event.",
+ "properties": {
+ "type": { // implicit by being of type {@link DebugNotificationMessage}
+ "type": "string",
+ "enum": [ "event" ]
+ },
+ "event": { // implemented by {@link DebugNotificationMessage#getMethod()}
+ "type": "string",
+ "description": "Type of event."
+ },
+ "body": { // implemented by {@link DebugNotificationMessage#getParams()}
+ "type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+ "description": "Event-specific information."
+ }
+ },
+ "required": [ "type", "event" ]
+ }]
+ },
+
+ "Response": { // implemented by {@link DebugResponseMessage}
+ "allOf": [ { "$ref": "#/definitions/ProtocolMessage" }, {
+ "type": "object",
+ "description": "Response to a request.",
+ "properties": {
+ "type": { // implicit by being of type {@link DebugResponseMessage}
+ "type": "string",
+ "enum": [ "response" ]
+ },
+ "request_seq": { // implemented by {@link DebugResponseMessage#getId()}
+ "type": "integer",
+ "description": "Sequence number of the corresponding request."
+ },
+ "success": { // implemented by {@link DebugResponseMessage#getError()} == null
+ "type": "boolean",
+ "description": "Outcome of the request."
+ },
+ "command": { // implemented by {@link DebugResponseMessage#getMethod()}
+ "type": "string",
+ "description": "The command requested."
+ },
+ "message": { // implemented by {@link ResponseError#getMessage()}
+ "type": "string",
+ "description": "Contains error message if success == false."
+ },
+ "body": { // implemented by {@link DebugResponseMessage#getResult()} for success and {@link ResponseError#getData()} for error
+ "type": [ "array", "boolean", "integer", "null", "number" , "object", "string" ],
+ "description": "Contains request result if success is true and optional error details if success is false."
+ }
+ },
+ "required": [ "type", "request_seq", "success", "command" ]
+ }]
+ },
+ * </pre>
+ *
+ */
+public class DebugMessageTypeAdapter extends MessageTypeAdapter {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ private final MessageJsonHandler handler;
+
+ public Factory(MessageJsonHandler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ if (!Message.class.isAssignableFrom(typeToken.getRawType()))
+ return null;
+ return (TypeAdapter<T>) new DebugMessageTypeAdapter(handler, gson);
+ }
+
+ }
+
+ private final MessageJsonHandler handler;
+ private final Gson gson;
+
+ public DebugMessageTypeAdapter(MessageJsonHandler handler, Gson gson) {
+ super(handler, gson);
+ this.handler = handler;
+ this.gson = gson;
+ }
+
+ @Override
+ public Message read(JsonReader in) throws IOException {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+
+ in.beginObject();
+ String messageType = null, method = null, message = null;
+ int seq = 0, request_seq = 0;
+ Boolean rawSuccess = null;
+ Object rawParams = null;
+ Object rawBody = null;
+
+ try {
+
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "seq": {
+ seq = in.nextInt();
+ break;
+ }
+ case "request_seq": {
+ // on responses we treat the request_seq as the id
+ request_seq = in.nextInt();
+ break;
+ }
+ case "type": {
+ messageType = in.nextString();
+ break;
+ }
+ case "success": {
+ rawSuccess = in.nextBoolean();
+ break;
+ }
+ case "command": {
+ method = in.nextString();
+ break;
+ }
+ case "event": {
+ method = in.nextString();
+ break;
+ }
+ case "message": {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ } else {
+ message = in.nextString();
+ }
+ break;
+ }
+ case "arguments": {
+ rawParams = parseParams(in, method);
+ break;
+ }
+ case "body": {
+ rawBody = parseBody(in, messageType, request_seq, method, rawSuccess);
+ break;
+ }
+ default:
+ in.skipValue();
+ }
+ }
+ boolean success = rawSuccess != null ? rawSuccess : false;
+ Object params = parseParams(rawParams, method);
+ Object body = parseBody(rawBody, messageType, request_seq, method, success);
+
+ in.endObject();
+ return createMessage(messageType, seq, request_seq, method, success, message, params, body);
+
+ } catch (JsonSyntaxException | MalformedJsonException | EOFException exception) {
+ if ("request".equals(messageType) || "event".equals(messageType) || "response".equals(messageType)) {
+ // Create a message and bundle it to an exception with an issue that wraps the original exception
+ boolean success = rawSuccess != null ? rawSuccess : false;
+ Message resultMessage = createMessage(messageType, seq, request_seq, method, success, message, rawParams, rawBody);
+ MessageIssue issue = new MessageIssue("Message could not be parsed.", ResponseErrorCode.ParseError.getValue(), exception);
+ throw new MessageIssueException(resultMessage, issue);
+ } else {
+ throw exception;
+ }
+ }
+ }
+
+ /**
+ * Convert the json input into the body object corresponding to the type of
+ * message.
+ *
+ * If the type of message or any other necessary field is not known until after
+ * parsing, call {@link #parseBody(Object, String, int, String, Boolean)} on
+ * the return value of this call for a second chance conversion.
+ *
+ * @param in
+ * json input to read from
+ * @param messageType
+ * message type if known
+ * @param request_seq
+ * seq id of request message if known
+ * @param method
+ * event/method being called
+ * @param success
+ * if success of a response is known
+ * @return correctly typed object if the correct expected type can be
+ * determined, or a JsonElement representing the body
+ */
+ protected Object parseBody(JsonReader in, String messageType, int request_seq, String method, Boolean success)
+ throws IOException {
+ if ("event".equals(messageType)) {
+ return parseParams(in, method);
+ } else if ("response".equals(messageType) && success != null && success) {
+ return super.parseResult(in, Integer.toString(request_seq));
+ } else {
+ return JsonParser.parseReader(in);
+ }
+ }
+
+ /**
+ * Convert the JsonElement into the body object corresponding to the type of
+ * message. If the rawBody is already converted, does nothing.
+ *
+ * @param rawBody
+ * json element to read from
+ * @param messageType
+ * message type if known
+ * @param request_seq
+ * seq id of request message if known
+ * @param method
+ * event/method being called
+ * @param success
+ * if success of a response is known
+ * @return correctly typed object if the correct expected type can be
+ * determined, or rawBody unmodified if no conversion can be done.
+ */
+ protected Object parseBody(Object rawBody, String messageType, int request_seq, String method, Boolean success) {
+ if ("event".equals(messageType)) {
+ return parseParams(rawBody, method);
+ } else if ("response".equals(messageType)) {
+ if (success != null && success) {
+ return super.parseResult(rawBody, Integer.toString(request_seq));
+ }
+ if (isNull(rawBody)) {
+ return null;
+ }
+ if (!(rawBody instanceof JsonElement)) {
+ return rawBody;
+ }
+ JsonElement rawJsonParams = (JsonElement) rawBody;
+ return fromJson(rawJsonParams, Object.class);
+ }
+ return rawBody;
+ }
+
+ private Message createMessage(String messageType, int seq, int request_seq, String method, boolean success,
+ String errorMessage, Object params, Object body) throws JsonParseException {
+ if (messageType == null) {
+ throw new JsonParseException("Unable to identify the input message. Missing 'type' field.");
+ }
+ switch (messageType) {
+ case "request": {
+ DebugRequestMessage message = new DebugRequestMessage();
+ message.setId(seq);
+ message.setMethod(method);
+ message.setParams(params);
+ return message;
+ }
+ case "event": {
+ DebugNotificationMessage message = new DebugNotificationMessage();
+ message.setId(seq);
+ message.setMethod(method);
+ message.setParams(body);
+ return message;
+ }
+ case "response": {
+ DebugResponseMessage message = new DebugResponseMessage();
+ message.setId(request_seq);
+ message.setResponseId(seq);
+ message.setMethod(method);
+ if (!success) {
+ ResponseError error = new ResponseError();
+ error.setCode(ResponseErrorCode.UnknownErrorCode);
+ error.setData(body);
+ if (errorMessage == null) {
+ // Some debug servers/clients don't provide a "message" field on an error.
+ // Generally in those cases the body has some extra details to figure out
+ // what went wrong.
+ errorMessage = "Unset error message.";
+ }
+ error.setMessage(errorMessage);
+ message.setError(error);
+ } else {
+ if (body instanceof JsonElement) {
+ // Type of result could not be resolved - try again with the parsed JSON tree
+ MethodProvider methodProvider = handler.getMethodProvider();
+ if (methodProvider != null) {
+ String resolvedMethod = methodProvider.resolveMethod(Integer.toString(request_seq));
+ if (resolvedMethod != null) {
+ JsonRpcMethod jsonRpcMethod = handler.getJsonRpcMethod(resolvedMethod);
+ if (jsonRpcMethod != null) {
+ TypeAdapter<?> typeAdapter = null;
+ Type returnType = jsonRpcMethod.getReturnType();
+ if (jsonRpcMethod.getReturnTypeAdapterFactory() != null)
+ typeAdapter = jsonRpcMethod.getReturnTypeAdapterFactory().create(gson, TypeToken.get(returnType));
+ JsonElement jsonElement = (JsonElement) body;
+ if (typeAdapter != null)
+ body = typeAdapter.fromJsonTree(jsonElement);
+ else
+ body = gson.fromJson(jsonElement, returnType);
+ }
+ }
+ }
+ }
+ message.setResult(body);
+ }
+ return message;
+ }
+ default:
+ throw new JsonParseException("Unable to identify the input message.");
+ }
+ }
+
+ @Override
+ public void write(JsonWriter out, Message message) throws IOException {
+ out.beginObject();
+ if (message instanceof DebugRequestMessage) {
+ DebugRequestMessage requestMessage = (DebugRequestMessage) message;
+ out.name("type");
+ out.value("request");
+ out.name("seq");
+ writeIntId(out, requestMessage.getRawId());
+ out.name("command");
+ out.value(requestMessage.getMethod());
+ Object params = requestMessage.getParams();
+ if (params != null) {
+ out.name("arguments");
+ gson.toJson(params, params.getClass(), out);
+ }
+ } else if (message instanceof DebugResponseMessage) {
+ DebugResponseMessage responseMessage = (DebugResponseMessage) message;
+ out.name("type");
+ out.value("response");
+ out.name("seq");
+ writeIntId(out, responseMessage.getRawResponseId());
+ out.name("request_seq");
+ writeIntId(out, responseMessage.getRawId());
+ out.name("command");
+ out.value(responseMessage.getMethod());
+ ResponseError error = responseMessage.getError();
+ if (error != null) {
+ out.name("success");
+ out.value(false);
+ String errorMessage = error.getMessage();
+ out.name("message");
+ if (errorMessage == null)
+ writeNullValue(out);
+ else
+ gson.toJson(errorMessage, errorMessage.getClass(), out);
+
+ Object errorData = error.getData();
+ if (errorData != null) {
+ out.name("body");
+ gson.toJson(errorData, errorData.getClass(), out);
+ }
+ } else {
+ out.name("success");
+ out.value(true);
+ Object result = responseMessage.getResult();
+ if (result != null) {
+ out.name("body");
+ gson.toJson(result, result.getClass(), out);
+ }
+ }
+ } else if (message instanceof DebugNotificationMessage) {
+ DebugNotificationMessage notificationMessage = (DebugNotificationMessage) message;
+ out.name("type");
+ out.value("event");
+ out.name("seq");
+ writeIntId(out, notificationMessage.getRawId());
+ out.name("event");
+ out.value(notificationMessage.getMethod());
+ Object params = notificationMessage.getParams();
+ if (params != null) {
+ out.name("body");
+ gson.toJson(params, params.getClass(), out);
+ }
+ }
+
+ out.endObject();
+ }
+
+ private void writeIntId(JsonWriter out, Either<String, Number> id) throws IOException {
+ if (id == null)
+ writeNullValue(out);
+ else if (id.isLeft())
+ out.value(Integer.parseInt(id.getLeft()));
+ else if (id.isRight())
+ out.value(id.getRight());
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/json/DebugMessageJsonHandler.java b/java/org/eclipse/lsp4j/jsonrpc/debug/json/DebugMessageJsonHandler.java
new file mode 100644
index 0000000..1e72557
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/json/DebugMessageJsonHandler.java
@@ -0,0 +1,38 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.json;
+
+import java.util.Map;
+import java.util.function.Consumer;
+
+import org.eclipse.lsp4j.jsonrpc.debug.adapters.DebugEnumTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.debug.adapters.DebugMessageTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+
+import com.google.gson.GsonBuilder;
+
+public class DebugMessageJsonHandler extends MessageJsonHandler {
+ public DebugMessageJsonHandler(Map<String, JsonRpcMethod> supportedMethods) {
+ super(supportedMethods);
+ }
+
+ public DebugMessageJsonHandler(Map<String, JsonRpcMethod> supportedMethods, Consumer<GsonBuilder> configureGson) {
+ super(supportedMethods, configureGson);
+ }
+
+ public GsonBuilder getDefaultGsonBuilder() {
+ return super.getDefaultGsonBuilder().registerTypeAdapterFactory(new DebugMessageTypeAdapter.Factory(this))
+ .registerTypeAdapterFactory(new DebugEnumTypeAdapter.Factory());
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugNotificationMessage.java b/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugNotificationMessage.java
new file mode 100644
index 0000000..738a789
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugNotificationMessage.java
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.messages;
+
+import org.eclipse.lsp4j.jsonrpc.debug.adapters.DebugMessageTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * DSP specific version of NotificationMessage.
+ *
+ * @see DebugMessageTypeAdapter
+ */
+public class DebugNotificationMessage extends NotificationMessage {
+
+ /**
+ * The notification id.
+ */
+ @NonNull
+ private Either<String, Number> id;
+
+ public String getId() {
+ if (id == null)
+ return null;
+ if (id.isLeft())
+ return id.getLeft();
+ if (id.isRight())
+ return id.getRight().toString();
+ return null;
+ }
+
+ @NonNull
+ public Either<String, Number> getRawId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = Either.forLeft(id);
+ }
+
+ public void setId(int id) {
+ this.id = Either.forRight(id);
+ }
+
+ public void setRawId(@NonNull Either<String, Number> id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DebugNotificationMessage other = (DebugNotificationMessage) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugRequestMessage.java b/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugRequestMessage.java
new file mode 100644
index 0000000..dca7310
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugRequestMessage.java
@@ -0,0 +1,24 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.messages;
+
+import org.eclipse.lsp4j.jsonrpc.debug.adapters.DebugMessageTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+
+/**
+ * DSP specific version of RequestMessage.
+ *
+ * @see DebugMessageTypeAdapter
+ */
+public class DebugRequestMessage extends RequestMessage {
+ // no additional fields are needed to represent request messages in DSP
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugResponseMessage.java b/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugResponseMessage.java
new file mode 100644
index 0000000..26fe32b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/debug/messages/DebugResponseMessage.java
@@ -0,0 +1,109 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.messages;
+
+import org.eclipse.lsp4j.jsonrpc.debug.adapters.DebugMessageTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * DSP specific version of ResponseMessage.
+ *
+ * @see DebugMessageTypeAdapter
+ */
+public class DebugResponseMessage extends ResponseMessage {
+
+ /**
+ * The response id.
+ *
+ * The {@link #getId()} field is the id of the message being replied to.
+ */
+ @NonNull
+ private Either<String, Number> responseId;
+
+ public String getResponseId() {
+ if (responseId == null)
+ return null;
+ if (responseId.isLeft())
+ return responseId.getLeft();
+ if (responseId.isRight())
+ return responseId.getRight().toString();
+ return null;
+ }
+
+ @NonNull
+ public Either<String, Number> getRawResponseId() {
+ return responseId;
+ }
+
+ public void setResponseId(String id) {
+ this.responseId = Either.forLeft(id);
+ }
+
+ public void setResponseId(int id) {
+ this.responseId = Either.forRight(id);
+ }
+
+ public void setRawResponseId(@NonNull Either<String, Number> id) {
+ this.responseId = id;
+ }
+
+ /**
+ * The method that was invoked.
+ */
+ @NonNull
+ private String method;
+
+ @NonNull
+ public String getMethod() {
+ return this.method;
+ }
+
+ public void setMethod(@NonNull String method) {
+ this.method = method;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ DebugResponseMessage other = (DebugResponseMessage) obj;
+ if (this.responseId == null) {
+ if (other.responseId != null)
+ return false;
+ } else if (!this.responseId.equals(other.responseId))
+ return false;
+ if (this.method == null) {
+ if (other.method != null)
+ return false;
+ } else if (!this.method.equals(other.method))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.responseId == null) ? 0 : this.responseId.hashCode());
+ result = prime * result + ((this.method == null) ? 0 : this.method.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java b/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java
new file mode 100644
index 0000000..1eedf2e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.MessageProducer;
+
+/**
+ * This class connects a message producer with a message consumer by listening for new messages in a dedicated thread.
+ */
+public class ConcurrentMessageProcessor implements Runnable {
+
+ /**
+ * Start a thread that listens for messages in the message producer and forwards them to the message consumer.
+ *
+ * @param messageProducer - produces messages, e.g. by reading from an input channel
+ * @param messageConsumer - processes messages and potentially forwards them to other consumers
+ * @param executorService - the thread is started using this service
+ * @return a future that is resolved when the started thread is terminated, e.g. by closing a stream
+ * @deprecated Please use the non-static ConcurrentMessageProcessor.beginProcessing() instead.
+ */
+ @Deprecated
+ public static Future<Void> startProcessing(MessageProducer messageProducer, MessageConsumer messageConsumer,
+ ExecutorService executorService) {
+ ConcurrentMessageProcessor reader = new ConcurrentMessageProcessor(messageProducer, messageConsumer);
+ final Future<?> result = executorService.submit(reader);
+ return wrapFuture(result, messageProducer);
+ }
+
+ public static Future<Void> wrapFuture(Future<?> result, MessageProducer messageProducer) {
+ return new Future<Void>() {
+
+ @Override
+ public Void get() throws InterruptedException, ExecutionException {
+ return (Void) result.get();
+ }
+
+ @Override
+ public Void get(long timeout, TimeUnit unit)
+ throws InterruptedException, ExecutionException, TimeoutException {
+ return (Void) result.get(timeout, unit);
+ }
+
+ @Override
+ public boolean isDone() {
+ return result.isDone();
+ }
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ if (mayInterruptIfRunning && messageProducer instanceof Closeable) {
+ try {
+ ((Closeable) messageProducer).close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return result.cancel(mayInterruptIfRunning);
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return result.isCancelled();
+ }
+ };
+ }
+
+ private static final Logger LOG = Logger.getLogger(ConcurrentMessageProcessor.class.getName());
+
+ private boolean isRunning;
+
+ private final MessageProducer messageProducer;
+ private final MessageConsumer messageConsumer;
+
+ public ConcurrentMessageProcessor(MessageProducer messageProducer, MessageConsumer messageConsumer) {
+ this.messageProducer = messageProducer;
+ this.messageConsumer = messageConsumer;
+ }
+
+ /**
+ * Start a thread that listens for messages in the message producer and forwards them to the message consumer.
+ *
+ * @param executorService - the thread is started using this service
+ * @return a future that is resolved when the started thread is terminated, e.g. by closing a stream
+ */
+ public Future<Void> beginProcessing(ExecutorService executorService) {
+ final Future<?> result = executorService.submit(this);
+ return wrapFuture(result, messageProducer);
+ }
+
+ public void run() {
+ processingStarted();
+ try {
+ messageProducer.listen(messageConsumer);
+ } catch (Exception e) {
+ LOG.log(Level.SEVERE, e.getMessage(), e);
+ } finally {
+ processingEnded();
+ }
+ }
+
+ protected void processingStarted() {
+ if (isRunning) {
+ throw new IllegalStateException("The message processor is already running.");
+ }
+ isRunning = true;
+ }
+
+ protected void processingEnded() {
+ isRunning = false;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/JsonRpcMethod.java b/java/org/eclipse/lsp4j/jsonrpc/json/JsonRpcMethod.java
new file mode 100644
index 0000000..b2dcf13
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/JsonRpcMethod.java
@@ -0,0 +1,88 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.lang.reflect.Type;
+
+import com.google.gson.TypeAdapterFactory;
+
+/**
+ * A description of a JSON-RPC method.
+ */
+public class JsonRpcMethod {
+
+ private final String methodName;
+ private final Type[] parameterTypes;
+ private final Type returnType;
+ private final TypeAdapterFactory returnTypeAdapterFactory;
+ private final boolean isNotification;
+
+ private JsonRpcMethod(String methodName, Type[] parameterTypes, Type returnType, TypeAdapterFactory returnTypeAdapterFactory,
+ boolean isNotification) {
+ if (methodName == null)
+ throw new NullPointerException("methodName");
+ this.methodName = methodName;
+ this.parameterTypes = parameterTypes;
+ this.returnType = returnType;
+ this.returnTypeAdapterFactory = returnTypeAdapterFactory;
+ this.isNotification = isNotification;
+ }
+
+ public String getMethodName() {
+ return methodName;
+ }
+
+ public Type[] getParameterTypes() {
+ return parameterTypes;
+ }
+
+ public Type getReturnType() {
+ return returnType;
+ }
+
+ public TypeAdapterFactory getReturnTypeAdapterFactory() {
+ return returnTypeAdapterFactory;
+ }
+
+ public boolean isNotification() {
+ return isNotification;
+ }
+
+ public static JsonRpcMethod notification(String name, Type... parameterTypes) {
+ return new JsonRpcMethod(name, parameterTypes, Void.class, null, true);
+ }
+
+ public static JsonRpcMethod request(String name, Type returnType, Type... parameterTypes) {
+ return new JsonRpcMethod(name, parameterTypes, returnType, null, false);
+ }
+
+ public static JsonRpcMethod request(String name, Type returnType, TypeAdapterFactory returnTypeAdapterFactory, Type... parameterTypes) {
+ return new JsonRpcMethod(name, parameterTypes, returnType, returnTypeAdapterFactory, false);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ if (isNotification)
+ builder.append("JsonRpcMethod (notification) {\n");
+ else
+ builder.append("JsonRpcMethod (request) {\n");
+ builder.append("\tmethodName: ").append(methodName).append('\n');
+ if (parameterTypes != null)
+ builder.append("\tparameterTypes: ").append(parameterTypes).append('\n');
+ if (returnType != null)
+ builder.append("\treturnType: ").append(returnType).append('\n');
+ builder.append("}");
+ return builder.toString();
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/JsonRpcMethodProvider.java b/java/org/eclipse/lsp4j/jsonrpc/json/JsonRpcMethodProvider.java
new file mode 100644
index 0000000..a731200
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/JsonRpcMethodProvider.java
@@ -0,0 +1,26 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.util.Map;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+
+/**
+ * Provides {@link JsonRpcMethod}. Can be implemented by {@link Endpoint}s to
+ * provide information about the supported methods.
+ */
+public interface JsonRpcMethodProvider {
+
+ Map<String, JsonRpcMethod> supportedMethods();
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/MessageConstants.java b/java/org/eclipse/lsp4j/jsonrpc/json/MessageConstants.java
new file mode 100644
index 0000000..e6676fa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/MessageConstants.java
@@ -0,0 +1,22 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+public interface MessageConstants {
+
+ public static String JSONRPC_VERSION = "2.0";
+ public static String CONTENT_LENGTH_HEADER = "Content-Length";
+ public static String CONTENT_TYPE_HEADER = "Content-Type";
+ public static String JSON_MIME_TYPE = "application/json";
+ public static String CRLF = "\r\n";
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/MessageJsonHandler.java b/java/org/eclipse/lsp4j/jsonrpc/json/MessageJsonHandler.java
new file mode 100644
index 0000000..f7584c8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/MessageJsonHandler.java
@@ -0,0 +1,164 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EnumTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.MessageTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.ThrowableTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.TupleTypeAdapters;
+import org.eclipse.lsp4j.jsonrpc.messages.CancelParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonIOException;
+import com.google.gson.JsonParseException;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.google.gson.stream.MalformedJsonException;
+
+/**
+ * A wrapper around Gson that includes configuration required for JSON-RPC messages.
+ */
+public class MessageJsonHandler {
+
+ public static final JsonRpcMethod CANCEL_METHOD = JsonRpcMethod.notification("$/cancelRequest", CancelParams.class);
+
+ private final Gson gson;
+
+ private final Map<String, JsonRpcMethod> supportedMethods;
+
+ private MethodProvider methodProvider;
+
+ /**
+ * @param supportedMethods - a map used to resolve RPC methods in {@link #getJsonRpcMethod(String)}
+ */
+ public MessageJsonHandler(Map<String, JsonRpcMethod> supportedMethods) {
+ this.supportedMethods = supportedMethods;
+ this.gson = getDefaultGsonBuilder().create();
+ }
+
+ /**
+ * @param supportedMethods - a map used to resolve RPC methods in {@link #getJsonRpcMethod(String)}
+ * @param configureGson - a function that contributes to the GsonBuilder created by {@link #getDefaultGsonBuilder()}
+ */
+ public MessageJsonHandler(Map<String, JsonRpcMethod> supportedMethods, Consumer<GsonBuilder> configureGson) {
+ this.supportedMethods = supportedMethods;
+ GsonBuilder gsonBuilder = getDefaultGsonBuilder();
+ configureGson.accept(gsonBuilder);
+ this.gson = gsonBuilder.create();
+ }
+
+ /**
+ * Create a {@link GsonBuilder} with default settings for parsing JSON-RPC messages.
+ */
+ public GsonBuilder getDefaultGsonBuilder() {
+ return new GsonBuilder()
+ .registerTypeAdapterFactory(new CollectionTypeAdapter.Factory())
+ .registerTypeAdapterFactory(new ThrowableTypeAdapter.Factory())
+ .registerTypeAdapterFactory(new EitherTypeAdapter.Factory())
+ .registerTypeAdapterFactory(new TupleTypeAdapters.TwoTypeAdapterFactory())
+ .registerTypeAdapterFactory(new EnumTypeAdapter.Factory())
+ .registerTypeAdapterFactory(new MessageTypeAdapter.Factory(this));
+ }
+
+ public Gson getGson() {
+ return gson;
+ }
+
+ /**
+ * Resolve an RPC method by name.
+ */
+ public JsonRpcMethod getJsonRpcMethod(String name) {
+ JsonRpcMethod result = supportedMethods.get(name);
+ if (result != null)
+ return result;
+ else if (CANCEL_METHOD.getMethodName().equals(name))
+ return CANCEL_METHOD;
+ return null;
+ }
+
+ public MethodProvider getMethodProvider() {
+ return methodProvider;
+ }
+
+ public void setMethodProvider(MethodProvider methodProvider) {
+ this.methodProvider = methodProvider;
+ }
+
+ public Message parseMessage(CharSequence input) throws JsonParseException {
+ StringReader reader = new StringReader(input.toString());
+ return parseMessage(reader);
+ }
+
+ public Message parseMessage(Reader input) throws JsonParseException {
+ JsonReader jsonReader = new JsonReader(input);
+ Message message = gson.fromJson(jsonReader, Message.class);
+
+ if (message != null) {
+ // Check whether the input has been fully consumed
+ try {
+ if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
+ MessageIssue issue = new MessageIssue("JSON document was not fully consumed.", ResponseErrorCode.ParseError.getValue());
+ throw new MessageIssueException(message, issue);
+ }
+ } catch (MalformedJsonException e) {
+ MessageIssue issue = new MessageIssue("Message could not be parsed.", ResponseErrorCode.ParseError.getValue(), e);
+ throw new MessageIssueException(message, issue);
+ } catch (IOException e) {
+ throw new JsonIOException(e);
+ }
+ }
+ return message;
+ }
+
+ public String serialize(Message message) {
+ StringWriter writer = new StringWriter();
+ serialize(message, writer);
+ return writer.toString();
+ }
+
+ public void serialize(Message message, Writer output) throws JsonIOException {
+ gson.toJson(message, Message.class, output);
+ }
+
+
+ private static MessageJsonHandler toStringInstance;
+
+ /**
+ * Perform JSON serialization of the given object using the default configuration of JSON-RPC messages
+ * enhanced with the pretty printing option.
+ */
+ public static String toString(Object object) {
+ if (toStringInstance == null) {
+ toStringInstance = new MessageJsonHandler(Collections.emptyMap(), gsonBuilder -> {
+ gsonBuilder.setPrettyPrinting();
+ });
+ }
+ return toStringInstance.gson.toJson(object);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/MethodProvider.java b/java/org/eclipse/lsp4j/jsonrpc/json/MethodProvider.java
new file mode 100644
index 0000000..3ece1f9
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/MethodProvider.java
@@ -0,0 +1,23 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+public interface MethodProvider {
+
+ /**
+ * Returns the method name for a given request id, or null if such request id is unknown.
+ *
+ * @return method name or {@code null}
+ */
+ String resolveMethod(String requestId);
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/ResponseJsonAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/ResponseJsonAdapter.java
new file mode 100644
index 0000000..3fe62d0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/ResponseJsonAdapter.java
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import com.google.gson.TypeAdapterFactory;
+
+/**
+ * An annotation that indicates the Gson {@link TypeAdapterFactory} to use with a request response.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface ResponseJsonAdapter {
+
+ Class<? extends TypeAdapterFactory> value();
+
+}
\ No newline at end of file
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageConsumer.java b/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageConsumer.java
new file mode 100644
index 0000000..313c472
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageConsumer.java
@@ -0,0 +1,98 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+/**
+ * A message consumer that serializes messages to JSON and sends them to an output stream.
+ */
+public class StreamMessageConsumer implements MessageConsumer, MessageConstants {
+
+ private final String encoding;
+ private final MessageJsonHandler jsonHandler;
+
+ private final Object outputLock = new Object();
+
+ private OutputStream output;
+
+ public StreamMessageConsumer(MessageJsonHandler jsonHandler) {
+ this(null, StandardCharsets.UTF_8.name(), jsonHandler);
+ }
+
+ public StreamMessageConsumer(OutputStream output, MessageJsonHandler jsonHandler) {
+ this(output, StandardCharsets.UTF_8.name(), jsonHandler);
+ }
+
+ public StreamMessageConsumer(OutputStream output, String encoding, MessageJsonHandler jsonHandler) {
+ this.output = output;
+ this.encoding = encoding;
+ this.jsonHandler = jsonHandler;
+ }
+
+ public OutputStream getOutput() {
+ return output;
+ }
+
+ public void setOutput(OutputStream output) {
+ this.output = output;
+ }
+
+ @Override
+ public void consume(Message message) {
+ try {
+ String content = jsonHandler.serialize(message);
+ byte[] contentBytes = content.getBytes(encoding);
+ int contentLength = contentBytes.length;
+
+ String header = getHeader(contentLength);
+ byte[] headerBytes = header.getBytes(StandardCharsets.US_ASCII);
+
+ synchronized (outputLock) {
+ output.write(headerBytes);
+ output.write(contentBytes);
+ output.flush();
+ }
+ } catch (IOException exception) {
+ throw new JsonRpcException(exception);
+ }
+ }
+
+ /**
+ * Construct a header to be prepended to the actual content. This implementation writes
+ * {@code Content-Length} and {@code Content-Type} attributes according to the LSP specification.
+ */
+ protected String getHeader(int contentLength) {
+ StringBuilder headerBuilder = new StringBuilder();
+ appendHeader(headerBuilder, CONTENT_LENGTH_HEADER, contentLength).append(CRLF);
+ if (!StandardCharsets.UTF_8.name().equals(encoding)) {
+ appendHeader(headerBuilder, CONTENT_TYPE_HEADER, JSON_MIME_TYPE);
+ headerBuilder.append("; charset=").append(encoding).append(CRLF);
+ }
+ headerBuilder.append(CRLF);
+ return headerBuilder.toString();
+ }
+
+ /**
+ * Append a header attribute to the given builder.
+ */
+ protected StringBuilder appendHeader(StringBuilder builder, String name, Object value) {
+ return builder.append(name).append(": ").append(value);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java b/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java
new file mode 100644
index 0000000..835a903
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java
@@ -0,0 +1,216 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueHandler;
+import org.eclipse.lsp4j.jsonrpc.MessageProducer;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+/**
+ * A message producer that reads from an input stream and parses messages from JSON.
+ */
+public class StreamMessageProducer implements MessageProducer, Closeable, MessageConstants {
+
+ private static final Logger LOG = Logger.getLogger(StreamMessageProducer.class.getName());
+
+ private final MessageJsonHandler jsonHandler;
+ private final MessageIssueHandler issueHandler;
+
+ private InputStream input;
+
+ private MessageConsumer callback;
+ private boolean keepRunning;
+
+ public StreamMessageProducer(InputStream input, MessageJsonHandler jsonHandler) {
+ this(input, jsonHandler, null);
+ }
+
+ public StreamMessageProducer(InputStream input, MessageJsonHandler jsonHandler, MessageIssueHandler issueHandler) {
+ this.input = input;
+ this.jsonHandler = jsonHandler;
+ this.issueHandler = issueHandler;
+ }
+
+ public InputStream getInput() {
+ return input;
+ }
+
+ public void setInput(InputStream input) {
+ this.input = input;
+ }
+
+ protected static class Headers {
+ public int contentLength = -1;
+ public String charset = StandardCharsets.UTF_8.name();
+ }
+
+ @Override
+ public void listen(MessageConsumer callback) {
+ if (keepRunning) {
+ throw new IllegalStateException("This StreamMessageProducer is already running.");
+ }
+ this.keepRunning = true;
+ this.callback = callback;
+ try {
+ StringBuilder headerBuilder = null;
+ StringBuilder debugBuilder = null;
+ boolean newLine = false;
+ Headers headers = new Headers();
+ while (keepRunning) {
+ int c = input.read();
+ if (c == -1) {
+ // End of input stream has been reached
+ keepRunning = false;
+ } else {
+ if (debugBuilder == null)
+ debugBuilder = new StringBuilder();
+ debugBuilder.append((char) c);
+ if (c == '\n') {
+ if (newLine) {
+ // Two consecutive newlines have been read, which signals the start of the message content
+ if (headers.contentLength < 0) {
+ fireError(new IllegalStateException("Missing header " + CONTENT_LENGTH_HEADER
+ + " in input \"" + debugBuilder + "\""));
+ } else {
+ boolean result = handleMessage(input, headers);
+ if (!result)
+ keepRunning = false;
+ newLine = false;
+ }
+ headers = new Headers();
+ debugBuilder = null;
+ } else if (headerBuilder != null) {
+ // A single newline ends a header line
+ parseHeader(headerBuilder.toString(), headers);
+ headerBuilder = null;
+ }
+ newLine = true;
+ } else if (c != '\r') {
+ // Add the input to the current header line
+ if (headerBuilder == null)
+ headerBuilder = new StringBuilder();
+ headerBuilder.append((char) c);
+ newLine = false;
+ }
+ }
+ } // while (keepRunning)
+ } catch (IOException exception) {
+ if (JsonRpcException.indicatesStreamClosed(exception)) {
+ // Only log the error if we had intended to keep running
+ if (keepRunning)
+ fireStreamClosed(exception);
+ } else
+ throw new JsonRpcException(exception);
+ } finally {
+ this.callback = null;
+ this.keepRunning = false;
+ }
+ }
+
+ /**
+ * Log an error.
+ */
+ protected void fireError(Throwable error) {
+ String message = error.getMessage() != null ? error.getMessage() : "An error occurred while processing an incoming message.";
+ LOG.log(Level.SEVERE, message, error);
+ }
+
+ /**
+ * Report that the stream was closed through an exception.
+ */
+ protected void fireStreamClosed(Exception cause) {
+ String message = cause.getMessage() != null ? cause.getMessage() : "The input stream was closed.";
+ LOG.log(Level.INFO, message, cause);
+ }
+
+ /**
+ * Parse a header attribute and set the corresponding data in the {@link Headers} fields.
+ */
+ protected void parseHeader(String line, Headers headers) {
+ int sepIndex = line.indexOf(':');
+ if (sepIndex >= 0) {
+ String key = line.substring(0, sepIndex).trim();
+ switch (key) {
+ case CONTENT_LENGTH_HEADER:
+ try {
+ headers.contentLength = Integer.parseInt(line.substring(sepIndex + 1).trim());
+ } catch (NumberFormatException e) {
+ fireError(e);
+ }
+ break;
+ case CONTENT_TYPE_HEADER: {
+ int charsetIndex = line.indexOf("charset=");
+ if (charsetIndex >= 0)
+ headers.charset = line.substring(charsetIndex + 8).trim();
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Read the JSON content part of a message, parse it, and notify the callback.
+ *
+ * @return {@code true} if we should continue reading from the input stream, {@code false} if we should stop
+ */
+ protected boolean handleMessage(InputStream input, Headers headers) throws IOException {
+ if (callback == null)
+ callback = message -> LOG.log(Level.INFO, "Received message: " + message);
+
+ try {
+ int contentLength = headers.contentLength;
+ byte[] buffer = new byte[contentLength];
+ int bytesRead = 0;
+
+ while (bytesRead < contentLength) {
+ int readResult = input.read(buffer, bytesRead, contentLength - bytesRead);
+ if (readResult == -1)
+ return false;
+ bytesRead += readResult;
+ }
+
+ String content = new String(buffer, headers.charset);
+ try {
+ Message message = jsonHandler.parseMessage(content);
+ callback.consume(message);
+ } catch (MessageIssueException exception) {
+ // An issue was found while parsing or validating the message
+ if (issueHandler != null)
+ issueHandler.handle(exception.getRpcMessage(), exception.getIssues());
+ else
+ fireError(exception);
+ }
+ } catch (Exception exception) {
+ // UnsupportedEncodingException can be thrown by String constructor
+ // JsonParseException can be thrown by jsonHandler
+ // We also catch arbitrary exceptions that are thrown by message consumers in order to keep this thread alive
+ fireError(exception);
+ }
+ return true;
+ }
+
+ @Override
+ public void close() {
+ keepRunning = false;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/CollectionTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/CollectionTypeAdapter.java
new file mode 100644
index 0000000..96d34f8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/CollectionTypeAdapter.java
@@ -0,0 +1,146 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.function.Supplier;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParseException;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+/**
+ * A specialized type adapter for collections that can handle single values.
+ */
+public class CollectionTypeAdapter<E> extends TypeAdapter<Collection<E>> {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ @Override
+ @SuppressWarnings({ "unchecked" })
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ if (!Collection.class.isAssignableFrom(typeToken.getRawType()))
+ return null;
+
+ Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Collection.class);
+ if (elementTypes.length != 1)
+ return null;
+ Type elementType = elementTypes[0];
+ TypeAdapter<?> elementTypeAdapter;
+ if (elementType == Object.class)
+ elementTypeAdapter = new JsonElementTypeAdapter(gson);
+ else
+ elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
+ Supplier<Collection<Object>> constructor = getConstructor((Class<Collection<Object>>) typeToken.getRawType());
+ return (TypeAdapter<T>) create(gson, elementType, elementTypeAdapter, constructor);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected TypeAdapter<?> create(Gson gson, Type elementType, TypeAdapter<?> elementTypeAdapter, Supplier<Collection<Object>> constructor) {
+ return new CollectionTypeAdapter(gson, elementType, elementTypeAdapter, constructor);
+ }
+
+ protected <E> Supplier<Collection<E>> getConstructor(Class<? extends Collection<E>> rawType) {
+ try {
+ Constructor<? extends Collection<E>> constructor = rawType.getDeclaredConstructor();
+ return () -> {
+ try {
+ return constructor.newInstance();
+ } catch (Exception e) {
+ throw new JsonParseException(e);
+ }
+ };
+ } catch (Exception e) {
+ if (SortedSet.class.isAssignableFrom(rawType))
+ return () -> new TreeSet<E>();
+ else if (Set.class.isAssignableFrom(rawType))
+ return () -> new LinkedHashSet<E>();
+ else if (Queue.class.isAssignableFrom(rawType))
+ return () -> new LinkedList<E>();
+ else
+ return () -> new ArrayList<E>();
+ }
+ }
+
+ }
+
+ private final Gson gson;
+ private final Type elementType;
+ private final TypeAdapter<E> elementTypeAdapter;
+ private final Supplier<Collection<E>> constructor;
+
+ public CollectionTypeAdapter(Gson gson, Type elementType, TypeAdapter<E> elementTypeAdapter, Supplier<Collection<E>> constructor) {
+ this.gson = gson;
+ this.elementType = elementType;
+ this.elementTypeAdapter = elementTypeAdapter;
+ this.constructor = constructor;
+ }
+
+ @Override
+ public Collection<E> read(JsonReader in) throws IOException {
+ JsonToken peek = in.peek();
+ if (peek == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ } else if (peek == JsonToken.BEGIN_ARRAY) {
+ Collection<E> collection = constructor.get();
+ in.beginArray();
+ while (in.hasNext()) {
+ E instance = elementTypeAdapter.read(in);
+ collection.add(instance);
+ }
+ in.endArray();
+ return collection;
+ } else {
+ Collection<E> collection = constructor.get();
+ E instance = elementTypeAdapter.read(in);
+ collection.add(instance);
+ return collection;
+ }
+ }
+
+ @Override
+ public void write(JsonWriter out, Collection<E> collection) throws IOException {
+ if (collection == null) {
+ out.nullValue();
+ return;
+ }
+ out.beginArray();
+ for (E element : collection) {
+ if (element != null && elementType != element.getClass()
+ && (elementType instanceof TypeVariable<?> || elementType instanceof Class<?>)) {
+ @SuppressWarnings("unchecked")
+ TypeAdapter<E> runtimeTypeAdapter = (TypeAdapter<E>) gson.getAdapter(TypeToken.get(element.getClass()));
+ runtimeTypeAdapter.write(out, element);
+ } else {
+ elementTypeAdapter.write(out, element);
+ }
+ }
+ out.endArray();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/CollectionTypeAdapterFactory.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/CollectionTypeAdapterFactory.java
new file mode 100644
index 0000000..7a153e2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/CollectionTypeAdapterFactory.java
@@ -0,0 +1,40 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.function.Supplier;
+
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+
+/**
+ * @deprecated Use {@link CollectionTypeAdapter.Factory} instead.
+ */
+@Deprecated
+public class CollectionTypeAdapterFactory extends CollectionTypeAdapter.Factory {
+
+ /**
+ * @deprecated Use {@link CollectionTypeAdapter} instead.
+ */
+ @Deprecated
+ protected static class Adapter<E> extends CollectionTypeAdapter<E> {
+
+ public Adapter(Gson gson, Type elementType, TypeAdapter<E> elementTypeAdapter,
+ Supplier<Collection<E>> constructor) {
+ super(gson, elementType, elementTypeAdapter, constructor);
+ }
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EitherTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EitherTypeAdapter.java
new file mode 100644
index 0000000..707c506
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EitherTypeAdapter.java
@@ -0,0 +1,286 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.function.Predicate;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Either3;
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+/**
+ * Type adapter for {@link Either} and {@link Either3}.
+ */
+public class EitherTypeAdapter<L, R> extends TypeAdapter<Either<L, R>> {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ if (!TypeUtils.isEither(typeToken.getType())) {
+ return null;
+ }
+ return new EitherTypeAdapter(gson, typeToken);
+ }
+
+ }
+
+ /**
+ * A predicate that is usedful for checking alternatives in case both the left and the right type
+ * are JSON object types.
+ */
+ public static class PropertyChecker implements Predicate<JsonElement> {
+
+ private final String propertyName;
+ private final String expectedValue;
+ private final Class<? extends JsonElement> expectedType;
+
+ public PropertyChecker(String propertyName) {
+ this.propertyName = propertyName;
+ this.expectedValue = null;
+ this.expectedType = null;
+ }
+
+ public PropertyChecker(String propertyName, String expectedValue) {
+ this.propertyName = propertyName;
+ this.expectedValue = expectedValue;
+ this.expectedType = null;
+ }
+
+ public PropertyChecker(String propertyName, Class<? extends JsonElement> expectedType) {
+ this.propertyName = propertyName;
+ this.expectedType = expectedType;
+ this.expectedValue = null;
+ }
+
+ @Override
+ public boolean test(JsonElement element) {
+ if (element.isJsonObject()) {
+ JsonObject object = element.getAsJsonObject();
+ JsonElement value = object.get(propertyName);
+ if (expectedValue != null)
+ return value != null && value.isJsonPrimitive() && expectedValue.equals(value.getAsString());
+ else if (expectedType != null)
+ return expectedType.isInstance(value);
+ else
+ return value != null;
+ }
+ return false;
+ }
+
+ }
+
+ /**
+ * A predicate for the case that a type alternative is a list.
+ */
+ public static class ListChecker implements Predicate<JsonElement> {
+
+ private final Predicate<JsonElement> elementChecker;
+ private final boolean resultIfEmpty;
+
+ public ListChecker(Predicate<JsonElement> elementChecker) {
+ this(elementChecker, false);
+ }
+
+ public ListChecker(Predicate<JsonElement> elementChecker, boolean resultIfEmpty) {
+ this.elementChecker = elementChecker;
+ this.resultIfEmpty = resultIfEmpty;
+ }
+
+ @Override
+ public boolean test(JsonElement t) {
+ if (elementChecker.test(t))
+ return true;
+ if (t.isJsonArray()) {
+ JsonArray array = t.getAsJsonArray();
+ if (array.size() == 0)
+ return resultIfEmpty;
+ for (JsonElement e : array) {
+ if (elementChecker.test(e))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ }
+
+ protected final TypeToken<Either<L, R>> typeToken;
+ protected final EitherTypeArgument<L> left;
+ protected final EitherTypeArgument<R> right;
+ protected final Predicate<JsonElement> leftChecker;
+ protected final Predicate<JsonElement> rightChecker;
+
+ public EitherTypeAdapter(Gson gson, TypeToken<Either<L, R>> typeToken) {
+ this(gson, typeToken, null, null);
+ }
+
+ public EitherTypeAdapter(Gson gson, TypeToken<Either<L, R>> typeToken, Predicate<JsonElement> leftChecker, Predicate<JsonElement> rightChecker) {
+ this.typeToken = typeToken;
+ Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Either.class);
+ this.left = new EitherTypeArgument<L>(gson, elementTypes[0]);
+ this.right = new EitherTypeArgument<R>(gson, elementTypes[1]);
+ this.leftChecker = leftChecker;
+ this.rightChecker = rightChecker;
+ }
+
+ @Override
+ public void write(JsonWriter out, Either<L, R> value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ } else if (value.isLeft()) {
+ left.write(out, value.getLeft());
+ } else {
+ right.write(out, value.getRight());
+ }
+ }
+
+ @Override
+ public Either<L, R> read(JsonReader in) throws IOException {
+ JsonToken next = in.peek();
+ if (next == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+ return create(next, in);
+ }
+
+ protected Either<L, R> create(JsonToken nextToken, JsonReader in) throws IOException {
+ boolean matchesLeft = left.isAssignable(nextToken);
+ boolean matchesRight = right.isAssignable(nextToken);
+ if (matchesLeft && matchesRight) {
+ if (leftChecker != null || rightChecker != null) {
+ JsonElement element = JsonParser.parseReader(in);
+ if (leftChecker != null && leftChecker.test(element))
+ // Parse the left alternative from the JSON element tree
+ return createLeft(left.read(element));
+ if (rightChecker != null && rightChecker.test(element))
+ // Parse the right alternative from the JSON element tree
+ return createRight(right.read(element));
+ }
+ throw new JsonParseException("Ambiguous Either type: token " + nextToken + " matches both alternatives.");
+ } else if (matchesLeft) {
+ // Parse the left alternative from the JSON stream
+ return createLeft(left.read(in));
+ } else if (matchesRight) {
+ // Parse the right alternative from the JSON stream
+ return createRight(right.read(in));
+ } else if (leftChecker != null || rightChecker != null) {
+ // If result is not the list but directly the only item in the list
+ JsonElement element = JsonParser.parseReader(in);
+ if (leftChecker != null && leftChecker.test(element))
+ // Parse the left alternative from the JSON element tree
+ return createLeft(left.read(element));
+ if (rightChecker != null && rightChecker.test(element))
+ // Parse the right alternative from the JSON element tree
+ return createRight(right.read(element));
+ }
+ throw new JsonParseException("Unexpected token " + nextToken + ": expected " + left + " | " + right + " tokens.");
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Either<L, R> createLeft(L obj) throws IOException {
+ if (Either3.class.isAssignableFrom(typeToken.getRawType()))
+ return (Either<L, R>) Either3.forLeft3(obj);
+ return Either.forLeft(obj);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Either<L, R> createRight(R obj) throws IOException {
+ if (Either3.class.isAssignableFrom(typeToken.getRawType()))
+ return (Either<L, R>) Either3.forRight3((Either<?, ?>) obj);
+ return Either.forRight(obj);
+ }
+
+ protected static class EitherTypeArgument<T> {
+
+ protected final TypeToken<T> typeToken;
+ protected final TypeAdapter<T> adapter;
+ protected final Collection<JsonToken> expectedTokens;
+
+ @SuppressWarnings("unchecked")
+ public EitherTypeArgument(Gson gson, Type type) {
+ this.typeToken = (TypeToken<T>) TypeToken.get(type);
+ this.adapter = (type == Object.class) ? (TypeAdapter<T>) new JsonElementTypeAdapter(gson) : gson.getAdapter(this.typeToken);
+ this.expectedTokens = new HashSet<>();
+ for (Type expectedType : TypeUtils.getExpectedTypes(type)) {
+ Class<?> rawType = TypeToken.get(expectedType).getRawType();
+ JsonToken expectedToken = getExpectedToken(rawType);
+ expectedTokens.add(expectedToken);
+ }
+ }
+
+ protected JsonToken getExpectedToken(Class<?> rawType) {
+ if (rawType.isArray() || Collection.class.isAssignableFrom(rawType) || Tuple.class.isAssignableFrom(rawType)) {
+ return JsonToken.BEGIN_ARRAY;
+ }
+ if (Boolean.class.isAssignableFrom(rawType)) {
+ return JsonToken.BOOLEAN;
+ }
+ if (Number.class.isAssignableFrom(rawType) || Enum.class.isAssignableFrom(rawType)) {
+ return JsonToken.NUMBER;
+ }
+ if (Character.class.isAssignableFrom(rawType) || String.class.isAssignableFrom(rawType)) {
+ return JsonToken.STRING;
+ }
+ return JsonToken.BEGIN_OBJECT;
+ }
+
+ public boolean isAssignable(JsonToken jsonToken) {
+ return this.expectedTokens.contains(jsonToken);
+ }
+
+ public void write(JsonWriter out, T value) throws IOException {
+ this.adapter.write(out, value);
+ }
+
+ public T read(JsonReader in) throws IOException {
+ return this.adapter.read(in);
+ }
+
+ public T read(JsonElement element) throws IOException {
+ return this.adapter.fromJsonTree(element);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for (JsonToken expectedToken : expectedTokens) {
+ if (builder.length() != 0) {
+ builder.append(" | ");
+ }
+ builder.append(expectedToken);
+ }
+ return builder.toString();
+ }
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EitherTypeAdapterFactory.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EitherTypeAdapterFactory.java
new file mode 100644
index 0000000..5abbe83
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EitherTypeAdapterFactory.java
@@ -0,0 +1,37 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+/**
+ * @deprecated Use {@link EitherTypeAdapter.Factory} instead.
+ */
+@Deprecated
+public class EitherTypeAdapterFactory extends EitherTypeAdapter.Factory {
+
+ /**
+ * @deprecated Use {@link EitherTypeAdapter} instead.
+ */
+ @Deprecated
+ protected static class Adapter<L, R> extends EitherTypeAdapter<L, R> {
+
+ public Adapter(Gson gson, TypeToken<Either<L, R>> typeToken) {
+ super(gson, typeToken);
+ }
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EnumTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EnumTypeAdapter.java
new file mode 100644
index 0000000..c24ded2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EnumTypeAdapter.java
@@ -0,0 +1,105 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+/**
+ * A custom type adapter for enums that uses integer values.
+ */
+public class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T> {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ Class<?> rawType = typeToken.getRawType();
+ if (!Enum.class.isAssignableFrom(rawType) || rawType == Enum.class)
+ return null;
+ if (!rawType.isEnum())
+ rawType = rawType.getSuperclass();
+ try {
+ return new EnumTypeAdapter(rawType);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
+
+ private static String VALUE_FIELD_NAME = "value";
+
+ private final Map<String, T> nameToConstant = new HashMap<>();
+ private final Map<Integer, T> valueToConstant = new HashMap<>();
+ private final Map<T, Integer> constantToValue = new HashMap<>();
+
+ EnumTypeAdapter(Class<T> classOfT) throws IllegalAccessException {
+ try {
+ Field valueField = classOfT.getDeclaredField(VALUE_FIELD_NAME);
+ if (valueField.getType() != int.class && valueField.getType() != Integer.class)
+ throw new IllegalArgumentException("The field 'value' must contain an integer value.");
+ valueField.setAccessible(true);
+ for (T constant : classOfT.getEnumConstants()) {
+ nameToConstant.put(constant.name(), constant);
+ Integer constValue = (Integer) valueField.get(constant);
+ valueToConstant.put(constValue, constant);
+ constantToValue.put(constant, constValue);
+ }
+ } catch (NoSuchFieldException e) {
+ for (T constant : classOfT.getEnumConstants()) {
+ nameToConstant.put(constant.name(), constant);
+ int constValue = constant.ordinal();
+ valueToConstant.put(constValue, constant);
+ constantToValue.put(constant, constValue);
+ }
+ }
+ }
+
+ @Override
+ public T read(JsonReader in) throws IOException {
+ JsonToken peek = in.peek();
+ if (peek == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ } else if (peek == JsonToken.NUMBER) {
+ return valueToConstant.get(in.nextInt());
+ } else {
+ String string = in.nextString();
+ try {
+ return valueToConstant.get(Integer.parseInt(string));
+ } catch (NumberFormatException e) {
+ return nameToConstant.get(string);
+ }
+ }
+ }
+
+ @Override
+ public void write(JsonWriter out, T value) throws IOException {
+ if (value != null)
+ out.value(constantToValue.get(value));
+ else
+ out.value((String) null);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EnumTypeAdapterFactory.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EnumTypeAdapterFactory.java
new file mode 100644
index 0000000..ee23dde
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/EnumTypeAdapterFactory.java
@@ -0,0 +1,20 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+/**
+ * @deprecated Use {@link EnumTypeAdapter.Factory} instead.
+ */
+@Deprecated
+public class EnumTypeAdapterFactory extends EnumTypeAdapter.Factory {
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/JsonElementTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/JsonElementTypeAdapter.java
new file mode 100644
index 0000000..0e19daa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/JsonElementTypeAdapter.java
@@ -0,0 +1,68 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.IOException;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+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;
+
+/**
+ * A type adapter that reads every input into a tree of {@link JsonElement}s.
+ */
+public class JsonElementTypeAdapter extends TypeAdapter<Object> {
+
+ /**
+ * This factory should not be registered with a GsonBuilder because it always matches.
+ * Use it as argument to a {@link com.google.gson.annotations.JsonAdapter} annotation like this:
+ * {@code @JsonAdapter(JsonElementTypeAdapter.Factory.class)}
+ */
+ public static class Factory implements TypeAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+ return (TypeAdapter<T>) new JsonElementTypeAdapter(gson);
+ }
+
+ }
+
+ private final Gson gson;
+ private final TypeAdapter<JsonElement> adapter;
+
+ public JsonElementTypeAdapter(Gson gson) {
+ this.gson = gson;
+ this.adapter = gson.getAdapter(JsonElement.class);
+ }
+
+ @Override
+ public JsonElement read(JsonReader in) throws IOException {
+ return adapter.read(in);
+ }
+
+ @Override
+ public void write(JsonWriter out, Object value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ } else if (value instanceof JsonElement) {
+ adapter.write(out, (JsonElement) value);
+ } else {
+ gson.toJson(value, value.getClass(), out);;
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/MessageTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/MessageTypeAdapter.java
new file mode 100644
index 0000000..bffdecb
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/MessageTypeAdapter.java
@@ -0,0 +1,459 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageConstants;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.MethodProvider;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonIOException;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import com.google.gson.stream.MalformedJsonException;
+
+/**
+ * The type adapter for messages dispatches between the different message types: {@link RequestMessage},
+ * {@link ResponseMessage}, and {@link NotificationMessage}.
+ */
+public class MessageTypeAdapter extends TypeAdapter<Message> {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ private final MessageJsonHandler handler;
+
+ public Factory(MessageJsonHandler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ if (!Message.class.isAssignableFrom(typeToken.getRawType()))
+ return null;
+ return (TypeAdapter<T>) new MessageTypeAdapter(handler, gson);
+ }
+
+ }
+
+ private static Type[] EMPTY_TYPE_ARRAY = {};
+
+ private final MessageJsonHandler handler;
+ private final Gson gson;
+
+ public MessageTypeAdapter(MessageJsonHandler handler, Gson gson) {
+ this.handler = handler;
+ this.gson = gson;
+ }
+
+ @Override
+ public Message read(JsonReader in) throws IOException, JsonIOException, JsonSyntaxException {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+
+ in.beginObject();
+ String jsonrpc = null, method = null;
+ Either<String, Number> id = null;
+ Object rawParams = null;
+ Object rawResult = null;
+ ResponseError responseError = null;
+ try {
+
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "jsonrpc": {
+ jsonrpc = in.nextString();
+ break;
+ }
+ case "id": {
+ if (in.peek() == JsonToken.NUMBER)
+ id = Either.forRight(in.nextInt());
+ else
+ id = Either.forLeft(in.nextString());
+ break;
+ }
+ case "method": {
+ method = in.nextString();
+ break;
+ }
+ case "params": {
+ rawParams = parseParams(in, method);
+ break;
+ }
+ case "result": {
+ rawResult = parseResult(in, id != null ? id.get().toString() : null);
+ break;
+ }
+ case "error": {
+ responseError = gson.fromJson(in, ResponseError.class);
+ break;
+ }
+ default:
+ in.skipValue();
+ }
+ }
+ Object params = parseParams(rawParams, method);
+ Object result = parseResult(rawResult, id != null ? id.get().toString() : null);
+
+ in.endObject();
+ return createMessage(jsonrpc, id, method, params, result, responseError);
+
+ } catch (JsonSyntaxException | MalformedJsonException | EOFException exception) {
+ if (id != null || method != null) {
+ // Create a message and bundle it to an exception with an issue that wraps the original exception
+ Message message = createMessage(jsonrpc, id, method, rawParams, rawResult, responseError);
+ MessageIssue issue = new MessageIssue("Message could not be parsed.", ResponseErrorCode.ParseError.getValue(), exception);
+ throw new MessageIssueException(message, issue);
+ } else {
+ throw exception;
+ }
+ }
+ }
+
+ /**
+ * Convert the json input into the result object corresponding to the call made
+ * by id.
+ *
+ * If the id is not known until after parsing, call
+ * {@link #parseResult(Object, String)} on the return value of this call for a
+ * second chance conversion.
+ *
+ * @param in
+ * json input to read from
+ * @param id
+ * id of request message this is in response to
+ * @return correctly typed object if the correct expected type can be
+ * determined, or a JsonElement representing the result
+ */
+ protected Object parseResult(JsonReader in, String id) throws JsonIOException, JsonSyntaxException {
+ Type type = null;
+ MethodProvider methodProvider = handler.getMethodProvider();
+ if (methodProvider != null && id != null) {
+ String resolvedMethod = methodProvider.resolveMethod(id);
+ if (resolvedMethod != null) {
+ JsonRpcMethod jsonRpcMethod = handler.getJsonRpcMethod(resolvedMethod);
+ if (jsonRpcMethod != null) {
+ type = jsonRpcMethod.getReturnType();
+ if (jsonRpcMethod.getReturnTypeAdapterFactory() != null) {
+ TypeAdapter<?> typeAdapter = jsonRpcMethod.getReturnTypeAdapterFactory().create(gson, TypeToken.get(type));
+ try {
+ if (typeAdapter != null)
+ return typeAdapter.read(in);
+ } catch (IOException exception) {
+ throw new JsonIOException(exception);
+ }
+ }
+ }
+ }
+ }
+ return fromJson(in, type);
+ }
+
+ /**
+ * Convert the JsonElement into the result object corresponding to the call made
+ * by id. If the result is already converted, does nothing.
+ *
+ * @param result
+ * json element to read from
+ * @param id
+ * id of request message this is in response to
+ * @return correctly typed object if the correct expected type can be
+ * determined, or result unmodified if no conversion can be done.
+ */
+ protected Object parseResult(Object result, String id) throws JsonSyntaxException {
+ if (result instanceof JsonElement) {
+ // Type of result could not be resolved - try again with the parsed JSON tree
+ Type type = null;
+ MethodProvider methodProvider = handler.getMethodProvider();
+ if (methodProvider != null) {
+ String resolvedMethod = methodProvider.resolveMethod(id);
+ if (resolvedMethod != null) {
+ JsonRpcMethod jsonRpcMethod = handler.getJsonRpcMethod(resolvedMethod);
+ if (jsonRpcMethod != null) {
+ type = jsonRpcMethod.getReturnType();
+ if (jsonRpcMethod.getReturnTypeAdapterFactory() != null) {
+ TypeAdapter<?> typeAdapter = jsonRpcMethod.getReturnTypeAdapterFactory().create(gson, TypeToken.get(type));
+ if (typeAdapter != null)
+ return typeAdapter.fromJsonTree((JsonElement) result);
+ }
+ }
+ }
+ }
+ return fromJson((JsonElement) result, type);
+ }
+ return result;
+ }
+
+ /**
+ * Convert the json input into the parameters object corresponding to the call
+ * made by method.
+ *
+ * If the method is not known until after parsing, call
+ * {@link #parseParams(Object, String)} on the return value of this call for a
+ * second chance conversion.
+ *
+ * @param in
+ * json input to read from
+ * @param method
+ * method name of request
+ * @return correctly typed object if the correct expected type can be
+ * determined, or a JsonElement representing the parameters
+ */
+ protected Object parseParams(JsonReader in, String method) throws IOException, JsonIOException {
+ JsonToken next = in.peek();
+ if (next == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+ Type[] parameterTypes = getParameterTypes(method);
+ if (parameterTypes.length == 1) {
+ return fromJson(in, parameterTypes[0]);
+ }
+ if (parameterTypes.length > 1 && next == JsonToken.BEGIN_ARRAY) {
+ List<Object> parameters = new ArrayList<Object>(parameterTypes.length);
+ int index = 0;
+ in.beginArray();
+ while (in.hasNext()) {
+ Type parameterType = index < parameterTypes.length ? parameterTypes[index] : null;
+ Object parameter = fromJson(in, parameterType);
+ parameters.add(parameter);
+ index++;
+ }
+ in.endArray();
+ while (index < parameterTypes.length) {
+ parameters.add(null);
+ index++;
+ }
+ return parameters;
+ }
+ JsonElement rawParams = JsonParser.parseReader(in);
+ if (method != null && parameterTypes.length == 0 && (
+ rawParams.isJsonArray() && rawParams.getAsJsonArray().size() == 0
+ || rawParams.isJsonObject() && rawParams.getAsJsonObject().size() == 0)) {
+ return null;
+ }
+ return rawParams;
+ }
+
+ /**
+ * Convert the JsonElement into the parameters object corresponding to the call made
+ * by method. If the result is already converted, does nothing.
+ *
+ * @param params
+ * json element to read from
+ * @param method
+ * method name of request
+ * @return correctly typed object if the correct expected type can be
+ * determined, or params unmodified if no conversion can be done.
+ */
+ protected Object parseParams(Object params, String method) {
+ if (isNull(params)) {
+ return null;
+ }
+ if (!(params instanceof JsonElement)) {
+ return params;
+ }
+ JsonElement rawParams = (JsonElement) params;
+ Type[] parameterTypes = getParameterTypes(method);
+ if (parameterTypes.length == 1) {
+ return fromJson(rawParams, parameterTypes[0]);
+ }
+ if (parameterTypes.length > 1 && rawParams instanceof JsonArray) {
+ JsonArray array = (JsonArray) rawParams;
+ List<Object> parameters = new ArrayList<Object>(Math.max(array.size(), parameterTypes.length));
+ int index = 0;
+ Iterator<JsonElement> iterator = array.iterator();
+ while (iterator.hasNext()) {
+ Type parameterType = index < parameterTypes.length ? parameterTypes[index] : null;
+ Object parameter = fromJson(iterator.next(), parameterType);
+ parameters.add(parameter);
+ index++;
+ }
+ while (index < parameterTypes.length) {
+ parameters.add(null);
+ index++;
+ }
+ return parameters;
+ }
+ if (method != null && parameterTypes.length == 0 && (
+ rawParams.isJsonArray() && rawParams.getAsJsonArray().size() == 0
+ || rawParams.isJsonObject() && rawParams.getAsJsonObject().size() == 0)) {
+ return null;
+ }
+ return rawParams;
+ }
+
+ protected Object fromJson(JsonReader in, Type type) throws JsonIOException {
+ if (isNullOrVoidType(type)) {
+ return JsonParser.parseReader(in);
+ }
+ return gson.fromJson(in, type);
+ }
+
+ protected Object fromJson(JsonElement element, Type type) {
+ if (isNull(element)) {
+ return null;
+ }
+ if (isNullOrVoidType(type)) {
+ return element;
+ }
+ Object value = gson.fromJson(element, type);
+ if (isNull(value)) {
+ return null;
+ }
+ return value;
+ }
+
+ protected boolean isNull(Object value) {
+ return value == null || value instanceof JsonNull;
+ }
+
+ protected boolean isNullOrVoidType(Type type) {
+ return type == null || Void.class == type;
+ }
+
+ protected Type[] getParameterTypes(String method) {
+ if (method != null) {
+ JsonRpcMethod jsonRpcMethod = handler.getJsonRpcMethod(method);
+ if (jsonRpcMethod != null)
+ return jsonRpcMethod.getParameterTypes();
+ }
+ return EMPTY_TYPE_ARRAY;
+ }
+
+ protected Message createMessage(String jsonrpc, Either<String, Number> id, String method, Object params,
+ Object responseResult, ResponseError responseError) throws JsonParseException {
+ if (id != null && method != null) {
+ RequestMessage message = new RequestMessage();
+ message.setJsonrpc(jsonrpc);
+ message.setRawId(id);
+ message.setMethod(method);
+ message.setParams(params);
+ return message;
+ } else if (id != null) {
+ ResponseMessage message = new ResponseMessage();
+ message.setJsonrpc(jsonrpc);
+ message.setRawId(id);
+ if (responseError != null)
+ message.setError(responseError);
+ else
+ message.setResult(responseResult);
+ return message;
+ } else if (method != null) {
+ NotificationMessage message = new NotificationMessage();
+ message.setJsonrpc(jsonrpc);
+ message.setMethod(method);
+ message.setParams(params);
+ return message;
+ } else {
+ throw new JsonParseException("Unable to identify the input message.");
+ }
+ }
+
+ @Override
+ public void write(JsonWriter out, Message message) throws IOException {
+ out.beginObject();
+ out.name("jsonrpc");
+ out.value(message.getJsonrpc() == null ? MessageConstants.JSONRPC_VERSION : message.getJsonrpc());
+
+ if (message instanceof RequestMessage) {
+ RequestMessage requestMessage = (RequestMessage) message;
+ out.name("id");
+ writeId(out, requestMessage.getRawId());
+ out.name("method");
+ out.value(requestMessage.getMethod());
+ out.name("params");
+ Object params = requestMessage.getParams();
+ if (params == null)
+ writeNullValue(out);
+ else
+ gson.toJson(params, params.getClass(), out);
+ } else if (message instanceof ResponseMessage) {
+ ResponseMessage responseMessage = (ResponseMessage) message;
+ out.name("id");
+ writeId(out, responseMessage.getRawId());
+ if (responseMessage.getError() != null) {
+ out.name("error");
+ gson.toJson(responseMessage.getError(), ResponseError.class, out);
+ } else {
+ out.name("result");
+ Object result = responseMessage.getResult();
+ if (result == null)
+ writeNullValue(out);
+ else
+ gson.toJson(result, result.getClass(), out);
+ }
+ } else if (message instanceof NotificationMessage) {
+ NotificationMessage notificationMessage = (NotificationMessage) message;
+ out.name("method");
+ out.value(notificationMessage.getMethod());
+ out.name("params");
+ Object params = notificationMessage.getParams();
+ if (params == null)
+ writeNullValue(out);
+ else
+ gson.toJson(params, params.getClass(), out);
+ }
+
+ out.endObject();
+ }
+
+ protected void writeId(JsonWriter out, Either<String, Number> id) throws IOException {
+ if (id == null)
+ writeNullValue(out);
+ else if (id.isLeft())
+ out.value(id.getLeft());
+ else if (id.isRight())
+ out.value(id.getRight());
+ }
+
+ /**
+ * Use this method to write a {@code null} value even if the JSON writer is set to not serialize {@code null}.
+ */
+ protected void writeNullValue(JsonWriter out) throws IOException {
+ boolean previousSerializeNulls = out.getSerializeNulls();
+ out.setSerializeNulls(true);
+ out.nullValue();
+ out.setSerializeNulls(previousSerializeNulls);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/MessageTypeAdapterFactory.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/MessageTypeAdapterFactory.java
new file mode 100644
index 0000000..8afa239
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/MessageTypeAdapterFactory.java
@@ -0,0 +1,26 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+
+/**
+ * @deprecated Use {@link MessageTypeAdapter.Factory} instead.
+ */
+@Deprecated
+public class MessageTypeAdapterFactory extends MessageTypeAdapter.Factory {
+
+ public MessageTypeAdapterFactory(MessageJsonHandler handler) {
+ super(handler);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/ThrowableTypeAdapter.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/ThrowableTypeAdapter.java
new file mode 100644
index 0000000..caaaf94
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/ThrowableTypeAdapter.java
@@ -0,0 +1,136 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParseException;
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+/**
+ * A type adapter for {@link Throwable}. This is used to report issues to the sender of a request.
+ */
+public class ThrowableTypeAdapter extends TypeAdapter<Throwable> {
+
+ public static class Factory implements TypeAdapterFactory {
+
+ @SuppressWarnings({ "unchecked" })
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ if (!Throwable.class.isAssignableFrom(typeToken.getRawType()))
+ return null;
+
+ return (TypeAdapter<T>) new ThrowableTypeAdapter((TypeToken<Throwable>) typeToken);
+ }
+
+ }
+
+ private final TypeToken<Throwable> typeToken;
+
+ public ThrowableTypeAdapter(TypeToken<Throwable> typeToken) {
+ this.typeToken = typeToken;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Throwable read(JsonReader in) throws IOException {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+
+ in.beginObject();
+ String message = null;
+ Throwable cause = null;
+ while (in.hasNext()) {
+ String name = in.nextName();
+ switch (name) {
+ case "message": {
+ message = in.nextString();
+ break;
+ }
+ case "cause": {
+ cause = read(in);
+ break;
+ }
+ default:
+ in.skipValue();
+ }
+ }
+ in.endObject();
+
+ try {
+ Constructor<Throwable> constructor;
+ if (message == null && cause == null) {
+ constructor = (Constructor<Throwable>) typeToken.getRawType().getDeclaredConstructor();
+ return constructor.newInstance();
+ } else if (message == null) {
+ constructor = (Constructor<Throwable>) typeToken.getRawType().getDeclaredConstructor(Throwable.class);
+ return constructor.newInstance(cause);
+ } else if (cause == null) {
+ constructor = (Constructor<Throwable>) typeToken.getRawType().getDeclaredConstructor(String.class);
+ return constructor.newInstance(message);
+ } else {
+ constructor = (Constructor<Throwable>) typeToken.getRawType().getDeclaredConstructor(String.class, Throwable.class);
+ return constructor.newInstance(message, cause);
+ }
+ } catch (NoSuchMethodException e) {
+ if (message == null && cause == null)
+ return new RuntimeException();
+ else if (message == null)
+ return new RuntimeException(cause);
+ else if (cause == null)
+ return new RuntimeException(message);
+ else
+ return new RuntimeException(message, cause);
+ } catch (Exception e) {
+ throw new JsonParseException(e);
+ }
+ }
+
+ @Override
+ public void write(JsonWriter out, Throwable throwable) throws IOException {
+ if (throwable == null) {
+ out.nullValue();
+ } else if (throwable.getMessage() == null && throwable.getCause() != null) {
+ write(out, throwable.getCause());
+ } else {
+ out.beginObject();
+ if (throwable.getMessage() != null) {
+ out.name("message");
+ out.value(throwable.getMessage());
+ }
+ if (shouldWriteCause(throwable)) {
+ out.name("cause");
+ write(out, throwable.getCause());
+ }
+ out.endObject();
+ }
+ }
+
+ private boolean shouldWriteCause(Throwable throwable) {
+ Throwable cause = throwable.getCause();
+ if (cause == null || cause.getMessage() == null || cause == throwable)
+ return false;
+ if (throwable.getMessage() != null && throwable.getMessage().contains(cause.getMessage()))
+ return false;
+ return true;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/TupleTypeAdapters.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/TupleTypeAdapters.java
new file mode 100644
index 0000000..2214f03
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/TupleTypeAdapters.java
@@ -0,0 +1,74 @@
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple.Two;
+
+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.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+public final class TupleTypeAdapters {
+
+ private TupleTypeAdapters() {}
+
+ public static class TwoTypeAdapter<F extends Object, S extends Object> extends TypeAdapter<Two<F, S>> {
+
+ protected final TypeAdapter<F> first;
+ protected final TypeAdapter<S> second;
+
+ @SuppressWarnings("unchecked")
+ public TwoTypeAdapter(Gson gson, TypeToken<Two<F, S>> typeToken) {
+ Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Two.class);
+ this.first = gson.getAdapter((TypeToken<F>) TypeToken.get(elementTypes[0]));
+ this.second = gson.getAdapter((TypeToken<S>) TypeToken.get(elementTypes[1]));
+ }
+
+ @Override
+ public void write(final JsonWriter out, final Two<F, S> value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ } else {
+ out.beginArray();
+ first.write(out, value.getFirst());
+ second.write(out, value.getSecond());
+ out.endArray();
+ }
+ }
+
+ @Override
+ public Two<F, S> read(final JsonReader in) throws IOException {
+ JsonToken next = in.peek();
+ if (next == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ }
+ in.beginArray();
+ F f = first.read(in);
+ S s = second.read(in);
+ Two<F, S> result = new Two<F, S>(f, s);
+ in.endArray();
+ return result;
+ }
+
+ }
+
+ public static class TwoTypeAdapterFactory implements TypeAdapterFactory {
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
+ if (!TypeUtils.isTwoTuple(typeToken.getType())) {
+ return null;
+ }
+ return new TwoTypeAdapter(gson, typeToken);
+ }
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/json/adapters/TypeUtils.java b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/TypeUtils.java
new file mode 100644
index 0000000..11e4530
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/json/adapters/TypeUtils.java
@@ -0,0 +1,242 @@
+/******************************************************************************
+ * Copyright (c) 2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.json.adapters;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple;
+
+import com.google.gson.reflect.TypeToken;
+
+/**
+ * Utilities for handling types in the JSON parser / serializer.
+ */
+public final class TypeUtils {
+
+ private TypeUtils() {}
+
+ /**
+ * Determine the actual type arguments of the given type token with regard to the given target type.
+ */
+ public static Type[] getElementTypes(TypeToken<?> typeToken, Class<?> targetType) {
+ return getElementTypes(typeToken.getType(), typeToken.getRawType(), targetType);
+ }
+
+ private static Type[] getElementTypes(Type type, Class<?> rawType, Class<?> targetType) {
+ if (targetType.equals(rawType) && type instanceof ParameterizedType) {
+ Type mappedType;
+ if (type instanceof ParameterizedTypeImpl)
+ mappedType = type;
+ else
+ // Transform wildcards in the actual type arguments
+ mappedType = getMappedType(type, Collections.emptyMap());
+ return ((ParameterizedType) mappedType).getActualTypeArguments();
+ }
+ // Map the parameters of the raw type to the actual type arguments
+ Map<String, Type> varMapping = createVariableMapping(type, rawType);
+ if (targetType.isInterface()) {
+ // Look for superinterfaces that extend the target interface
+ Class<?>[] interfaces = rawType.getInterfaces();
+ for (int i = 0; i < interfaces.length; i++) {
+ if (Collection.class.isAssignableFrom(interfaces[i])) {
+ Type genericInterface = rawType.getGenericInterfaces()[i];
+ Type mappedInterface = getMappedType(genericInterface, varMapping);
+ return getElementTypes(mappedInterface, interfaces[i], targetType);
+ }
+ }
+ }
+ if (!rawType.isInterface()) {
+ // Visit the superclass if it extends the target class / implements the target interface
+ Class<?> rawSupertype = rawType.getSuperclass();
+ if (targetType.isAssignableFrom(rawSupertype)) {
+ Type genericSuperclass = rawType.getGenericSuperclass();
+ Type mappedSuperclass = getMappedType(genericSuperclass, varMapping);
+ return getElementTypes(mappedSuperclass, rawSupertype, targetType);
+ }
+ }
+ // No luck, return an array of Object types
+ Type[] result = new Type[targetType.getTypeParameters().length];
+ Arrays.fill(result, Object.class);
+ return result;
+ }
+
+ private static <T> Map<String, Type> createVariableMapping(Type type, Class<T> rawType) {
+ if (type instanceof ParameterizedType) {
+ TypeVariable<Class<T>>[] vars = rawType.getTypeParameters();
+ Type[] args = ((ParameterizedType) type).getActualTypeArguments();
+ Map<String, Type> newVarMapping = new HashMap<>(capacity(vars.length));
+ for (int i = 0; i < vars.length; i++) {
+ Type actualType = Object.class;
+ if (i < args.length) {
+ actualType = args[i];
+ if (actualType instanceof WildcardType)
+ actualType = ((WildcardType) actualType).getUpperBounds()[0];
+ }
+ newVarMapping.put(vars[i].getName(), actualType);
+ }
+ return newVarMapping;
+ }
+ return Collections.emptyMap();
+ }
+
+ private static int capacity(int expectedSize) {
+ if (expectedSize < 3)
+ return expectedSize + 1;
+ else
+ return expectedSize + expectedSize / 3;
+ }
+
+ private static Type getMappedType(Type type, Map<String, Type> varMapping) {
+ if (type instanceof TypeVariable) {
+ String name = ((TypeVariable<?>) type).getName();
+ if (varMapping.containsKey(name))
+ return varMapping.get(name);
+ }
+ if (type instanceof WildcardType) {
+ return getMappedType(((WildcardType) type).getUpperBounds()[0], varMapping);
+ }
+ if (type instanceof ParameterizedType) {
+ ParameterizedType pt = (ParameterizedType) type;
+ Type[] origArgs = pt.getActualTypeArguments();
+ Type[] mappedArgs = new Type[origArgs.length];
+ for (int i = 0; i < origArgs.length; i++) {
+ mappedArgs[i] = getMappedType(origArgs[i], varMapping);
+ }
+ return new ParameterizedTypeImpl(pt, mappedArgs);
+ }
+ return type;
+ }
+
+ private static class ParameterizedTypeImpl implements ParameterizedType {
+
+ private final Type ownerType;
+ private final Type rawType;
+ private final Type[] actualTypeArguments;
+
+ ParameterizedTypeImpl(ParameterizedType original, Type[] typeArguments) {
+ this(original.getOwnerType(), original.getRawType(), typeArguments);
+ }
+
+ ParameterizedTypeImpl(Type ownerType, Type rawType, Type[] typeArguments) {
+ this.ownerType = ownerType;
+ this.rawType = rawType;
+ this.actualTypeArguments = typeArguments;
+ }
+
+ @Override
+ public Type getOwnerType() {
+ return ownerType;
+ }
+
+ @Override
+ public Type getRawType() {
+ return rawType;
+ }
+
+ @Override
+ public Type[] getActualTypeArguments() {
+ return actualTypeArguments;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder result = new StringBuilder();
+ if (ownerType != null) {
+ result.append(toString(ownerType));
+ result.append('$');
+ }
+ result.append(toString(rawType));
+ result.append('<');
+ for (int i = 0; i < actualTypeArguments.length; i++) {
+ if (i > 0)
+ result.append(", ");
+ result.append(toString(actualTypeArguments[i]));
+ }
+ result.append('>');
+ return result.toString();
+ }
+
+ private String toString(Type type) {
+ if (type instanceof Class<?>)
+ return ((Class<?>) type).getName();
+ else
+ return String.valueOf(type);
+ }
+
+ }
+
+ /**
+ * Return all possible types that can be expected when an element of the given type is parsed.
+ * If the type satisfies {@link #isEither(Type)}, a list of the corresponding type arguments is returned,
+ * otherwise a list containg the type itself is returned. Type parameters are <em>not</em> resolved
+ * by this method (use {@link #getElementTypes(TypeToken, Class)} to get resolved parameters).
+ */
+ public static Collection<Type> getExpectedTypes(Type type) {
+ Collection<Type> result = new ArrayList<>();
+ collectExpectedTypes(type, result);
+ return result;
+ }
+
+ private static void collectExpectedTypes(Type type, Collection<Type> types) {
+ if (isEither(type)) {
+ if (type instanceof ParameterizedType) {
+ for (Type typeArgument : ((ParameterizedType) type).getActualTypeArguments()) {
+ collectExpectedTypes(typeArgument, types);
+ }
+ }
+ if (type instanceof Class) {
+ for (Type typeParameter : ((Class<?>) type).getTypeParameters()) {
+ collectExpectedTypes(typeParameter, types);
+ }
+ }
+ } else {
+ types.add(type);
+ }
+ }
+
+ /**
+ * Test whether the given type is Either.
+ */
+ public static boolean isEither(Type type) {
+ if (type instanceof ParameterizedType) {
+ return isEither(((ParameterizedType) type).getRawType());
+ }
+ if (type instanceof Class) {
+ return Either.class.isAssignableFrom((Class<?>) type);
+ }
+ return false;
+ }
+
+ /**
+ * Test whether the given type is a two-tuple (pair).
+ */
+ public static boolean isTwoTuple(Type type) {
+ if (type instanceof ParameterizedType) {
+ return isTwoTuple(((ParameterizedType) type).getRawType());
+ }
+ if (type instanceof Class) {
+ return Tuple.Two.class.isAssignableFrom((Class<?>) type);
+ }
+ return false;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/CancelParams.java b/java/org/eclipse/lsp4j/jsonrpc/messages/CancelParams.java
new file mode 100644
index 0000000..2c6a35f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/CancelParams.java
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * To cancel a request a notification message with the following properties is sent.
+ */
+public class CancelParams {
+
+ /**
+ * The request id to cancel.
+ */
+ @NonNull
+ private Either<String, Number> id;
+
+ @NonNull
+ public String getId() {
+ if (id == null)
+ return null;
+ if (id.isLeft())
+ return id.getLeft();
+ if (id.isRight())
+ return id.getRight().toString();
+ return null;
+ }
+
+ @NonNull
+ public Either<String, Number> getRawId() {
+ return id;
+ }
+
+ public void setId(@NonNull String id) {
+ this.id = Either.forLeft(id);
+ }
+
+ public void setId(@NonNull int id) {
+ this.id = Either.forRight(id);
+ }
+
+ public void setRawId(@NonNull Either<String, Number> id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return MessageJsonHandler.toString(this);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CancelParams other = (CancelParams) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/Either.java b/java/org/eclipse/lsp4j/jsonrpc/messages/Either.java
new file mode 100644
index 0000000..0b5f484
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/Either.java
@@ -0,0 +1,223 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * An either type maps union types in protocol specifications.
+ */
+public class Either<L, R> {
+
+ public static <L, R> Either<L, R> forLeft(@NonNull L left) {
+ return new Either<>(left, null);
+ }
+
+ public static <L, R> Either<L, R> forRight(@NonNull R right) {
+ return new Either<>(null, right);
+ }
+
+ private final L left;
+ private final R right;
+
+ protected Either(L left, R right) {
+ super();
+ this.left = left;
+ this.right = right;
+ }
+
+ public L getLeft() {
+ return left;
+ }
+
+ public R getRight() {
+ return right;
+ }
+
+ public Object get() {
+ if (left != null)
+ return left;
+ if (right != null)
+ return right;
+ return null;
+ }
+
+ public boolean isLeft() {
+ return left != null;
+ }
+
+ public boolean isRight() {
+ return right != null;
+ }
+
+ public <T> T map(
+ @NonNull Function<? super L, ? extends T> mapLeft,
+ @NonNull Function<? super R, ? extends T> mapRight) {
+ if (isLeft()) {
+ return mapLeft.apply(getLeft());
+ }
+ if (isRight()) {
+ return mapRight.apply(getRight());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Either<?, ?>) {
+ Either<?, ?> other = (Either<?, ?>) obj;
+ return (this.left == other.left && this.right == other.right)
+ || (this.left != null && other.left != null && this.left.equals(other.left))
+ || (this.right != null && other.right != null && this.right.equals(other.right));
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ if (this.left != null)
+ return this.left.hashCode();
+ if (this.right != null)
+ return this.right.hashCode();
+ return 0;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder("Either [").append(System.lineSeparator());
+ builder.append(" left = ").append(left).append(System.lineSeparator());
+ builder.append(" right = ").append(right).append(System.lineSeparator());
+ return builder.append("]").toString();
+ }
+
+ /**
+ * Return a left disjoint type if the given type is either.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils#getElementTypes(Type, Class, Class)} instead
+ */
+ @Deprecated
+ public static Type getLeftDisjointType(Type type) {
+ if (isEither(type)) {
+ if (type instanceof ParameterizedType) {
+ final ParameterizedType parameterizedType = (ParameterizedType) type;
+ return parameterizedType.getActualTypeArguments()[0];
+ }
+ if (type instanceof Class) {
+ final Class<?> cls = (Class<?>) type;
+ return cls.getTypeParameters()[0];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return a right disjoint type if the given type is either.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils#getElementTypes(Type, Class, Class)} instead
+ */
+ @Deprecated
+ public static Type getRightDisjointType(Type type) {
+ if (isEither(type)) {
+ if (type instanceof ParameterizedType) {
+ final ParameterizedType parameterizedType = (ParameterizedType) type;
+ return parameterizedType.getActualTypeArguments()[1];
+ }
+ if (type instanceof Class) {
+ final Class<?> cls = (Class<?>) type;
+ return cls.getTypeParameters()[1];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return all disjoint types.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils#getExpectedTypes(Type)} instead
+ */
+ @Deprecated
+ public static Collection<Type> getAllDisjoinTypes(Type type) {
+ return collectDisjoinTypes(type, new ArrayList<>());
+ }
+
+ @Deprecated
+ protected static Collection<Type> collectDisjoinTypes(Type type, Collection<Type> types) {
+ if (isEither(type)) {
+ if (type instanceof ParameterizedType) {
+ return collectDisjoinTypes((ParameterizedType) type, types);
+ }
+ if (type instanceof Class) {
+ return collectDisjoinTypes((Class<?>) type, types);
+ }
+ }
+ types.add(type);
+ return types;
+ }
+
+ @Deprecated
+ protected static Collection<Type> collectDisjoinTypes(ParameterizedType type, Collection<Type> types) {
+ for (Type typeArgument : type.getActualTypeArguments()) {
+ collectDisjoinTypes(typeArgument, types);
+ }
+ return types;
+ }
+
+ @Deprecated
+ protected static Collection<Type> collectDisjoinTypes(Class<?> type, Collection<Type> types) {
+ for (Type typeParameter : type.getTypeParameters()) {
+ collectDisjoinTypes(typeParameter, types);
+ }
+ return types;
+ }
+
+ /**
+ * Test whether the given type is Either.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils#isEither(Type)} instead
+ */
+ @Deprecated
+ public static boolean isEither(Type type) {
+ if (type instanceof ParameterizedType) {
+ return isEither((ParameterizedType) type);
+ }
+ if (type instanceof Class) {
+ return isEither((Class<?>) type);
+ }
+ return false;
+ }
+
+ /**
+ * Test whether the given type is Either.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils#isEither(Type)} instead
+ */
+ @Deprecated
+ public static boolean isEither(ParameterizedType type) {
+ return isEither(type.getRawType());
+ }
+
+ /**
+ * Test whether the given class is Either.
+ *
+ * @deprecated Use {@link org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils#isEither(Type)} instead
+ */
+ @Deprecated
+ public static boolean isEither(Class<?> cls) {
+ return Either.class.isAssignableFrom(cls);
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/Either3.java b/java/org/eclipse/lsp4j/jsonrpc/messages/Either3.java
new file mode 100644
index 0000000..81f385e
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/Either3.java
@@ -0,0 +1,111 @@
+/******************************************************************************
+ * Copyright (c) 2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * Union type for three types.
+ */
+public class Either3<T1, T2, T3> extends Either<T1, Either<T2, T3>> {
+
+ public static <T1, T2, T3> Either3<T1, T2, T3> forFirst(@NonNull T1 first) {
+ return new Either3<T1, T2, T3>(first, null);
+ }
+
+ public static <T1, T2, T3> Either3<T1, T2, T3> forSecond(@NonNull T2 second) {
+ return new Either3<T1, T2, T3>(null, new Either<T2, T3>(second, null));
+ }
+
+ public static <T1, T2, T3> Either3<T1, T2, T3> forThird(@NonNull T3 third) {
+ return new Either3<T1, T2, T3>(null, new Either<T2, T3>(null, third));
+ }
+
+ public static <T1, T2, T3> Either3<T1, T2, T3> forLeft3(@NonNull T1 first) {
+ return new Either3<T1, T2, T3>(first, null);
+ }
+
+ public static <T1, T2, T3> Either3<T1, T2, T3> forRight3(@NonNull Either<T2, T3> right) {
+ return new Either3<T1, T2, T3>(null, right);
+ }
+
+ protected Either3(T1 left, Either<T2, T3> right) {
+ super(left, right);
+ }
+
+ public T1 getFirst() {
+ return getLeft();
+ }
+
+ public T2 getSecond() {
+ Either<T2, T3> right = getRight();
+ if (right == null)
+ return null;
+ else
+ return right.getLeft();
+ }
+
+ public T3 getThird() {
+ Either<T2, T3> right = getRight();
+ if (right == null)
+ return null;
+ else
+ return right.getRight();
+ }
+
+ @Override
+ public Object get() {
+ if (isRight())
+ return getRight().get();
+ return super.get();
+ }
+
+ public boolean isFirst() {
+ return isLeft();
+ }
+
+ public boolean isSecond() {
+ return isRight() && getRight().isLeft();
+ }
+
+ public boolean isThird() {
+ return isRight() && getRight().isRight();
+ }
+
+ public <T> T map(
+ @NonNull Function<? super T1, ? extends T> mapFirst,
+ @NonNull Function<? super T2, ? extends T> mapSecond,
+ @NonNull Function<? super T3, ? extends T> mapThird) {
+ if (isFirst()) {
+ return mapFirst.apply(getFirst());
+ }
+ if (isSecond()) {
+ return mapSecond.apply(getSecond());
+ }
+ if (isThird()) {
+ return mapThird.apply(getThird());
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("Either3 [").append(System.lineSeparator());
+ builder.append(" first = ").append(getFirst()).append(System.lineSeparator());
+ builder.append(" second = ").append(getSecond()).append(System.lineSeparator());
+ builder.append(" third = ").append(getThird()).append(System.lineSeparator());
+ return builder.append("]").toString();
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/IdentifiableMessage.java b/java/org/eclipse/lsp4j/jsonrpc/messages/IdentifiableMessage.java
new file mode 100644
index 0000000..61faf65
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/IdentifiableMessage.java
@@ -0,0 +1,81 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * A message with an {@code id} property.
+ */
+public abstract class IdentifiableMessage extends Message {
+
+ /**
+ * The message identifier.
+ */
+ @NonNull
+ private Either<String, Number> id;
+
+ public String getId() {
+ if (id == null)
+ return null;
+ if (id.isLeft())
+ return id.getLeft();
+ if (id.isRight())
+ return id.getRight().toString();
+ return null;
+ }
+
+ @NonNull
+ public Either<String, Number> getRawId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = Either.forLeft(id);
+ }
+
+ public void setId(int id) {
+ this.id = Either.forRight(id);
+ }
+
+ public void setRawId(@NonNull Either<String, Number> id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ IdentifiableMessage other = (IdentifiableMessage) obj;
+ if (this.id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!this.id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/Message.java b/java/org/eclipse/lsp4j/jsonrpc/messages/Message.java
new file mode 100644
index 0000000..5d4be74
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/Message.java
@@ -0,0 +1,66 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.json.MessageConstants;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * A general message as defined by JSON-RPC. The language server protocol always
+ * uses "2.0" as the jsonrpc version.
+ */
+public abstract class Message {
+
+ @NonNull
+ private String jsonrpc = MessageConstants.JSONRPC_VERSION;
+
+ @NonNull
+ public String getJsonrpc() {
+ return this.jsonrpc;
+ }
+
+ public void setJsonrpc(@NonNull String jsonrpc) {
+ this.jsonrpc = jsonrpc;
+ }
+
+ @Override
+ public String toString() {
+ return MessageJsonHandler.toString(this);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Message other = (Message) obj;
+ if (this.jsonrpc == null) {
+ if (other.jsonrpc != null)
+ return false;
+ } else if (!this.jsonrpc.equals(other.jsonrpc))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.jsonrpc == null) ? 0 : this.jsonrpc.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/MessageIssue.java b/java/org/eclipse/lsp4j/jsonrpc/messages/MessageIssue.java
new file mode 100644
index 0000000..1220255
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/MessageIssue.java
@@ -0,0 +1,60 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * Describes an issue found while parsing or validating a message.
+ */
+public class MessageIssue {
+
+ @NonNull
+ private String text;
+
+ private int code;
+
+ private Exception cause;
+
+ public MessageIssue(@NonNull String text) {
+ this(text, 0, null);
+ }
+
+ public MessageIssue(@NonNull String text, int code) {
+ this(text, code, null);
+ }
+
+ public MessageIssue(@NonNull String text, int code, Exception cause) {
+ this.text = text;
+ this.code = code;
+ this.cause = cause;
+ }
+
+ @NonNull
+ public String getText() {
+ return text;
+ }
+
+ public int getIssueCode() {
+ return code;
+ }
+
+ public Exception getCause() {
+ return cause;
+ }
+
+ @Override
+ public String toString() {
+ return getText();
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/NotificationMessage.java b/java/org/eclipse/lsp4j/jsonrpc/messages/NotificationMessage.java
new file mode 100644
index 0000000..b10f9d4
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/NotificationMessage.java
@@ -0,0 +1,83 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * A notification message. A processed notification message must not send a
+ * response back. They work like events.
+ */
+public class NotificationMessage extends Message {
+
+ /**
+ * The method to be invoked.
+ */
+ @NonNull
+ private String method;
+
+ @NonNull
+ public String getMethod() {
+ return this.method;
+ }
+
+ public void setMethod(@NonNull String method) {
+ this.method = method;
+ }
+
+ /**
+ * The method's params.
+ */
+ private Object params;
+
+ public Object getParams() {
+ return this.params;
+ }
+
+ public void setParams(Object params) {
+ this.params = params;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ NotificationMessage other = (NotificationMessage) obj;
+ if (this.method == null) {
+ if (other.method != null)
+ return false;
+ } else if (!this.method.equals(other.method))
+ return false;
+ if (this.params == null) {
+ if (other.params != null)
+ return false;
+ } else if (!this.params.equals(other.params))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.method == null) ? 0 : this.method.hashCode());
+ result = prime * result + ((this.params == null) ? 0 : this.params.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/RequestMessage.java b/java/org/eclipse/lsp4j/jsonrpc/messages/RequestMessage.java
new file mode 100644
index 0000000..42d76c2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/RequestMessage.java
@@ -0,0 +1,84 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+/**
+ * A request message to describe a request between the client and the server.
+ * Every processed request must send a response back to the sender of the
+ * request.
+ */
+public class RequestMessage extends IdentifiableMessage {
+
+ /**
+ * The method to be invoked.
+ */
+ @NonNull
+ private String method;
+
+ @NonNull
+ public String getMethod() {
+ return this.method;
+ }
+
+ public void setMethod(@NonNull String method) {
+ this.method = method;
+ }
+
+ /**
+ * The method's parameters. The object type depends on the chosen method.
+ */
+ private Object params;
+
+ public Object getParams() {
+ return this.params;
+ }
+
+ public void setParams(Object params) {
+ this.params = params;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ RequestMessage other = (RequestMessage) obj;
+ if (this.method == null) {
+ if (other.method != null)
+ return false;
+ } else if (!this.method.equals(other.method))
+ return false;
+ if (this.params == null) {
+ if (other.params != null)
+ return false;
+ } else if (!this.params.equals(other.params))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.method == null) ? 0 : this.method.hashCode());
+ result = prime * result + ((this.params == null) ? 0 : this.params.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseError.java b/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseError.java
new file mode 100644
index 0000000..64b8888
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseError.java
@@ -0,0 +1,123 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.adapters.JsonElementTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+import com.google.gson.annotations.JsonAdapter;
+
+public class ResponseError {
+
+ /**
+ * A number indicating the error type that occurred.
+ */
+ @NonNull
+ private int code;
+
+ @NonNull
+ public int getCode() {
+ return this.code;
+ }
+
+ public void setCode(@NonNull int code) {
+ this.code = code;
+ }
+
+ public void setCode(ResponseErrorCode code) {
+ this.setCode(code.getValue());
+ }
+
+ /**
+ * A string providing a short description of the error.
+ */
+ @NonNull
+ private String message;
+
+ @NonNull
+ public String getMessage() {
+ return this.message;
+ }
+
+ public void setMessage(@NonNull String message) {
+ this.message = message;
+ }
+
+ /**
+ * A Primitive or Structured value that contains additional information
+ * about the error. Can be omitted.
+ */
+ @JsonAdapter(JsonElementTypeAdapter.Factory.class)
+ private Object data;
+
+ public Object getData() {
+ return this.data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ public ResponseError() {
+ }
+
+ public ResponseError(ResponseErrorCode code, String message, Object data) {
+ this(code.getValue(), message, data);
+ }
+
+ public ResponseError(int code, String message, Object data) {
+ this.code = code;
+ this.message = message;
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return MessageJsonHandler.toString(this);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResponseError other = (ResponseError) obj;
+ if (other.code != this.code)
+ return false;
+ if (this.message == null) {
+ if (other.message != null)
+ return false;
+ } else if (!this.message.equals(other.message))
+ return false;
+ if (this.data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!this.data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + this.code;
+ result = prime * result + ((this.message == null) ? 0 : this.message.hashCode());
+ result = prime * result + ((this.data == null) ? 0 : this.data.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseErrorCode.java b/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseErrorCode.java
new file mode 100644
index 0000000..2e86a42
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseErrorCode.java
@@ -0,0 +1,110 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+/**
+ * A number indicating the error type that occurred.
+ */
+public enum ResponseErrorCode {
+
+ ParseError(-32700),
+
+ InvalidRequest(-32600),
+
+ MethodNotFound(-32601),
+
+ InvalidParams(-32602),
+
+ InternalError(-32603),
+
+ /**
+ * This is the start range of JSON RPC reserved error codes.
+ * It doesn't denote a real error code. No LSP error codes should
+ * be defined between the start and end range. For backwards
+ * compatibility the {@link #serverNotInitialized} and the
+ * {@link #UnknownErrorCode} are left in the range.
+ *
+ * Since 3.16.0
+ */
+ jsonrpcReservedErrorRangeStart(-32099),
+
+ /** @deprecated use {@link #jsonrpcReservedErrorRangeStart} */
+ @Deprecated
+ serverErrorStart(-32099),
+
+ /**
+ * Error code indicating that a server received a notification or
+ * request before the server has received the {@code initialize} request.
+ *
+ * Should be {@code ServerNotInitialized}
+ */
+ serverNotInitialized(-32002),
+
+ UnknownErrorCode(-32001),
+
+ /**
+ * This is the start range of JSON RPC reserved error codes.
+ * It doesn't denote a real error code.
+ *
+ * Since 3.16.0
+ */
+ jsonrpcReservedErrorRangeEnd(-32000),
+
+ /** @deprecated use {@link #jsonrpcReservedErrorRangeEnd} */
+ @Deprecated
+ serverErrorEnd(-32000),
+
+ /**
+ * This is the start range of LSP reserved error codes.
+ * It doesn't denote a real error code.
+ *
+ * Since 3.16.0
+ */
+ lspReservedErrorRangeStart(-32899),
+
+ /**
+ * The server detected that the content of a document got
+ * modified outside normal conditions. A server should
+ * NOT send this error code if it detects a content change
+ * in it unprocessed messages. The result even computed
+ * on an older state might still be useful for the client.
+ *
+ * If a client decides that a result is not of any use anymore
+ * the client should cancel the request.
+ */
+ ContentModified(-32801),
+
+ /**
+ * The client has canceled a request and a server as detected
+ * the cancel.
+ */
+ RequestCancelled(-32800),
+
+ /**
+ * This is the end range of LSP reserved error codes.
+ * It doesn't denote a real error code.
+ *
+ * Since 3.16.0
+ */
+ lspReservedErrorRangeEnd(-32800);
+
+ private final int value;
+
+ ResponseErrorCode(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseMessage.java b/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseMessage.java
new file mode 100644
index 0000000..baf33e3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/ResponseMessage.java
@@ -0,0 +1,83 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+/**
+ * Response message sent as a result of a request. If a request doesn't provide
+ * a result value the receiver of a request still needs to return a response
+ * message to conform to the JSON RPC specification. The result property of the
+ * ResponseMessage should be set to null in this case to signal a successful
+ * request. A response message is linked to a request via their {@code id} properties.
+ */
+public class ResponseMessage extends IdentifiableMessage {
+
+ /**
+ * The result of a request. This can be omitted in the case of an error.
+ * The object type depends on the method of the corresponding request.
+ */
+ private Object result;
+
+ public Object getResult() {
+ return this.result;
+ }
+
+ public void setResult(Object result) {
+ this.result = result;
+ }
+
+ /**
+ * The error object in case a request fails.
+ */
+ private ResponseError error;
+
+ public ResponseError getError() {
+ return this.error;
+ }
+
+ public void setError(ResponseError error) {
+ this.error = error;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!super.equals(obj))
+ return false;
+ ResponseMessage other = (ResponseMessage) obj;
+ if (this.result == null) {
+ if (other.result != null)
+ return false;
+ } else if (!this.result.equals(other.result))
+ return false;
+ if (this.error == null) {
+ if (other.error != null)
+ return false;
+ } else if (!this.error.equals(other.error))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((this.result == null) ? 0 : this.result.hashCode());
+ result = prime * result + ((this.error == null) ? 0 : this.error.hashCode());
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/messages/Tuple.java b/java/org/eclipse/lsp4j/jsonrpc/messages/Tuple.java
new file mode 100644
index 0000000..03618ce
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/messages/Tuple.java
@@ -0,0 +1,81 @@
+package org.eclipse.lsp4j.jsonrpc.messages;
+
+import java.io.IOException;
+
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+
+/**
+ * Representation of tuple types.
+ */
+@SuppressWarnings("all")
+public interface Tuple {
+
+ public static <F, S> Two<F, S> two(F first, S second) {
+ return new Two<F, S>(first, second);
+ }
+
+ /**
+ * A two-tuple, i.e. a pair.
+ */
+ public static class Two<F extends Object, S extends Object> implements Tuple {
+
+ private final F first;
+ private final S second;
+
+ public Two(F first, S second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ public F getFirst() {
+ return this.first;
+ }
+
+ public S getSecond() {
+ return this.second;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Tuple.Two<?, ?> other = (Tuple.Two<?, ?>) obj;
+ if (this.first == null) {
+ if (other.first != null)
+ return false;
+ } else if (!this.first.equals(other.first))
+ return false;
+ if (this.second == null) {
+ if (other.second != null)
+ return false;
+ } else if (!this.second.equals(other.second))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.first == null) ? 0 : this.first.hashCode());
+ return prime * result + ((this.second == null) ? 0 : this.second.hashCode());
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("Tuples.Two [").append(System.lineSeparator());
+ builder.append(" first = ").append(first).append(System.lineSeparator());
+ builder.append(" second = ").append(second).append(System.lineSeparator());
+ return builder.append("]").toString();
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/AnnotationUtil.java b/java/org/eclipse/lsp4j/jsonrpc/services/AnnotationUtil.java
new file mode 100644
index 0000000..48f6fc2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/AnnotationUtil.java
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.function.Consumer;
+
+public final class AnnotationUtil {
+ private AnnotationUtil() {}
+
+ public static void findDelegateSegments(Class<?> clazz, Set<Class<?>> visited, Consumer<Method> acceptor) {
+ if (clazz == null || !visited.add(clazz))
+ return;
+ findDelegateSegments(clazz.getSuperclass(), visited, acceptor);
+ for (Class<?> interf : clazz.getInterfaces()) {
+ findDelegateSegments(interf, visited, acceptor);
+ }
+ for (Method method : clazz.getDeclaredMethods()) {
+ if (isDelegateMethod(method)) {
+ acceptor.accept(method);
+ }
+ }
+ }
+
+ public static boolean isDelegateMethod(Method method) {
+ if (!method.isSynthetic()) {
+ JsonDelegate jsonDelegate = method.getAnnotation(JsonDelegate.class);
+ if (jsonDelegate != null) {
+ if (!(method.getParameterCount() == 0 && method.getReturnType().isInterface())) {
+ throw new IllegalStateException(
+ "The method " + method.toString() + " is not a proper @JsonDelegate method.");
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Depth first search for annotated methods in hierarchy.
+ */
+ public static void findRpcMethods(Class<?> clazz, Set<Class<?>> visited, Consumer<MethodInfo> acceptor) {
+ if (clazz == null || !visited.add(clazz))
+ return;
+ findRpcMethods(clazz.getSuperclass(), visited, acceptor);
+ for (Class<?> interf : clazz.getInterfaces()) {
+ findRpcMethods(interf, visited, acceptor);
+ }
+ String segment = getSegment(clazz);
+ for (Method method : clazz.getDeclaredMethods()) {
+ MethodInfo methodInfo = createMethodInfo(method, segment);
+ if (methodInfo != null) {
+ acceptor.accept(methodInfo);
+ }
+ }
+ }
+
+ protected static String getSegment(Class<?> clazz) {
+ JsonSegment jsonSegment = clazz.getAnnotation(JsonSegment.class);
+ return jsonSegment == null ? "" : jsonSegment.value() + "/";
+ }
+
+ protected static MethodInfo createMethodInfo(Method method, String segment) {
+ if (!method.isSynthetic()) {
+ JsonRequest jsonRequest = method.getAnnotation(JsonRequest.class);
+ if (jsonRequest != null) {
+ return createRequestInfo(method, segment, jsonRequest);
+ }
+ JsonNotification jsonNotification = method.getAnnotation(JsonNotification.class);
+ if (jsonNotification != null) {
+ return createNotificationInfo(method, segment, jsonNotification);
+ }
+ }
+ return null;
+ }
+
+ protected static MethodInfo createNotificationInfo(Method method, String segment, JsonNotification jsonNotification) {
+ MethodInfo methodInfo = createMethodInfo(method, jsonNotification.useSegment(), segment, jsonNotification.value());
+ methodInfo.isNotification = true;
+ return methodInfo;
+ }
+
+ protected static MethodInfo createRequestInfo(Method method, String segment, JsonRequest jsonRequest) {
+ return createMethodInfo(method, jsonRequest.useSegment(), segment, jsonRequest.value());
+ }
+
+ protected static MethodInfo createMethodInfo(Method method, boolean useSegment, String segment, String value) {
+ method.setAccessible(true);
+
+ MethodInfo methodInfo = new MethodInfo();
+ methodInfo.method = method;
+ methodInfo.parameterTypes = getParameterTypes(method);
+ methodInfo.name = getMethodName(method, useSegment, segment, value);
+ return methodInfo;
+ }
+
+ protected static String getMethodName(Method method, boolean useSegment, String segment, String value) {
+ String name = value != null && value.length() > 0 ? value : method.getName();
+ return useSegment ? segment + name : name;
+ }
+
+ protected static Type[] getParameterTypes(Method method) {
+ return Arrays.stream(method.getParameters()).map(t -> t.getParameterizedType()).toArray(Type[]::new);
+ }
+
+ static class MethodInfo {
+ private static Type[] EMPTY_TYPE_ARRAY = {};
+ public String name;
+ public Method method;
+ public Type[] parameterTypes = EMPTY_TYPE_ARRAY;
+ public boolean isNotification = false;
+ }
+
+ static class DelegateInfo {
+ public Method method;
+ public Object delegate;
+ }
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/EndpointProxy.java b/java/org/eclipse/lsp4j/jsonrpc/services/EndpointProxy.java
new file mode 100644
index 0000000..bb1609c
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/EndpointProxy.java
@@ -0,0 +1,130 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.services.AnnotationUtil.DelegateInfo;
+import org.eclipse.lsp4j.jsonrpc.services.AnnotationUtil.MethodInfo;
+
+/**
+ * A Proxy that wraps an {@link Endpoint} in one or more service interfaces, i.e. interfaces
+ * containing {@link JsonNotification} and {@link JsonRequest} methods.
+ */
+public class EndpointProxy implements InvocationHandler {
+
+ private final Method object_equals;
+ private final Method object_hashCode;
+ private final Method object_toString;
+
+ private final Endpoint delegate;
+ private final LinkedHashMap<String, MethodInfo> methodInfos;
+ private final LinkedHashMap<String, DelegateInfo> delegatedSegments;
+
+ public EndpointProxy(Endpoint delegate, Class<?> interface_) {
+ this(delegate, Collections.singletonList(interface_));
+ }
+
+ public EndpointProxy(Endpoint delegate, Collection<Class<?>> interfaces) {
+ if (delegate == null)
+ throw new NullPointerException("delegate");
+ if (interfaces == null)
+ throw new NullPointerException("interfaces");
+ if (interfaces.isEmpty())
+ throw new IllegalArgumentException("interfaces must not be empty.");
+
+ this.delegate = delegate;
+ try {
+ object_equals = Object.class.getDeclaredMethod("equals", Object.class);
+ object_hashCode = Object.class.getDeclaredMethod("hashCode");
+ object_toString = Object.class.getDeclaredMethod("toString");
+ } catch (NoSuchMethodException | SecurityException exception) {
+ throw new RuntimeException(exception);
+ }
+ methodInfos = new LinkedHashMap<>();
+ delegatedSegments = new LinkedHashMap<>();
+ for (Class<?> interf : interfaces) {
+ AnnotationUtil.findRpcMethods(interf, new HashSet<Class<?>>(), (methodInfo) -> {
+ if (methodInfos.put(methodInfo.method.getName(), methodInfo) != null) {
+ throw new IllegalStateException("Duplicate RPC method " + methodInfo.method);
+ }
+ });
+ AnnotationUtil.findDelegateSegments(interf, new HashSet<Class<?>>(), (method) -> {
+ Object delegateProxy = ServiceEndpoints.toServiceObject(delegate, method.getReturnType());
+ DelegateInfo info = new DelegateInfo();
+ info.delegate = delegateProxy;
+ info.method = method;
+ if (delegatedSegments.put(method.getName(), info) != null) {
+ throw new IllegalStateException("Duplicate RPC method " + method);
+ }
+ });
+ }
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ args = args == null ? new Object[0] : args;
+ MethodInfo methodInfo = this.methodInfos.get(method.getName());
+ if (methodInfo != null) {
+ Object params = getParams(args, methodInfo);
+ if (methodInfo.isNotification) {
+ delegate.notify(methodInfo.name, params);
+ return null;
+ }
+ return delegate.request(methodInfo.name, params);
+ }
+ DelegateInfo delegateInfo = this.delegatedSegments.get(method.getName());
+ if (delegateInfo != null) {
+ return delegateInfo.delegate;
+ }
+ if (object_equals.equals(method) && args.length == 1) {
+ if(args[0] != null ) {
+ try {
+ return this.equals(Proxy.getInvocationHandler(args[0]));
+ } catch (IllegalArgumentException exception) {
+ }
+ }
+ return this.equals(args[0]);
+ }
+ if (object_hashCode.equals(method)) {
+ return this.hashCode();
+ }
+ if (object_toString.equals(method)) {
+ return this.toString();
+ }
+ return method.invoke(delegate, args);
+ }
+
+ protected Object getParams(Object[] args, MethodInfo methodInfo) {
+ if (args.length == 0) {
+ return null;
+ }
+ if (args.length == 1) {
+ return args[0];
+ }
+ return Arrays.asList(args);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " for " + delegate.toString();
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/GenericEndpoint.java b/java/org/eclipse/lsp4j/jsonrpc/services/GenericEndpoint.java
new file mode 100644
index 0000000..918c0d8
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/GenericEndpoint.java
@@ -0,0 +1,180 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Stream;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.ResponseErrorException;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+
+/**
+ * An endpoint that reflectively delegates to {@link JsonNotification} and
+ * {@link JsonRequest} methods of one or more given delegate objects.
+ */
+public class GenericEndpoint implements Endpoint {
+
+ private static final Logger LOG = Logger.getLogger(GenericEndpoint.class.getName());
+ private static final Object[] NO_ARGUMENTS = {};
+
+ private final LinkedHashMap<String, Function<Object, CompletableFuture<Object>>> methodHandlers = new LinkedHashMap<>();
+ private final List<Object> delegates;
+
+ public GenericEndpoint(Object delegate) {
+ this.delegates = Collections.singletonList(delegate);
+ recursiveFindRpcMethods(delegate, new HashSet<>(), new HashSet<>());
+ }
+
+ public GenericEndpoint(Collection<Object> delegates) {
+ this.delegates = new ArrayList<>(delegates);
+ for (Object delegate : this.delegates) {
+ recursiveFindRpcMethods(delegate, new HashSet<>(), new HashSet<>());
+ }
+ }
+
+ protected void recursiveFindRpcMethods(Object current, Set<Class<?>> visited, Set<Class<?>> visitedForDelegate) {
+ AnnotationUtil.findRpcMethods(current.getClass(), visited, (methodInfo) -> {
+ @SuppressWarnings("unchecked")
+ Function<Object, CompletableFuture<Object>> handler = (arg) -> {
+ try {
+ Method method = methodInfo.method;
+ Object[] arguments = this.getArguments(method, arg);
+ return (CompletableFuture<Object>) method.invoke(current, arguments);
+ } catch (InvocationTargetException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ };
+ if (methodHandlers.put(methodInfo.name, handler) != null) {
+ throw new IllegalStateException("Multiple methods for name " + methodInfo.name);
+ }
+ });
+ AnnotationUtil.findDelegateSegments(current.getClass(), visitedForDelegate, (method) -> {
+ try {
+ Object delegate = method.invoke(current);
+ if (delegate != null) {
+ recursiveFindRpcMethods(delegate, visited, visitedForDelegate);
+ } else {
+ LOG.log(Level.SEVERE, "A delegate object is null, jsonrpc methods of '" + method + "' are ignored");
+ }
+ } catch (InvocationTargetException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+
+ protected Object[] getArguments(Method method, Object arg) {
+ int parameterCount = method.getParameterCount();
+ if (parameterCount == 0) {
+ if (arg != null) {
+ LOG.warning("Unexpected params '" + arg + "' for '" + method + "' is ignored");
+ }
+ return NO_ARGUMENTS;
+ }
+ if (arg instanceof List<?>) {
+ List<?> arguments = (List<?>) arg;
+ int argumentCount = arguments.size();
+ if (argumentCount == parameterCount) {
+ return arguments.toArray();
+ }
+ if (argumentCount > parameterCount) {
+ Stream<?> unexpectedArguments = arguments.stream().skip(parameterCount);
+ String unexpectedParams = unexpectedArguments.map(a -> "'" + a + "'").reduce((a, a2) -> a + ", " + a2).get();
+ LOG.warning("Unexpected params " + unexpectedParams + " for '" + method + "' is ignored");
+ return arguments.subList(0, parameterCount).toArray();
+ }
+ return arguments.toArray(new Object[parameterCount]);
+ }
+ Object[] arguments = new Object[parameterCount];
+ arguments[0] = arg;
+ return arguments;
+ }
+
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ // Check the registered method handlers
+ Function<Object, CompletableFuture<Object>> handler = methodHandlers.get(method);
+ if (handler != null) {
+ return handler.apply(parameter);
+ }
+
+ // Ask the delegate objects whether they can handle the request generically
+ List<CompletableFuture<?>> futures = new ArrayList<>(delegates.size());
+ for (Object delegate : delegates) {
+ if (delegate instanceof Endpoint) {
+ futures.add(((Endpoint) delegate).request(method, parameter));
+ }
+ }
+ if (!futures.isEmpty()) {
+ return CompletableFuture.anyOf(futures.toArray(new CompletableFuture[futures.size()]));
+ }
+
+ // Create a log message about the unsupported method
+ String message = "Unsupported request method: " + method;
+ if (isOptionalMethod(method)) {
+ LOG.log(Level.INFO, message);
+ return CompletableFuture.completedFuture(null);
+ }
+ LOG.log(Level.WARNING, message);
+ CompletableFuture<?> exceptionalResult = new CompletableFuture<Object>();
+ ResponseError error = new ResponseError(ResponseErrorCode.MethodNotFound, message, null);
+ exceptionalResult.completeExceptionally(new ResponseErrorException(error));
+ return exceptionalResult;
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ // Check the registered method handlers
+ Function<Object, CompletableFuture<Object>> handler = methodHandlers.get(method);
+ if (handler != null) {
+ handler.apply(parameter);
+ return;
+ }
+
+ // Ask the delegate objects whether they can handle the notification generically
+ int notifiedDelegates = 0;
+ for (Object delegate : delegates) {
+ if (delegate instanceof Endpoint) {
+ ((Endpoint) delegate).notify(method, parameter);
+ notifiedDelegates++;
+ }
+ }
+
+ if (notifiedDelegates == 0) {
+ // Create a log message about the unsupported method
+ String message = "Unsupported notification method: " + method;
+ if (isOptionalMethod(method)) {
+ LOG.log(Level.INFO, message);
+ } else {
+ LOG.log(Level.WARNING, message);
+ }
+ }
+ }
+
+ protected boolean isOptionalMethod(String method) {
+ return method != null && method.startsWith("$/");
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/JsonDelegate.java b/java/org/eclipse/lsp4j/jsonrpc/services/JsonDelegate.java
new file mode 100644
index 0000000..5a6b224
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/JsonDelegate.java
@@ -0,0 +1,28 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * A method annotated with {@link JsonDelegate} is treated as a delegate method.
+ * As a result jsonrpc methods of the delegate will be considered, too.
+ * If an annotated method returns `null`
+ * then jsonrpc methods of the delegate are not considered.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface JsonDelegate {
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/JsonNotification.java b/java/org/eclipse/lsp4j/jsonrpc/services/JsonNotification.java
new file mode 100644
index 0000000..75ad20b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/JsonNotification.java
@@ -0,0 +1,52 @@
+/******************************************************************************
+ * Copyright (c) 2016, 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation to mark a notification method on an interface or class.
+ * <p>
+ * A notification method must be of type <code>void</code> and have zero or one
+ * argument.
+ * <p>
+ * According to jsonrpc an argument must be an 'object' (a java bean, not e,g.
+ * String).
+ * <p>
+ * The name of the jsonrpc notification will be the optional segment, followed
+ * by the name of the Java method that is annotated with JsonNotification. The
+ * name of the jsonrpc notification can be customized by using the
+ * {@link #value()} field of this annotation. To specify the whole name,
+ * including the segment, in the value, set {@link #useSegment()} to false.
+ *
+ * @see JsonSegment
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface JsonNotification {
+ /**
+ * The name of the the jsonrpc request method. If empty, uses the name of the
+ * annotated method.
+ */
+ String value() default "";
+
+ /**
+ * When using segments, useSegment will be true to prepend the segment name to
+ * the name of the request.
+ *
+ * @see JsonSegment
+ */
+ boolean useSegment() default true;
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/JsonRequest.java b/java/org/eclipse/lsp4j/jsonrpc/services/JsonRequest.java
new file mode 100644
index 0000000..4e9b801
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/JsonRequest.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2016, 2020 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Annotation to mark a request method on an interface or class.
+ * <p>
+ * A request method must have the return type {@link CompletableFuture} with an
+ * object parameter type or Void and have zero or one argument.
+ * <p>
+ * According to jsonrpc an argument must be an 'object' (a java bean, not e,g.
+ * String).
+ * <p>
+ * The name of the jsonrpc request will be the optional segment, followed by the
+ * name of the Java method that is annotated with JsonRequest. The name of the
+ * jsonrpc request can be customized by using the {@link #value()} field of this
+ * annotation. To specify the whole name, including the segment, in the value,
+ * set {@link #useSegment()} to false.
+ *
+ * @see JsonSegment
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.METHOD, ElementType.TYPE })
+public @interface JsonRequest {
+ /**
+ * The name of the the jsonrpc request method. If empty, uses the name of the
+ * annotated method.
+ */
+ String value() default "";
+
+ /**
+ * When using segments, useSegment will be true to prepend the segment name to
+ * the name of the request.
+ *
+ * @see JsonSegment
+ */
+ boolean useSegment() default true;
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/JsonSegment.java b/java/org/eclipse/lsp4j/jsonrpc/services/JsonSegment.java
new file mode 100644
index 0000000..2b73197
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/JsonSegment.java
@@ -0,0 +1,26 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Use on a class or interface to prefix all declared {@link JsonRequest} and {@link JsonNotification} methods.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface JsonSegment {
+ String value() default "";
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/services/ServiceEndpoints.java b/java/org/eclipse/lsp4j/jsonrpc/services/ServiceEndpoints.java
new file mode 100644
index 0000000..c8ad3f0
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/services/ServiceEndpoints.java
@@ -0,0 +1,128 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.services;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.ResponseJsonAdapter;
+
+import com.google.gson.TypeAdapterFactory;
+
+public final class ServiceEndpoints {
+ private ServiceEndpoints() {}
+
+ /**
+ * Wraps a given {@link Endpoint} in the given service interface.
+ *
+ * @return the wrapped service object
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T toServiceObject(Endpoint endpoint, Class<T> interface_) {
+ Class<?>[] interfArray = new Class[]{interface_, Endpoint.class};
+ EndpointProxy invocationHandler = new EndpointProxy(endpoint, interface_);
+ return (T) Proxy.newProxyInstance(interface_.getClassLoader(), interfArray, invocationHandler);
+ }
+
+ /**
+ * Wraps a given {@link Endpoint} in the given service interfaces.
+ *
+ * @return the wrapped service object
+ */
+ public static Object toServiceObject(Endpoint endpoint, Collection<Class<?>> interfaces, ClassLoader classLoader) {
+ Class<?>[] interfArray = new Class[interfaces.size() + 1];
+ interfaces.toArray(interfArray);
+ interfArray[interfArray.length - 1] = Endpoint.class;
+ EndpointProxy invocationHandler = new EndpointProxy(endpoint, interfaces);
+ return Proxy.newProxyInstance(classLoader, interfArray, invocationHandler);
+ }
+
+ /**
+ * Wraps a given object with service annotations behind an {@link Endpoint} interface.
+ *
+ * @return the wrapped service endpoint
+ */
+ public static Endpoint toEndpoint(Object serviceObject) {
+ return new GenericEndpoint(serviceObject);
+ }
+
+ /**
+ * Wraps a collection of objects with service annotations behind an {@link Endpoint} interface.
+ *
+ * @return the wrapped service endpoint
+ */
+ public static Endpoint toEndpoint(Collection<Object> serviceObjects) {
+ return new GenericEndpoint(serviceObjects);
+ }
+
+ /**
+ * Finds all Json RPC methods on a given class.
+ *
+ * @return the supported JsonRpcMethods
+ */
+ public static Map<String, JsonRpcMethod> getSupportedMethods(Class<?> type) {
+ Set<Class<?>> visitedTypes = new HashSet<>();
+ return getSupportedMethods(type, visitedTypes);
+ }
+
+ /**
+ * Finds all Json RPC methods on a given type
+ */
+ private static Map<String, JsonRpcMethod> getSupportedMethods(Class<?> type, Set<Class<?>> visitedTypes) {
+ Map<String, JsonRpcMethod> result = new LinkedHashMap<String, JsonRpcMethod>();
+ AnnotationUtil.findRpcMethods(type, visitedTypes, (methodInfo) -> {
+ JsonRpcMethod meth;
+ if (methodInfo.isNotification) {
+ meth = JsonRpcMethod.notification(methodInfo.name, methodInfo.parameterTypes);
+ } else {
+ Type genericReturnType = methodInfo.method.getGenericReturnType();
+ if (genericReturnType instanceof ParameterizedType) {
+ Type returnType = ((ParameterizedType) genericReturnType).getActualTypeArguments()[0];
+ TypeAdapterFactory responseTypeAdapter = null;
+ ResponseJsonAdapter responseTypeAdapterAnnotation = methodInfo.method.getAnnotation(ResponseJsonAdapter.class);
+ if (responseTypeAdapterAnnotation != null) {
+ try {
+ responseTypeAdapter = responseTypeAdapterAnnotation.value().newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ meth = JsonRpcMethod.request(methodInfo.name, returnType, responseTypeAdapter, methodInfo.parameterTypes);
+ } else {
+ throw new IllegalStateException("Expecting return type of CompletableFuture but was : " + genericReturnType);
+ }
+ }
+ if (result.put(methodInfo.name, meth) != null) {
+ throw new IllegalStateException("Duplicate RPC method "+methodInfo.name+".");
+ };
+ });
+
+ AnnotationUtil.findDelegateSegments(type, new HashSet<>(), (method)-> {
+ Map<String, JsonRpcMethod> supportedDelegateMethods = getSupportedMethods(method.getReturnType(), visitedTypes);
+ for (JsonRpcMethod meth : supportedDelegateMethods.values()) {
+ if (result.put(meth.getMethodName(), meth) != null) {
+ throw new IllegalStateException("Duplicate RPC method "+meth.getMethodName()+".");
+ };
+ }
+ });
+ return result;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/validation/NonNull.java b/java/org/eclipse/lsp4j/jsonrpc/validation/NonNull.java
new file mode 100644
index 0000000..9771e75
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/validation/NonNull.java
@@ -0,0 +1,31 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.validation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates that the annotated field or parameter must not be set to {@code null}. If validation
+ * is active, an exception is thrown when a message is received where a {@code NonNull} field
+ * has a {@code null} or {@code undefined} value.
+ *
+ * In order to achieve consistent behavior, for every field with this annotation the corresponding
+ * getter method as well as the parameter of the corresponding setter method are also expected to
+ * be annotated.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER})
+public @interface NonNull {
+}
diff --git a/java/org/eclipse/lsp4j/jsonrpc/validation/ReflectiveMessageValidator.java b/java/org/eclipse/lsp4j/jsonrpc/validation/ReflectiveMessageValidator.java
new file mode 100644
index 0000000..965c811
--- /dev/null
+++ b/java/org/eclipse/lsp4j/jsonrpc/validation/ReflectiveMessageValidator.java
@@ -0,0 +1,185 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.validation;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+
+import com.google.gson.JsonElement;
+
+/**
+ * Validates messages and forwards them to other message consumers. In case an issue is found,
+ * a {@link MessageIssueException} is thrown.
+ */
+public class ReflectiveMessageValidator implements MessageConsumer {
+
+ private static final Logger LOG = Logger.getLogger(ReflectiveMessageValidator.class.getName());
+
+ private final MessageConsumer delegate;
+
+ /**
+ * When created with this constructor, the validator acts as a message sink.
+ */
+ public ReflectiveMessageValidator() {
+ this.delegate = null;
+ }
+
+ /**
+ * Forward messages to the given consumer unless an issue is found.
+ */
+ public ReflectiveMessageValidator(MessageConsumer delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void consume(Message message) throws MessageIssueException, JsonRpcException {
+ List<MessageIssue> issues = validate(message);
+ if (!issues.isEmpty()) {
+ // Sort the messages in order to get a stable order (otherwise it depends on the JVM's reflection implementation)
+ Collections.sort(issues, (issue1, issue2) -> issue1.getText().compareTo(issue2.getText()));
+ throw new MessageIssueException(message, issues);
+ } else if (delegate != null) {
+ delegate.consume(message);
+ }
+ }
+
+ /**
+ * Check whether the given object is valid. If it is not valid, its issues are not reported.
+ */
+ public boolean isValid(Object object) {
+ List<MessageIssue> issues = validate(object);
+ return issues.isEmpty();
+ }
+
+ protected List<MessageIssue> validate(Object object) {
+ List<MessageIssue> result = new ArrayList<>();
+ try {
+ validate(object, result, new LinkedList<>(), new LinkedList<>());
+ } catch (Exception e) {
+ LOG.log(Level.SEVERE, "Error during message validation: " + e.getMessage(), e);
+ result.add(new MessageIssue("Message validation failed, please check the logs of the remote endpoint.",
+ ResponseErrorCode.InvalidParams.getValue()));
+ }
+ return result;
+ }
+
+ /**
+ * Validate all fields of the given object.
+ */
+ protected void validate(Object object, List<MessageIssue> issues, Deque<Object> objectStack, Deque<Object> accessorStack) throws Exception {
+ if (object == null
+ || object instanceof Enum<?>
+ || object instanceof String
+ || object instanceof Number
+ || object instanceof Boolean
+ || object instanceof JsonElement
+ || object instanceof Throwable) {
+ return;
+ }
+ if (objectStack.contains(object)) {
+ issues.add(new MessageIssue("An element of the message has a direct or indirect reference to itself."
+ + " Path: " + createPathString(accessorStack),
+ ResponseErrorCode.InvalidParams.getValue()));
+ return;
+ }
+ objectStack.push(object);
+ if (object instanceof List<?>) {
+ ListIterator<?> iter = ((List<?>) object).listIterator();
+ while (iter.hasNext()) {
+ accessorStack.push(iter.nextIndex());
+ Object element = iter.next();
+ if (element == null) {
+ issues.add(new MessageIssue("Lists must not contain null references."
+ + " Path: " + createPathString(accessorStack),
+ ResponseErrorCode.InvalidParams.getValue()));
+ }
+ validate(element, issues, objectStack, accessorStack);
+ accessorStack.pop();
+ }
+ } else if (object instanceof Either<?, ?>) {
+ Either<?, ?> either = (Either<?, ?>) object;
+ if (either.isLeft()) {
+ validate(either.getLeft(), issues, objectStack, accessorStack);
+ } else if (either.isRight()) {
+ validate(either.getRight(), issues, objectStack, accessorStack);
+ } else {
+ issues.add(new MessageIssue("An Either instance must not be empty."
+ + " Path: " + createPathString(accessorStack),
+ ResponseErrorCode.InvalidParams.getValue()));
+ }
+ } else {
+ for (Method method : object.getClass().getMethods()) {
+ if (isGetter(method)) {
+ accessorStack.push(method);
+ Object value = method.invoke(object);
+ if (value == null && method.getAnnotation(NonNull.class) != null) {
+ issues.add(new MessageIssue("The accessor '" + method.getDeclaringClass().getSimpleName()
+ + "." + method.getName() + "()' must return a non-null value."
+ + " Path: " + createPathString(accessorStack),
+ ResponseErrorCode.InvalidParams.getValue()));
+ }
+ validate(value, issues, objectStack, accessorStack);
+ accessorStack.pop();
+ }
+ }
+ }
+ objectStack.pop();
+ }
+
+ protected String createPathString(Deque<Object> accessorStack) {
+ StringBuilder result = new StringBuilder("$");
+ Iterator<Object> resultIter = accessorStack.descendingIterator();
+ while(resultIter.hasNext()) {
+ Object accessor = resultIter.next();
+ if (accessor instanceof Method)
+ result.append('.').append(getPropertyName((Method) accessor));
+ else if (accessor instanceof Integer)
+ result.append('[').append(accessor).append(']');
+ else
+ result.append(accessor);
+ }
+ return result.toString();
+ }
+
+ protected boolean isGetter(Method method) {
+ return method.getParameterCount() == 0 && method.getName().startsWith("get")
+ && method.getDeclaringClass() != Object.class
+ && Modifier.isPublic(method.getModifiers())
+ && !Modifier.isStatic(method.getModifiers());
+ }
+
+ protected String getPropertyName(Method method) {
+ String methodName = method.getName();
+ if (methodName.startsWith("get") && methodName.length() > 3)
+ return methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
+ else
+ return methodName;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/launch/LSPLauncher.java b/java/org/eclipse/lsp4j/launch/LSPLauncher.java
new file mode 100644
index 0000000..88229d2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/launch/LSPLauncher.java
@@ -0,0 +1,160 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.launch;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+import org.eclipse.lsp4j.services.LanguageClient;
+import org.eclipse.lsp4j.services.LanguageServer;
+
+/**
+ * Specialized launcher for the Language Server Protocol.
+ */
+public final class LSPLauncher {
+
+ private LSPLauncher() {}
+
+ /**
+ * Create a new Launcher for a language server and an input and output stream.
+ *
+ * @param server - the server that receives method calls from the remote client
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ */
+ public static Launcher<LanguageClient> createServerLauncher(LanguageServer server, InputStream in, OutputStream out) {
+ return new Builder<LanguageClient>()
+ .setLocalService(server)
+ .setRemoteInterface(LanguageClient.class)
+ .setInput(in)
+ .setOutput(out)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a language server and an input and output stream, and set up message validation and tracing.
+ *
+ * @param server - the server that receives method calls from the remote client
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param validate - whether messages should be validated with the {@link ReflectiveMessageValidator}
+ * @param trace - a writer to which incoming and outgoing messages are traced, or {@code null} to disable tracing
+ */
+ public static Launcher<LanguageClient> createServerLauncher(LanguageServer server, InputStream in, OutputStream out,
+ boolean validate, PrintWriter trace) {
+ return new Builder<LanguageClient>()
+ .setLocalService(server)
+ .setRemoteInterface(LanguageClient.class)
+ .setInput(in)
+ .setOutput(out)
+ .validateMessages(validate)
+ .traceMessages(trace)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a language server and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and outgoing message streams so additional
+ * message handling such as validation and tracing can be included.
+ *
+ * @param server - the server that receives method calls from the remote client
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ */
+ public static Launcher<LanguageClient> createServerLauncher(LanguageServer server, InputStream in, OutputStream out,
+ ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return new Builder<LanguageClient>()
+ .setLocalService(server)
+ .setRemoteInterface(LanguageClient.class)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a language client and an input and output stream.
+ *
+ * @param client - the client that receives method calls from the remote server
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ */
+ public static Launcher<LanguageServer> createClientLauncher(LanguageClient client, InputStream in, OutputStream out) {
+ return new Builder<LanguageServer>()
+ .setLocalService(client)
+ .setRemoteInterface(LanguageServer.class)
+ .setInput(in)
+ .setOutput(out)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a language client and an input and output stream, and set up message validation and tracing.
+ *
+ * @param client - the client that receives method calls from the remote server
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param validate - whether messages should be validated with the {@link ReflectiveMessageValidator}
+ * @param trace - a writer to which incoming and outgoing messages are traced, or {@code null} to disable tracing
+ */
+ public static Launcher<LanguageServer> createClientLauncher(LanguageClient client, InputStream in, OutputStream out,
+ boolean validate, PrintWriter trace) {
+ return new Builder<LanguageServer>()
+ .setLocalService(client)
+ .setRemoteInterface(LanguageServer.class)
+ .setInput(in)
+ .setOutput(out)
+ .validateMessages(validate)
+ .traceMessages(trace)
+ .create();
+ }
+
+ /**
+ * Create a new Launcher for a language client and an input and output stream. Threads are started with the given
+ * executor service. The wrapper function is applied to the incoming and outgoing message streams so additional
+ * message handling such as validation and tracing can be included.
+ *
+ * @param client - the client that receives method calls from the remote server
+ * @param in - input stream to listen for incoming messages
+ * @param out - output stream to send outgoing messages
+ * @param executorService - the executor service used to start threads
+ * @param wrapper - a function for plugging in additional message consumers
+ */
+ public static Launcher<LanguageServer> createClientLauncher(LanguageClient client, InputStream in, OutputStream out,
+ ExecutorService executorService, Function<MessageConsumer, MessageConsumer> wrapper) {
+ return new Builder<LanguageServer>()
+ .setLocalService(client)
+ .setRemoteInterface(LanguageServer.class)
+ .setInput(in)
+ .setOutput(out)
+ .setExecutorService(executorService)
+ .wrapMessages(wrapper)
+ .create();
+ }
+
+ /**
+ * Launcher builder for the Language Server Protocol.
+ */
+ public static class Builder<T> extends Launcher.Builder<T> {
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/services/LanguageClient.java b/java/org/eclipse/lsp4j/services/LanguageClient.java
new file mode 100644
index 0000000..2d0d5d7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/services/LanguageClient.java
@@ -0,0 +1,210 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.services;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
+import org.eclipse.lsp4j.ApplyWorkspaceEditResponse;
+import org.eclipse.lsp4j.ConfigurationParams;
+import org.eclipse.lsp4j.LogTraceParams;
+import org.eclipse.lsp4j.MessageActionItem;
+import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.lsp4j.ProgressParams;
+import org.eclipse.lsp4j.PublishDiagnosticsParams;
+import org.eclipse.lsp4j.RegistrationParams;
+import org.eclipse.lsp4j.ShowDocumentParams;
+import org.eclipse.lsp4j.ShowDocumentResult;
+import org.eclipse.lsp4j.ShowMessageRequestParams;
+import org.eclipse.lsp4j.UnregistrationParams;
+import org.eclipse.lsp4j.WorkDoneProgressCreateParams;
+import org.eclipse.lsp4j.WorkspaceFolder;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+public interface LanguageClient {
+ /**
+ * The workspace/applyEdit request is sent from the server to the client to modify resource on the client side.
+ */
+ @JsonRequest("workspace/applyEdit")
+ default CompletableFuture<ApplyWorkspaceEditResponse> applyEdit(ApplyWorkspaceEditParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The client/registerCapability request is sent from the server to the client
+ * to register for a new capability on the client side.
+ * Not all clients need to support dynamic capability registration.
+ * A client opts in via the ClientCapabilities.dynamicRegistration property
+ */
+ @JsonRequest("client/registerCapability")
+ default CompletableFuture<Void> registerCapability(RegistrationParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The client/unregisterCapability request is sent from the server to the client
+ * to unregister a previously register capability.
+ */
+ @JsonRequest("client/unregisterCapability")
+ default CompletableFuture<Void> unregisterCapability(UnregistrationParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The telemetry notification is sent from the server to the client to ask
+ * the client to log a telemetry event.
+ */
+ @JsonNotification("telemetry/event")
+ void telemetryEvent(Object object);
+
+ /**
+ * Diagnostics notifications are sent from the server to the client to
+ * signal results of validation runs.
+ */
+ @JsonNotification("textDocument/publishDiagnostics")
+ void publishDiagnostics(PublishDiagnosticsParams diagnostics);
+
+ /**
+ * The show message notification is sent from a server to a client to ask
+ * the client to display a particular message in the user interface.
+ */
+ @JsonNotification("window/showMessage")
+ void showMessage(MessageParams messageParams);
+
+ /**
+ * The show message request is sent from a server to a client to ask the
+ * client to display a particular message in the user interface. In addition
+ * to the show message notification the request allows to pass actions and
+ * to wait for an answer from the client.
+ */
+ @JsonRequest("window/showMessageRequest")
+ CompletableFuture<MessageActionItem> showMessageRequest(ShowMessageRequestParams requestParams);
+
+ /**
+ * The show document request is sent from a server to a client to ask the
+ * client to display a particular document in the user interface.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest("window/showDocument")
+ default CompletableFuture<ShowDocumentResult> showDocument(ShowDocumentParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The log message notification is send from the server to the client to ask
+ * the client to log a particular message.
+ */
+ @JsonNotification("window/logMessage")
+ void logMessage(MessageParams message);
+
+ /**
+ * The workspace/workspaceFolders request is sent from the server to the client
+ * to fetch the current open list of workspace folders.
+ *
+ * @return null in the response if only a single file is open in the tool,
+ * an empty array if a workspace is open but no folders are configured,
+ * the workspace folders otherwise.
+ *
+ * Since 3.6.0
+ */
+ @JsonRequest("workspace/workspaceFolders")
+ default CompletableFuture<List<WorkspaceFolder>> workspaceFolders() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The workspace/configuration request is sent from the server to the client to fetch
+ * configuration settings from the client. The request can fetch several configuration settings
+ * in one roundtrip. The order of the returned configuration settings correspond to the
+ * order of the passed ConfigurationItems (e.g. the first item in the response is the
+ * result for the first configuration item in the params).
+ *
+ * Since 3.6.0
+ */
+ @JsonRequest("workspace/configuration")
+ default CompletableFuture<List<Object>> configuration(ConfigurationParams configurationParams) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This request is sent from the server to the client to ask the client to create a work done progress.
+ *
+ * Since 3.15.0
+ */
+ @JsonRequest("window/workDoneProgress/create")
+ default CompletableFuture<Void> createProgress(WorkDoneProgressCreateParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The base protocol offers also support to report progress in a generic fashion.
+ * This mechanism can be used to report any kind of progress including work done progress
+ * (usually used to report progress in the user interface using a progress bar)
+ * and partial result progress to support streaming of results.
+ *
+ * Since 3.15.0
+ */
+ @JsonNotification("$/progress")
+ default void notifyProgress(ProgressParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * A notification to log the trace of the server's execution. The amount and content of these
+ * notifications depends on the current trace configuration. If trace is 'off', the server
+ * should not send any logTrace notification. If trace is 'message', the server should not
+ * add the 'verbose' field in the LogTraceParams.
+ *
+ * $/logTrace should be used for systematic trace reporting. For single debugging messages,
+ * the server should send window/logMessage notifications.
+ *
+ * Since 3.16.0
+ */
+ @JsonNotification("$/logTrace")
+ default void logTrace(LogTraceParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The `workspace/semanticTokens/refresh` request is sent from the server to the client.
+ * Servers can use it to ask clients to refresh the editors for which this server
+ * provides semantic tokens. As a result the client should ask the server to recompute
+ * the semantic tokens for these editors. This is useful if a server detects a project wide
+ * configuration change which requires a re-calculation of all semantic tokens.
+ * Note that the client still has the freedom to delay the re-calculation of the semantic tokens
+ * if for example an editor is currently not visible.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest("workspace/semanticTokens/refresh")
+ default CompletableFuture<Void> refreshSemanticTokens() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code workspace/codeLens/refresh} request is sent from the server to the client.
+ * Servers can use it to ask clients to refresh the code lenses currently shown in editors.
+ * As a result the client should ask the server to recompute the code lenses for these editors.
+ * This is useful if a server detects a configuration change which requires a re-calculation of
+ * all code lenses. Note that the client still has the freedom to delay the re-calculation of
+ * the code lenses if for example an editor is currently not visible.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest("workspace/codeLens/refresh")
+ default CompletableFuture<Void> refreshCodeLenses() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/services/LanguageClientAware.java b/java/org/eclipse/lsp4j/services/LanguageClientAware.java
new file mode 100644
index 0000000..64d709b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/services/LanguageClientAware.java
@@ -0,0 +1,17 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.services;
+
+public interface LanguageClientAware {
+
+ void connect(LanguageClient client);
+}
diff --git a/java/org/eclipse/lsp4j/services/LanguageClientExtensions.java b/java/org/eclipse/lsp4j/services/LanguageClientExtensions.java
new file mode 100644
index 0000000..de2f1f7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/services/LanguageClientExtensions.java
@@ -0,0 +1,20 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.services;
+
+
+/**
+ * An extension interface for new methods that are not (yet) defined in the standard LSP protocol.
+ */
+public interface LanguageClientExtensions extends LanguageClient {
+
+}
diff --git a/java/org/eclipse/lsp4j/services/LanguageServer.java b/java/org/eclipse/lsp4j/services/LanguageServer.java
new file mode 100644
index 0000000..ec4e4e7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/services/LanguageServer.java
@@ -0,0 +1,112 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.services;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.InitializeParams;
+import org.eclipse.lsp4j.InitializeResult;
+import org.eclipse.lsp4j.InitializedParams;
+import org.eclipse.lsp4j.SetTraceParams;
+import org.eclipse.lsp4j.WorkDoneProgressCancelParams;
+import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+
+/**
+ * Interface for implementations of
+ * https://github.com/Microsoft/vscode-languageserver-protocol
+ */
+public interface LanguageServer {
+ /**
+ * The initialize request is sent as the first request from the client to
+ * the server.
+ *
+ * If the server receives requests or notifications before the initialize request, it should act as follows:
+ * - for a request, the response should be errored with:
+ * {@link org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode#serverNotInitialized}.
+ * The message can be picked by the server.
+ * - notifications should be dropped, except for the exit notification.
+ * This will allow the client to exit a server without an initialize request.
+ *
+ * Until the server has responded to the initialize request with an InitializeResult,
+ * the client must not send any additional requests or notifications to the server.
+ *
+ * During the initialize request, the server is allowed to send the notifications window/showMessage,
+ * window/logMessage, and telemetry/event, as well as the request window/showMessageRequest, to the client.
+ */
+ @JsonRequest
+ CompletableFuture<InitializeResult> initialize(InitializeParams params);
+
+ /**
+ * The initialized notification is sent from the client to the server after
+ * the client received the result of the initialize request, but before the
+ * client is sending any other request or notification to the server. The
+ * server can use the initialized notification, for example, to dynamically
+ * register capabilities.
+ */
+ @JsonNotification
+ default void initialized(InitializedParams params) {
+ initialized();
+ }
+ /**
+ * @deprecated see initialized(InitializedParams)
+ */
+ @Deprecated
+ default void initialized() {
+ }
+
+ /**
+ * The shutdown request is sent from the client to the server. It asks the
+ * server to shutdown, but to not exit (otherwise the response might not be
+ * delivered correctly to the client). There is a separate exit notification
+ * that asks the server to exit.
+ */
+ @JsonRequest
+ CompletableFuture<Object> shutdown();
+
+ /**
+ * A notification to ask the server to exit its process.
+ */
+ @JsonNotification
+ void exit();
+
+ /**
+ * Provides access to the textDocument services.
+ */
+ @JsonDelegate
+ TextDocumentService getTextDocumentService();
+
+ /**
+ * Provides access to the workspace services.
+ */
+ @JsonDelegate
+ WorkspaceService getWorkspaceService();
+
+ /**
+ * This notification is sent from the client to the server to cancel a progress initiated on the server side.
+ */
+ @JsonNotification("window/workDoneProgress/cancel")
+ default void cancelProgress(WorkDoneProgressCancelParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * A notification that should be used by the client to modify the trace setting of the server.
+ *
+ * Since 3.16.0
+ */
+ @JsonNotification("$/setTrace")
+ default void setTrace(SetTraceParams params) {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/services/TextDocumentService.java b/java/org/eclipse/lsp4j/services/TextDocumentService.java
new file mode 100644
index 0000000..9c4a9aa
--- /dev/null
+++ b/java/org/eclipse/lsp4j/services/TextDocumentService.java
@@ -0,0 +1,628 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.services;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import com.google.common.annotations.Beta;
+
+import org.eclipse.lsp4j.CallHierarchyIncomingCall;
+import org.eclipse.lsp4j.CallHierarchyIncomingCallsParams;
+import org.eclipse.lsp4j.CallHierarchyItem;
+import org.eclipse.lsp4j.CallHierarchyOutgoingCall;
+import org.eclipse.lsp4j.CallHierarchyOutgoingCallsParams;
+import org.eclipse.lsp4j.CallHierarchyPrepareParams;
+import org.eclipse.lsp4j.CodeAction;
+import org.eclipse.lsp4j.CodeActionParams;
+import org.eclipse.lsp4j.CodeLens;
+import org.eclipse.lsp4j.CodeLensParams;
+import org.eclipse.lsp4j.ColorInformation;
+import org.eclipse.lsp4j.ColorPresentation;
+import org.eclipse.lsp4j.ColorPresentationParams;
+import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.CompletionItem;
+import org.eclipse.lsp4j.CompletionList;
+import org.eclipse.lsp4j.CompletionParams;
+import org.eclipse.lsp4j.DeclarationParams;
+import org.eclipse.lsp4j.DefinitionParams;
+import org.eclipse.lsp4j.DidChangeTextDocumentParams;
+import org.eclipse.lsp4j.DidCloseTextDocumentParams;
+import org.eclipse.lsp4j.DidOpenTextDocumentParams;
+import org.eclipse.lsp4j.DidSaveTextDocumentParams;
+import org.eclipse.lsp4j.DocumentColorParams;
+import org.eclipse.lsp4j.DocumentFormattingParams;
+import org.eclipse.lsp4j.DocumentHighlight;
+import org.eclipse.lsp4j.DocumentHighlightParams;
+import org.eclipse.lsp4j.DocumentLink;
+import org.eclipse.lsp4j.DocumentLinkParams;
+import org.eclipse.lsp4j.DocumentOnTypeFormattingParams;
+import org.eclipse.lsp4j.DocumentRangeFormattingParams;
+import org.eclipse.lsp4j.DocumentSymbol;
+import org.eclipse.lsp4j.DocumentSymbolCapabilities;
+import org.eclipse.lsp4j.DocumentSymbolParams;
+import org.eclipse.lsp4j.FoldingRange;
+import org.eclipse.lsp4j.FoldingRangeRequestParams;
+import org.eclipse.lsp4j.Hover;
+import org.eclipse.lsp4j.HoverParams;
+import org.eclipse.lsp4j.ImplementationParams;
+import org.eclipse.lsp4j.Location;
+import org.eclipse.lsp4j.Moniker;
+import org.eclipse.lsp4j.MonikerParams;
+import org.eclipse.lsp4j.LocationLink;
+import org.eclipse.lsp4j.LinkedEditingRangeParams;
+import org.eclipse.lsp4j.LinkedEditingRanges;
+import org.eclipse.lsp4j.PrepareRenameParams;
+import org.eclipse.lsp4j.PrepareRenameResult;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.ReferenceParams;
+import org.eclipse.lsp4j.RenameParams;
+import org.eclipse.lsp4j.ResolveTypeHierarchyItemParams;
+import org.eclipse.lsp4j.SelectionRange;
+import org.eclipse.lsp4j.SelectionRangeParams;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensDelta;
+import org.eclipse.lsp4j.SemanticTokensDeltaParams;
+import org.eclipse.lsp4j.SemanticTokensParams;
+import org.eclipse.lsp4j.SemanticTokensRangeParams;
+import org.eclipse.lsp4j.SignatureHelp;
+import org.eclipse.lsp4j.SignatureHelpParams;
+import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.TextDocumentRegistrationOptions;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.TypeDefinitionParams;
+import org.eclipse.lsp4j.TypeHierarchyItem;
+import org.eclipse.lsp4j.TypeHierarchyParams;
+import org.eclipse.lsp4j.WillSaveTextDocumentParams;
+import org.eclipse.lsp4j.WorkspaceEdit;
+import org.eclipse.lsp4j.adapters.CodeActionResponseAdapter;
+import org.eclipse.lsp4j.adapters.DocumentSymbolResponseAdapter;
+import org.eclipse.lsp4j.adapters.LocationLinkListAdapter;
+import org.eclipse.lsp4j.adapters.PrepareRenameResponseAdapter;
+import org.eclipse.lsp4j.adapters.SemanticTokensFullDeltaResponseAdapter;
+import org.eclipse.lsp4j.jsonrpc.json.ResponseJsonAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.services.JsonSegment;
+
+@JsonSegment("textDocument")
+public interface TextDocumentService {
+
+ /**
+ * The Completion request is sent from the client to the server to compute
+ * completion items at a given cursor position. Completion items are
+ * presented in the IntelliSense user interface. If computing complete
+ * completion items is expensive servers can additional provide a handler
+ * for the resolve completion item request. This request is sent when a
+ * completion item is selected in the user interface.
+ *
+ * Registration Options: CompletionRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion(CompletionParams position) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request is sent from the client to the server to resolve additional
+ * information for a given completion item.
+ */
+ @JsonRequest(value="completionItem/resolve", useSegment = false)
+ default CompletableFuture<CompletionItem> resolveCompletionItem(CompletionItem unresolved) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The hover request is sent from the client to the server to request hover
+ * information at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<Hover> hover(HoverParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The signature help request is sent from the client to the server to
+ * request signature information at a given cursor position.
+ *
+ * Registration Options: SignatureHelpRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<SignatureHelp> signatureHelp(SignatureHelpParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The go to declaration request is sent from the client to the server to resolve
+ * the declaration location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ *
+ * Since 3.14.0
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(LocationLinkListAdapter.class)
+ default CompletableFuture<Either<List<? extends Location>, List<? extends LocationLink>>> declaration(DeclarationParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The goto definition request is sent from the client to the server to resolve
+ * the definition location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(LocationLinkListAdapter.class)
+ default CompletableFuture<Either<List<? extends Location>, List<? extends LocationLink>>> definition(DefinitionParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The goto type definition request is sent from the client to the server to resolve
+ * the type definition location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ *
+ * Since 3.6.0
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(LocationLinkListAdapter.class)
+ default CompletableFuture<Either<List<? extends Location>, List<? extends LocationLink>>> typeDefinition(TypeDefinitionParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The goto implementation request is sent from the client to the server to resolve
+ * the implementation location of a symbol at a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ *
+ * Since 3.6.0
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(LocationLinkListAdapter.class)
+ default CompletableFuture<Either<List<? extends Location>, List<? extends LocationLink>>> implementation(ImplementationParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The references request is sent from the client to the server to resolve
+ * project-wide references for the symbol denoted by the given text document
+ * position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends Location>> references(ReferenceParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document highlight request is sent from the client to the server to
+ * to resolve a document highlights for a given text document position.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends DocumentHighlight>> documentHighlight(DocumentHighlightParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document symbol request is sent from the client to the server to list all
+ * symbols found in a given text document.
+ *
+ * Registration Options: {@link TextDocumentRegistrationOptions}
+ *
+ * <p>
+ * <b>Caveat</b>: although the return type allows mixing the
+ * {@link DocumentSymbol} and {@link SymbolInformation} instances into a list do
+ * not do it because the clients cannot accept a heterogeneous list. A list of
+ * {@code DocumentSymbol} instances is only a valid return value if the
+ * {@link DocumentSymbolCapabilities#getHierarchicalDocumentSymbolSupport()
+ * textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} is
+ * {@code true}. More details on this difference between the LSP and the LSP4J
+ * can be found <a href="https://github.com/eclipse/lsp4j/issues/252">here</a>.
+ * </p>
+ *
+ * Servers should whenever possible return {@code DocumentSymbol} since it is the richer data structure.
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(DocumentSymbolResponseAdapter.class)
+ default CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The code action request is sent from the client to the server to compute
+ * commands for a given text document and range. These commands are
+ * typically code fixes to either fix problems or to beautify/refactor code.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(CodeActionResponseAdapter.class)
+ default CompletableFuture<List<Either<Command, CodeAction>>> codeAction(CodeActionParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The request is sent from the client to the server to resolve additional information for a given code action. This is usually used to compute
+ * the `edit` property of a code action to avoid its unnecessary computation during the `textDocument/codeAction` request.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest(value="codeAction/resolve", useSegment = false)
+ default CompletableFuture<CodeAction> resolveCodeAction(CodeAction unresolved) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The code lens request is sent from the client to the server to compute
+ * code lenses for a given text document.
+ *
+ * Registration Options: CodeLensRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends CodeLens>> codeLens(CodeLensParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The code lens resolve request is sent from the client to the server to
+ * resolve the command for a given code lens item.
+ */
+ @JsonRequest(value="codeLens/resolve", useSegment = false)
+ default CompletableFuture<CodeLens> resolveCodeLens(CodeLens unresolved) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document formatting request is sent from the client to the server to
+ * format a whole document.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends TextEdit>> formatting(DocumentFormattingParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document range formatting request is sent from the client to the
+ * server to format a given range in a document.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends TextEdit>> rangeFormatting(DocumentRangeFormattingParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document on type formatting request is sent from the client to the
+ * server to format parts of the document during typing.
+ *
+ * Registration Options: DocumentOnTypeFormattingRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends TextEdit>> onTypeFormatting(DocumentOnTypeFormattingParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The rename request is sent from the client to the server to do a
+ * workspace wide rename of a symbol.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<WorkspaceEdit> rename(RenameParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The linked editing range request is sent from the client to the server to return
+ * for a given position in a document the range of the symbol at the position
+ * and all ranges that have the same content. Optionally a word pattern can be
+ * returned to describe valid contents. A rename to one of the ranges can be
+ * applied to all other ranges if the new content is valid. If no result-specific
+ * word pattern is provided, the word pattern from the client's language configuration
+ * is used.
+ *
+ * Registration Options: LinkedEditingRangeRegistrationOptions
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest
+ default CompletableFuture<LinkedEditingRanges> linkedEditingRange(LinkedEditingRangeParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document open notification is sent from the client to the server to
+ * signal newly opened text documents. The document's truth is now managed
+ * by the client and the server must not try to read the document's truth
+ * using the document's uri.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonNotification
+ void didOpen(DidOpenTextDocumentParams params);
+
+ /**
+ * The document change notification is sent from the client to the server to
+ * signal changes to a text document.
+ *
+ * Registration Options: TextDocumentChangeRegistrationOptions
+ */
+ @JsonNotification
+ void didChange(DidChangeTextDocumentParams params);
+
+ /**
+ * The document close notification is sent from the client to the server
+ * when the document got closed in the client. The document's truth now
+ * exists where the document's uri points to (e.g. if the document's uri is
+ * a file uri the truth now exists on disk).
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonNotification
+ void didClose(DidCloseTextDocumentParams params);
+
+ /**
+ * The document save notification is sent from the client to the server when
+ * the document for saved in the client.
+ *
+ * Registration Options: TextDocumentSaveRegistrationOptions
+ */
+ @JsonNotification
+ void didSave(DidSaveTextDocumentParams params);
+
+ /**
+ * The document will save notification is sent from the client to the server before the document is actually saved.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonNotification
+ default void willSave(WillSaveTextDocumentParams params) {}
+
+ /**
+ * The document will save request is sent from the client to the server before the document is actually saved.
+ * The request can return an array of TextEdits which will be applied to the text document before it is saved.
+ * Please note that clients might drop results if computing the text edits took too long or if a server constantly fails on this request.
+ * This is done to keep the save fast and reliable.
+ *
+ * Registration Options: TextDocumentRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<TextEdit>> willSaveWaitUntil(WillSaveTextDocumentParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document links request is sent from the client to the server to request the location of links in a document.
+ *
+ * Registration Options: DocumentLinkRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<List<DocumentLink>> documentLink(DocumentLinkParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document link resolve request is sent from the client to the server to resolve the target of a given document link.
+ */
+ @JsonRequest(value="documentLink/resolve", useSegment = false)
+ default CompletableFuture<DocumentLink> documentLinkResolve(DocumentLink params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The document color request is sent from the client to the server to list all color references found in a given text
+ * document. Along with the range, a color value in RGB is returned.
+ *
+ * Clients can use the result to decorate color references in an editor. For example:
+ * - Color boxes showing the actual color next to the reference
+ * - Show a color picker when a color reference is edited
+ *
+ * Since 3.6.0
+ */
+ @JsonRequest
+ default CompletableFuture<List<ColorInformation>> documentColor(DocumentColorParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The color presentation request is sent from the client to the server to obtain a list of presentations for a color
+ * value at a given location. Clients can use the result to
+ * - modify a color reference.
+ * - show in a color picker and let users pick one of the presentations
+ *
+ * Since 3.6.0
+ */
+ @JsonRequest
+ default CompletableFuture<List<ColorPresentation>> colorPresentation(ColorPresentationParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The folding range request is sent from the client to the server to return all folding
+ * ranges found in a given text document.
+ *
+ * Since 3.10.0
+ */
+ @JsonRequest
+ default CompletableFuture<List<FoldingRange>> foldingRange(FoldingRangeRequestParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The prepare rename request is sent from the client to the server to setup and test the validity of a rename
+ * operation at a given location.
+ *
+ * Since 3.12.0
+ */
+ @JsonRequest
+ @ResponseJsonAdapter(PrepareRenameResponseAdapter.class)
+ default CompletableFuture<Either<Range, PrepareRenameResult>> prepareRename(PrepareRenameParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code textDocument/typeHierarchy} request is sent from the client to the
+ * server to retrieve a {@link TypeHierarchyItem type hierarchy item} based on
+ * the {@link TypeHierarchyParams cursor position in the text document}. This
+ * request would also allow to specify if the item should be resolved and
+ * whether sub- or supertypes are to be resolved. If no type hierarchy item can
+ * be found under the given text document position, resolves to {@code null}.
+ *
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+ @Beta
+ @JsonRequest
+ default CompletableFuture<TypeHierarchyItem> typeHierarchy(TypeHierarchyParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code typeHierarchy/resolve} request is sent from the client to the
+ * server to resolve an unresolved {@link TypeHierarchyItem type hierarchy
+ * item}. A type hierarchy item is unresolved if the if the
+ * {@link TypeHierarchyItem#getParents parents} or the
+ * {@link TypeHierarchyItem#getChildren children} is not defined.
+ *
+ * <p>
+ * <b>Note:</b> the <a href=
+ * "https://github.com/Microsoft/vscode-languageserver-node/pull/426">{@code textDocument/typeHierarchy}
+ * language feature</a> is not yet part of the official LSP specification.
+ */
+ @Beta
+ @JsonRequest(value="typeHierarchy/resolve", useSegment = false)
+ default CompletableFuture<TypeHierarchyItem> resolveTypeHierarchy(ResolveTypeHierarchyItemParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Bootstraps call hierarchy by returning the item that is denoted by the given document
+ * and position. This item will be used as entry into the call graph. Providers should
+ * return null when there is no item at the given location.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest
+ default CompletableFuture<List<CallHierarchyItem>> prepareCallHierarchy(CallHierarchyPrepareParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Provide all incoming calls for an item, e.g all callers for a method. In graph terms this describes directed
+ * and annotated edges inside the call graph, e.g the given item is the starting node and the result is the nodes
+ * that can be reached.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest(value="callHierarchy/incomingCalls", useSegment = false)
+ default CompletableFuture<List<CallHierarchyIncomingCall>> callHierarchyIncomingCalls(CallHierarchyIncomingCallsParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Provide all outgoing calls for an item, e.g call calls to functions, methods, or constructors from the given item. In
+ * graph terms this describes directed and annotated edges inside the call graph, e.g the given item is the starting
+ * node and the result is the nodes that can be reached.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest(value="callHierarchy/outgoingCalls", useSegment = false)
+ default CompletableFuture<List<CallHierarchyOutgoingCall>> callHierarchyOutgoingCalls(CallHierarchyOutgoingCallsParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code textDocument/selectionRange} request is sent from the client to the server to return
+ * suggested selection ranges at an array of given positions. A selection range is a range around
+ * the cursor position which the user might be interested in selecting.
+ *
+ * Since 3.15.0
+ */
+ @JsonRequest
+ default CompletableFuture<List<SelectionRange>> selectionRange(SelectionRangeParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code textDocument/semanticTokens/full} request is sent from the client to the server to return
+ * the semantic tokens for a whole file.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest(value="textDocument/semanticTokens/full", useSegment = false)
+ default CompletableFuture<SemanticTokens> semanticTokensFull(SemanticTokensParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code textDocument/semanticTokens/full/delta} request is sent from the client to the server to return
+ * the semantic tokens delta for a whole file.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest(value="textDocument/semanticTokens/full/delta", useSegment = false)
+ @ResponseJsonAdapter(SemanticTokensFullDeltaResponseAdapter.class)
+ default CompletableFuture<Either<SemanticTokens, SemanticTokensDelta>> semanticTokensFullDelta(SemanticTokensDeltaParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The {@code textDocument/semanticTokens/range} request is sent from the client to the server to return
+ * the semantic tokens delta for a range.
+ *
+ * When a user opens a file it can be beneficial to only compute the semantic tokens for the visible range
+ * (faster rendering of the tokens in the user interface). If a server can compute these tokens faster than
+ * for the whole file it can provide a handler for the textDocument/semanticTokens/range request to handle
+ * this case special. Please note that if a client also announces that it will send the
+ * textDocument/semanticTokens/range server should implement this request as well to allow for flicker free
+ * scrolling and semantic coloring of a minimap.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest(value="textDocument/semanticTokens/range", useSegment = false)
+ default CompletableFuture<SemanticTokens> semanticTokensRange(SemanticTokensRangeParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Language Server Index Format (LSIF) introduced the concept of symbol monikers to help associate symbols across
+ * different indexes. This request adds capability for LSP server implementations to provide the same symbol moniker
+ * information given a text document position. Clients can utilize this method to get the moniker at the current
+ * location in a file user is editing and do further code navigation queries in other services that rely on LSIF indexes
+ * and link symbols together.
+ *
+ * The {@code textDocument/moniker} request is sent from the client to the server to get the symbol monikers for a given
+ * text document position. An array of Moniker types is returned as response to indicate possible monikers at the given location.
+ * If no monikers can be calculated, an empty array or null should be returned.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest
+ default CompletableFuture<List<Moniker>> moniker(MonikerParams params) {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/services/WorkspaceService.java b/java/org/eclipse/lsp4j/services/WorkspaceService.java
new file mode 100644
index 0000000..1f585ce
--- /dev/null
+++ b/java/org/eclipse/lsp4j/services/WorkspaceService.java
@@ -0,0 +1,163 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.services;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.CreateFilesParams;
+import org.eclipse.lsp4j.DeleteFilesParams;
+import org.eclipse.lsp4j.DidChangeConfigurationParams;
+import org.eclipse.lsp4j.DidChangeWatchedFilesParams;
+import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams;
+import org.eclipse.lsp4j.ExecuteCommandParams;
+import org.eclipse.lsp4j.RenameFilesParams;
+import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.WorkspaceEdit;
+import org.eclipse.lsp4j.WorkspaceSymbolParams;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.services.JsonSegment;
+
+@JsonSegment("workspace")
+public interface WorkspaceService {
+ /**
+ * The workspace/executeCommand request is sent from the client to the
+ * server to trigger command execution on the server. In most cases the
+ * server creates a WorkspaceEdit structure and applies the changes to the
+ * workspace using the request workspace/applyEdit which is sent from the
+ * server to the client.
+ *
+ * Registration Options: ExecuteCommandRegistrationOptions
+ */
+ @JsonRequest
+ default CompletableFuture<Object> executeCommand(ExecuteCommandParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The workspace symbol request is sent from the client to the server to
+ * list project-wide symbols matching the query string.
+ *
+ * Registration Options: void
+ */
+ @JsonRequest
+ default CompletableFuture<List<? extends SymbolInformation>> symbol(WorkspaceSymbolParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * A notification sent from the client to the server to signal the change of
+ * configuration settings.
+ */
+ @JsonNotification
+ void didChangeConfiguration(DidChangeConfigurationParams params);
+
+ /**
+ * The watched files notification is sent from the client to the server when
+ * the client detects changes to file watched by the language client.
+ */
+ @JsonNotification
+ void didChangeWatchedFiles(DidChangeWatchedFilesParams params);
+
+ /**
+ * The workspace/didChangeWorkspaceFolders notification is sent from the client
+ * to the server to inform the server about workspace folder configuration changes.
+ * The notification is sent by default if both ServerCapabilities/workspaceFolders
+ * and ClientCapabilities/workspace/workspaceFolders are true; or if the server has
+ * registered to receive this notification it first.
+ *
+ * Since 3.6.0
+ */
+ @JsonNotification
+ default void didChangeWorkspaceFolders(DidChangeWorkspaceFoldersParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The will create files request is sent from the client to the server before files
+ * are actually created as long as the creation is triggered from within the client.
+ * The request can return a {@link WorkspaceEdit} which will be applied to workspace
+ * before the files are created. Please note that clients might drop results if computing
+ * the edit took too long or if a server constantly fails on this request. This is
+ * done to keep creates fast and reliable.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest
+ default CompletableFuture<WorkspaceEdit> willCreateFiles(CreateFilesParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The did create files notification is sent from the client to the server when files
+ * were created from within the client.
+ *
+ * Since 3.16.0
+ */
+ @JsonNotification
+ default void didCreateFiles(CreateFilesParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The will rename files request is sent from the client to the server before files
+ * are actually renamed as long as the rename is triggered from within the client.
+ * The request can return a {@link WorkspaceEdit} which will be applied to workspace
+ * before the files are renamed. Please note that clients might drop results if computing
+ * the edit took too long or if a server constantly fails on this request. This is
+ * done to keep renames fast and reliable.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest
+ default CompletableFuture<WorkspaceEdit> willRenameFiles(RenameFilesParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The did rename files notification is sent from the client to the server when files
+ * were renamed from within the client.
+ *
+ * Since 3.16.0
+ */
+ @JsonNotification
+ default void didRenameFiles(RenameFilesParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The will delete files request is sent from the client to the server before files
+ * are actually deleted as long as the deletion is triggered from within the client.
+ * The request can return a {@link WorkspaceEdit} which will be applied to workspace
+ * before the files are deleted. Please note that clients might drop results if computing
+ * the edit took too long or if a server constantly fails on this request. This is
+ * done to keep deletes fast and reliable.
+ *
+ * Since 3.16.0
+ */
+ @JsonRequest
+ default CompletableFuture<WorkspaceEdit> willDeleteFiles(DeleteFilesParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * The did delete files notification is sent from the client to the server when files
+ * were deleted from within the client.
+ *
+ * Since 3.16.0
+ */
+ @JsonNotification
+ default void didDeleteFiles(DeleteFilesParams params) {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/java/org/eclipse/lsp4j/util/DocumentSymbols.java b/java/org/eclipse/lsp4j/util/DocumentSymbols.java
new file mode 100644
index 0000000..0763b02
--- /dev/null
+++ b/java/org/eclipse/lsp4j/util/DocumentSymbols.java
@@ -0,0 +1,96 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.util;
+
+import java.util.ArrayDeque;
+import java.util.Iterator;
+import java.util.Queue;
+
+import org.eclipse.lsp4j.DocumentSymbol;
+
+/**
+ * Utilities for {@link DocumentSymbol document symbols}.
+ */
+public final class DocumentSymbols {
+
+ /**
+ * Returns an unmodifiable iterator over the {@link DocumentSymbol document
+ * symbols} using the breath-first traversal. That is, all the symbols of depth
+ * 0 are returned, then depth 1, then 2, and so on.
+ *
+ * <p>
+ * It does not guarantee a well defined behavior of the resulting iterator if
+ * you modify the structure while the iteration is in progress.
+ */
+ public static Iterator<DocumentSymbol> asIterator(DocumentSymbol documentSymbol) {
+ return new DocumentSymbolIterator(documentSymbol);
+ }
+
+ protected static class DocumentSymbolIterator extends BreadthFirstIterator<DocumentSymbol> {
+
+ protected DocumentSymbolIterator(DocumentSymbol documentSymbol) {
+ super(Preconditions.checkNotNull(documentSymbol, "documentSymbol"));
+ }
+
+ @Override
+ protected Iterable<DocumentSymbol> getChildren(DocumentSymbol node) {
+ return node.getChildren();
+ }
+
+ }
+
+ protected abstract static class BreadthFirstIterator<T> implements Iterator<T> {
+
+ private Queue<T> queue;
+
+ protected BreadthFirstIterator(T root) {
+ Preconditions.checkNotNull(root, "root");
+ this.queue = new ArrayDeque<>();
+ this.queue.add(root);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return !this.queue.isEmpty();
+ }
+
+ @Override
+ public T next() {
+ T result = queue.remove();
+ Iterable<T> children = getChildren(result);
+ if (children != null) {
+ for (T child : children) {
+ queue.add(child);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns with the children (direct descendants) of the {@code node} argument.
+ * If the argument does not have any children, clients are allowed to return
+ * {@code null}.
+ */
+ protected abstract Iterable<T> getChildren(T node);
+
+ }
+
+ private DocumentSymbols() {
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/util/Positions.java b/java/org/eclipse/lsp4j/util/Positions.java
new file mode 100644
index 0000000..a4affc7
--- /dev/null
+++ b/java/org/eclipse/lsp4j/util/Positions.java
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.util;
+
+import org.eclipse.lsp4j.Position;
+
+/**
+ * Utilities for the {@link Position}.
+ */
+public final class Positions {
+
+ /**
+ * {@code true} if {@code left} is strictly before than {@code right}. Otherwise,
+ * {@code false}.
+ * <p>
+ * If you want to allow equality, use {@link Position#equals}.
+ */
+ public static boolean isBefore(Position left, Position right) {
+ Preconditions.checkNotNull(left, "left");
+ Preconditions.checkNotNull(right, "right");
+ if (left.getLine() < right.getLine()) {
+ return true;
+ }
+ if (left.getLine() > right.getLine()) {
+ return false;
+ }
+ return left.getCharacter() < right.getCharacter();
+ }
+
+ private Positions() {
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/util/Preconditions.java b/java/org/eclipse/lsp4j/util/Preconditions.java
new file mode 100644
index 0000000..2319b7d
--- /dev/null
+++ b/java/org/eclipse/lsp4j/util/Preconditions.java
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.util;
+
+/**
+ * Utilities for checking method and constructor arguments.
+ */
+public final class Preconditions {
+
+ private Preconditions() {}
+
+ private static boolean nullChecks = true;
+
+ public static void enableNullChecks(boolean enable) {
+ Preconditions.nullChecks = enable;
+ }
+
+ public static <T> T checkNotNull(T object, String propertyName) {
+ if (nullChecks && object == null) {
+ throw new NullPointerException("Property must not be null: " + propertyName);
+ }
+ return object;
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/util/Ranges.java b/java/org/eclipse/lsp4j/util/Ranges.java
new file mode 100644
index 0000000..ebd4e69
--- /dev/null
+++ b/java/org/eclipse/lsp4j/util/Ranges.java
@@ -0,0 +1,47 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.util;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+
+/**
+ * Utility class for {@link Range}.
+ */
+public final class Ranges {
+
+ /**
+ * {@code true} if the {@code smaller} {@link Range range} is inside or equal to
+ * the {@code bigger} range. Otherwise, {@code false}.
+ */
+ public static boolean containsRange(Range bigger, Range smaller) {
+ Preconditions.checkNotNull(bigger, "bigger");
+ Preconditions.checkNotNull(smaller, "smaller");
+ return containsPosition(bigger, smaller.getStart()) && containsPosition(bigger, smaller.getEnd());
+ }
+
+ /**
+ * {@code true} if the {@link Position position} is either inside or on the
+ * border of the {@link Range range}. Otherwise, {@code false}.
+ */
+ public static boolean containsPosition(Range range, Position position) {
+ Preconditions.checkNotNull(range, "range");
+ Preconditions.checkNotNull(position, "position");
+ return (range.getStart().equals(position) || Positions.isBefore(range.getStart(), position)
+ && (range.getEnd().equals(position) || Positions.isBefore(position, range.getEnd())));
+ }
+
+ private Ranges() {
+
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/WebSocketEndpoint.java b/java/org/eclipse/lsp4j/websocket/WebSocketEndpoint.java
new file mode 100644
index 0000000..efe675f
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/WebSocketEndpoint.java
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket;
+
+import java.util.Collection;
+
+import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
+import javax.websocket.Session;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+
+/**
+ * WebSocket endpoint implementation that connects to a JSON-RPC service.
+ *
+ * @param <T> remote service interface type
+ */
+public abstract class WebSocketEndpoint<T> extends Endpoint {
+
+ @Override
+ public void onOpen(Session session, EndpointConfig config) {
+ WebSocketLauncherBuilder<T> builder = new WebSocketLauncherBuilder<T>();
+ builder.setSession(session);
+ configure(builder);
+ Launcher<T> launcher = builder.create();
+ connect(builder.getLocalServices(), launcher.getRemoteProxy());
+ }
+
+ /**
+ * Configure the JSON-RPC launcher. Implementations should set at least the
+ * {@link Launcher.Builder#setLocalService(Object) local service} and the
+ * {@link Launcher.Builder#setRemoteInterface(Class) remote interface}.
+ */
+ abstract protected void configure(Launcher.Builder<T> builder);
+
+ /**
+ * Override this in order to connect the local services to the remote service proxy.
+ */
+ protected void connect(Collection<Object> localServices, T remoteProxy) {
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/WebSocketLauncherBuilder.java b/java/org/eclipse/lsp4j/websocket/WebSocketLauncherBuilder.java
new file mode 100644
index 0000000..5a52886
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/WebSocketLauncherBuilder.java
@@ -0,0 +1,76 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket;
+
+import java.util.Collection;
+
+import javax.websocket.Session;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+
+/**
+ * JSON-RPC launcher builder for use in {@link WebSocketEndpoint}.
+ *
+ * @param <T> remote service interface type
+ */
+public class WebSocketLauncherBuilder<T> extends Launcher.Builder<T> {
+
+ protected Session session;
+
+ public Collection<Object> getLocalServices() {
+ return localServices;
+ }
+
+ public WebSocketLauncherBuilder<T> setSession(Session session) {
+ this.session = session;
+ return this;
+ }
+
+ @Override
+ public Launcher<T> create() {
+ if (localServices == null)
+ throw new IllegalStateException("Local service must be configured.");
+ if (remoteInterfaces == null)
+ throw new IllegalStateException("Remote interface must be configured.");
+
+ MessageJsonHandler jsonHandler = createJsonHandler();
+ RemoteEndpoint remoteEndpoint = createRemoteEndpoint(jsonHandler);
+ addMessageHandlers(jsonHandler, remoteEndpoint);
+ T remoteProxy = createProxy(remoteEndpoint);
+ return createLauncher(null, remoteProxy, remoteEndpoint, null);
+ }
+
+ @Override
+ protected RemoteEndpoint createRemoteEndpoint(MessageJsonHandler jsonHandler) {
+ MessageConsumer outgoingMessageStream = new WebSocketMessageConsumer(session, jsonHandler);
+ outgoingMessageStream = wrapMessageConsumer(outgoingMessageStream);
+ Endpoint localEndpoint = ServiceEndpoints.toEndpoint(localServices);
+ RemoteEndpoint remoteEndpoint;
+ if (exceptionHandler == null)
+ remoteEndpoint = new RemoteEndpoint(outgoingMessageStream, localEndpoint);
+ else
+ remoteEndpoint = new RemoteEndpoint(outgoingMessageStream, localEndpoint, exceptionHandler);
+ jsonHandler.setMethodProvider(remoteEndpoint);
+ return remoteEndpoint;
+ }
+
+ protected void addMessageHandlers(MessageJsonHandler jsonHandler, RemoteEndpoint remoteEndpoint) {
+ MessageConsumer messageConsumer = wrapMessageConsumer(remoteEndpoint);
+ session.addMessageHandler(new WebSocketMessageHandler(messageConsumer, jsonHandler, remoteEndpoint));
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/WebSocketMessageConsumer.java b/java/org/eclipse/lsp4j/websocket/WebSocketMessageConsumer.java
new file mode 100644
index 0000000..b906567
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/WebSocketMessageConsumer.java
@@ -0,0 +1,71 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket;
+
+import java.io.IOException;
+import java.util.logging.Logger;
+
+import javax.websocket.Session;
+
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+/**
+ * Message consumer that sends messages via a WebSocket session.
+ */
+public class WebSocketMessageConsumer implements MessageConsumer {
+
+ private static final Logger LOG = Logger.getLogger(WebSocketMessageConsumer.class.getName());
+
+ private final Session session;
+ private final MessageJsonHandler jsonHandler;
+
+ public WebSocketMessageConsumer(Session session, MessageJsonHandler jsonHandler) {
+ this.session = session;
+ this.jsonHandler = jsonHandler;
+ }
+
+ public Session getSession() {
+ return session;
+ }
+
+ @Override
+ public void consume(Message message) {
+ String content = jsonHandler.serialize(message);
+ try {
+ sendMessage(content);
+ } catch (IOException exception) {
+ throw new JsonRpcException(exception);
+ }
+ }
+
+ protected void sendMessage(String message) throws IOException {
+ if (session.isOpen()) {
+ int length = message.length();
+ if (length <= session.getMaxTextMessageBufferSize()) {
+ session.getAsyncRemote().sendText(message);
+ } else {
+ int currentOffset = 0;
+ while (currentOffset < length) {
+ int currentEnd = Math.min(currentOffset + session.getMaxTextMessageBufferSize(), length);
+ session.getBasicRemote().sendText(message.substring(currentOffset, currentEnd), currentEnd == length);
+ currentOffset = currentEnd;
+ }
+ }
+ } else {
+ LOG.info("Ignoring message due to closed session: " + message);
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/WebSocketMessageHandler.java b/java/org/eclipse/lsp4j/websocket/WebSocketMessageHandler.java
new file mode 100644
index 0000000..622eef2
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/WebSocketMessageHandler.java
@@ -0,0 +1,47 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket;
+
+import javax.websocket.MessageHandler;
+
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueHandler;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+/**
+ * WebSocket message handler that parses JSON messages and forwards them to a {@link MessageConsumer}.
+ */
+public class WebSocketMessageHandler implements MessageHandler.Whole<String> {
+
+ private final MessageConsumer callback;
+ private final MessageJsonHandler jsonHandler;
+ private final MessageIssueHandler issueHandler;
+
+ public WebSocketMessageHandler(MessageConsumer callback, MessageJsonHandler jsonHandler, MessageIssueHandler issueHandler) {
+ this.callback = callback;
+ this.jsonHandler = jsonHandler;
+ this.issueHandler = issueHandler;
+ }
+
+ public void onMessage(String content) {
+ try {
+ Message message = jsonHandler.parseMessage(content);
+ callback.consume(message);
+ } catch (MessageIssueException exception) {
+ // An issue was found while parsing or validating the message
+ issueHandler.handle(exception.getRpcMessage(), exception.getIssues());
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketEndpoint.java b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketEndpoint.java
new file mode 100644
index 0000000..e0833ce
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketEndpoint.java
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta;
+
+import java.util.Collection;
+
+import jakarta.websocket.Endpoint;
+import jakarta.websocket.EndpointConfig;
+import jakarta.websocket.Session;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+
+/**
+ * WebSocket endpoint implementation that connects to a JSON-RPC service.
+ *
+ * @param <T> remote service interface type
+ */
+public abstract class WebSocketEndpoint<T> extends Endpoint {
+
+ @Override
+ public void onOpen(Session session, EndpointConfig config) {
+ WebSocketLauncherBuilder<T> builder = new WebSocketLauncherBuilder<>();
+ builder.setSession(session);
+ configure(builder);
+ Launcher<T> launcher = builder.create();
+ connect(builder.getLocalServices(), launcher.getRemoteProxy());
+ }
+
+ /**
+ * Configure the JSON-RPC launcher. Implementations should set at least the
+ * {@link Launcher.Builder#setLocalService(Object) local service} and the
+ * {@link Launcher.Builder#setRemoteInterface(Class) remote interface}.
+ */
+ protected abstract void configure(Launcher.Builder<T> builder);
+
+ /**
+ * Override this in order to connect the local services to the remote service proxy.
+ */
+ protected void connect(Collection<Object> localServices, T remoteProxy) {
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketLauncherBuilder.java b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketLauncherBuilder.java
new file mode 100644
index 0000000..7fdf1e3
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketLauncherBuilder.java
@@ -0,0 +1,76 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta;
+
+import java.util.Collection;
+
+import jakarta.websocket.Session;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+
+/**
+ * JSON-RPC launcher builder for use in {@link WebSocketEndpoint}.
+ *
+ * @param <T> remote service interface type
+ */
+public class WebSocketLauncherBuilder<T> extends Launcher.Builder<T> {
+
+ protected Session session;
+
+ public Collection<Object> getLocalServices() {
+ return localServices;
+ }
+
+ public WebSocketLauncherBuilder<T> setSession(Session session) {
+ this.session = session;
+ return this;
+ }
+
+ @Override
+ public Launcher<T> create() {
+ if (localServices == null)
+ throw new IllegalStateException("Local service must be configured.");
+ if (remoteInterfaces == null)
+ throw new IllegalStateException("Remote interface must be configured.");
+
+ MessageJsonHandler jsonHandler = createJsonHandler();
+ RemoteEndpoint remoteEndpoint = createRemoteEndpoint(jsonHandler);
+ addMessageHandlers(jsonHandler, remoteEndpoint);
+ T remoteProxy = createProxy(remoteEndpoint);
+ return createLauncher(null, remoteProxy, remoteEndpoint, null);
+ }
+
+ @Override
+ protected RemoteEndpoint createRemoteEndpoint(MessageJsonHandler jsonHandler) {
+ MessageConsumer outgoingMessageStream = new WebSocketMessageConsumer(session, jsonHandler);
+ outgoingMessageStream = wrapMessageConsumer(outgoingMessageStream);
+ Endpoint localEndpoint = ServiceEndpoints.toEndpoint(localServices);
+ RemoteEndpoint remoteEndpoint;
+ if (exceptionHandler == null)
+ remoteEndpoint = new RemoteEndpoint(outgoingMessageStream, localEndpoint);
+ else
+ remoteEndpoint = new RemoteEndpoint(outgoingMessageStream, localEndpoint, exceptionHandler);
+ jsonHandler.setMethodProvider(remoteEndpoint);
+ return remoteEndpoint;
+ }
+
+ protected void addMessageHandlers(MessageJsonHandler jsonHandler, RemoteEndpoint remoteEndpoint) {
+ MessageConsumer messageConsumer = wrapMessageConsumer(remoteEndpoint);
+ session.addMessageHandler(new WebSocketMessageHandler(messageConsumer, jsonHandler, remoteEndpoint));
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketMessageConsumer.java b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketMessageConsumer.java
new file mode 100644
index 0000000..c2eaf16
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketMessageConsumer.java
@@ -0,0 +1,72 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import jakarta.websocket.Session;
+
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+/**
+ * Message consumer that sends messages via a WebSocket session.
+ */
+public class WebSocketMessageConsumer implements MessageConsumer {
+
+ private static final Logger LOG = Logger.getLogger(WebSocketMessageConsumer.class.getName());
+
+ private final Session session;
+ private final MessageJsonHandler jsonHandler;
+
+ public WebSocketMessageConsumer(Session session, MessageJsonHandler jsonHandler) {
+ this.session = session;
+ this.jsonHandler = jsonHandler;
+ }
+
+ public Session getSession() {
+ return session;
+ }
+
+ @Override
+ public void consume(Message message) {
+ String content = jsonHandler.serialize(message);
+ try {
+ sendMessage(content);
+ } catch (IOException exception) {
+ throw new JsonRpcException(exception);
+ }
+ }
+
+ protected void sendMessage(String message) throws IOException {
+ if (session.isOpen()) {
+ int length = message.length();
+ if (length <= session.getMaxTextMessageBufferSize()) {
+ session.getAsyncRemote().sendText(message);
+ } else {
+ int currentOffset = 0;
+ while (currentOffset < length) {
+ int currentEnd = Math.min(currentOffset + session.getMaxTextMessageBufferSize(), length);
+ session.getBasicRemote().sendText(message.substring(currentOffset, currentEnd), currentEnd == length);
+ currentOffset = currentEnd;
+ }
+ }
+ } else {
+ LOG.log(Level.INFO, "Ignoring message due to closed session: {0}", message);
+ }
+ }
+
+}
diff --git a/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketMessageHandler.java b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketMessageHandler.java
new file mode 100644
index 0000000..686987b
--- /dev/null
+++ b/java/org/eclipse/lsp4j/websocket/jakarta/WebSocketMessageHandler.java
@@ -0,0 +1,47 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta;
+
+import jakarta.websocket.MessageHandler;
+
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueHandler;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+
+/**
+ * WebSocket message handler that parses JSON messages and forwards them to a {@link MessageConsumer}.
+ */
+public class WebSocketMessageHandler implements MessageHandler.Whole<String> {
+
+ private final MessageConsumer callback;
+ private final MessageJsonHandler jsonHandler;
+ private final MessageIssueHandler issueHandler;
+
+ public WebSocketMessageHandler(MessageConsumer callback, MessageJsonHandler jsonHandler, MessageIssueHandler issueHandler) {
+ this.callback = callback;
+ this.jsonHandler = jsonHandler;
+ this.issueHandler = issueHandler;
+ }
+
+ public void onMessage(String content) {
+ try {
+ Message message = jsonHandler.parseMessage(content);
+ callback.consume(message);
+ } catch (MessageIssueException exception) {
+ // An issue was found while parsing or validating the message
+ issueHandler.handle(exception.getRpcMessage(), exception.getIssues());
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/EqualityTest.java b/javatests/org/eclipse/lsp4j/EqualityTest.java
new file mode 100644
index 0000000..444c05c
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/EqualityTest.java
@@ -0,0 +1,49 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test;
+
+import java.util.ArrayList;
+
+import org.eclipse.lsp4j.CompletionItem;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextEdit;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EqualityTest {
+
+ @Test public void testEquals() {
+ Assert.assertEquals(new TextDocumentIdentifier("foo"), new TextDocumentIdentifier("foo"));
+ Assert.assertNotEquals(new TextDocumentIdentifier("foo"), new TextDocumentIdentifier("bar"));
+
+ CompletionItem e1 = new CompletionItem();
+ e1.setAdditionalTextEdits(new ArrayList<>());
+ e1.getAdditionalTextEdits().add(new TextEdit(new Range(new Position(1,1), new Position(1,1)), "foo"));
+
+ CompletionItem e2 = new CompletionItem();
+ e2.setAdditionalTextEdits(new ArrayList<>());
+ e2.getAdditionalTextEdits().add(new TextEdit(new Range(new Position(1,1), new Position(1,1)), "foo"));
+
+ CompletionItem e3 = new CompletionItem();
+ e3.setAdditionalTextEdits(new ArrayList<>());
+ e3.getAdditionalTextEdits().add(new TextEdit(new Range(new Position(1,1), new Position(1,2)), "foo"));
+
+ Assert.assertEquals(e1, e2);
+ Assert.assertNotEquals(e1, e3);
+
+ Assert.assertEquals(e1.hashCode(), e2.hashCode());
+ Assert.assertNotEquals(e1.hashCode(), e3.hashCode());
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/LSPEndpointTest.xtend b/javatests/org/eclipse/lsp4j/LSPEndpointTest.xtend
new file mode 100644
index 0000000..1783632
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/LSPEndpointTest.xtend
@@ -0,0 +1,142 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test
+
+import java.io.ByteArrayOutputStream
+import java.io.OutputStreamWriter
+import java.io.PipedInputStream
+import java.io.PipedOutputStream
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.CompletionException
+import java.util.concurrent.TimeUnit
+import org.eclipse.lsp4j.DidChangeConfigurationParams
+import org.eclipse.lsp4j.DidChangeTextDocumentParams
+import org.eclipse.lsp4j.DidChangeWatchedFilesParams
+import org.eclipse.lsp4j.DidCloseTextDocumentParams
+import org.eclipse.lsp4j.DidOpenTextDocumentParams
+import org.eclipse.lsp4j.DidSaveTextDocumentParams
+import org.eclipse.lsp4j.HoverParams
+import org.eclipse.lsp4j.InitializeParams
+import org.eclipse.lsp4j.MessageParams
+import org.eclipse.lsp4j.Position
+import org.eclipse.lsp4j.PublishDiagnosticsParams
+import org.eclipse.lsp4j.ShowDocumentParams;
+import org.eclipse.lsp4j.ShowMessageRequestParams
+import org.eclipse.lsp4j.TextDocumentIdentifier
+import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint
+import org.eclipse.lsp4j.launch.LSPLauncher
+import org.eclipse.lsp4j.services.LanguageClient
+import org.eclipse.lsp4j.services.LanguageServer
+import org.eclipse.lsp4j.services.TextDocumentService
+import org.eclipse.lsp4j.services.WorkspaceService
+import org.eclipse.xtend.lib.annotations.Accessors
+import org.junit.Test
+
+import static org.junit.Assert.*
+
+class LSPEndpointTest {
+
+ static val TIMEOUT = 2000
+
+ @Test
+ def void testIssue152() throws Exception {
+ val client = new DummyClient
+ val in = new PipedInputStream
+ val responseStream = new PipedOutputStream
+ in.connect(responseStream)
+ val responseWriter = new OutputStreamWriter(responseStream)
+ val out = new ByteArrayOutputStream
+ val launcher = LSPLauncher.createClientLauncher(client, in, out, true, null)
+ val future = launcher.startListening()
+
+ val hoverResult = launcher.remoteProxy.textDocumentService.hover(new HoverParams => [
+ textDocument = new TextDocumentIdentifier('foo')
+ position = new Position(0, 0)
+ ])
+ responseWriter.write('Content-Length: 60\r\n\r\n')
+ responseWriter.write('{"jsonrpc":"2.0","id":"1","result":{"contents":[null,null]}}')
+ responseWriter.flush()
+
+ try {
+ hoverResult.join()
+ fail('Expected a CompletionException to be thrown.')
+ } catch (CompletionException exception) {
+ assertEquals('''
+ Lists must not contain null references. Path: $.result.contents[0]
+ Lists must not contain null references. Path: $.result.contents[1]
+ '''.toString.replaceAll("\\r", "").trim, exception.cause.message)
+ assertFalse(future.isDone)
+ } finally {
+ in.close()
+ }
+ }
+
+ @Test
+ def void testIssue346() throws Exception {
+ val logMessages = new LogMessageAccumulator
+ try {
+ logMessages.registerTo(GenericEndpoint)
+
+ val server = new DummyServer
+ val in = new PipedInputStream
+ val messageStream = new PipedOutputStream
+ in.connect(messageStream)
+ val messageWriter = new OutputStreamWriter(messageStream)
+ val out = new ByteArrayOutputStream
+ val launcher = LSPLauncher.createServerLauncher(server, in, out, true, null)
+ launcher.startListening()
+
+ messageWriter.write('Content-Length: 48\r\n\r\n')
+ messageWriter.write('{"jsonrpc": "2.0","method": "exit","params": {}}')
+ messageWriter.flush()
+
+ server.exited.get(TIMEOUT, TimeUnit.MILLISECONDS)
+ assertTrue(logMessages.records.join('\n', [message]), logMessages.records.isEmpty)
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Accessors
+ private static class DummyServer implements LanguageServer {
+
+ val textDocumentService = new TextDocumentService {
+ override didChange(DidChangeTextDocumentParams params) {}
+ override didClose(DidCloseTextDocumentParams params) {}
+ override didOpen(DidOpenTextDocumentParams params) {}
+ override didSave(DidSaveTextDocumentParams params) {}
+ }
+
+ val workspaceService = new WorkspaceService {
+ override didChangeConfiguration(DidChangeConfigurationParams params) {}
+ override didChangeWatchedFiles(DidChangeWatchedFilesParams params) {}
+ }
+
+ override initialize(InitializeParams params) {}
+ override shutdown() {}
+
+ val exited = new CompletableFuture<Void>
+ override exit() {
+ exited.complete(null)
+ }
+ }
+
+ private static class DummyClient implements LanguageClient {
+ override logMessage(MessageParams message) {}
+ override publishDiagnostics(PublishDiagnosticsParams diagnostics) {}
+ override showMessage(MessageParams messageParams) {}
+ override showMessageRequest(ShowMessageRequestParams requestParams) {}
+ override showDocument(ShowDocumentParams requestParams) {}
+ override telemetryEvent(Object object) {}
+ }
+
+}
\ No newline at end of file
diff --git a/javatests/org/eclipse/lsp4j/LogMessageAccumulator.java b/javatests/org/eclipse/lsp4j/LogMessageAccumulator.java
new file mode 100644
index 0000000..4c3eb87
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/LogMessageAccumulator.java
@@ -0,0 +1,111 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+
+public class LogMessageAccumulator extends Handler {
+
+ private static final long TIMEOUT = 2000;
+
+ private final List<LogRecord> records = new ArrayList<>();
+ private final List<Logger> registeredLoggers = new ArrayList<>();
+
+ public Logger registerTo(Class<?> clazz) {
+ return registerTo(clazz.getName());
+ }
+
+ public Logger registerTo(String name) {
+ Logger logger = Logger.getLogger(name);
+ logger.setUseParentHandlers(false);
+ logger.addHandler(this);
+ logger.setLevel(Level.ALL);
+ registeredLoggers.add(logger);
+ return logger;
+ }
+
+ public void unregister() {
+ for (Logger logger : registeredLoggers) {
+ logger.setLevel(null);
+ logger.removeHandler(this);
+ logger.setUseParentHandlers(true);
+ }
+ registeredLoggers.clear();
+ }
+
+ public List<LogRecord> getRecords() {
+ return records;
+ }
+
+ public LogRecord findRecord(Level level, String message) {
+ synchronized (records) {
+ for (LogRecord r : records) {
+ if (level.equals(r.getLevel()) && message.equals(r.getMessage()))
+ return r;
+ }
+ return null;
+ }
+ }
+
+ public Optional<LogRecord> match(Predicate<LogRecord> predicate) {
+ synchronized (records) {
+ return records.stream().filter(predicate).findFirst();
+ }
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ synchronized (records) {
+ records.add(record);
+ }
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ }
+
+ public void await(Predicate<LogRecord> predicate) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (!match(predicate).isPresent()) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT) {
+ synchronized (records) {
+ String records = this.records.stream().map(r -> r.getLevel() + ": " + r.getMessage()).reduce((a, a2) -> a + '\n' + a2).get();
+ Assert.fail("Timeout elapsed while waiting for logging, logged:\n" + records);
+ }
+ }
+ }
+ }
+
+ public void await(Level level, String message) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (findRecord(level, message) == null) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT)
+ Assert.fail("Timeout elapsed while waiting for " + level + ": " + message);
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/NoAnnotationTest.xtend b/javatests/org/eclipse/lsp4j/NoAnnotationTest.xtend
new file mode 100644
index 0000000..f36d443
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/NoAnnotationTest.xtend
@@ -0,0 +1,25 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test
+
+import org.eclipse.lsp4j.CodeLens
+import org.eclipse.lsp4j.generator.JsonRpcData
+import org.junit.Assert
+import org.junit.Test
+
+class NoAnnotationTest {
+
+ @Test def void testNoAnnotation() {
+ Assert.assertFalse(CodeLens.annotations.exists[annotationType == JsonRpcData])
+ }
+
+}
\ No newline at end of file
diff --git a/javatests/org/eclipse/lsp4j/NonNullTest.java b/javatests/org/eclipse/lsp4j/NonNullTest.java
new file mode 100644
index 0000000..ba56c38
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/NonNullTest.java
@@ -0,0 +1,32 @@
+package org.eclipse.lsp4j.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.eclipse.lsp4j.CodeAction;
+import org.junit.Test;
+
+public class NonNullTest {
+
+ @Test
+ public void testCodeAction1() {
+ try {
+ new CodeAction(null);
+ fail("Expected a NullPointerException");
+ } catch (NullPointerException exc) {
+ assertEquals("Property must not be null: title", exc.getMessage());
+ }
+ }
+
+ @Test
+ public void testCodeAction2() {
+ try {
+ CodeAction codeAction = new CodeAction();
+ codeAction.setTitle(null);
+ fail("Expected a NullPointerException");
+ } catch (NullPointerException exc) {
+ assertEquals("Property must not be null: title", exc.getMessage());
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/debug/test/DSPDebugServer.java b/javatests/org/eclipse/lsp4j/debug/test/DSPDebugServer.java
new file mode 100644
index 0000000..b02d876
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/debug/test/DSPDebugServer.java
@@ -0,0 +1,35 @@
+/******************************************************************************
+ * Copyright (c) 2018 Kichwa Coders and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.debug.test;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.concurrent.Future;
+
+import org.eclipse.lsp4j.debug.launch.DSPLauncher;
+import org.eclipse.lsp4j.debug.services.IDebugProtocolClient;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.junit.Test;
+
+public class DSPDebugServer {
+
+ // This is a test for https://github.com/eclipse/lsp4j/issues/224
+ @Test
+ public void testDebugServerCanBeLaunched() throws IOException {
+ TestDebugServer testDebugServer = new TestDebugServer();
+ Launcher<IDebugProtocolClient> launcher = DSPLauncher.createServerLauncher(testDebugServer,
+ new PipedInputStream(), new PipedOutputStream());
+ Future<Void> listening = launcher.startListening();
+ listening.cancel(true);
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/debug/test/DSPLauncherTest.java b/javatests/org/eclipse/lsp4j/debug/test/DSPLauncherTest.java
new file mode 100644
index 0000000..88d97e3
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/debug/test/DSPLauncherTest.java
@@ -0,0 +1,161 @@
+/******************************************************************************
+ * Copyright (c) 2016-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.debug.test;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.debug.Capabilities;
+import org.eclipse.lsp4j.debug.InitializeRequestArguments;
+import org.eclipse.lsp4j.debug.OutputEventArguments;
+import org.eclipse.lsp4j.debug.launch.DSPLauncher;
+import org.eclipse.lsp4j.debug.services.IDebugProtocolClient;
+import org.eclipse.lsp4j.debug.services.IDebugProtocolServer;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.xtext.xbase.lib.Pair;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DSPLauncherTest {
+
+ private static final long TIMEOUT = 2000;
+
+ @Test
+ public void testNotification() throws IOException {
+ OutputEventArguments p = new OutputEventArguments();
+ p.setOutput("Hello World");
+
+ client.expectedNotifications.put("output", p);
+ serverLauncher.getRemoteProxy().output(p);
+ client.joinOnEmpty();
+ }
+
+ @Test
+ public void testRequest() throws Exception {
+ InitializeRequestArguments p = new InitializeRequestArguments();
+ p.setClientID("test");
+
+ Capabilities result = new Capabilities();
+ result.setSupportTerminateDebuggee(true);
+ result.setSupportsCompletionsRequest(false);
+
+ server.expectedRequests.put("initialize", new Pair<>(p, result));
+ CompletableFuture<Capabilities> future = clientLauncher.getRemoteProxy().initialize(p);
+ Assert.assertEquals(result.toString(), future.get(TIMEOUT, TimeUnit.MILLISECONDS).toString());
+ client.joinOnEmpty();
+ }
+
+ static class AssertingEndpoint implements Endpoint {
+ public Map<String, Pair<Object, Object>> expectedRequests = new LinkedHashMap<>();
+
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ Assert.assertTrue(expectedRequests.containsKey(method));
+ Pair<Object, Object> result = expectedRequests.remove(method);
+ Assert.assertEquals(result.getKey().toString(), parameter.toString());
+ return CompletableFuture.completedFuture(result.getValue());
+ }
+
+ public Map<String, Object> expectedNotifications = new LinkedHashMap<>();
+
+ @Override
+ public void notify(String method, Object parameter) {
+ Assert.assertTrue(expectedNotifications.containsKey(method));
+ Object object = expectedNotifications.remove(method);
+ Assert.assertEquals(object.toString(), parameter.toString());
+ }
+
+ /**
+ * wait max 1 sec for all expectations to be removed
+ */
+ public void joinOnEmpty() {
+ long before = System.currentTimeMillis();
+ do {
+ if (expectedNotifications.isEmpty() && expectedNotifications.isEmpty()) {
+ return;
+ }
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } while (System.currentTimeMillis() < before + 1000);
+ Assert.fail("expectations weren't empty " + toString());
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).addAllFields().toString();
+ }
+
+ }
+
+ private AssertingEndpoint server;
+ private Launcher<IDebugProtocolClient> serverLauncher;
+ private Future<?> serverListening;
+
+ private AssertingEndpoint client;
+ private Launcher<IDebugProtocolServer> clientLauncher;
+ private Future<?> clientListening;
+
+ private Level logLevel;
+
+ @Before
+ public void setup() throws IOException {
+ PipedInputStream inClient = new PipedInputStream();
+ PipedOutputStream outClient = new PipedOutputStream();
+ PipedInputStream inServer = new PipedInputStream();
+ PipedOutputStream outServer = new PipedOutputStream();
+
+ inClient.connect(outServer);
+ outClient.connect(inServer);
+ server = new AssertingEndpoint();
+ serverLauncher = DSPLauncher.createServerLauncher(
+ ServiceEndpoints.toServiceObject(server, IDebugProtocolServer.class), inServer, outServer);
+ serverListening = serverLauncher.startListening();
+
+ client = new AssertingEndpoint();
+ clientLauncher = DSPLauncher.createClientLauncher(
+ ServiceEndpoints.toServiceObject(client, IDebugProtocolClient.class), inClient, outClient);
+ clientListening = clientLauncher.startListening();
+
+ Logger logger = Logger.getLogger(StreamMessageProducer.class.getName());
+ logLevel = logger.getLevel();
+ logger.setLevel(Level.SEVERE);
+ }
+
+ @After
+ public void teardown() throws InterruptedException, ExecutionException {
+ clientListening.cancel(true);
+ serverListening.cancel(true);
+ Thread.sleep(10);
+ Logger logger = Logger.getLogger(StreamMessageProducer.class.getName());
+ logger.setLevel(logLevel);
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/debug/test/DebugProtocolTest.java b/javatests/org/eclipse/lsp4j/debug/test/DebugProtocolTest.java
new file mode 100644
index 0000000..67131ce
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/debug/test/DebugProtocolTest.java
@@ -0,0 +1,21 @@
+/******************************************************************************
+ * Copyright (c) 2017 Kichwa Coders Ltd. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.debug.test;
+
+import org.junit.Test;
+
+public class DebugProtocolTest {
+ @Test
+ public void test() {
+ // No tests as of now because there is no logic code in this plug-in yet.
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/debug/test/TestDebugServer.java b/javatests/org/eclipse/lsp4j/debug/test/TestDebugServer.java
new file mode 100644
index 0000000..34075d6
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/debug/test/TestDebugServer.java
@@ -0,0 +1,263 @@
+package org.eclipse.lsp4j.debug.test;
+
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.debug.Capabilities;
+import org.eclipse.lsp4j.debug.CompletionsArguments;
+import org.eclipse.lsp4j.debug.CompletionsResponse;
+import org.eclipse.lsp4j.debug.ConfigurationDoneArguments;
+import org.eclipse.lsp4j.debug.ContinueArguments;
+import org.eclipse.lsp4j.debug.ContinueResponse;
+import org.eclipse.lsp4j.debug.DataBreakpointInfoArguments;
+import org.eclipse.lsp4j.debug.DataBreakpointInfoResponse;
+import org.eclipse.lsp4j.debug.DisassembleArguments;
+import org.eclipse.lsp4j.debug.DisassembleResponse;
+import org.eclipse.lsp4j.debug.DisconnectArguments;
+import org.eclipse.lsp4j.debug.EvaluateArguments;
+import org.eclipse.lsp4j.debug.EvaluateResponse;
+import org.eclipse.lsp4j.debug.ExceptionInfoArguments;
+import org.eclipse.lsp4j.debug.ExceptionInfoResponse;
+import org.eclipse.lsp4j.debug.GotoArguments;
+import org.eclipse.lsp4j.debug.GotoTargetsArguments;
+import org.eclipse.lsp4j.debug.GotoTargetsResponse;
+import org.eclipse.lsp4j.debug.InitializeRequestArguments;
+import org.eclipse.lsp4j.debug.LoadedSourcesArguments;
+import org.eclipse.lsp4j.debug.LoadedSourcesResponse;
+import org.eclipse.lsp4j.debug.ModulesArguments;
+import org.eclipse.lsp4j.debug.ModulesResponse;
+import org.eclipse.lsp4j.debug.NextArguments;
+import org.eclipse.lsp4j.debug.PauseArguments;
+import org.eclipse.lsp4j.debug.ReadMemoryArguments;
+import org.eclipse.lsp4j.debug.ReadMemoryResponse;
+import org.eclipse.lsp4j.debug.RestartArguments;
+import org.eclipse.lsp4j.debug.RestartFrameArguments;
+import org.eclipse.lsp4j.debug.ReverseContinueArguments;
+import org.eclipse.lsp4j.debug.RunInTerminalRequestArguments;
+import org.eclipse.lsp4j.debug.RunInTerminalResponse;
+import org.eclipse.lsp4j.debug.ScopesArguments;
+import org.eclipse.lsp4j.debug.ScopesResponse;
+import org.eclipse.lsp4j.debug.SetBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetDataBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetDataBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetExceptionBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetExpressionArguments;
+import org.eclipse.lsp4j.debug.SetExpressionResponse;
+import org.eclipse.lsp4j.debug.SetFunctionBreakpointsArguments;
+import org.eclipse.lsp4j.debug.SetFunctionBreakpointsResponse;
+import org.eclipse.lsp4j.debug.SetVariableArguments;
+import org.eclipse.lsp4j.debug.SetVariableResponse;
+import org.eclipse.lsp4j.debug.SourceArguments;
+import org.eclipse.lsp4j.debug.SourceResponse;
+import org.eclipse.lsp4j.debug.StackTraceArguments;
+import org.eclipse.lsp4j.debug.StackTraceResponse;
+import org.eclipse.lsp4j.debug.StepBackArguments;
+import org.eclipse.lsp4j.debug.StepInArguments;
+import org.eclipse.lsp4j.debug.StepInTargetsArguments;
+import org.eclipse.lsp4j.debug.StepInTargetsResponse;
+import org.eclipse.lsp4j.debug.StepOutArguments;
+import org.eclipse.lsp4j.debug.TerminateArguments;
+import org.eclipse.lsp4j.debug.TerminateThreadsArguments;
+import org.eclipse.lsp4j.debug.ThreadsResponse;
+import org.eclipse.lsp4j.debug.VariablesArguments;
+import org.eclipse.lsp4j.debug.VariablesResponse;
+import org.eclipse.lsp4j.debug.services.IDebugProtocolServer;
+
+public class TestDebugServer implements IDebugProtocolServer {
+ @Override
+ public CompletableFuture<RunInTerminalResponse> runInTerminal(RunInTerminalRequestArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Capabilities> initialize(InitializeRequestArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> configurationDone(ConfigurationDoneArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> launch(Map<String, Object> args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> attach(Map<String, Object> args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> restart(RestartArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> disconnect(DisconnectArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<SetBreakpointsResponse> setBreakpoints(SetBreakpointsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<SetFunctionBreakpointsResponse> setFunctionBreakpoints(
+ SetFunctionBreakpointsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> setExceptionBreakpoints(SetExceptionBreakpointsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<DataBreakpointInfoResponse> dataBreakpointInfo(DataBreakpointInfoArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<SetDataBreakpointsResponse> setDataBreakpoints(SetDataBreakpointsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<ContinueResponse> continue_(ContinueArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> next(NextArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> stepIn(StepInArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> stepOut(StepOutArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> stepBack(StepBackArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> reverseContinue(ReverseContinueArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> restartFrame(RestartFrameArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> goto_(GotoArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> pause(PauseArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<StackTraceResponse> stackTrace(StackTraceArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<ScopesResponse> scopes(ScopesArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<VariablesResponse> variables(VariablesArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<SetVariableResponse> setVariable(SetVariableArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<SourceResponse> source(SourceArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<ThreadsResponse> threads() {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<ModulesResponse> modules(ModulesArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<LoadedSourcesResponse> loadedSources(LoadedSourcesArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<EvaluateResponse> evaluate(EvaluateArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<StepInTargetsResponse> stepInTargets(StepInTargetsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<GotoTargetsResponse> gotoTargets(GotoTargetsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<CompletionsResponse> completions(CompletionsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<ExceptionInfoResponse> exceptionInfo(ExceptionInfoArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> terminate(TerminateArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<Void> terminateThreads(TerminateThreadsArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<SetExpressionResponse> setExpression(SetExpressionArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<ReadMemoryResponse> readMemory(ReadMemoryArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture<DisassembleResponse> disassemble(DisassembleArguments args) {
+ return CompletableFuture.completedFuture(null);
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugIntegrationTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugIntegrationTest.java
new file mode 100644
index 0000000..891d92d
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugIntegrationTest.java
@@ -0,0 +1,481 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test;
+
+import static org.eclipse.lsp4j.jsonrpc.json.MessageConstants.CONTENT_LENGTH_HEADER;
+import static org.eclipse.lsp4j.jsonrpc.json.MessageConstants.CRLF;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.ResponseErrorException;
+import org.eclipse.lsp4j.jsonrpc.debug.DebugLauncher;
+import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DebugIntegrationTest {
+
+ private static final long TIMEOUT = 2000;
+
+ public static class MyParam {
+ public MyParam(String string) {
+ this.value = string;
+ }
+
+ String value;
+ }
+
+ public static interface MyServer {
+ @JsonRequest
+ CompletableFuture<MyParam> askServer(MyParam param);
+ }
+
+ public static interface MyClient {
+ @JsonRequest
+ CompletableFuture<MyParam> askClient(MyParam param);
+ }
+
+ @Test
+ public void testBothDirectionRequests() throws Exception {
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ MyClient client = new MyClient() {
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyServer> clientSideLauncher = DebugLauncher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in2, out2);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> fooFuture = clientSideLauncher.getRemoteProxy().askServer(new MyParam("FOO"));
+ CompletableFuture<MyParam> barFuture = serverSideLauncher.getRemoteProxy().askClient(new MyParam("BAR"));
+
+ Assert.assertEquals("FOO", fooFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ Assert.assertEquals("BAR", barFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ }
+
+ @Test
+ public void testCancellation() throws Exception {
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ boolean[] inComputeAsync = new boolean[1];
+ boolean[] cancellationHappened = new boolean[1];
+
+ MyClient client = new MyClient() {
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ return CompletableFutures.computeAsync(cancelToken -> {
+ try {
+ long startTime = System.currentTimeMillis();
+ inComputeAsync[0] = true;
+ do {
+ cancelToken.checkCanceled();
+ Thread.sleep(50);
+ } while (System.currentTimeMillis() - startTime < TIMEOUT);
+ } catch (CancellationException e) {
+ cancellationHappened[0] = true;
+ } catch (InterruptedException e) {
+ Assert.fail("Thread was interrupted unexpectedly.");
+ }
+ return param;
+ });
+ }
+ };
+ Launcher<MyServer> clientSideLauncher = DebugLauncher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in2, out2);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> future = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+
+ long startTime = System.currentTimeMillis();
+ while (!inComputeAsync[0]) {
+ Thread.sleep(50);
+ if (System.currentTimeMillis() - startTime > TIMEOUT)
+ Assert.fail("Timeout waiting for client to start computing.");
+ }
+ future.cancel(true);
+
+ startTime = System.currentTimeMillis();
+ while (!cancellationHappened[0]) {
+ Thread.sleep(50);
+ if (System.currentTimeMillis() - startTime > TIMEOUT)
+ Assert.fail("Timeout waiting for confirmation of cancellation.");
+ }
+ try {
+ future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.fail("Expected cancellation.");
+ } catch (CancellationException e) {
+ }
+ }
+
+ @Test
+ public void testCancellationResponse() throws Exception {
+ // create client messages
+ String requestMessage = "{\"type\":\"request\","
+ + "\"seq\":1,\n"
+ + "\"command\":\"askServer\",\n"
+ + "\"arguments\": { value: \"bar\" }\n"
+ + "}";
+ String cancellationMessage = "{\"type\":\"event\","
+ + "\"event\":\"$/cancelRequest\",\n"
+ + "\"body\": { id: 1 }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage.getBytes().length) + requestMessage
+ + getHeader(cancellationMessage.getBytes().length) + cancellationMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFutures.computeAsync(cancelToken -> {
+ try {
+ long startTime = System.currentTimeMillis();
+ do {
+ cancelToken.checkCanceled();
+ Thread.sleep(50);
+ } while (System.currentTimeMillis() - startTime < TIMEOUT);
+ } catch (InterruptedException e) {
+ Assert.fail("Thread was interrupted unexpectedly.");
+ }
+ return param;
+ });
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 163\r\n\r\n" +
+ "{\"type\":\"response\",\"seq\":1,\"request_seq\":1,\"command\":\"askServer\",\"success\":false,\"message\":\"The request (id: 1, method: \\u0027askServer\\u0027) has been cancelled\"}",
+ out.toString());
+ }
+
+
+ @Test
+ public void testVersatility() throws Exception {
+ Logger.getLogger(RemoteEndpoint.class.getName()).setLevel(Level.OFF);
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ // See https://github.com/eclipse/lsp4j/issues/510 for full details.
+ // Make sure that the thread that writes to the PipedOutputStream stays alive
+ // until the read from the PipedInputStream. Using a cached thread pool
+ // does not 100% guarantee that, but increases the probability that the
+ // selected thread will exist for the lifetime of the test.
+ ExecutorService executor = Executors.newCachedThreadPool();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ MyClient client = new MyClient() {
+ private int tries = 0;
+
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ if (tries == 0) {
+ tries++;
+ throw new UnsupportedOperationException();
+ }
+ return CompletableFutures.computeAsync(executor, cancelToken -> {
+ if (tries++ == 1)
+ throw new UnsupportedOperationException();
+ return param;
+ });
+ }
+ };
+ Launcher<MyServer> clientSideLauncher = DebugLauncher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in2, out2);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> errorFuture1 = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+ try {
+ System.out.println(errorFuture1.get());
+ Assert.fail();
+ } catch (ExecutionException e) {
+ Assert.assertNotNull(((ResponseErrorException)e.getCause()).getResponseError().getMessage());
+ }
+ CompletableFuture<MyParam> errorFuture2 = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+ try {
+ errorFuture2.get();
+ Assert.fail();
+ } catch (ExecutionException e) {
+ Assert.assertNotNull(((ResponseErrorException)e.getCause()).getResponseError().getMessage());
+ }
+ CompletableFuture<MyParam> goodFuture = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+ Assert.assertEquals("FOO", goodFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ }
+
+ @Test
+ public void testUnknownMessages() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class.getName());
+
+ // create client messages
+ String clientMessage1 = "{\"type\":\"event\","
+ + "\"event\":\"foo1\",\n"
+ + " \"body\":\"bar\"\n"
+ + "}";
+ String clientMessage2 = "{\"type\":\"request\","
+ + "\"seq\":1,\n"
+ + "\"command\":\"foo2\",\n"
+ + " \"arguments\":\"bar\"\n"
+ + "}";
+ String clientMessages = getHeader(clientMessage1.getBytes().length) + clientMessage1
+ + getHeader(clientMessage2.getBytes().length) + clientMessage2;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ logMessages.await(Level.WARNING, "Unsupported notification method: foo1");
+ logMessages.await(Level.WARNING, "Unsupported request method: foo2");
+
+ Assert.assertEquals("Content-Length: 121\r\n\r\n" +
+ "{\"type\":\"response\",\"seq\":1,\"request_seq\":1,\"command\":\"foo2\",\"success\":false,\"message\":\"Unsupported request method: foo2\"}",
+ out.toString());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testUnknownOptionalMessages() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class.getName());
+
+ // create client messages
+ String clientMessage1 = "{\"type\":\"event\","
+ + "\"event\":\"$/foo1\",\n"
+ + " \"body\":\"bar\"\n"
+ + "}";
+ String clientMessage2 = "{\"type\":\"request\","
+ + "\"seq\":1,\n"
+ + "\"command\":\"$/foo2\",\n"
+ + " \"arguments\":\"bar\"\n"
+ + "}";
+ String clientMessages = getHeader(clientMessage1.getBytes().length) + clientMessage1
+ + getHeader(clientMessage2.getBytes().length) + clientMessage2;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ logMessages.await(Level.INFO, "Unsupported notification method: $/foo1");
+ logMessages.await(Level.INFO, "Unsupported request method: $/foo2");
+
+ Assert.assertEquals("Content-Length: 77\r\n\r\n" +
+ "{\"type\":\"response\",\"seq\":1,\"request_seq\":1,\"command\":\"$/foo2\",\"success\":true}",
+ out.toString());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testResponse() throws Exception {
+ String clientMessage = "{\"type\":\"request\","
+ + "\"seq\":1,\n"
+ + "\"command\":\"askServer\",\n"
+ + " \"arguments\": { value: \"bar\" }\n"
+ + "}";
+ String clientMessages = getHeader(clientMessage.getBytes().length) + clientMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 103\r\n\r\n" +
+ "{\"type\":\"response\",\"seq\":1,\"request_seq\":1,\"command\":\"askServer\",\"success\":true,\"body\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ public static interface UnexpectedParamsTestServer {
+ @JsonNotification
+ void myNotification();
+ }
+
+ @Test
+ public void testUnexpectedParams() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class.getName());
+
+ // create client messages
+ String notificationMessage = "{\"type\":\"event\","
+ + "\"event\":\"myNotification\",\n"
+ + "\"body\": { \"value\": \"foo\" }\n"
+ + "}";
+ String clientMessages = getHeader(notificationMessage.getBytes().length) + notificationMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ UnexpectedParamsTestServer server = new UnexpectedParamsTestServer() {
+ public void myNotification() {
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening();
+
+ logMessages.await(Level.WARNING, "Unexpected params '{\"value\":\"foo\"}' for " + "'public abstract void "
+ + UnexpectedParamsTestServer.class.getName() + ".myNotification()' is ignored");
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ protected String getHeader(int contentLength) {
+ StringBuilder headerBuilder = new StringBuilder();
+ headerBuilder.append(CONTENT_LENGTH_HEADER).append(": ").append(contentLength).append(CRLF);
+ headerBuilder.append(CRLF);
+ return headerBuilder.toString();
+ }
+
+ /**
+ * Test a fully connected design with the {@link ReflectiveMessageValidator} enabled.
+ */
+ @Test
+ public void testValidatedRequests() throws Exception {
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ MyClient client = new MyClient() {
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyServer> clientSideLauncher = DebugLauncher.createLauncher(client, MyServer.class, in, out, true, null);
+
+ // create server side
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = DebugLauncher.createLauncher(server, MyClient.class, in2, out2, true, null);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> fooFuture = clientSideLauncher.getRemoteProxy().askServer(new MyParam("FOO"));
+ CompletableFuture<MyParam> barFuture = serverSideLauncher.getRemoteProxy().askClient(new MyParam("BAR"));
+
+ Assert.assertEquals("FOO", fooFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ Assert.assertEquals("BAR", barFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ }
+
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugLauncherTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugLauncherTest.java
new file mode 100644
index 0000000..73aa13e
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugLauncherTest.java
@@ -0,0 +1,116 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.debug.DebugLauncher;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+
+public class DebugLauncherTest {
+
+ private static final long TIMEOUT = 2000;
+
+ static class Param {
+ Param() {
+ }
+ Param(String message) {
+ this.message = message;
+ }
+ public String message;
+ }
+
+ static interface A {
+ @JsonNotification public void say(Param p);
+ }
+
+ @Test public void testDone() throws Exception {
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ }
+ };
+ Launcher<A> launcher = DebugLauncher.createLauncher(a, A.class, new ByteArrayInputStream("".getBytes()), new ByteArrayOutputStream());
+ Future<?> startListening = launcher.startListening();
+ startListening.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.assertTrue(startListening.isDone());
+ Assert.assertFalse(startListening.isCancelled());
+ }
+
+ @Test public void testCanceled() throws Exception {
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ }
+ };
+ Launcher<A> launcher = DebugLauncher.createLauncher(a, A.class, new InputStream() {
+ @Override
+ public int read() throws IOException {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ return '\n';
+ }
+ }, new ByteArrayOutputStream());
+ Future<?> startListening = launcher.startListening();
+ startListening.cancel(true);
+ Assert.assertTrue(startListening.isDone());
+ Assert.assertTrue(startListening.isCancelled());
+ }
+
+ @Test public void testCustomGson() throws Exception {
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ }
+ };
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ TypeAdapter<Param> typeAdapter = new TypeAdapter<Param>() {
+ @Override
+ public void write(JsonWriter out, Param value) throws IOException {
+ out.beginObject();
+ out.name("message");
+ out.value("bar");
+ out.endObject();
+ }
+ @Override
+ public Param read(JsonReader in) throws IOException {
+ return null;
+ }
+ };
+ Launcher<A> launcher = DebugLauncher.createIoLauncher(a, A.class, new ByteArrayInputStream("".getBytes()), out,
+ Executors.newCachedThreadPool(), c -> c,
+ gsonBuilder -> {gsonBuilder.registerTypeAdapter(Param.class, typeAdapter);});
+ A remoteProxy = launcher.getRemoteProxy();
+
+ remoteProxy.say(new Param("foo"));
+ Assert.assertEquals("Content-Length: 63\r\n\r\n" +
+ "{\"type\":\"event\",\"seq\":1,\"event\":\"say\",\"body\":{\"message\":\"bar\"}}",
+ out.toString());
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugRemoteEndpointTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugRemoteEndpointTest.java
new file mode 100644
index 0000000..d0b7a9d
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/DebugRemoteEndpointTest.java
@@ -0,0 +1,130 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.debug.DebugRemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+import org.junit.Test;
+
+public class DebugRemoteEndpointTest {
+
+ static class TestEndpoint implements Endpoint {
+
+ List<NotificationMessage> notifications = new ArrayList<>();
+ Map<RequestMessage, CompletableFuture<Object>> requests = new LinkedHashMap<>();
+
+ public void notify(String method, Object parameter) {
+ notifications.add(new NotificationMessage() {{
+ setMethod(method);
+ setParams(parameter);
+ }});
+ }
+
+ @Override
+ public CompletableFuture<Object> request(String method, Object parameter) {
+ CompletableFuture<Object> completableFuture = new CompletableFuture<Object>();
+ requests.put(new RequestMessage() {{
+ setMethod(method);
+ setParams(parameter);
+ }}, completableFuture);
+ return completableFuture;
+ }
+
+ }
+
+ static class TestMessageConsumer implements MessageConsumer {
+
+ List<Message> messages = new ArrayList<>();
+
+ @Override
+ public void consume(Message message) {
+ messages.add(message);
+ }
+
+ }
+
+ @Test public void testNotification() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new DebugRemoteEndpoint(consumer, endp);
+
+ endpoint.consume(new NotificationMessage() {{
+ setMethod("foo");
+ setParams("myparam");
+ }});
+
+ NotificationMessage notificationMessage = endp.notifications.get(0);
+ assertEquals("foo", notificationMessage.getMethod());
+ assertEquals("myparam", notificationMessage.getParams());
+ assertTrue(consumer.messages.isEmpty());
+ }
+
+ @Test public void testRequest() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new DebugRemoteEndpoint(consumer, endp);
+
+ endpoint.consume(new RequestMessage() {{
+ setId("1");
+ setMethod("foo");
+ setParams("myparam");
+ }});
+
+ Entry<RequestMessage, CompletableFuture<Object>> entry = endp.requests.entrySet().iterator().next();
+ entry.getValue().complete("success");
+ assertEquals("foo", entry.getKey().getMethod());
+ assertEquals("myparam", entry.getKey().getParams());
+ assertEquals("success", ((ResponseMessage)consumer.messages.get(0)).getResult());
+ }
+
+ @Test public void testCancellation() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new DebugRemoteEndpoint(consumer, endp);
+
+ endpoint.consume(new RequestMessage() {{
+ setId("1");
+ setMethod("foo");
+ setParams("myparam");
+ }});
+
+ Entry<RequestMessage, CompletableFuture<Object>> entry = endp.requests.entrySet().iterator().next();
+ entry.getValue().cancel(true);
+ ResponseMessage message = (ResponseMessage) consumer.messages.get(0);
+ assertNotNull(message);
+ ResponseError error = message.getError();
+ assertNotNull(error);
+ assertEquals(error.getCode(), ResponseErrorCode.RequestCancelled.getValue());
+ assertEquals(error.getMessage(), "The request (id: 1, method: 'foo') has been cancelled");
+
+ }
+
+}
\ No newline at end of file
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/LogMessageAccumulator.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/LogMessageAccumulator.java
new file mode 100644
index 0000000..908eff5
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/LogMessageAccumulator.java
@@ -0,0 +1,111 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.junit.Assert;
+
+public class LogMessageAccumulator extends Handler {
+
+ private static final long TIMEOUT = 2000;
+
+ private final List<LogRecord> records = new ArrayList<>();
+ private final List<Logger> registeredLoggers = new ArrayList<>();
+
+ public Logger registerTo(Class<?> clazz) {
+ return registerTo(clazz.getName());
+ }
+
+ public Logger registerTo(String name) {
+ Logger logger = Logger.getLogger(name);
+ logger.setUseParentHandlers(false);
+ logger.addHandler(this);
+ logger.setLevel(Level.ALL);
+ registeredLoggers.add(logger);
+ return logger;
+ }
+
+ public void unregister() {
+ for (Logger logger : registeredLoggers) {
+ logger.setLevel(null);
+ logger.removeHandler(this);
+ logger.setUseParentHandlers(true);
+ }
+ registeredLoggers.clear();
+ }
+
+ public List<LogRecord> getRecords() {
+ return records;
+ }
+
+ public LogRecord findRecord(Level level, String message) {
+ synchronized (records) {
+ for (LogRecord r : records) {
+ if (level.equals(r.getLevel()) && message.equals(r.getMessage()))
+ return r;
+ }
+ return null;
+ }
+ }
+
+ public Optional<LogRecord> match(Predicate<LogRecord> predicate) {
+ synchronized (records) {
+ return records.stream().filter(predicate).findFirst();
+ }
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ synchronized (records) {
+ records.add(record);
+ }
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ }
+
+ public void await(Predicate<LogRecord> predicate) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (!match(predicate).isPresent()) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT) {
+ synchronized (records) {
+ String records = this.records.stream().map(r -> r.getLevel() + ": " + r.getMessage()).reduce((a, a2) -> a + '\n' + a2).get();
+ Assert.fail("Timeout elapsed while waiting for logging, logged:\n" + records);
+ }
+ }
+ }
+ }
+
+ public void await(Level level, String message) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (findRecord(level, message) == null) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT)
+ Assert.fail("Timeout elapsed while waiting for " + level + ": " + message);
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/DebugMessageJsonHandlerTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/DebugMessageJsonHandlerTest.java
new file mode 100644
index 0000000..3891176
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/DebugMessageJsonHandlerTest.java
@@ -0,0 +1,851 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test.json;
+
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.debug.json.DebugMessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.debug.messages.DebugRequestMessage;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+
+public class DebugMessageJsonHandlerTest {
+
+ public static class Entry {
+ public String name;
+ public int kind;
+ public Location location;
+ }
+
+ public static class Location {
+ public String uri;
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testParseList() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<List<? extends Entry>>() {}.getType(),
+ new TypeToken<List<? extends Entry>>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id)->"foo");
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + " \"body\": [\n"
+ + " {\"name\":\"$schema\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":1,\"character\":3},\"end\":{\"line\":1,\"character\":55}}}},\n"
+ + " {\"name\":\"type\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":2,\"character\":3},\"end\":{\"line\":2,\"character\":19}}}},\n"
+ + " {\"name\":\"title\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":3,\"character\":3},\"end\":{\"line\":3,\"character\":50}}}},\n"
+ + " {\"name\":\"additionalProperties\",\"kind\":17,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":4,\"character\":4},\"end\":{\"line\":4,\"character\":32}}}},\n"
+ + " {\"name\":\"properties\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":5,\"character\":3},\"end\":{\"line\":5,\"character\":20}}}}\n"
+ + "]}");
+ List<? extends Entry> result = (List<? extends Entry>) ((ResponseMessage)message).getResult();
+ Assert.assertEquals(5, result.size());
+ for (Entry e : result) {
+ Assert.assertTrue(e.location.uri, e.location.uri.startsWith("file:/home/mistria"));
+ }
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testParseList_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Set<Entry>>() {}.getType(),
+ new TypeToken<Set<Entry>>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id)->"foo");
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + " \"body\": [\n"
+ + " {\"name\":\"$schema\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":1,\"character\":3},\"end\":{\"line\":1,\"character\":55}}}},\n"
+ + " {\"name\":\"type\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":2,\"character\":3},\"end\":{\"line\":2,\"character\":19}}}},\n"
+ + " {\"name\":\"title\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":3,\"character\":3},\"end\":{\"line\":3,\"character\":50}}}},\n"
+ + " {\"name\":\"additionalProperties\",\"kind\":17,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":4,\"character\":4},\"end\":{\"line\":4,\"character\":32}}}},\n"
+ + " {\"name\":\"properties\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":5,\"character\":3},\"end\":{\"line\":5,\"character\":20}}}}\n"
+ + "]}");
+ Set<Entry> result = (Set<Entry>) ((ResponseMessage)message).getResult();
+ Assert.assertEquals(5, result.size());
+ for (Entry e : result) {
+ Assert.assertTrue(e.location.uri, e.location.uri.startsWith("file:/home/mistria"));
+ }
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<String, List<Map<String,String>>>>() {}.getType(),
+ new TypeToken<Either<String, Integer>>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + " \"body\": [\n"
+ + " {\"name\":\"foo\"},\n"
+ + " {\"name\":\"bar\"}\n"
+ + "]}");
+ Either<String, List<Map<String, String>>> result = (Either<String, List<Map<String,String>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ for (Map<String, String> e : result.getRight()) {
+ Assert.assertNotNull(e.get("name"));
+ }
+ message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": \"name\"\n"
+ + "}");
+ result = (Either<String, List<Map<String,String>>>) ((ResponseMessage)message).getResult();
+ Assert.assertFalse(result.isRight());
+ Assert.assertEquals("name",result.getLeft());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<Integer, Map<String,String>>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": 2\n"
+ + "}");
+ Either<Integer, List<Map<String, String>>> result = (Either<Integer, List<Map<String,String>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertEquals(Integer.valueOf(2), result.getLeft());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<Either<Integer, Map<String,String>>, List<Either<Integer, Map<String,String>>>>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": 2\n"
+ + "}");
+ Either<Either<Integer, Map<String,String>>, List<Either<Integer, Map<String,String>>>> result = (Either<Either<Integer, Map<String, String>>, List<Either<Integer, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertTrue(result.getLeft().isLeft());
+ Assert.assertEquals(Integer.valueOf(2), result.getLeft().getLeft());
+
+ message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + " \"body\": {\n"
+ + " \"foo\":\"1\",\n"
+ + " \"bar\":\"2\"\n"
+ + "}}");
+ result = (Either<Either<Integer, Map<String, String>>, List<Either<Integer, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertTrue(result.getLeft().isRight());
+ Assert.assertEquals("1", result.getLeft().getRight().get("foo"));
+ Assert.assertEquals("2", result.getLeft().getRight().get("bar"));
+
+ message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + " \"body\": [{\n"
+ + " \"foo\":\"1\",\n"
+ + " \"bar\":\"2\"\n"
+ + "}]}");
+ result = (Either<Either<Integer, Map<String, String>>, List<Either<Integer, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertTrue(result.getRight().get(0).isRight());
+ Assert.assertEquals("1", result.getRight().get(0).getRight().get("foo"));
+ Assert.assertEquals("2", result.getRight().get(0).getRight().get("bar"));
+
+ message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + " \"body\": [\n"
+ + " 2\n"
+ + "]}");
+ result = (Either<Either<Integer, Map<String, String>>, List<Either<Integer, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertTrue(result.getRight().get(0).isLeft());
+ Assert.assertEquals(Integer.valueOf(2), result.getRight().get(0).getLeft());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<MyClass, List<? extends MyClass>>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": {\n"
+ + " value:\"foo\"\n"
+ + "}}");
+ Either<MyClass, List<? extends MyClass>> result = (Either<MyClass, List<? extends MyClass>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertEquals("foo", result.getLeft().getValue());
+
+ message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": [{\n"
+ + " value:\"bar\"\n"
+ + "}]}");
+ result = (Either<MyClass, List<? extends MyClass>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertEquals("bar", result.getRight().get(0).getValue());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_05() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<List<MyClass>, MyClassList>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ Message message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": [{\n"
+ + " value:\"foo\"\n"
+ + "}]}");
+ Either<List<MyClass>, MyClassList> result = (Either<List<MyClass>, MyClassList>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertEquals("foo", result.getLeft().get(0).getValue());
+
+ message = handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"response\",\n"
+ + "\"success\":true,\n"
+ + "\"body\": {\n"
+ + " items: [{\n"
+ + " value:\"bar\"\n"
+ + "}]}}");
+ result = (Either<List<MyClass>, MyClassList>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertEquals("bar", result.getRight().getItems().get(0).getValue());
+ }
+
+ @Test
+ public void testParamsParsing_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"arguments\": {\"uri\": \"dummy://mymodel.mydsl\"},\n"
+ + "\"command\":\"foo\"\n"
+ + "}");
+ Object params = message.getParams();
+ Class<? extends Object> class1 = params.getClass();
+ Assert.assertEquals(Location.class, class1);
+ }
+
+ @Test
+ public void testParamsParsing_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"foo\",\n"
+ + "\"arguments\": {\"uri\": \"dummy://mymodel.mydsl\"}\n"
+ + "}");
+ Assert.assertEquals(Location.class, message.getParams().getClass());
+ }
+
+ @Test
+ public void testParamsParsing_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"bar\",\n"
+ + "\"arguments\": {\"uri\": \"dummy://mymodel.mydsl\"}\n"
+ + "}");
+ Assert.assertEquals(JsonObject.class, message.getParams().getClass());
+ }
+
+ @Test
+ public void testParamsParsing_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"bar\",\n"
+ + "\"arguments\": null\n"
+ + "}");
+ Assert.assertEquals(null, message.getParams());
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"foo\",\n"
+ + "\"arguments\": [\"foo\", 2]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(2, parameters.size());
+ Assert.assertEquals("foo", parameters.get(0));
+ Assert.assertEquals(2, parameters.get(1));
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"bar\",\n"
+ + "\"arguments\": [\"foo\", 2]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof JsonArray);
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"foo\",\n"
+ + "\"arguments\": [[\"foo\", \"bar\"], [1, 2], {\"uri\": \"dummy://mymodel.mydsl\"}]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertTrue("" + parameters.get(2).getClass(), parameters.get(2) instanceof Location);
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"foo\",\n"
+ + "\"arguments\": [[\"foo\", \"bar\"], [1, 2]]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertNull(parameters.get(2));
+ }
+
+ @Test
+ public void testMultiParamsParsing_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"arguments\": [\"foo\", 2],\n"
+ + "\"command\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(2, parameters.size());
+ Assert.assertEquals("foo", parameters.get(0));
+ Assert.assertEquals(2, parameters.get(1));
+ }
+
+ @Test
+ public void testMultiParamsParsing_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"arguments\": [\"foo\", 2],\n"
+ + "\"command\":\"bar\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof JsonArray);
+ }
+
+ @Test
+ public void testMultiParamsParsing_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"arguments\": [[\"foo\", \"bar\"], [1, 2], {\"uri\": \"dummy://mymodel.mydsl\"}],\n"
+ + "\"command\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertTrue("" + parameters.get(2).getClass(), parameters.get(2) instanceof Location);
+ }
+
+ @Test
+ public void testMultiParamsParsing_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"arguments\": [[\"foo\", \"bar\"], [1, 2]],\n"
+ + "\"command\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertNull(parameters.get(2));
+ }
+
+ @Test
+ public void testEnumParam() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<MyDebugEnum>>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ RequestMessage message = (RequestMessage) handler.parseMessage("{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"arguments\": [\"enum1\", \"anotherEnum\", \"aStrangeEnumUTC\"],\n"
+ + "\"command\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals(Arrays.asList(MyDebugEnum.ENUM1, MyDebugEnum.ANOTHER_ENUM, MyDebugEnum.A_STRANGE_ENUM_UTC),
+ parameters);
+ }
+
+ public static final <T> void swap(T[] a, int i, int j) {
+ T t = a[i];
+ a[i] = a[j];
+ a[j] = t;
+ }
+
+ public <T> void testAllPermutationsInner(T[] array, int i, int n, Consumer<T[]> test) {
+ int j;
+ if (i == n) {
+ test.accept(array);
+ } else {
+ for (j = i; j <= n; j++) {
+ swap(array, i, j);
+ testAllPermutationsInner(array, i + 1, n, test);
+ swap(array, i, j);
+ }
+ }
+ }
+
+ public <T> void testAllPermutationsStart(T[] array, Consumer<T[]> test) {
+ testAllPermutationsInner(array, 0, array.length - 1, test);
+ }
+
+ public void testAllPermutations(String[] properties, Consumer<String> test) {
+ testAllPermutationsStart(properties, mutatedProperties -> {
+ StringBuilder json = new StringBuilder();
+ json.append("{");
+ for (int k = 0; k < mutatedProperties.length; k++) {
+ json.append(mutatedProperties[k]);
+ if (k != mutatedProperties.length - 1) {
+ json.append(",");
+ }
+
+ }
+ json.append("}");
+ String jsonString = json.toString();
+ try {
+ test.accept(jsonString);
+ } catch (Exception | AssertionError e) {
+ // To make it easier to debug a failing test, add another exception
+ // layer that shows the version of the json used -- you may
+ // need to turn off "Filter Stack Trace" in JUnit view in Eclipse
+ // to see the underlying error.
+ throw new AssertionError("Failed with this input json: " + jsonString, e);
+ }
+ });
+ }
+
+ @Test
+ public void testThePermutationsTest() {
+ // make sure that the testAllPermutations works as expected
+ Set<String> collectedPermutations = new HashSet<>();
+ Set<String> expectedPermutations = new HashSet<>();
+ expectedPermutations.add("{a,b,c}");
+ expectedPermutations.add("{a,c,b}");
+ expectedPermutations.add("{b,a,c}");
+ expectedPermutations.add("{b,c,a}");
+ expectedPermutations.add("{c,a,b}");
+ expectedPermutations.add("{c,b,a}");
+ testAllPermutations(new String[] {"a", "b", "c"}, perm -> collectedPermutations.add(perm));
+ Assert.assertEquals(expectedPermutations, collectedPermutations);
+ }
+
+ @Test
+ public void testRequest_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {
+ }.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"seq\":2",
+ "\"type\":\"request\"",
+ "\"command\":\"foo\"",
+ "\"arguments\": {\"uri\": \"dummy://mymodel.mydsl\"}"
+ };
+ testAllPermutations(properties, json -> {
+ RequestMessage message = (RequestMessage) handler.parseMessage(json);
+ Object params = message.getParams();
+ Class<? extends Object> class1 = params.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)params).uri);
+ });
+ }
+
+ @Test
+ public void testNormalResponse_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Location>() {}.getType(),
+ new TypeToken<Void>() {
+ }.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"seq\":2",
+ "\"type\":\"response\"",
+ "\"request_seq\":5",
+ "\"success\":true",
+ "\"body\": {\"uri\": \"dummy://mymodel.mydsl\"}"
+ };
+ testAllPermutations(properties, json -> {
+ ResponseMessage message = (ResponseMessage) handler.parseMessage(json);
+ Object result = message.getResult();
+ Class<? extends Object> class1 = result.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)result).uri);
+ Assert.assertNull(message.getError());
+ });
+ }
+
+ @Test
+ public void testNormalResponseExtraFields_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Location>() {}.getType(),
+ new TypeToken<Void>() {
+ }.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"seq\":2",
+ "\"type\":\"response\"",
+ "\"request_seq\":5",
+ "\"success\":true",
+ "\"body\": {\"uri\": \"dummy://mymodel.mydsl\"}",
+ "\"message\": null"
+ };
+ testAllPermutations(properties, json -> {
+ ResponseMessage message = (ResponseMessage) handler.parseMessage(json);
+ Object result = message.getResult();
+ Class<? extends Object> class1 = result.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)result).uri);
+ Assert.assertNull(message.getError());
+ });
+ }
+
+ @Test
+ public void testErrorResponse_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Location>() {}.getType(),
+ new TypeToken<Void>() {
+ }.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"seq\":2",
+ "\"type\":\"response\"",
+ "\"request_seq\":5",
+ "\"success\":false",
+ "\"message\": \"failed\"",
+ "\"body\": {\"uri\": \"failed\"}"
+ };
+ testAllPermutations(properties, json -> {
+ ResponseMessage message = (ResponseMessage) handler.parseMessage(json);
+ Assert.assertEquals("failed", message.getError().getMessage());
+ Object data = message.getError().getData();
+ Map<String, String> expected = new HashMap<>();
+ expected.put("uri", "failed");
+ Assert.assertEquals(expected, data);
+ Assert.assertNull(message.getResult());
+ });
+ }
+
+ @Test
+ public void testNotification_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {
+ }.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"seq\":2",
+ "\"type\":\"event\"",
+ "\"event\":\"foo\"",
+ "\"body\": {\"uri\": \"dummy://mymodel.mydsl\"}"
+ };
+ testAllPermutations(properties, json -> {
+ NotificationMessage message = (NotificationMessage) handler.parseMessage(json);
+ Object params = message.getParams();
+ Class<? extends Object> class1 = params.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)params).uri);
+ });
+ }
+
+ @Test
+ public void testMissingSuccessResponse_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Location>() {}.getType(),
+ new TypeToken<Void>() {
+ }.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"seq\":2",
+ "\"type\":\"response\"",
+ "\"request_seq\":5",
+ "\"message\": \"failed\"",
+ "\"body\": {\"uri\": \"failed\"}"
+ };
+ testAllPermutations(properties, json -> {
+ ResponseMessage message = (ResponseMessage) handler.parseMessage(json);
+ Assert.assertEquals("failed", message.getError().getMessage());
+ Object data = message.getError().getData();
+ Map<String, String> expected = new HashMap<>();
+ expected.put("uri", "failed");
+ Assert.assertEquals(expected, data);
+ Assert.assertNull(message.getResult());
+ });
+ }
+
+ @Test
+ public void testParseErrorRequest() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String input = "{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"foo\"\n"
+ + "\"arguments\": \"ERROR HERE - a string where an object is expected\",\n"
+ + "}";
+ try {
+ handler.parseMessage(input);
+ fail("Should have had a parse error");
+ } catch (MessageIssueException e) {
+ // Make sure the message parsed ok up until the parse error
+ DebugRequestMessage rpcMessage = (DebugRequestMessage)e.getRpcMessage();
+ Assert.assertEquals("2", rpcMessage.getId());
+ Assert.assertEquals("foo", rpcMessage.getMethod());
+
+ // check there is an underlying error
+ MessageIssue messageIssue = e.getIssues().get(0);
+ Assert.assertNotNull(messageIssue.getCause());
+ }
+ }
+
+ @Test
+ public void testParseSyntaxErrorRequest() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ DebugMessageJsonHandler handler = new DebugMessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String input = "{"
+ + "\"seq\":2,\n"
+ + "\"type\":\"request\",\n"
+ + "\"command\":\"foo\"\n"
+ + "\"arguments\": \"ERROR HERE - an unterminated string,\n"
+ + "}";
+ try {
+ handler.parseMessage(input);
+ fail("Should have had a parse error");
+ } catch (MessageIssueException e) {
+ // Make sure the message parsed ok up until the parse error
+ DebugRequestMessage rpcMessage = (DebugRequestMessage)e.getRpcMessage();
+ Assert.assertEquals("2", rpcMessage.getId());
+ Assert.assertEquals("foo", rpcMessage.getMethod());
+
+ // check there is an underlying error
+ MessageIssue messageIssue = e.getIssues().get(0);
+ Assert.assertNotNull(messageIssue.getCause());
+ }
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyClass.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyClass.java
new file mode 100644
index 0000000..73b85c0
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyClass.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test.json;
+
+public class MyClass {
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return "MyClass [value=" + value + "]";
+ }
+
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((value == null) ? 0 : value.hashCode());
+ return result;
+ }
+
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MyClass other = (MyClass) obj;
+ if (value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!value.equals(other.value))
+ return false;
+ return true;
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyClassList.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyClassList.java
new file mode 100644
index 0000000..664b84f
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyClassList.java
@@ -0,0 +1,56 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test.json;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MyClassList {
+
+ private List<MyClass> items = new ArrayList<>();
+
+ public List<MyClass> getItems() {
+ return items;
+ }
+
+ public void setItems(List<MyClass> items) {
+ this.items = items;
+ }
+
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((items == null) ? 0 : items.hashCode());
+ return result;
+ }
+
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MyClassList other = (MyClassList) obj;
+ if (items == null) {
+ if (other.items != null)
+ return false;
+ } else if (!items.equals(other.items))
+ return false;
+ return true;
+ }
+
+ public String toString() {
+ return "MyClassList [items=" + items + "]";
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyDebugEnum.java b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyDebugEnum.java
new file mode 100644
index 0000000..12942cf
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/debug/test/json/MyDebugEnum.java
@@ -0,0 +1,38 @@
+/******************************************************************************
+ * Copyright (c) 2016-2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.debug.test.json;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * DSP, unlike LSP enums are passed as strings, not numbers. That means a
+ * different style.
+ */
+public enum MyDebugEnum {
+
+ /**
+ * An enum that simply needs case conversion
+ */
+ ENUM1,
+
+ /**
+ * An enum with _ case to camel case
+ */
+ ANOTHER_ENUM,
+
+ /**
+ * An enum with no fixed rule
+ */
+ @SerializedName("aStrangeEnumUTC")
+ A_STRANGE_ENUM_UTC;
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/ExtendableConcurrentMessageProcessorTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/ExtendableConcurrentMessageProcessorTest.java
new file mode 100644
index 0000000..fdfd6b1
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/ExtendableConcurrentMessageProcessorTest.java
@@ -0,0 +1,267 @@
+/******************************************************************************
+ * Copyright (c) 2018 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.MessageProducer;
+import org.eclipse.lsp4j.jsonrpc.Launcher.Builder;
+import org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.test.ExtendableConcurrentMessageProcessorTest.MessageContextStore.MessageContext;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * This is a test to verify that it is easy for a client to override the construction
+ * of the ConcurrentMessageProcessor, so that an extender making use of
+ * lsp4j.jsonrpc might be able to use these bootstrapping classes
+ * for different protocols that may need to identify which client is making
+ * each and every request.
+ *
+ */
+public class ExtendableConcurrentMessageProcessorTest {
+
+ private static final long TIMEOUT = 2000;
+
+ /**
+ * Test that an adopter making use of these APIs is able to
+ * identify which client is making any given request.
+ */
+ @Test
+ public void testIdentifyClientRequest() throws Exception {
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ MyClient client = new MyClientImpl();
+ Launcher<MyServer> clientSideLauncher = Launcher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServerImpl();
+ MessageContextStore<MyClient> contextStore = new MessageContextStore<>();
+ Launcher<MyClient> serverSideLauncher = createLauncher(createBuilder(contextStore), server, MyClient.class, in2, out2);
+
+ TestContextWrapper.setMap(contextStore);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> fooFuture = clientSideLauncher.getRemoteProxy().askServer(new MyParam("FOO"));
+ CompletableFuture<MyParam> barFuture = serverSideLauncher.getRemoteProxy().askClient(new MyParam("BAR"));
+
+ Assert.assertEquals("FOO", fooFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ Assert.assertEquals("BAR", barFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ Assert.assertFalse(TestContextWrapper.error);
+ }
+
+ /*
+ * Copy the createLauncher method, but pass in a custom builder
+ */
+ static <T> Launcher<T> createLauncher(Builder<T> builder, Object localService, Class<T> remoteInterface, InputStream in, OutputStream out) {
+ return builder.setLocalService(localService)
+ .setRemoteInterface(remoteInterface)
+ .setInput(in).setOutput(out)
+ .create();
+ }
+
+ /*
+ * The custom builder to be used when creating a launcher
+ */
+ static <T> Builder<T> createBuilder(MessageContextStore<T> store) {
+ return new Builder<T>() {
+ @Override
+ protected ConcurrentMessageProcessor createMessageProcessor(MessageProducer reader,
+ MessageConsumer messageConsumer, T remoteProxy) {
+ return new CustomConcurrentMessageProcessor<T>(reader, messageConsumer, remoteProxy, store);
+ }
+ };
+ }
+
+ /*
+ * The custom message processor, which can make sure to persist which clients are
+ * making a given request before propagating those requests to the server implementation.
+ */
+ public static class CustomConcurrentMessageProcessor<T> extends ConcurrentMessageProcessor {
+
+ private T remoteProxy;
+ private final MessageContextStore<T> threadMap;
+ public CustomConcurrentMessageProcessor(MessageProducer reader, MessageConsumer messageConsumer,
+ T remoteProxy, MessageContextStore<T> threadMap) {
+ super(reader, messageConsumer);
+ this.remoteProxy = remoteProxy;
+ this.threadMap = threadMap;
+ }
+
+ protected void processingStarted() {
+ super.processingStarted();
+ if (threadMap != null) {
+ threadMap.setContext(new MessageContext<T>(remoteProxy));
+ }
+ }
+
+ protected void processingEnded() {
+ super.processingEnded();
+ if (threadMap != null)
+ threadMap.clear();
+
+ }
+ }
+
+ /*
+ * Server and client interfaces are below, along with any parameters required
+ */
+
+ public static interface MyServer {
+ @JsonRequest
+ CompletableFuture<MyParam> askServer(MyParam param);
+ }
+
+ public static interface MyClient {
+ @JsonRequest
+ CompletableFuture<MyParam> askClient(MyParam param);
+ }
+ public static class MyParam {
+ private MyParam nested;
+ private Either<String, Integer> either;
+
+ public MyParam() {}
+
+ public MyParam(@NonNull String string) {
+ this.value = string;
+ }
+
+ @NonNull
+ private String value;
+
+ @NonNull
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(@NonNull String value) {
+ this.value = value;
+ }
+
+ public MyParam getNested() {
+ return nested;
+ }
+
+ public void setNested(MyParam nested) {
+ this.nested = nested;
+ }
+
+ public Either<String, Integer> getEither() {
+ return either;
+ }
+
+ public void setEither(Either<String, Integer> either) {
+ this.either = either;
+ }
+ }
+
+ public static class MyServerImpl implements MyServer {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ MessageContext<MyClient> context = TestContextWrapper.store.getContext();
+ MyClient client = context.getRemoteProxy();
+ if( client == null )
+ TestContextWrapper.setError(true);
+ else
+ TestContextWrapper.setError(false);
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+
+
+ public static class MyClientImpl implements MyClient {
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+
+
+ /*
+ * A custom class for storing the context for any given message
+ */
+ public static class MessageContextStore<T> {
+ private ThreadLocal<MessageContext<T>> messageContext = new ThreadLocal<>();
+
+ public void setContext(MessageContext<T> context) {
+ messageContext.set(context);
+ }
+
+ /**
+ * Get the context for the current request
+ * @return
+ */
+ public MessageContext<T> getContext() {
+ return messageContext.get();
+ }
+
+ /**
+ * Remove the context for this request.
+ * Any new requests will need to set their context anew.
+ */
+ public void clear() {
+ messageContext.remove();
+ }
+
+ /**
+ * This object can be extended to include whatever other context
+ * from the raw message we may consider making available to implementations.
+ * At a minimum, it should make available the remote proxy, so a given
+ * request knows which remote proxy is making the request.
+ */
+ public static class MessageContext<T> {
+ T remoteProxy;
+ public MessageContext(T remoteProxy) {
+ this.remoteProxy = remoteProxy;
+ }
+
+ public T getRemoteProxy() {
+ return this.remoteProxy;
+ }
+ };
+ }
+
+ /*
+ * A class used to store the results of the test (success or failure)
+ */
+ public static class TestContextWrapper {
+ public static MessageContextStore<MyClient> store;
+ public static boolean error = false;
+ public static void setMap(MessageContextStore<MyClient> store2) {
+ store= store2;
+ }
+
+ public static void setError(boolean error2) {
+ error = error2;
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/IntegrationTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/IntegrationTest.java
new file mode 100644
index 0000000..eaf023b
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/IntegrationTest.java
@@ -0,0 +1,692 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test;
+
+import static org.eclipse.lsp4j.jsonrpc.json.MessageConstants.CONTENT_LENGTH_HEADER;
+import static org.eclipse.lsp4j.jsonrpc.json.MessageConstants.CRLF;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.ResponseErrorException;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IntegrationTest {
+
+ private static final long TIMEOUT = 2000;
+
+ public static class MyParam {
+ public MyParam() {}
+
+ public MyParam(@NonNull String string) {
+ this.value = string;
+ }
+
+ @NonNull
+ private String value;
+
+ @NonNull
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(@NonNull String value) {
+ this.value = value;
+ }
+
+ private MyParam nested;
+
+ public MyParam getNested() {
+ return nested;
+ }
+
+ public void setNested(MyParam nested) {
+ this.nested = nested;
+ }
+
+ private Either<String, Integer> either;
+
+ public Either<String, Integer> getEither() {
+ return either;
+ }
+
+ public void setEither(Either<String, Integer> either) {
+ this.either = either;
+ }
+ }
+
+ public static interface MyServer {
+ @JsonRequest
+ CompletableFuture<MyParam> askServer(MyParam param);
+ }
+
+ public static class MyServerImpl implements MyServer {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+
+ public static interface MyClient {
+ @JsonRequest
+ CompletableFuture<MyParam> askClient(MyParam param);
+ }
+
+ public static class MyClientImpl implements MyClient {
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ return CompletableFuture.completedFuture(param);
+ }
+ };
+
+ @Test
+ public void testBothDirectionRequests() throws Exception {
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ MyClient client = new MyClientImpl();
+ Launcher<MyServer> clientSideLauncher = Launcher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in2, out2);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> fooFuture = clientSideLauncher.getRemoteProxy().askServer(new MyParam("FOO"));
+ CompletableFuture<MyParam> barFuture = serverSideLauncher.getRemoteProxy().askClient(new MyParam("BAR"));
+
+ Assert.assertEquals("FOO", fooFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ Assert.assertEquals("BAR", barFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ }
+
+ @Test
+ public void testResponse1() throws Exception {
+ // create client message
+ String requestMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"42\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessage = getHeader(requestMessage.getBytes().length) + requestMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessage.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 52" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"42\",\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testResponse2() throws Exception {
+ // create client message
+ String requestMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": 42,\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessage = getHeader(requestMessage.getBytes().length) + requestMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessage.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 50" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":42,\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testEither() throws Exception {
+ // create client message
+ String requestMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": 42,\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"either\": \"bar\", \"value\": \"foo\" }\n"
+ + "}";
+ String clientMessage = getHeader(requestMessage.getBytes().length) + requestMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessage.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 65" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":42,\"result\":{\"value\":\"foo\",\"either\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testEitherNull() throws Exception {
+ // create client message
+ String requestMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": 42,\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"either\": null, \"value\": \"foo\" }\n"
+ + "}";
+ String clientMessage = getHeader(requestMessage.getBytes().length) + requestMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessage.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 50" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":42,\"result\":{\"value\":\"foo\"}}",
+ out.toString());
+ }
+
+
+ @Test
+ public void testCancellation() throws Exception {
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ boolean[] inComputeAsync = new boolean[1];
+ boolean[] cancellationHappened = new boolean[1];
+
+ MyClient client = new MyClient() {
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ return CompletableFutures.computeAsync(cancelToken -> {
+ try {
+ long startTime = System.currentTimeMillis();
+ inComputeAsync[0] = true;
+ do {
+ cancelToken.checkCanceled();
+ Thread.sleep(50);
+ } while (System.currentTimeMillis() - startTime < TIMEOUT);
+ } catch (CancellationException e) {
+ cancellationHappened[0] = true;
+ } catch (InterruptedException e) {
+ Assert.fail("Thread was interrupted unexpectedly.");
+ }
+ return param;
+ });
+ }
+ };
+ Launcher<MyServer> clientSideLauncher = Launcher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in2, out2);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> future = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+
+ long startTime = System.currentTimeMillis();
+ while (!inComputeAsync[0]) {
+ Thread.sleep(50);
+ if (System.currentTimeMillis() - startTime > TIMEOUT)
+ Assert.fail("Timeout waiting for client to start computing.");
+ }
+ future.cancel(true);
+
+ startTime = System.currentTimeMillis();
+ while (!cancellationHappened[0]) {
+ Thread.sleep(50);
+ if (System.currentTimeMillis() - startTime > TIMEOUT)
+ Assert.fail("Timeout waiting for confirmation of cancellation.");
+ }
+ try {
+ future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.fail("Expected cancellation.");
+ } catch (CancellationException e) {
+ }
+ }
+
+ @Test
+ public void testCancellationResponse() throws Exception {
+ // create client messages
+ String requestMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String cancellationMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"method\": \"$/cancelRequest\",\n"
+ + "\"params\": { \"id\": 1 }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage.getBytes().length) + requestMessage
+ + getHeader(cancellationMessage.getBytes().length) + cancellationMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServer() {
+ @Override
+ public CompletableFuture<MyParam> askServer(MyParam param) {
+ return CompletableFutures.computeAsync(cancelToken -> {
+ try {
+ long startTime = System.currentTimeMillis();
+ do {
+ cancelToken.checkCanceled();
+ Thread.sleep(50);
+ } while (System.currentTimeMillis() - startTime < TIMEOUT);
+ } catch (InterruptedException e) {
+ Assert.fail("Thread was interrupted unexpectedly.");
+ }
+ return param;
+ });
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 132" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32800,\"message\":\"The request (id: 1, method: \\u0027askServer\\u0027) has been cancelled\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testVersatility() throws Exception {
+ Logger.getLogger(RemoteEndpoint.class.getName()).setLevel(Level.OFF);
+ // create client side
+ PipedInputStream in = new PipedInputStream();
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+
+ // See https://github.com/eclipse/lsp4j/issues/510 for full details.
+ // Make sure that the thread that writes to the PipedOutputStream stays alive
+ // until the read from the PipedInputStream. Using a cached thread pool
+ // does not 100% guarantee that, but increases the probability that the
+ // selected thread will exist for the lifetime of the test.
+ ExecutorService executor = Executors.newCachedThreadPool();
+
+ in.connect(out2);
+ out.connect(in2);
+
+ MyClient client = new MyClient() {
+ private int tries = 0;
+
+ @Override
+ public CompletableFuture<MyParam> askClient(MyParam param) {
+ if (tries == 0) {
+ tries++;
+ throw new UnsupportedOperationException();
+ }
+ return CompletableFutures.computeAsync(executor, cancelToken -> {
+ if (tries++ == 1)
+ throw new UnsupportedOperationException();
+ return param;
+ });
+ }
+ };
+ Launcher<MyServer> clientSideLauncher = Launcher.createLauncher(client, MyServer.class, in, out);
+
+ // create server side
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in2, out2);
+
+ clientSideLauncher.startListening();
+ serverSideLauncher.startListening();
+
+ CompletableFuture<MyParam> errorFuture1 = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+ try {
+ System.out.println(errorFuture1.get());
+ Assert.fail();
+ } catch (ExecutionException e) {
+ Assert.assertNotNull(((ResponseErrorException)e.getCause()).getResponseError().getMessage());
+ }
+ CompletableFuture<MyParam> errorFuture2 = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+ try {
+ errorFuture2.get();
+ Assert.fail();
+ } catch (ExecutionException e) {
+ Assert.assertNotNull(((ResponseErrorException)e.getCause()).getResponseError().getMessage());
+ }
+ CompletableFuture<MyParam> goodFuture = serverSideLauncher.getRemoteProxy().askClient(new MyParam("FOO"));
+ Assert.assertEquals("FOO", goodFuture.get(TIMEOUT, TimeUnit.MILLISECONDS).value);
+ }
+
+ @Test
+ public void testUnknownMessages() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class);
+
+ // create client messages
+ String clientMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"method\": \"foo1\",\n"
+ + "\"params\": \"bar\"\n"
+ + "}";
+ String clientMessage2 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"foo2\",\n"
+ + "\"params\": \"bar\"\n"
+ + "}";
+ String clientMessages = getHeader(clientMessage1.getBytes().length) + clientMessage1
+ + getHeader(clientMessage2.getBytes().length) + clientMessage2;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ logMessages.await(Level.WARNING, "Unsupported notification method: foo1");
+ logMessages.await(Level.WARNING, "Unsupported request method: foo2");
+
+ Assert.assertEquals("Content-Length: 95" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32601,\"message\":\"Unsupported request method: foo2\"}}",
+ out.toString());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testUnknownOptionalMessages() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class);
+
+ // create client messages
+ String clientMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"method\": \"$/foo1\",\n"
+ + "\"params\": \"bar\"\n"
+ + "}";
+ String clientMessage2 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"$/foo2\",\n"
+ + "\"params\": \"bar\"\n"
+ + "}";
+ String clientMessages = getHeader(clientMessage1.getBytes().length) + clientMessage1
+ + getHeader(clientMessage2.getBytes().length) + clientMessage2;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ logMessages.await(Level.INFO, "Unsupported notification method: $/foo1");
+ logMessages.await(Level.INFO, "Unsupported request method: $/foo2");
+
+ Assert.assertEquals("Content-Length: 40" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":null}",
+ out.toString());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ public static interface UnexpectedParamsTestServer {
+ @JsonNotification
+ void myNotification();
+ }
+
+ @Test
+ public void testUnexpectedParams() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class);
+
+ // create client messages
+ String notificationMessage = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"method\": \"myNotification\",\n"
+ + "\"params\": { \"value\": \"foo\" }\n"
+ + "}";
+ String clientMessages = getHeader(notificationMessage.getBytes().length) + notificationMessage;
+
+ // create server side
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ UnexpectedParamsTestServer server = new UnexpectedParamsTestServer() {
+ public void myNotification() {
+ }
+ };
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening();
+
+ logMessages.await(Level.WARNING, "Unexpected params '{\"value\":\"foo\"}' for "
+ + "'public abstract void org.eclipse.lsp4j.jsonrpc.test.IntegrationTest$UnexpectedParamsTestServer.myNotification()' is ignored");
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testMalformedJson1() throws Exception {
+ String requestMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": }\n"
+ + "}";
+ String requestMessage2 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"2\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage1.getBytes().length) + requestMessage1
+ + getHeader(requestMessage2.getBytes().length) + requestMessage2;
+
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 214" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32700,\"message\":\"Message could not be parsed.\","
+ + "\"data\":{\"message\":\"com.google.gson.stream.MalformedJsonException: Expected value at line 4 column 22 path $.params.value\"}}}"
+ + "Content-Length: 51" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testMalformedJson2() throws Exception {
+ // intercept log messages
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(StreamMessageProducer.class);
+
+ String requestMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"params\": { \"value\": }\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\":\"askServer\",\n"
+ + "}";
+ String requestMessage2 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"2\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage1.getBytes().length) + requestMessage1
+ + getHeader(requestMessage2.getBytes().length) + requestMessage2;
+
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ logMessages.await(Level.SEVERE, "com.google.gson.stream.MalformedJsonException: Expected value at line 2 column 22 path $.params.value");
+ Assert.assertEquals("Content-Length: 51" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testMalformedJson3() throws Exception {
+ String requestMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "]";
+ String requestMessage2 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"2\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage1.getBytes().length) + requestMessage1
+ + getHeader(requestMessage2.getBytes().length) + requestMessage2;
+
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 165" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32700,\"message\":\"Message could not be parsed.\","
+ + "\"data\":{\"message\":\"Unterminated object at line 5 column 2 path $.params\"}}}"
+ + "Content-Length: 51" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testMalformedJson4() throws Exception {
+ String requestMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}}";
+ String requestMessage2 = "{\"jsonrpc\":\"2.0\",\n"
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage1.getBytes().length) + requestMessage1
+ + getHeader(requestMessage2.getBytes().length) + requestMessage2;
+
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 195" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32700,\"message\":\"Message could not be parsed.\","
+ + "\"data\":{\"message\":\"Use JsonReader.setLenient(true) to accept malformed JSON at line 5 column 3 path $\"}}}"
+ + "Content-Length: 51" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testValidationIssue1() throws Exception {
+ String requestMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": null }\n"
+ + "}";
+ String requestMessage2 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"2\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": \"bar\" }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage1.getBytes().length) + requestMessage1
+ + getHeader(requestMessage2.getBytes().length) + requestMessage2;
+
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out, true, null);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 157" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32602,\"message\":\"The accessor \\u0027MyParam.getValue()\\u0027 must return a non-null value. Path: $.params.value\"}}"
+ + "Content-Length: 51" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"result\":{\"value\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test
+ public void testValidationIssue2() throws Exception {
+ String requestMessage1 = "{\"jsonrpc\": \"2.0\",\n"
+ + "\"id\": \"1\",\n"
+ + "\"method\": \"askServer\",\n"
+ + "\"params\": { \"value\": null, \"nested\": { \"value\": null } }\n"
+ + "}";
+ String clientMessages = getHeader(requestMessage1.getBytes().length) + requestMessage1;
+
+ ByteArrayInputStream in = new ByteArrayInputStream(clientMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ MyServer server = new MyServerImpl();
+ Launcher<MyClient> serverSideLauncher = Launcher.createLauncher(server, MyClient.class, in, out, true, null);
+ serverSideLauncher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("Content-Length: 379" + CRLF + CRLF
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"error\":{\"code\":-32600,\"message\":\"Multiple issues were found in \\u0027askServer\\u0027 request.\","
+ + "\"data\":["
+ + "{\"text\":\"The accessor \\u0027MyParam.getValue()\\u0027 must return a non-null value. Path: $.params.nested.value\",\"code\":-32602},"
+ + "{\"text\":\"The accessor \\u0027MyParam.getValue()\\u0027 must return a non-null value. Path: $.params.value\",\"code\":-32602}"
+ + "]}}",
+ out.toString());
+ }
+
+ protected String getHeader(int contentLength) {
+ StringBuilder headerBuilder = new StringBuilder();
+ headerBuilder.append(CONTENT_LENGTH_HEADER).append(": ").append(contentLength).append(CRLF);
+ headerBuilder.append(CRLF);
+ return headerBuilder.toString();
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/LauncherTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/LauncherTest.java
new file mode 100644
index 0000000..c7d9924
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/LauncherTest.java
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+
+public class LauncherTest {
+
+ private static final long TIMEOUT = 2000;
+
+ static class Param {
+ Param() {
+ }
+ Param(String message) {
+ this.message = message;
+ }
+ public String message;
+ }
+
+ static interface A {
+ @JsonNotification
+ public void say(Param p);
+ }
+
+ static interface B {
+ @JsonRequest
+ public CompletableFuture<String> ask(Param p);
+ }
+
+ @Test public void testDone() throws Exception {
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ }
+ };
+ Launcher<A> launcher = Launcher.createLauncher(a, A.class, new ByteArrayInputStream("".getBytes()), new ByteArrayOutputStream());
+ Future<?> startListening = launcher.startListening();
+ startListening.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.assertTrue(startListening.isDone());
+ Assert.assertFalse(startListening.isCancelled());
+ }
+
+ @Test public void testCanceled() throws Exception {
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ }
+ };
+ Launcher<A> launcher = Launcher.createLauncher(a, A.class, new InputStream() {
+ @Override
+ public int read() throws IOException {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ return '\n';
+ }
+ }, new ByteArrayOutputStream());
+ Future<?> startListening = launcher.startListening();
+ startListening.cancel(true);
+ Assert.assertTrue(startListening.isDone());
+ Assert.assertTrue(startListening.isCancelled());
+ }
+
+ @Test public void testCustomGson() throws Exception {
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ }
+ };
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ TypeAdapter<Param> typeAdapter = new TypeAdapter<Param>() {
+ @Override
+ public void write(JsonWriter out, Param value) throws IOException {
+ out.beginObject();
+ out.name("message");
+ out.value("bar");
+ out.endObject();
+ }
+ @Override
+ public Param read(JsonReader in) throws IOException {
+ return null;
+ }
+ };
+ Launcher<A> launcher = Launcher.createIoLauncher(a, A.class, new ByteArrayInputStream("".getBytes()), out,
+ Executors.newCachedThreadPool(), c -> c,
+ gsonBuilder -> {gsonBuilder.registerTypeAdapter(Param.class, typeAdapter);});
+ A remoteProxy = launcher.getRemoteProxy();
+
+ remoteProxy.say(new Param("foo"));
+ Assert.assertEquals("Content-Length: 59\r\n\r\n"
+ + "{\"jsonrpc\":\"2.0\",\"method\":\"say\",\"params\":{\"message\":\"bar\"}}",
+ out.toString());
+ }
+
+ @Test public void testMultipleServices() throws Exception {
+ final String[] paramA = new String[1];
+ A a = new A() {
+ @Override
+ public void say(Param p) {
+ paramA[0] = p.message;
+ }
+ };
+ final String[] paramB = new String[1];
+ B b = new B() {
+ @Override
+ public CompletableFuture<String> ask(Param p) {
+ paramB[0] = p.message;
+ return CompletableFuture.completedFuture("echo " + p.message);
+ }
+ };
+ String inputMessages = "Content-Length: 60\r\n\r\n"
+ + "{\"jsonrpc\":\"2.0\",\"method\":\"say\",\"params\":{\"message\":\"foo1\"}}"
+ + "Content-Length: 69\r\n\r\n"
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"ask\",\"params\":{\"message\":\"bar1\"}}";
+ ByteArrayInputStream in = new ByteArrayInputStream(inputMessages.getBytes());
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ ClassLoader classLoader = getClass().getClassLoader();
+ Launcher<Object> launcher = Launcher.createIoLauncher(Arrays.asList(a, b), Arrays.asList(A.class, B.class),
+ classLoader, in, out, Executors.newCachedThreadPool(), c -> c, null);
+
+ launcher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
+ assertEquals("foo1", paramA[0]);
+ assertEquals("bar1", paramB[0]);
+
+ Object remoteProxy = launcher.getRemoteProxy();
+ ((A) remoteProxy).say(new Param("foo2"));
+ ((B) remoteProxy).ask(new Param("bar2"));
+ Assert.assertEquals("Content-Length: 47\r\n\r\n"
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":\"echo bar1\"}"
+ + "Content-Length: 60\r\n\r\n"
+ + "{\"jsonrpc\":\"2.0\",\"method\":\"say\",\"params\":{\"message\":\"foo2\"}}"
+ + "Content-Length: 69\r\n\r\n"
+ + "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"ask\",\"params\":{\"message\":\"bar2\"}}",
+ out.toString());
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/LogMessageAccumulator.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/LogMessageAccumulator.java
new file mode 100644
index 0000000..c850c17
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/LogMessageAccumulator.java
@@ -0,0 +1,120 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+import org.junit.Assert;
+
+public class LogMessageAccumulator extends Handler {
+
+ private static final long TIMEOUT = 2000;
+
+ private final List<LogRecord> records = new ArrayList<>();
+ private final List<Logger> registeredLoggers = new ArrayList<>();
+
+ public Logger registerTo(Class<?> clazz) {
+ return registerTo(clazz.getName());
+ }
+
+ public Logger registerTo(String name) {
+ Logger logger = Logger.getLogger(name);
+ logger.setUseParentHandlers(false);
+ logger.addHandler(this);
+ logger.setLevel(Level.ALL);
+ registeredLoggers.add(logger);
+ return logger;
+ }
+
+ public void unregister() {
+ for (Logger logger : registeredLoggers) {
+ logger.setLevel(null);
+ logger.removeHandler(this);
+ logger.setUseParentHandlers(true);
+ }
+ registeredLoggers.clear();
+ }
+
+ public List<LogRecord> getRecords() {
+ return records;
+ }
+
+ public LogRecord findRecord(Level level, String message) {
+ synchronized (records) {
+ for (LogRecord r : records) {
+ if (level.equals(r.getLevel()) && message.equals(r.getMessage()))
+ return r;
+ }
+ return null;
+ }
+ }
+
+ public Optional<LogRecord> match(Predicate<LogRecord> predicate) {
+ synchronized (records) {
+ return records.stream().filter(predicate).findFirst();
+ }
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ synchronized (records) {
+ records.add(record);
+ }
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ }
+
+ public void await(Predicate<LogRecord> predicate) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (!match(predicate).isPresent()) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT) {
+ Assert.fail("Timeout elapsed while waiting for specific record.\n"
+ + "Logged records:\n" + recordsToString());
+ }
+ }
+ }
+
+ public void await(Level level, String message) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (findRecord(level, message) == null) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT) {
+ Assert.fail("Timeout elapsed while waiting for " + level + ": \"" + message + "\"\n"
+ + "Logged records:\n" + recordsToString());
+ }
+ }
+ }
+
+ private String recordsToString() {
+ synchronized (records) {
+ if (records.isEmpty())
+ return "None";
+ return records.stream().map(r -> r.getLevel() + ": " + r.getMessage()).collect(Collectors.joining("\n"));
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/RemoteEndpointTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/RemoteEndpointTest.java
new file mode 100644
index 0000000..f62d932
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/RemoteEndpointTest.java
@@ -0,0 +1,398 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.logging.Level;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RemoteEndpointTest {
+
+ private static final long TIMEOUT = 2000;
+
+ static class TestEndpoint implements Endpoint {
+
+ List<NotificationMessage> notifications = new ArrayList<>();
+ Map<RequestMessage, CompletableFuture<Object>> requests = new LinkedHashMap<>();
+
+ public void notify(String method, Object parameter) {
+ notifications.add(init(new NotificationMessage(), it -> {
+ it.setMethod(method);
+ it.setParams(parameter);
+ }));
+ }
+
+ @Override
+ public CompletableFuture<Object> request(String method, Object parameter) {
+ CompletableFuture<Object> completableFuture = new CompletableFuture<Object>();
+ requests.put(init(new RequestMessage(), it -> {
+ it.setMethod(method);
+ it.setParams(parameter);
+ }), completableFuture);
+ return completableFuture;
+ }
+
+ }
+
+ static class TestMessageConsumer implements MessageConsumer {
+
+ List<Message> messages = new ArrayList<>();
+
+ @Override
+ public void consume(Message message) {
+ messages.add(message);
+ }
+
+ }
+
+ static <T> T init(T value, Consumer<T> initializer) {
+ initializer.accept(value);
+ return value;
+ }
+
+ @Test
+ public void testNotification() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ endpoint.consume(init(new NotificationMessage(), it -> {
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ NotificationMessage notificationMessage = endp.notifications.get(0);
+ assertEquals("foo", notificationMessage.getMethod());
+ assertEquals("myparam", notificationMessage.getParams());
+ assertTrue(consumer.messages.isEmpty());
+ }
+
+ @Test
+ public void testRequest1() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ endpoint.consume(init(new RequestMessage(), it -> {
+ it.setId("1");
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ Entry<RequestMessage, CompletableFuture<Object>> entry = endp.requests.entrySet().iterator().next();
+ entry.getValue().complete("success");
+ assertEquals("foo", entry.getKey().getMethod());
+ assertEquals("myparam", entry.getKey().getParams());
+ ResponseMessage responseMessage = (ResponseMessage) consumer.messages.get(0);
+ assertEquals("success", responseMessage.getResult());
+ assertEquals(Either.forLeft("1"), responseMessage.getRawId());
+ }
+
+ @Test
+ public void testRequest2() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ endpoint.consume(init(new RequestMessage(), it -> {
+ it.setId(1);
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ Entry<RequestMessage, CompletableFuture<Object>> entry = endp.requests.entrySet().iterator().next();
+ entry.getValue().complete("success");
+ assertEquals("foo", entry.getKey().getMethod());
+ assertEquals("myparam", entry.getKey().getParams());
+ ResponseMessage responseMessage = (ResponseMessage) consumer.messages.get(0);
+ assertEquals("success", responseMessage.getResult());
+ assertEquals(Either.forRight(1), responseMessage.getRawId());
+ }
+
+ @Test
+ public void testHandleRequestIssues() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ endpoint.handle(init(new RequestMessage(), it -> {
+ it.setId("1");
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }), Collections.singletonList(new MessageIssue("bar")));
+
+ ResponseMessage responseMessage = (ResponseMessage) consumer.messages.get(0);
+ assertNotNull(responseMessage.getError());
+ assertEquals("bar", responseMessage.getError().getMessage());
+ }
+
+ @Test
+ public void testCancellation() {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ endpoint.consume(init(new RequestMessage(), it -> {
+ it.setId("1");
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ Entry<RequestMessage, CompletableFuture<Object>> entry = endp.requests.entrySet().iterator().next();
+ entry.getValue().cancel(true);
+ ResponseMessage message = (ResponseMessage) consumer.messages.get(0);
+ assertNotNull(message);
+ ResponseError error = message.getError();
+ assertNotNull(error);
+ assertEquals(error.getCode(), ResponseErrorCode.RequestCancelled.getValue());
+ assertEquals(error.getMessage(), "The request (id: 1, method: 'foo') has been cancelled");
+ }
+
+ @Test
+ public void testExceptionInEndpoint() {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ // Don't show the exception in the test execution log
+ logMessages.registerTo(RemoteEndpoint.class);
+
+ TestEndpoint endp = new TestEndpoint() {
+ @Override
+ public CompletableFuture<Object> request(String method, Object parameter) {
+ throw new RuntimeException("BAAZ");
+ }
+ };
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ endpoint.consume(init(new RequestMessage(), it -> {
+ it.setId("1");
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ ResponseMessage response = (ResponseMessage) consumer.messages.get(0);
+ assertEquals("Internal error.", response.getError().getMessage());
+ assertEquals(ResponseErrorCode.InternalError.getValue(), response.getError().getCode());
+ String exception = (String) response.getError().getData();
+ String expected = "java.lang.RuntimeException: BAAZ\n\tat org.eclipse.lsp4j.jsonrpc.test.RemoteEndpointTest";
+ assertEquals(expected, exception.replaceAll("\\r", "").substring(0, expected.length()));
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testExceptionInConsumer() throws Exception {
+ TestEndpoint endp = new TestEndpoint();
+ MessageConsumer consumer = message -> {
+ throw new RuntimeException("BAAZ");
+ };
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ CompletableFuture<Object> future = endpoint.request("foo", "myparam");
+ future.whenComplete((result, exception) -> {
+ assertNull(result);
+ assertNotNull(exception);
+ assertEquals("BAAZ", exception.getMessage());
+ });
+ try {
+ future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.fail("Expected an ExecutionException.");
+ } catch (ExecutionException exception) {
+ assertEquals("java.lang.RuntimeException: BAAZ", exception.getMessage());
+ }
+ }
+
+ @Test
+ public void testExceptionInCompletableFuture() throws Exception {
+ TestEndpoint endp = new TestEndpoint();
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+
+ CompletableFuture<Object> future = endpoint.request("foo", "myparam");
+ CompletableFuture<Void> chained = future.thenAccept(result -> {
+ throw new RuntimeException("BAAZ");
+ });
+ endpoint.consume(init(new ResponseMessage(), it -> {
+ it.setId("1");
+ it.setResult("Bar");
+ }));
+ try {
+ chained.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.fail("Expected an ExecutionException.");
+ } catch (ExecutionException exception) {
+ assertEquals("java.lang.RuntimeException: BAAZ", exception.getMessage());
+ }
+ }
+
+ @Test
+ public void testExceptionInOutputStream() throws Exception {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(RemoteEndpoint.class);
+
+ TestEndpoint endp = new TestEndpoint();
+ MessageConsumer consumer = new MessageConsumer() {
+ @Override
+ public void consume(Message message) throws JsonRpcException {
+ throw new JsonRpcException(new SocketException("Permission denied: connect"));
+ }
+ };
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+ endpoint.notify("foo", null);
+
+ logMessages.await(Level.WARNING, "Failed to send notification message.");
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testOutputStreamClosed() throws Exception {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(RemoteEndpoint.class);
+
+ TestEndpoint endp = new TestEndpoint();
+ MessageConsumer consumer = new MessageConsumer() {
+ @Override
+ public void consume(Message message) throws JsonRpcException {
+ throw new JsonRpcException(new SocketException("Socket closed"));
+ }
+ };
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
+ endpoint.notify("foo", null);
+
+ logMessages.await(Level.INFO, "Failed to send notification message.");
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testExceptionHandlerMisbehaving1() {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ // Don't show the exception in the test execution log
+ logMessages.registerTo(RemoteEndpoint.class);
+
+ TestEndpoint endp = new TestEndpoint() {
+ @Override
+ public CompletableFuture<Object> request(String method, Object parameter) {
+ throw new RuntimeException("BAAZ");
+ }
+ };
+ TestMessageConsumer consumer = new TestMessageConsumer();
+ // Misbehaving exception handler that returns null
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp, (e) -> null);
+
+ endpoint.consume(init(new RequestMessage(), it -> {
+ it.setId("1");
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ assertEquals("Check some response received", 1, consumer.messages.size());
+ ResponseMessage response = (ResponseMessage) consumer.messages.get(0);
+ assertEquals(ResponseErrorCode.InternalError.getValue(), response.getError().getCode());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ static class TestMessageConsumer2 implements MessageConsumer {
+
+ boolean sentException = false;
+ List<Message> messages = new ArrayList<>();
+
+ @Override
+ public void consume(Message message) {
+ if (sentException) {
+ messages.add(message);
+ } else {
+ // throw an exception only for the first message
+ sentException = true;
+ throw new RuntimeException("Exception in consumer");
+ }
+ }
+
+ }
+
+ @Test
+ public void testExceptionHandlerMisbehaving2() throws Exception {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ // Don't show the exception in the test execution log
+ logMessages.registerTo(RemoteEndpoint.class);
+
+ TestEndpoint endp = new TestEndpoint() {
+ @Override
+ public CompletableFuture<Object> request(String method, Object parameter) {
+ return CompletableFuture.supplyAsync(() -> "baz");
+ }
+ };
+ TestMessageConsumer2 consumer = new TestMessageConsumer2();
+ // Misbehaving exception handler that returns null
+ RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp, (e) -> null);
+
+ endpoint.consume(init(new RequestMessage(), it -> {
+ it.setId("1");
+ it.setMethod("foo");
+ it.setParams("myparam");
+ }));
+
+ long timeout = System.currentTimeMillis() + TIMEOUT;
+ while (consumer.messages.isEmpty()) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() > timeout) {
+ fail("Timedout waiting for messages");
+ }
+ }
+ assertEquals("Check some response received", 1, consumer.messages.size());
+ ResponseMessage response = (ResponseMessage) consumer.messages.get(0);
+ assertNotNull("Check response has error", response.getError());
+ assertEquals(ResponseErrorCode.InternalError.getValue(), response.getError().getCode());
+ } finally {
+ logMessages.unregister();
+ }
+ }
+}
\ No newline at end of file
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/TracingMessageConsumerTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/TracingMessageConsumerTest.java
new file mode 100644
index 0000000..a514532
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/TracingMessageConsumerTest.java
@@ -0,0 +1,265 @@
+/******************************************************************************
+ * Copyright (c) 2016-2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test;
+
+import org.eclipse.lsp4j.jsonrpc.*;
+import org.eclipse.lsp4j.jsonrpc.TracingMessageConsumer.RequestMetadata;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.messages.*;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import static java.util.Collections.emptyMap;
+import static org.junit.Assert.assertEquals;
+
+public class TracingMessageConsumerTest {
+ private static final RemoteEndpoint TEST_REMOTE_ENDPOINT = new EmptyRemoteEndpoint();
+ private static final StreamMessageConsumer TEST_STREAM_MESSAGE_CONSUMER =
+ new StreamMessageConsumer(
+ new ByteArrayOutputStream(), new MessageJsonHandler(emptyMap()));
+ private static final Clock TEST_CLOCK_1 =
+ Clock.fixed(Instant.parse("2019-06-26T22:07:30.00Z"), ZoneId.of("America/New_York"));
+ private static final Clock TEST_CLOCK_2 =
+ Clock.fixed(Instant.parse("2019-06-26T22:07:30.10Z"), ZoneId.of("America/New_York"));
+
+ @Test
+ public void testReceivedRequest() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_REMOTE_ENDPOINT, new HashMap<>(), new HashMap<>(), printWriter, TEST_CLOCK_1, Locale.US);
+
+ RequestMessage message = new RequestMessage();
+ message.setId("1");
+ message.setMethod("foo");
+ message.setParams("bar");
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Received request 'foo - (1)'\n" +
+ "Params: \"bar\"\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+
+ @Test
+ public void testReceivedResultResponse() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ Map<String, RequestMetadata> sentRequests = new HashMap<>();
+ sentRequests.put("1", new RequestMetadata("foo", TEST_CLOCK_1.instant()));
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_REMOTE_ENDPOINT, sentRequests, new HashMap<>(), printWriter, TEST_CLOCK_2, Locale.US);
+
+ ResponseMessage message = new ResponseMessage();
+ message.setId("1");
+ message.setResult("bar");
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Received response 'foo - (1)' in 100ms\n" +
+ "Result: \"bar\"\n" +
+ "Error: null\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+
+ @Test
+ public void testReceivedErrorResponse() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ Map<String, RequestMetadata> sentRequests = new HashMap<>();
+ sentRequests.put("1", new RequestMetadata("foo", TEST_CLOCK_1.instant()));
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_REMOTE_ENDPOINT, sentRequests, new HashMap<>(), printWriter, TEST_CLOCK_2, Locale.US);
+
+ ResponseMessage message = new ResponseMessage();
+ message.setId("1");
+ message.setError(new ResponseError(-32600, "bar", null));
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Received response 'foo - (1)' in 100ms\n" +
+ "Result: null\n" +
+ "Error: {\n" +
+ " \"code\": -32600,\n" +
+ " \"message\": \"bar\"\n" +
+ "}\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+
+ @Test
+ public void testReceivedNotification() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_REMOTE_ENDPOINT, new HashMap<>(), new HashMap<>(), printWriter, TEST_CLOCK_1, Locale.US);
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ message.setParams("bar");
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Received notification 'foo'\n" +
+ "Params: \"bar\"\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+
+ @Test
+ public void testSendingRequest() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_STREAM_MESSAGE_CONSUMER, new HashMap<>(), new HashMap<>(), printWriter, TEST_CLOCK_1, Locale.US);
+
+ RequestMessage message = new RequestMessage();
+ message.setId("1");
+ message.setMethod("foo");
+ message.setParams("bar");
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Sending request 'foo - (1)'\n" +
+ "Params: \"bar\"\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+
+ @Test
+ public void testSendingResponse() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ Map<String, RequestMetadata> receivedRequests = new HashMap<>();
+ receivedRequests.put("1", new RequestMetadata("foo", TEST_CLOCK_1.instant()));
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_STREAM_MESSAGE_CONSUMER, new HashMap<>(), receivedRequests, printWriter, TEST_CLOCK_2, Locale.US);
+
+ ResponseMessage message = new ResponseMessage();
+ message.setId("1");
+ message.setResult("bar");
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Sending response 'foo - (1)'. Processing request took 100ms\n" +
+ "Result: \"bar\"\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+
+ @Test
+ public void testSendingNotification() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ TracingMessageConsumer consumer =
+ new TracingMessageConsumer(
+ TEST_STREAM_MESSAGE_CONSUMER, emptyMap(), emptyMap(), printWriter, TEST_CLOCK_1, Locale.US);
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ message.setParams("bar");
+
+ consumer.consume(message);
+
+ String actualTrace = stringWriter.toString();
+ String expectedTrace = "" +
+ "[Trace - 06:07:30 PM] Sending notification 'foo'\n" +
+ "Params: \"bar\"\n" +
+ "\n" +
+ "\n";
+
+ assertEquals(expectedTrace, actualTrace);
+ }
+}
+
+class EmptyRemoteEndpoint extends RemoteEndpoint {
+ EmptyRemoteEndpoint() {
+ super(new EmptyMessageConsumer(), new EmptyEndpoint());
+ }
+
+ @Override
+ protected void handleResponse(ResponseMessage responseMessage) {
+ // no-op
+ }
+}
+
+class EmptyMessageConsumer implements MessageConsumer {
+ @Override
+ public void consume(Message message) throws MessageIssueException, JsonRpcException {
+ // no-op
+ }
+}
+
+class EmptyEndpoint implements Endpoint {
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ return CompletableFuture.completedFuture(new Object());
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ // no-op
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/annotations/EndpointsTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/annotations/EndpointsTest.java
new file mode 100644
index 0000000..bf6e8a9
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/annotations/EndpointsTest.java
@@ -0,0 +1,242 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.annotations;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint;
+import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.services.JsonSegment;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EndpointsTest {
+
+ private static final long TIMEOUT = 2000;
+
+ @JsonSegment("foo")
+ public static interface Foo {
+ @JsonRequest
+ public CompletableFuture<String> doStuff(String arg);
+
+ @JsonNotification
+ public void myNotification(String someArg);
+
+ @JsonDelegate
+ public Delegated getDelegate();
+ }
+
+ public static interface Delegated {
+
+ @JsonNotification("hubba")
+ public void myNotification(String someArg);
+ }
+
+ @JsonSegment("bar")
+ public static interface Bar {
+ @JsonRequest
+ public CompletableFuture<String> doStuff2(String arg, Integer arg2);
+
+ @JsonNotification
+ public void myNotification2(String someArg, Integer someArg2);
+
+ @JsonDelegate
+ public BarDelegated getDelegate2();
+ }
+
+ public static interface BarDelegated {
+
+ @JsonNotification("hubba")
+ public void myNotification(String someArg, Integer someArg2);
+ }
+
+ @Test public void testProxy_01() throws Exception {
+ Endpoint endpoint = new Endpoint() {
+
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ assertEquals("foo/doStuff", method);
+ assertEquals("param", parameter.toString());
+ return CompletableFuture.completedFuture("result");
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ assertEquals("foo/myNotification", method);
+ assertEquals("notificationParam", parameter.toString());
+ }
+ };
+ Foo foo = ServiceEndpoints.toServiceObject(endpoint, Foo.class);
+ foo.myNotification("notificationParam");
+ assertEquals("result", foo.doStuff("param").get(TIMEOUT, TimeUnit.MILLISECONDS));
+ }
+
+ @Test public void testProxy_02() throws Exception {
+ Endpoint endpoint = new Endpoint() {
+
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ assertEquals("bar/doStuff2", method);
+ assertEquals("[param, 2]", parameter.toString());
+ return CompletableFuture.completedFuture("result");
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ assertEquals("bar/myNotification2", method);
+ assertEquals("[notificationParam, 1]", parameter.toString());
+ }
+ };
+ Bar bar = ServiceEndpoints.toServiceObject(endpoint, Bar.class);
+ bar.myNotification2("notificationParam", 1);
+ assertEquals("result", bar.doStuff2("param", 2).get(TIMEOUT, TimeUnit.MILLISECONDS));
+ }
+
+ @Test public void testBackAndForth() throws Exception {
+ Endpoint endpoint = new Endpoint() {
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ assertEquals("foo/doStuff", method);
+ assertEquals("param", parameter.toString());
+ return CompletableFuture.completedFuture("result");
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ assertEquals("foo/myNotification", method);
+ assertEquals("notificationParam", parameter.toString());
+ }
+ };
+ Foo intermediateFoo = ServiceEndpoints.toServiceObject(endpoint, Foo.class);
+ Endpoint secondEndpoint = ServiceEndpoints.toEndpoint(intermediateFoo);
+ Foo foo = ServiceEndpoints.toServiceObject(secondEndpoint, Foo.class);
+ foo.myNotification("notificationParam");
+ assertEquals("result", foo.doStuff("param").get(TIMEOUT, TimeUnit.MILLISECONDS));
+ }
+
+ @Test public void testMultipleInterfaces() throws Exception {
+ final Map<String, Object> requests = new HashMap<>();
+ final Map<String, Object> notifications = new HashMap<>();
+ Endpoint endpoint = new Endpoint() {
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ requests.put(method, parameter);
+ switch (method) {
+ case "foo/doStuff":
+ assertEquals("paramFoo", parameter);
+ return CompletableFuture.completedFuture("resultFoo");
+ case "bar/doStuff2":
+ assertEquals(Arrays.asList("paramBar", 77), parameter);
+ return CompletableFuture.completedFuture("resultBar");
+ default:
+ Assert.fail("Unexpected method: " + method);
+ return null;
+ }
+ }
+
+ @Override
+ public void notify(String method, Object parameter) {
+ notifications.put(method, parameter);
+ }
+ };
+ ClassLoader classLoader = getClass().getClassLoader();
+ Object proxy = ServiceEndpoints.toServiceObject(endpoint, Arrays.asList(Foo.class, Bar.class), classLoader);
+ Foo foo = (Foo) proxy;
+ foo.myNotification("notificationParamFoo");
+ assertEquals("resultFoo", foo.doStuff("paramFoo").get(TIMEOUT, TimeUnit.MILLISECONDS));
+ Bar bar = (Bar) proxy;
+ bar.myNotification2("notificationParamBar", 42);
+ assertEquals("resultBar", bar.doStuff2("paramBar", 77).get(TIMEOUT, TimeUnit.MILLISECONDS));
+
+ assertEquals(2, requests.size());
+ assertEquals(2, notifications.size());
+ assertEquals("notificationParamFoo", notifications.get("foo/myNotification"));
+ assertEquals(Arrays.asList("notificationParamBar", 42), notifications.get("bar/myNotification2"));
+ }
+
+ @Test public void testRpcMethods_01() {
+ Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(Foo.class);
+
+ assertEquals("foo/doStuff", methods.get("foo/doStuff").getMethodName());
+ assertEquals(String.class, methods.get("foo/doStuff").getParameterTypes()[0]);
+ assertFalse(methods.get("foo/doStuff").isNotification());
+
+ assertEquals("foo/myNotification", methods.get("foo/myNotification").getMethodName());
+ assertEquals(String.class, methods.get("foo/myNotification").getParameterTypes()[0]);
+ assertTrue(methods.get("foo/myNotification").isNotification());
+
+ assertEquals("hubba", methods.get("hubba").getMethodName());
+ assertEquals(String.class, methods.get("hubba").getParameterTypes()[0]);
+ assertTrue(methods.get("hubba").isNotification());
+ }
+
+ @Test public void testRpcMethods_02() {
+ Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(Bar.class);
+
+ final JsonRpcMethod requestMethod = methods.get("bar/doStuff2");
+ assertEquals("bar/doStuff2", requestMethod.getMethodName());
+ assertEquals(2, requestMethod.getParameterTypes().length);
+ assertEquals(String.class, requestMethod.getParameterTypes()[0]);
+ assertEquals(Integer.class, requestMethod.getParameterTypes()[1]);
+ assertFalse(requestMethod.isNotification());
+
+ final JsonRpcMethod notificationMethod = methods.get("bar/myNotification2");
+ assertEquals("bar/myNotification2", notificationMethod.getMethodName());
+ assertEquals(2, notificationMethod.getParameterTypes().length);
+ assertEquals(String.class, notificationMethod.getParameterTypes()[0]);
+ assertEquals(Integer.class, notificationMethod.getParameterTypes()[1]);
+ assertTrue(notificationMethod.isNotification());
+
+ final JsonRpcMethod delegateMethod = methods.get("hubba");
+ assertEquals("hubba", delegateMethod.getMethodName());
+ assertEquals(2, delegateMethod.getParameterTypes().length);
+ assertEquals(String.class, delegateMethod.getParameterTypes()[0]);
+ assertEquals(Integer.class, delegateMethod.getParameterTypes()[1]);
+ assertTrue(delegateMethod.isNotification());
+ }
+
+ @JsonSegment("consumer")
+ public static interface StringConsumer extends Consumer<String> {
+ @JsonNotification
+ @Override
+ void accept(String message);
+ }
+
+ @Test public void testIssue106() {
+ Foo foo = ServiceEndpoints.toServiceObject(new GenericEndpoint(new Object()), Foo.class);
+ assertEquals(foo, foo);
+ }
+
+ @Test public void testIssue107() {
+ Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(StringConsumer.class);
+ final JsonRpcMethod method = methods.get("consumer/accept");
+ assertEquals("consumer/accept", method.getMethodName());
+ assertEquals(1, method.getParameterTypes().length);
+ assertEquals(String.class, method.getParameterTypes()[0]);
+ assertTrue(method.isNotification());
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/annotations/impl/GenericEndpointTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/annotations/impl/GenericEndpointTest.java
new file mode 100644
index 0000000..b8bdee0
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/annotations/impl/GenericEndpointTest.java
@@ -0,0 +1,285 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.annotations.impl;
+
+import java.util.Arrays;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Predicate;
+import java.util.logging.Level;
+
+import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint;
+import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.jsonrpc.services.JsonSegment;
+import org.eclipse.lsp4j.jsonrpc.test.LogMessageAccumulator;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GenericEndpointTest {
+
+ public static class Foo implements MyIf, OtherThing {
+
+ public int calls = 0;
+
+ @Override
+ public void myNotification() {
+ calls++;
+ }
+
+ @Override
+ public OtherThing doDelegate() {
+ return this;
+ }
+
+ }
+
+ public static class Bar {
+
+ public int calls = 0;
+
+ @JsonNotification
+ public void barrr() {
+ calls++;
+ }
+
+ }
+
+ public static interface MyIf {
+
+ @JsonNotification
+ public void myNotification();
+
+ @JsonDelegate
+ public OtherThing doDelegate();
+ }
+
+ @JsonSegment("other")
+ public static interface OtherThing {
+
+ @JsonNotification
+ public void myNotification();
+ }
+
+ @Test
+ public void testSimple() {
+ Foo foo = new Foo();
+ GenericEndpoint endpoint = new GenericEndpoint(foo);
+ endpoint.notify("myNotification", null);
+ endpoint.notify("other/myNotification", null);
+
+ Assert.assertEquals(2, foo.calls);
+ }
+
+ @Test
+ public void testMultiServices() {
+ Foo foo = new Foo();
+ Bar bar = new Bar();
+ GenericEndpoint endpoint = new GenericEndpoint(Arrays.asList(foo, bar));
+ endpoint.notify("myNotification", null);
+ endpoint.notify("barrr", null);
+ endpoint.notify("other/myNotification", null);
+
+ Assert.assertEquals(2, foo.calls);
+ Assert.assertEquals(1, bar.calls);
+ }
+
+ @Test
+ public void testUnexpectedParams() {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class);
+
+ Foo foo = new Foo();
+ GenericEndpoint endpoint = new GenericEndpoint(foo);
+ Assert.assertEquals(0, foo.calls);
+
+ endpoint.notify("myNotification", new Object());
+ Assert.assertEquals(1, foo.calls);
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Test
+ public void testZeroParams_01() throws Exception {
+ testZeroParams("foo", m -> m.contains("Unexpected params 'foo'"));
+ }
+
+ @Test
+ public void testZeroParams_02() throws Exception {
+ testZeroParams(null);
+ }
+
+ @Test
+ public void testZeroParams_03() throws Exception {
+ testZeroParams(Arrays.asList("foo"), m -> m.contains("Unexpected params '[foo]'"));
+ }
+
+ @Test
+ public void testZeroParams_04() throws Exception {
+ testZeroParams(Arrays.asList("foo", "bar"), m -> m.contains("Unexpected params '[foo, bar]'"));
+ }
+
+ protected void testZeroParams(Object params) throws Exception {
+ testZeroParams(params, null);
+ }
+
+ protected void testZeroParams(Object params, Predicate<String> predicate) throws Exception {
+ LogMessageAccumulator logMessages = null;
+ try {
+ if (predicate != null) {
+ logMessages = new LogMessageAccumulator();
+ logMessages.registerTo(GenericEndpoint.class);
+ }
+ GenericEndpoint endpoint = new GenericEndpoint(new Object() {
+
+ @JsonNotification
+ public void myNotification() {
+ }
+
+ });
+
+ endpoint.notify("myNotification", params);
+
+ if (predicate != null) {
+ logMessages.await(r -> Level.WARNING == r.getLevel() && predicate.test(r.getMessage()));
+ }
+ } finally {
+ if (logMessages != null) {
+ logMessages.unregister();
+ }
+ }
+ }
+
+ @Test
+ public void testSingleParams_01() throws Exception {
+ testSingleParams("foo", "foo");
+ }
+
+ @Test
+ public void testSingleParams_02() throws Exception {
+ testSingleParams(null, null);
+ }
+
+ @Test
+ public void testSingleParams_03() throws Exception {
+ testSingleParams(Arrays.asList("foo"), "foo");
+ }
+
+ @Test
+ public void testSingleParams_04() throws Exception {
+ testSingleParams(Arrays.asList("foo", "bar"), "foo", m -> m.contains("Unexpected params 'bar'"));
+ }
+
+ protected void testSingleParams(Object params, String expectedString) throws Exception {
+ this.testSingleParams(params, expectedString, null);
+ }
+
+ protected void testSingleParams(Object params, String expectedString, Predicate<String> predicate) throws Exception {
+ LogMessageAccumulator logMessages = null;
+ try {
+ if (predicate != null) {
+ logMessages = new LogMessageAccumulator();
+ logMessages.registerTo(GenericEndpoint.class);
+ }
+ GenericEndpoint endpoint = new GenericEndpoint(new Object() {
+
+ @JsonRequest
+ public CompletableFuture<String> getStringValue(String stringValue) {
+ return CompletableFuture.completedFuture(stringValue);
+ }
+
+ });
+
+ Assert.assertEquals(expectedString, endpoint.request("getStringValue", params).get());
+
+ if (predicate != null) {
+ logMessages.await(r -> Level.WARNING == r.getLevel() && predicate.test(r.getMessage()));
+ }
+ } finally {
+ if (logMessages != null) {
+ logMessages.unregister();
+ }
+ }
+ }
+
+ @Test
+ public void testMultiParams_01() throws Exception {
+ testMultiParams(Arrays.asList("foo", 1), "foo", 1);
+ }
+
+ @Test
+ public void testMultiParams_02() throws Exception {
+ testMultiParams(Arrays.asList("foo"), "foo", null);
+ }
+
+ @Test
+ public void testMultiParams_03() throws Exception {
+ testMultiParams(Arrays.asList("foo", 1, "bar", 2), "foo", 1, m -> m.contains("Unexpected params 'bar', '2'"));
+ }
+
+ @Test
+ public void testMultiParams_04() throws Exception {
+ testMultiParams("foo", "foo", null);
+ }
+
+ protected void testMultiParams(Object params, String expectedString, Integer expectedInt) throws Exception {
+ testMultiParams(params, expectedString, expectedInt, null);
+ }
+
+ protected void testMultiParams(Object params, String expectedString, Integer expectedInt, Predicate<String> predicate) throws Exception {
+ LogMessageAccumulator logMessages = null;
+ try {
+ if (predicate != null) {
+ logMessages = new LogMessageAccumulator();
+ logMessages.registerTo(GenericEndpoint.class);
+ }
+
+ GenericEndpoint endpoint = new GenericEndpoint(new Object() {
+
+ String stringValue;
+ Integer intValue;
+
+ @JsonRequest
+ public CompletableFuture<String> getStringValue() {
+ return CompletableFuture.completedFuture(stringValue);
+ }
+
+ @JsonRequest
+ public CompletableFuture<Integer> getIntValue() {
+ return CompletableFuture.completedFuture(intValue);
+ }
+
+ @JsonNotification
+ public void myNotification(String stringValue, Integer intValue) {
+ this.stringValue = stringValue;
+ this.intValue = intValue;
+ }
+
+ });
+ endpoint.notify("myNotification", params);
+
+ if (predicate != null) {
+ logMessages.await(r -> Level.WARNING == r.getLevel() && predicate.test(r.getMessage()));
+ }
+
+ Assert.assertEquals(expectedString, endpoint.request("getStringValue", null).get());
+ Assert.assertEquals(expectedInt, endpoint.request("getIntValue", null).get());
+ } finally {
+ if (logMessages != null) {
+ logMessages.unregister();
+ }
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/CollectionTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/CollectionTest.java
new file mode 100644
index 0000000..23a7f9e
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/CollectionTest.java
@@ -0,0 +1,92 @@
+/******************************************************************************
+ * Copyright (c) 2017-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+
+public class CollectionTest {
+
+ protected Gson createGson() {
+ return new GsonBuilder().registerTypeAdapterFactory(new CollectionTypeAdapter.Factory()).create();
+ }
+
+ protected void assertSerialize(Object object, String expected) {
+ Gson gson = createGson();
+ String actual = gson.toJson(object);
+ Assert.assertEquals(expected, actual);
+ }
+
+ protected void assertParse(Object expected, String string) {
+ Gson gson = createGson();
+ Object actual = gson.fromJson(string, expected.getClass());
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testSerializeList() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = Arrays.asList("foo", "bar");
+ assertSerialize(object, "{\"myProperty\":[\"foo\",\"bar\"]}");
+ }
+
+ @Test
+ public void testSerializeNull() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = null;
+ object.otherProperty = "ok";
+ assertParse(object, "{\"otherProperty\":\"ok\"}");
+ }
+
+ @Test
+ public void testParseList() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = Arrays.asList("foo", "bar");
+ assertParse(object, "{\"myProperty\":[\"foo\",\"bar\"]}");
+ }
+
+ @Test
+ public void testParseNull() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = null;
+ object.otherProperty = "ok";
+ assertParse(object, "{\"myProperty\":null, \"otherProperty\": \"ok\"}");
+ }
+
+ protected static class MyObjectA {
+ public List<String> myProperty;
+ public String otherProperty;
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyObjectA) {
+ MyObjectA other = (MyObjectA) obj;
+ return Objects.equals(this.myProperty, other.myProperty) && Objects.equals(this.otherProperty, otherProperty);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.myProperty, this.otherProperty);
+ }
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/EitherTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/EitherTest.java
new file mode 100644
index 0000000..6c12780
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/EitherTest.java
@@ -0,0 +1,267 @@
+/******************************************************************************
+ * Copyright (c) 2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Objects;
+import java.util.function.Function;
+
+import org.eclipse.lsp4j.jsonrpc.json.adapters.EitherTypeAdapter;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Either3;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+
+public class EitherTest {
+
+ protected Gson createGson() {
+ return new GsonBuilder().registerTypeAdapterFactory(new EitherTypeAdapter.Factory()).create();
+ }
+
+ protected void assertSerialize(String expected, Object object) {
+ Gson gson = createGson();
+ String actual = gson.toJson(object);
+ Assert.assertEquals(expected, actual);
+ }
+
+ protected void assertParse(Object expected, String string) {
+ Gson gson = createGson();
+ Object actual = gson.fromJson(string, expected.getClass());
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testSerializeEither() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = Either.forRight(7);
+ assertSerialize("{\"myProperty\":7}", object);
+ }
+
+ @Test
+ public void testSerializeNull() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = null;
+ object.otherProperty = "ok";
+ assertSerialize("{\"otherProperty\":\"ok\"}", object);
+ }
+
+ @Test
+ public void testParseEither() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = Either.forRight(7);
+ assertParse(object, "{\"myProperty\":7}");
+ }
+
+ @Test
+ public void testParseNull() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = null;
+ object.otherProperty = "ok";
+ assertParse(object, "{\"myProperty\":null, \"otherProperty\": \"ok\"}");
+ }
+
+ @Test
+ public void testEqualsForNull() {
+ Either<Object, Object> either1 = Either.forLeft(null);
+ Either<Object, Object> either2 = Either.forLeft(null);
+
+ assertTrue(either1.equals(either2));
+ }
+
+ @Test
+ public void testLeftEqualsNull() {
+ Either<Object, String> either1 = Either.forRight("Testing");
+ Either<Object, String> either2 = Either.forRight("Testing");
+
+ assertTrue(either1.equals(either2));
+ }
+
+ @Test
+ public void testRightEqualsNull() {
+ Either<Object, String> either1 = Either.forLeft("Testing");
+ Either<Object, String> either2 = Either.forLeft("Testing");
+
+ assertTrue(either1.equals(either2));
+ }
+
+ @Test
+ public void testEqualsFalseWithNonNull() {
+ Either<Object, String> either1 = Either.forLeft("Testing");
+ Either<Object, String> either2 = Either.forRight("Testing");
+
+ assertFalse(either1.equals(either2));
+ }
+
+ @Test
+ public void testMap() {
+ Either<char[], String> either = Either.forLeft(new char[] { 'f', 'o', 'o' });
+ assertEquals("foo", either.map(
+ String::new,
+ String::toUpperCase));
+ either = Either.forRight("bar");
+ assertEquals("BAR", either.map(
+ String::new,
+ String::toUpperCase));
+ }
+
+ @Test
+ public void testMapEither3() {
+ Either3<String, Integer, Boolean> either3;
+ Function<String, String> mapFirst = s -> s.toUpperCase();
+ Function<Integer, String> mapSecond = x -> x.toString();
+ Function<Boolean, String> mapThird = b -> b.toString();
+
+ either3 = Either3.forFirst("abc");
+ assertEquals("ABC", either3.map(mapFirst, mapSecond, mapThird));
+
+ either3 = Either3.forSecond(123);
+ assertEquals("123", either3.map(mapFirst, mapSecond, mapThird));
+
+ either3 = Either3.forThird(Boolean.TRUE);
+ assertEquals("true", either3.map(mapFirst, mapSecond, mapThird));
+ }
+
+ protected static class MyObjectA {
+ public Either<String, Integer> myProperty;
+ public String otherProperty;
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyObjectA) {
+ MyObjectA other = (MyObjectA) obj;
+ return Objects.equals(this.myProperty, other.myProperty) && Objects.equals(this.otherProperty, otherProperty);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.myProperty, this.otherProperty);
+ }
+ }
+
+ @Test
+ public void testSerializeEither3() {
+ MyObjectB object = new MyObjectB();
+ object.myProperty = Either3.forSecond(7);
+ assertSerialize("{\"myProperty\":7}", object);
+ }
+
+ @Test
+ public void testParseEither3() {
+ MyObjectB object = new MyObjectB();
+ object.myProperty = Either3.forSecond(7);
+ assertParse(object, "{\"myProperty\":7}");
+ }
+
+ protected static class MyObjectB {
+ public Either3<String, Integer, Boolean> myProperty;
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyObjectB) {
+ MyObjectB other = (MyObjectB) obj;
+ return this.myProperty == null && other.myProperty == null
+ || this.myProperty != null && this.myProperty.equals(other.myProperty);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ if (myProperty != null)
+ return myProperty.hashCode();
+ return 0;
+ }
+ }
+
+ @Test
+ public void testSerializeJsonObject() {
+ MyObjectC object = new MyObjectC();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("foo", "bar");
+ object.myProperty = Either.forRight(jsonObject);
+ assertSerialize("{\"myProperty\":{\"foo\":\"bar\"}}", object);
+ }
+
+ @Test
+ public void testParseJsonObject() {
+ MyObjectC object = new MyObjectC();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("foo", "bar");
+ object.myProperty = Either.forRight(jsonObject);
+ assertParse(object, "{\"myProperty\":{\"foo\":\"bar\"}}");
+ }
+
+ protected static class MyObjectC {
+ public Either<String, Object> myProperty;
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyObjectC) {
+ MyObjectC other = (MyObjectC) obj;
+ return Objects.equals(this.myProperty, other.myProperty);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(this.myProperty);
+ }
+ }
+
+ @Test
+ public void testSerializeJsonObjectEither3() {
+ MyObjectD object = new MyObjectD();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("foo", "bar");
+ object.myProperty = Either3.forThird(jsonObject);
+ assertSerialize("{\"myProperty\":{\"foo\":\"bar\"}}", object);
+ }
+
+ @Test
+ public void testParseJsonObjectEither3() {
+ MyObjectD object = new MyObjectD();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("foo", "bar");
+ object.myProperty = Either3.forThird(jsonObject);
+ assertParse(object, "{\"myProperty\":{\"foo\":\"bar\"}}");
+ }
+
+ protected static class MyObjectD {
+ public Either3<String, Integer, Object> myProperty;
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyObjectD) {
+ MyObjectD other = (MyObjectD) obj;
+ return Objects.equals(this.myProperty, other.myProperty);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(this.myProperty);
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MessageJsonHandlerTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MessageJsonHandlerTest.java
new file mode 100644
index 0000000..5d648b1
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MessageJsonHandlerTest.java
@@ -0,0 +1,783 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+
+public class MessageJsonHandlerTest {
+
+ public static class Entry {
+ public String name;
+ public int kind;
+ public Location location;
+ }
+
+ public static class Location {
+ public String uri;
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testParseList_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<List<? extends Entry>>() {}.getType(),
+ new TypeToken<List<? extends Entry>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id)->"foo");
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": [\n"
+ + " {\"name\":\"$schema\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":1,\"character\":3},\"end\":{\"line\":1,\"character\":55}}}},\n"
+ + " {\"name\":\"type\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":2,\"character\":3},\"end\":{\"line\":2,\"character\":19}}}},\n"
+ + " {\"name\":\"title\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":3,\"character\":3},\"end\":{\"line\":3,\"character\":50}}}},\n"
+ + " {\"name\":\"additionalProperties\",\"kind\":17,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":4,\"character\":4},\"end\":{\"line\":4,\"character\":32}}}},\n"
+ + " {\"name\":\"properties\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":5,\"character\":3},\"end\":{\"line\":5,\"character\":20}}}}\n"
+ + "]}");
+ List<? extends Entry> result = (List<? extends Entry>) ((ResponseMessage) message).getResult();
+ Assert.assertEquals(5, result.size());
+ for (Entry e : result) {
+ Assert.assertTrue(e.location.uri, e.location.uri.startsWith("file:/home/mistria"));
+ }
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testParseList_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Set<Entry>>() {}.getType(),
+ new TypeToken<Set<Entry>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id)->"foo");
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": [\n"
+ + " {\"name\":\"$schema\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":1,\"character\":3},\"end\":{\"line\":1,\"character\":55}}}},\n"
+ + " {\"name\":\"type\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":2,\"character\":3},\"end\":{\"line\":2,\"character\":19}}}},\n"
+ + " {\"name\":\"title\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":3,\"character\":3},\"end\":{\"line\":3,\"character\":50}}}},\n"
+ + " {\"name\":\"additionalProperties\",\"kind\":17,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":4,\"character\":4},\"end\":{\"line\":4,\"character\":32}}}},\n"
+ + " {\"name\":\"properties\",\"kind\":15,\"location\":{\"uri\":\"file:/home/mistria/runtime-EclipseApplication-with-patch/EclipseConEurope/something.json\",\"range\":{\"start\":{\"line\":5,\"character\":3},\"end\":{\"line\":5,\"character\":20}}}}\n"
+ + "]}");
+ Set<Entry> result = (Set<Entry>) ((ResponseMessage)message).getResult();
+ Assert.assertEquals(5, result.size());
+ for (Entry e : result) {
+ Assert.assertTrue(e.location.uri, e.location.uri.startsWith("file:/home/mistria"));
+ }
+ }
+
+ @Test
+ public void testParseNullList() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<List<? extends Entry>>() {}.getType(),
+ new TypeToken<List<? extends Entry>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id)->"foo");
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": null}");
+ Assert.assertNull(((ResponseMessage)message).getResult());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testParseEmptyList() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<List<? extends Entry>>() {}.getType(),
+ new TypeToken<List<? extends Entry>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id)->"foo");
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": []}");
+ List<Entry> result = (List<Entry>) ((ResponseMessage)message).getResult();
+ Assert.assertEquals(0, result.size());
+ }
+
+ @Test
+ public void testSerializeEmptyList() {
+ MessageJsonHandler handler = new MessageJsonHandler(Collections.emptyMap());
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ message.setParams(Collections.EMPTY_LIST);
+ String json = handler.serialize(message);
+ Assert.assertEquals("{\"jsonrpc\":\"2.0\",\"method\":\"foo\",\"params\":[]}", json);
+ }
+
+ @Test
+ public void testSerializeImmutableList() {
+ MessageJsonHandler handler = new MessageJsonHandler(Collections.emptyMap());
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ List<Object> list = new ArrayList<>();
+ list.add("a");
+ list.add("b");
+ message.setParams(Collections.unmodifiableList(list));
+ String json = handler.serialize(message);
+ Assert.assertEquals("{\"jsonrpc\":\"2.0\",\"method\":\"foo\",\"params\":[\"a\",\"b\"]}", json);
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<String, List<Map<String,String>>>>() {}.getType(),
+ new TypeToken<Either<String, Integer>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": [\n"
+ + " {\"name\":\"foo\"},\n"
+ + " {\"name\":\"bar\"}\n"
+ + "]}");
+ Either<String, List<Map<String, String>>> result = (Either<String, List<Map<String,String>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ for (Map<String, String> e : result.getRight()) {
+ Assert.assertNotNull(e.get("name"));
+ }
+ message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": \"name\"\n"
+ + "}");
+ result = (Either<String, List<Map<String,String>>>) ((ResponseMessage)message).getResult();
+ Assert.assertFalse(result.isRight());
+ Assert.assertEquals("name", result.getLeft());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<MyEnum, Map<String,String>>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": 2\n"
+ + "}");
+ Either<MyEnum, List<Map<String, String>>> result = (Either<MyEnum, List<Map<String,String>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertEquals(MyEnum.B, result.getLeft());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<Either<MyEnum, Map<String,String>>, List<Either<MyEnum, Map<String,String>>>>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": 2\n"
+ + "}");
+ Either<Either<MyEnum, Map<String,String>>, List<Either<MyEnum, Map<String,String>>>> result = (Either<Either<MyEnum, Map<String, String>>, List<Either<MyEnum, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertTrue(result.getLeft().isLeft());
+ Assert.assertEquals(MyEnum.B, result.getLeft().getLeft());
+
+ message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": {\n"
+ + " \"foo\":\"1\",\n"
+ + " \"bar\":\"2\"\n"
+ + "}}");
+ result = (Either<Either<MyEnum, Map<String, String>>, List<Either<MyEnum, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertTrue(result.getLeft().isRight());
+ Assert.assertEquals("1", result.getLeft().getRight().get("foo"));
+ Assert.assertEquals("2", result.getLeft().getRight().get("bar"));
+
+ message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": [{\n"
+ + " \"foo\":\"1\",\n"
+ + " \"bar\":\"2\"\n"
+ + "}]}");
+ result = (Either<Either<MyEnum, Map<String, String>>, List<Either<MyEnum, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertTrue(result.getRight().get(0).isRight());
+ Assert.assertEquals("1", result.getRight().get(0).getRight().get("foo"));
+ Assert.assertEquals("2", result.getRight().get(0).getRight().get("bar"));
+
+ message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + " \"result\": [\n"
+ + " 2\n"
+ + "]}");
+ result = (Either<Either<MyEnum, Map<String, String>>, List<Either<MyEnum, Map<String, String>>>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertTrue(result.getRight().get(0).isLeft());
+ Assert.assertEquals(MyEnum.B, result.getRight().get(0).getLeft());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<MyClass, List<? extends MyClass>>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": {\n"
+ + " value:\"foo\"\n"
+ + "}}");
+ Either<MyClass, List<? extends MyClass>> result = (Either<MyClass, List<? extends MyClass>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertEquals("foo", result.getLeft().getValue());
+
+ message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": [{\n"
+ + " value:\"bar\"\n"
+ + "}]}");
+ result = (Either<MyClass, List<? extends MyClass>>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertEquals("bar", result.getRight().get(0).getValue());
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ @Test
+ public void testEither_05() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Either<List<MyClass>, MyClassList>>() {}.getType(),
+ new TypeToken<Object>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ Message message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": [{\n"
+ + " value:\"foo\"\n"
+ + "}]}");
+ Either<List<MyClass>, MyClassList> result = (Either<List<MyClass>, MyClassList>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isLeft());
+ Assert.assertEquals("foo", result.getLeft().get(0).getValue());
+
+ message = handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"result\": {\n"
+ + " items: [{\n"
+ + " value:\"bar\"\n"
+ + "}]}}");
+ result = (Either<List<MyClass>, MyClassList>) ((ResponseMessage)message).getResult();
+ Assert.assertTrue(result.isRight());
+ Assert.assertEquals("bar", result.getRight().getItems().get(0).getValue());
+ }
+
+ @Test
+ public void testParamsParsing_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": {\"uri\": \"dummy://mymodel.mydsl\"},\n"
+ + "\"method\":\"foo\"\n"
+ + "}");
+ Assert.assertEquals(Location.class, message.getParams().getClass());
+ }
+
+ @Test
+ public void testParamsParsing_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"foo\",\n"
+ + "\"params\": {\"uri\": \"dummy://mymodel.mydsl\"}\n"
+ + "}");
+ Assert.assertEquals(Location.class, message.getParams().getClass());
+ }
+
+ @Test
+ public void testParamsParsing_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"bar\",\n"
+ + "\"params\": {\"uri\": \"dummy://mymodel.mydsl\"}\n"
+ + "}");
+ Assert.assertEquals(JsonObject.class, message.getParams().getClass());
+ }
+
+ @Test
+ public void testParamsParsing_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"bar\",\n"
+ + "\"params\": null\n"
+ + "}");
+ Assert.assertEquals(null, message.getParams());
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"foo\",\n"
+ + "\"params\": [\"foo\", 2]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(2, parameters.size());
+ Assert.assertEquals("foo", parameters.get(0));
+ Assert.assertEquals(2, parameters.get(1));
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"bar\",\n"
+ + "\"params\": [\"foo\", 2]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof JsonArray);
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"foo\",\n"
+ + "\"params\": [[\"foo\", \"bar\"], [1, 2], {\"uri\": \"dummy://mymodel.mydsl\"}]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertTrue("" + parameters.get(2).getClass(), parameters.get(2) instanceof Location);
+ }
+
+ @Test
+ public void testRawMultiParamsParsing_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"method\":\"foo\",\n"
+ + "\"params\": [[\"foo\", \"bar\"], [1, 2]]\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertNull(parameters.get(2));
+ }
+
+ @Test
+ public void testMultiParamsParsing_01() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": [\"foo\", 2],\n"
+ + "\"method\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(2, parameters.size());
+ Assert.assertEquals("foo", parameters.get(0));
+ Assert.assertEquals(2, parameters.get(1));
+ }
+
+ @Test
+ public void testMultiParamsParsing_02() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<String>() {}.getType(),
+ new TypeToken<Integer>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": [\"foo\", 2],\n"
+ + "\"method\":\"bar\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof JsonArray);
+ }
+
+ @Test
+ public void testMultiParamsParsing_03() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": [[\"foo\", \"bar\"], [1, 2], {\"uri\": \"dummy://mymodel.mydsl\"}],\n"
+ + "\"method\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertTrue("" + parameters.get(2).getClass(), parameters.get(2) instanceof Location);
+ }
+
+ @Test
+ public void testMultiParamsParsing_04() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<String>>() {}.getType(),
+ new TypeToken<List<Integer>>() {}.getType(),
+ new TypeToken<Location>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": [[\"foo\", \"bar\"], [1, 2]],\n"
+ + "\"method\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(3, parameters.size());
+ Assert.assertEquals("[foo, bar]", parameters.get(0).toString());
+ Assert.assertEquals("[1, 2]", parameters.get(1).toString());
+ Assert.assertNull(parameters.get(2));
+ }
+
+ @Test
+ public void testEnumParam() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<MyEnum>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": [1, 2, 3],\n"
+ + "\"method\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(Arrays.asList(MyEnum.A, MyEnum.B, MyEnum.C),
+ parameters);
+ }
+
+ @Test
+ public void testEnumParamNull() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<List<MyEnum>>() {}.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ RequestMessage message = (RequestMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"params\": [1, 2, null],\n"
+ + "\"method\":\"foo\"\n"
+ + "}");
+ Assert.assertTrue("" + message.getParams().getClass(), message.getParams() instanceof List);
+
+ List<?> parameters = (List<?>) message.getParams();
+ Assert.assertEquals(Arrays.asList(MyEnum.A, MyEnum.B, null),
+ parameters);
+ }
+
+ @Test
+ public void testResponseErrorData() {
+ MessageJsonHandler handler = new MessageJsonHandler(Collections.emptyMap());
+ ResponseMessage message = (ResponseMessage) handler.parseMessage("{\"jsonrpc\":\"2.0\","
+ + "\"id\":\"2\",\n"
+ + "\"error\": { \"code\": -32001, \"message\": \"foo\",\n"
+ + " \"data\": { \"uri\": \"file:/foo\", \"version\": 5, \"list\": [\"a\", \"b\", \"c\"] }\n"
+ + " }\n"
+ + "}");
+ ResponseError error = message.getError();
+ Assert.assertTrue("Expected a JsonObject in error.data", error.getData() instanceof JsonObject);
+ JsonObject data = (JsonObject) error.getData();
+ Assert.assertEquals("file:/foo", data.get("uri").getAsString());
+ Assert.assertEquals(5, data.get("version").getAsInt());
+ JsonArray list = data.get("list").getAsJsonArray();
+ Assert.assertEquals("a", list.get(0).getAsString());
+ Assert.assertEquals("b", list.get(1).getAsString());
+ Assert.assertEquals("c", list.get(2).getAsString());
+ }
+
+ public static final <T> void swap(T[] a, int i, int j) {
+ T t = a[i];
+ a[i] = a[j];
+ a[j] = t;
+ }
+
+ public <T> void testAllPermutationsInner(T[] array, int i, int n, Consumer<T[]> test) {
+ int j;
+ if (i == n) {
+ test.accept(array);
+ } else {
+ for (j = i; j <= n; j++) {
+ swap(array, i, j);
+ testAllPermutationsInner(array, i + 1, n, test);
+ swap(array, i, j);
+ }
+ }
+ }
+
+ public <T> void testAllPermutationsStart(T[] array, Consumer<T[]> test) {
+ testAllPermutationsInner(array, 0, array.length - 1, test);
+ }
+
+ public void testAllPermutations(String[] properties, Consumer<String> test) {
+ testAllPermutationsStart(properties, mutatedProperties -> {
+ StringBuilder json = new StringBuilder();
+ json.append("{");
+ for (int k = 0; k < mutatedProperties.length; k++) {
+ json.append(mutatedProperties[k]);
+ if (k != mutatedProperties.length - 1) {
+ json.append(",");
+ }
+
+ }
+ json.append("}");
+ String jsonString = json.toString();
+ try {
+ test.accept(jsonString);
+ } catch (Exception | AssertionError e) {
+ // To make it easier to debug a failing test, add another exception
+ // layer that shows the version of the json used -- you may
+ // need to turn off "Filter Stack Trace" in JUnit view in Eclipse
+ // to see the underlying error.
+ throw new AssertionError("Failed with this input json: " + jsonString, e);
+ }
+ });
+ }
+
+ @Test
+ public void testThePermutationsTest() {
+ // make sure that the testAllPermutations works as expected
+ Set<String> collectedPermutations = new HashSet<>();
+ Set<String> expectedPermutations = new HashSet<>();
+ expectedPermutations.add("{a,b,c}");
+ expectedPermutations.add("{a,c,b}");
+ expectedPermutations.add("{b,a,c}");
+ expectedPermutations.add("{b,c,a}");
+ expectedPermutations.add("{c,a,b}");
+ expectedPermutations.add("{c,b,a}");
+ testAllPermutations(new String[] {"a", "b", "c"}, perm -> collectedPermutations.add(perm));
+ Assert.assertEquals(expectedPermutations, collectedPermutations);
+ }
+
+ @Test
+ public void testRequest_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {
+ }.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"jsonrpc\":\"2.0\"",
+ "\"id\":2",
+ "\"method\":\"foo\"",
+ "\"params\": {\"uri\": \"dummy://mymodel.mydsl\"}"
+ };
+ testAllPermutations(properties, json -> {
+ RequestMessage message = (RequestMessage) handler.parseMessage(json);
+ Object params = message.getParams();
+ Class<? extends Object> class1 = params.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)params).uri);
+ });
+ }
+
+ @Test
+ public void testNormalResponse_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Location>() {}.getType(),
+ new TypeToken<Void>() {
+ }.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"jsonrpc\":\"2.0\"",
+ "\"id\":2",
+ "\"result\": {\"uri\": \"dummy://mymodel.mydsl\"}"
+ };
+ testAllPermutations(properties, json -> {
+ ResponseMessage message = (ResponseMessage) handler.parseMessage(json);
+ Object result = message.getResult();
+ Class<? extends Object> class1 = result.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)result).uri);
+ Assert.assertNull(message.getError());
+ });
+ }
+
+ @Test
+ public void testErrorResponse_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Location>() {}.getType(),
+ new TypeToken<Void>() {
+ }.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"jsonrpc\":\"2.0\"",
+ "\"id\":2",
+ "\"message\": \"failed\"",
+ "\"error\": {\"code\": 123456, \"message\": \"failed\", \"data\": {\"uri\": \"failed\"}}"
+ };
+ testAllPermutations(properties, json -> {
+ ResponseMessage message = (ResponseMessage) handler.parseMessage(json);
+ Assert.assertEquals("failed", message.getError().getMessage());
+ Object data = message.getError().getData();
+ JsonObject expected = new JsonObject();
+ expected.addProperty("uri", "failed");
+ Assert.assertEquals(expected, data);
+ Assert.assertNull(message.getResult());
+ });
+ }
+
+ @Test
+ public void testNotification_AllOrders() {
+ Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap<>();
+ supportedMethods.put("foo", JsonRpcMethod.request("foo",
+ new TypeToken<Void>() {}.getType(),
+ new TypeToken<Location>() {
+ }.getType()));
+ MessageJsonHandler handler = new MessageJsonHandler(supportedMethods);
+ handler.setMethodProvider((id) -> "foo");
+ String[] properties = new String[] {
+ "\"jsonrpc\":\"2.0\"",
+ "\"method\":\"foo\"",
+ "\"params\": {\"uri\": \"dummy://mymodel.mydsl\"}"
+ };
+ testAllPermutations(properties, json -> {
+ NotificationMessage message = (NotificationMessage) handler.parseMessage(json);
+ Object params = message.getParams();
+ Class<? extends Object> class1 = params.getClass();
+ Assert.assertEquals(Location.class, class1);
+ Assert.assertEquals("dummy://mymodel.mydsl", ((Location)params).uri);
+ });
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java
new file mode 100644
index 0000000..7d7b4f3
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java
@@ -0,0 +1,124 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.net.SocketException;
+import java.nio.channels.ClosedChannelException;
+import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.jsonrpc.JsonRpcException;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MessageProducerTest {
+
+ private static final long TIMEOUT = 2000;
+
+ private ExecutorService executorService;
+ private Level logLevel;
+
+ @Before
+ public void setup() {
+ executorService = Executors.newCachedThreadPool();
+ Logger logger = Logger.getLogger(StreamMessageProducer.class.getName());
+ logLevel = logger.getLevel();
+ logger.setLevel(Level.SEVERE);
+ }
+
+ @After
+ public void teardown() {
+ executorService.shutdown();
+ Logger logger = Logger.getLogger(StreamMessageProducer.class.getName());
+ logger.setLevel(logLevel);
+ }
+
+ @Test
+ public void testStopOnInterrrupt() throws Exception {
+ executorService.submit(() -> {
+ InputStream input = new InputStream() {
+ @Override
+ public int read() throws IOException {
+ throw new InterruptedIOException();
+ }
+ };
+ MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap());
+ StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler);
+ messageProducer.listen(message -> {});
+ messageProducer.close();
+ }).get(TIMEOUT, TimeUnit.MILLISECONDS);
+ }
+
+ @Test
+ public void testStopOnChannelClosed() throws Exception {
+ executorService.submit(() -> {
+ InputStream input = new InputStream() {
+ @Override
+ public int read() throws IOException {
+ throw new ClosedChannelException();
+ }
+ };
+ MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap());
+ StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler);
+ messageProducer.listen(message -> {});
+ messageProducer.close();
+ }).get(TIMEOUT, TimeUnit.MILLISECONDS);
+ }
+
+ @Test
+ public void testStopOnSocketClosed() throws Throwable {
+ executorService.submit(() -> {
+ InputStream input = new InputStream() {
+ @Override
+ public int read() throws IOException {
+ throw new SocketException("Socket closed");
+ }
+ };
+ MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap());
+ StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler);
+ messageProducer.listen(message -> {});
+ messageProducer.close();
+ }).get(TIMEOUT, TimeUnit.MILLISECONDS);
+ }
+
+ @Test(expected=JsonRpcException.class)
+ public void testIOException() throws Throwable {
+ try {
+ executorService.submit(() -> {
+ InputStream input = new InputStream() {
+ @Override
+ public int read() throws IOException {
+ throw new SocketException("Permission denied: connect");
+ }
+ };
+ MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap());
+ StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler);
+ messageProducer.listen(message -> {});
+ messageProducer.close();
+ }).get(TIMEOUT, TimeUnit.MILLISECONDS);
+ } catch (ExecutionException e) {
+ throw e.getCause();
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyClass.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyClass.java
new file mode 100644
index 0000000..fa0a6cd
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyClass.java
@@ -0,0 +1,53 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+public class MyClass {
+
+ private String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return "MyClass [value=" + value + "]";
+ }
+
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((value == null) ? 0 : value.hashCode());
+ return result;
+ }
+
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MyClass other = (MyClass) obj;
+ if (value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!value.equals(other.value))
+ return false;
+ return true;
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyClassList.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyClassList.java
new file mode 100644
index 0000000..718856d
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyClassList.java
@@ -0,0 +1,56 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MyClassList {
+
+ private List<MyClass> items = new ArrayList<>();
+
+ public List<MyClass> getItems() {
+ return items;
+ }
+
+ public void setItems(List<MyClass> items) {
+ this.items = items;
+ }
+
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((items == null) ? 0 : items.hashCode());
+ return result;
+ }
+
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MyClassList other = (MyClassList) obj;
+ if (items == null) {
+ if (other.items != null)
+ return false;
+ } else if (!items.equals(other.items))
+ return false;
+ return true;
+ }
+
+ public String toString() {
+ return "MyClassList [items=" + items + "]";
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyEnum.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyEnum.java
new file mode 100644
index 0000000..56ef630
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/MyEnum.java
@@ -0,0 +1,37 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+public enum MyEnum {
+
+ A(1),
+ B(2),
+ C(3);
+
+ private final int value;
+
+ MyEnum(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static MyEnum forValue(int value) {
+ MyEnum[] allValues = MyEnum.values();
+ if (value < 1 || value > allValues.length)
+ throw new IllegalArgumentException("Illegal enum value: " + value);
+ return allValues[value - 1];
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/ThrowableTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/ThrowableTest.java
new file mode 100644
index 0000000..445cf16
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/ThrowableTest.java
@@ -0,0 +1,108 @@
+/******************************************************************************
+ * Copyright (c) 2017-2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.util.Objects;
+
+import org.eclipse.lsp4j.jsonrpc.json.adapters.ThrowableTypeAdapter;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+
+public class ThrowableTest {
+
+ protected Gson createGson() {
+ return new GsonBuilder().registerTypeAdapterFactory(new ThrowableTypeAdapter.Factory()).create();
+ }
+
+ protected void assertSerialize(Object object, String expected) {
+ Gson gson = createGson();
+ String actual = gson.toJson(object);
+ Assert.assertEquals(expected, actual);
+ }
+
+ protected void assertParse(MyObjectA expected, String string) {
+ Gson gson = createGson();
+ MyObjectA actual = (MyObjectA)gson.fromJson(string, expected.getClass());
+ Assert.assertEquals(expected.otherProperty, actual.otherProperty);
+ assertEquals(expected.myThrowable, actual.myThrowable);
+ }
+
+ protected void assertEquals(Throwable expected, Throwable actual) {
+ if (Objects.equals(expected, actual))
+ return;
+ Assert.assertEquals(expected.getMessage(), actual.getMessage());
+ assertEquals(expected.getCause(), actual.getCause());
+ }
+
+ @Test
+ public void testSerializeThrowable() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = new Throwable("message");
+ assertSerialize(object, "{\"myThrowable\":{\"message\":\"message\"}}");
+ }
+
+ @Test
+ public void testSerializeThrowableWithCause() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = new Throwable("message", new Throwable("cause"));
+ assertSerialize(object, "{\"myThrowable\":{\"message\":\"message\",\"cause\":{\"message\":\"cause\"}}}");
+ }
+
+ @Test
+ public void testSerializeThrowableWithRecursiveCause() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = new Throwable("message");
+ object.myThrowable = new Throwable(object.myThrowable.getMessage(), object.myThrowable);
+ assertSerialize(object, "{\"myThrowable\":{\"message\":\"message\"}}");
+ }
+
+ @Test
+ public void testSerializeNull() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = null;
+ object.otherProperty = "ok";
+ assertSerialize(object, "{\"otherProperty\":\"ok\"}");
+ object.toString();
+ }
+
+ @Test
+ public void testParseThrowable() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = new Throwable("message");
+ assertParse(object, "{\"myThrowable\":{\"message\":\"message\"}}");
+ }
+
+ @Test
+ public void testParseThrowableWithCause() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = new Throwable("message", new Throwable("cause"));
+ assertParse(object, "{\"myThrowable\":{\"message\":\"message\",\"cause\":{\"message\":\"cause\"}}}");
+ }
+
+ @Test
+ public void testParseNull() {
+ MyObjectA object = new MyObjectA();
+ object.myThrowable = null;
+ object.otherProperty = "ok";
+ assertParse(object, "{\"myThrowable\":null, \"otherProperty\": \"ok\"}");
+ object.toString();
+ }
+
+ protected static class MyObjectA {
+ public Throwable myThrowable;
+ public String otherProperty;
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/TuplesTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/TuplesTest.java
new file mode 100644
index 0000000..37f0cf6
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/TuplesTest.java
@@ -0,0 +1,80 @@
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.util.Objects;
+
+import org.eclipse.lsp4j.jsonrpc.json.adapters.TupleTypeAdapters;
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class TuplesTest {
+
+ protected static class MyObjectA {
+ public Tuple.Two<String, Integer> myProperty;
+ public String otherProperty;
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MyObjectA) {
+ MyObjectA other = (MyObjectA) obj;
+ return Objects.equals(this.myProperty, other.myProperty) && Objects.equals(this.otherProperty, otherProperty);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.myProperty, this.otherProperty);
+ }
+ }
+
+ protected Gson createGson() {
+ return new GsonBuilder().registerTypeAdapterFactory(new TupleTypeAdapters.TwoTypeAdapterFactory()).create();
+ }
+
+ protected void assertSerialize(String expected, Object object) {
+ Gson gson = createGson();
+ String actual = gson.toJson(object);
+ Assert.assertEquals(expected, actual);
+ }
+
+ protected void assertParse(Object expected, String string) {
+ Gson gson = createGson();
+ Object actual = gson.fromJson(string, expected.getClass());
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testSerializeTwo() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = Tuple.two("Foo", 7);
+ assertSerialize("{\"myProperty\":[\"Foo\",7]}", object);
+ }
+
+ @Test
+ public void testSerializeNull() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = null;
+ object.otherProperty = "ok";
+ assertSerialize("{\"otherProperty\":\"ok\"}", object);
+ }
+
+ @Test
+ public void testParseTwo() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = Tuple.two("Foo", 7);
+ assertParse(object, "{\"myProperty\":[\"Foo\",7]}");
+ }
+
+ @Test
+ public void testParseNull() {
+ MyObjectA object = new MyObjectA();
+ object.myProperty = null;
+ object.otherProperty = "ok";
+ assertParse(object, "{\"myProperty\":null, \"otherProperty\": \"ok\"}");
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/json/TypeUtilsTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/TypeUtilsTest.java
new file mode 100644
index 0000000..b163f07
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/json/TypeUtilsTest.java
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * Copyright (c) 2017 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.json;
+
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.lsp4j.jsonrpc.json.adapters.TypeUtils;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.Either3;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.reflect.TypeToken;
+
+public class TypeUtilsTest {
+
+ protected void assertElementTypes(TypeToken<?> typeToken, Class<?> targetType, Type... expectedElementTypes) {
+ Type[] actualElementTypes = TypeUtils.getElementTypes(typeToken, targetType);
+ Assert.assertArrayEquals(expectedElementTypes, actualElementTypes);
+ }
+
+ @Test
+ public void testCollectionElement1() {
+ TypeToken<?> token = new TypeToken<List<String>>() {};
+ assertElementTypes(token, Collection.class, String.class);
+ }
+
+ @Test
+ public void testCollectionElement2() {
+ TypeToken<?> token = new TypeToken<List<? extends Number>>() {};
+ assertElementTypes(token, Collection.class, Number.class);
+ }
+
+ private static interface MyCollection extends Collection<String> {
+ }
+
+ @Test
+ public void testCollectionElement3() {
+ TypeToken<?> token = new TypeToken<MyCollection>() {};
+ assertElementTypes(token, Collection.class, String.class);
+ }
+
+ private static class MyLinkedList extends LinkedList<String> {
+ private static final long serialVersionUID = 1L;
+ }
+
+ @Test
+ public void testCollectionElement4() {
+ TypeToken<?> token = new TypeToken<MyLinkedList>() {};
+ assertElementTypes(token, Collection.class, String.class);
+ }
+
+ @Test
+ public void testCollectionElement5() {
+ TypeToken<?> token = new TypeToken<List<Either<List<String>, String>>>() {};
+ assertElementTypes(token, Collection.class, new TypeToken<Either<List<String>, String>>() {}.getType());
+ }
+
+ @Test
+ public void testEitherElements1() {
+ TypeToken<?> token = new TypeToken<Either<String, Number>>() {};
+ assertElementTypes(token, Either.class, String.class, Number.class);
+ }
+
+ @Test
+ public void testEitherElements2() {
+ TypeToken<?> token = new TypeToken<Either<String, ? extends Number>>() {};
+ assertElementTypes(token, Either.class, String.class, Number.class);
+ }
+
+ private static class MyEitherA extends Either<String, Number> {
+ protected MyEitherA(String left, Number right) {
+ super(left, right);
+ }
+ }
+
+ @Test
+ public void testEitherElements3() {
+ TypeToken<?> token = new TypeToken<MyEitherA>() {};
+ assertElementTypes(token, Either.class, String.class, Number.class);
+ }
+
+ private static class MyEitherB<T> extends Either<String, T> {
+ protected MyEitherB(String left, T right) {
+ super(left, right);
+ }
+ }
+
+ @Test
+ public void testEitherElements4() {
+ TypeToken<?> token = new TypeToken<MyEitherB<Number>>() {};
+ assertElementTypes(token, Either.class, String.class, Number.class);
+ }
+
+ @Test
+ public void testEitherElements5() {
+ TypeToken<?> token = new TypeToken<Either3<String, Number, Boolean>>() {};
+ assertElementTypes(token, Either.class, String.class, new TypeToken<Either<Number, Boolean>>() {}.getType());
+ }
+
+ @Test
+ public void testEitherElements6() {
+ TypeToken<?> token = new TypeToken<Either3<String, Number, Boolean>>() {};
+ assertElementTypes(token, Either3.class, String.class, Number.class, Boolean.class);
+ }
+
+ private static class MyEitherC extends Either3<String, Number, Boolean> {
+ protected MyEitherC(String left, Either<Number, Boolean> right) {
+ super(left, right);
+ }
+ }
+
+ @Test
+ public void testEitherElements7() {
+ TypeToken<?> token = new TypeToken<MyEitherC>() {};
+ assertElementTypes(token, Either.class, String.class, new TypeToken<Either<Number, Boolean>>() {}.getType());
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/jsonrpc/test/validation/ReflectiveMessageValidatorTest.java b/javatests/org/eclipse/lsp4j/jsonrpc/test/validation/ReflectiveMessageValidatorTest.java
new file mode 100644
index 0000000..207cfe3
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/jsonrpc/test/validation/ReflectiveMessageValidatorTest.java
@@ -0,0 +1,165 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.jsonrpc.test.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.google.gson.JsonObject;
+
+public class ReflectiveMessageValidatorTest {
+
+ public static class Foo {
+ // a non exposed self reference
+ Foo self = this;
+
+ Foo nested;
+ @NonNull String nonNullString;
+ String nullableString;
+ List<Foo> foos;
+
+ public Foo getNested() {
+ return nested;
+ }
+
+ public @NonNull String getNonNullString() {
+ return nonNullString;
+ }
+
+ public String getNullableString() {
+ return nullableString;
+ }
+
+ public List<Foo> getFoos() {
+ return foos;
+ }
+ }
+
+ @Test public void testNonNullViolated() {
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ message.setParams(new Foo());
+ try {
+ validator.consume(message);
+ Assert.fail();
+ } catch (MessageIssueException e) {
+ Assert.assertEquals("The accessor 'Foo.getNonNullString()' must return a non-null value. Path: $.params.nonNullString", e.getMessage());
+ }
+ }
+
+ @Test public void testNonNullViolated_nested() {
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ Foo foo = new Foo();
+ foo.nonNullString = "test";
+ foo.nested = new Foo();
+ message.setParams(foo);
+ try {
+ validator.consume(message);
+ Assert.fail();
+ } catch (MessageIssueException e) {
+ Assert.assertEquals("The accessor 'Foo.getNonNullString()' must return a non-null value. Path: $.params.nested.nonNullString", e.getMessage());
+ }
+ }
+
+ @Test public void testNoViolation() {
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ Foo foo = new Foo();
+ foo.nonNullString = "test";
+ foo.nested = new Foo() {{
+ nonNullString = "something";
+ }};
+ message.setParams(foo);
+ validator.consume(message);
+ }
+
+ @Test public void testRecursionViolation() {
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ Foo foo = new Foo();
+ foo.nonNullString = "test";
+ foo.nested = foo;
+ message.setParams(foo);
+ try {
+ validator.consume(message);
+ Assert.fail();
+ } catch (MessageIssueException e) {
+ Assert.assertEquals("An element of the message has a direct or indirect reference to itself. Path: $.params.nested", e.getMessage());
+ }
+ }
+
+ @Test public void testReflectionOnPropertiesOnly() {
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ Foo foo = new Foo();
+ foo.nonNullString = "test";
+ foo.nested = new Foo() {{
+ nonNullString = "something";
+ }};
+ foo.foos = new ArrayList<>();
+ foo.foos.add(new Foo());
+ message.setParams(foo);
+ try {
+ validator.consume(message);
+ Assert.fail();
+ } catch (MessageIssueException e) {
+ Assert.assertEquals("The accessor 'Foo.getNonNullString()' must return a non-null value. Path: $.params.foos[0].nonNullString", e.getMessage());
+ }
+ }
+
+ @Test public void testSkipJsonElement() {
+ final AtomicBoolean result = new AtomicBoolean(false);
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator((message) -> {
+ result.set(true);
+ });
+ NotificationMessage message = new NotificationMessage();
+ message.setMethod("foo");
+ message.setParams(new JsonObject());
+ validator.consume(message);
+ Assert.assertTrue(result.get());
+ }
+
+ @Test public void testRequestValidation() {
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ RequestMessage message = new RequestMessage();
+ message.setId("1");
+ message.setParams(new Object());
+ try {
+ validator.consume(message);
+ Assert.fail();
+ } catch (MessageIssueException e) {
+ Assert.assertEquals("The accessor 'RequestMessage.getMethod()' must return a non-null value. Path: $.method", e.getMessage());
+ }
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/launch/LauncherTest.java b/javatests/org/eclipse/lsp4j/launch/LauncherTest.java
new file mode 100644
index 0000000..ae83bc9
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/launch/LauncherTest.java
@@ -0,0 +1,174 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.launch;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.lsp4j.CompletionItem;
+import org.eclipse.lsp4j.CompletionItemKind;
+import org.eclipse.lsp4j.CompletionList;
+import org.eclipse.lsp4j.CompletionParams;
+import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.lsp4j.MessageType;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.launch.LSPLauncher;
+import org.eclipse.lsp4j.services.LanguageClient;
+import org.eclipse.lsp4j.services.LanguageServer;
+import org.eclipse.xtext.xbase.lib.Pair;
+import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LauncherTest {
+
+ private static final long TIMEOUT = 2000;
+
+ @Test public void testNotification() throws IOException {
+ MessageParams p = new MessageParams();
+ p.setMessage("Hello World");
+ p.setType(MessageType.Info);
+
+ client.expectedNotifications.put("window/logMessage", p);
+ serverLauncher.getRemoteProxy().logMessage(p);
+ client.joinOnEmpty();
+ }
+
+ @Test public void testRequest() throws Exception {
+ CompletionParams p = new CompletionParams();
+ p.setPosition(new Position(1,1));
+ p.setTextDocument(new TextDocumentIdentifier("test/foo.txt"));
+
+ CompletionList result = new CompletionList();
+ result.setIsIncomplete(true);
+ result.setItems(new ArrayList<>());
+
+ CompletionItem item = new CompletionItem();
+ item.setDetail("test");
+ item.setDocumentation("doc");
+ item.setFilterText("filter");
+ item.setInsertText("insert");
+ item.setKind(CompletionItemKind.Field);
+ result.getItems().add(item);
+
+ server.expectedRequests.put("textDocument/completion", new Pair<>(p, result));
+ CompletableFuture<Either<List<CompletionItem>, CompletionList>> future = clientLauncher.getRemoteProxy().getTextDocumentService().completion(p);
+ Assert.assertEquals(Either.forRight(result).toString(), future.get(TIMEOUT, TimeUnit.MILLISECONDS).toString());
+ client.joinOnEmpty();
+ }
+
+
+ static class AssertingEndpoint implements Endpoint {
+ public Map<String, Pair<Object, Object>> expectedRequests = new LinkedHashMap<>();
+
+ @Override
+ public CompletableFuture<?> request(String method, Object parameter) {
+ Assert.assertTrue(expectedRequests.containsKey(method));
+ Pair<Object, Object> result = expectedRequests.remove(method);
+ Assert.assertEquals(result.getKey().toString(), parameter.toString());
+ return CompletableFuture.completedFuture(result.getValue());
+ }
+
+ public Map<String, Object> expectedNotifications = new LinkedHashMap<>();
+
+ @Override
+ public void notify(String method, Object parameter) {
+ Assert.assertTrue(expectedNotifications.containsKey(method));
+ Object object = expectedNotifications.remove(method);
+ Assert.assertEquals(object.toString(), parameter.toString());
+ }
+
+ /**
+ * wait max 1 sec for all expectations to be removed
+ */
+ public void joinOnEmpty() {
+ long before = System.currentTimeMillis();
+ do {
+ if (expectedNotifications.isEmpty() && expectedNotifications.isEmpty()) {
+ return;
+ }
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } while ( System.currentTimeMillis() < before + 1000);
+ Assert.fail("expectations weren't empty "+toString());
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).addAllFields().toString();
+ }
+
+ }
+
+ private AssertingEndpoint server;
+ private Launcher<LanguageClient> serverLauncher;
+ private Future<?> serverListening;
+
+ private AssertingEndpoint client;
+ private Launcher<LanguageServer> clientLauncher;
+ private Future<?> clientListening;
+
+ private Level logLevel;
+
+ @Before public void setup() throws IOException {
+ PipedInputStream inClient = new PipedInputStream();
+ PipedOutputStream outClient = new PipedOutputStream();
+ PipedInputStream inServer = new PipedInputStream();
+ PipedOutputStream outServer = new PipedOutputStream();
+
+ inClient.connect(outServer);
+ outClient.connect(inServer);
+ server = new AssertingEndpoint();
+ serverLauncher = LSPLauncher.createServerLauncher(ServiceEndpoints.toServiceObject(server, LanguageServer.class), inServer, outServer);
+ serverListening = serverLauncher.startListening();
+
+ client = new AssertingEndpoint();
+ clientLauncher = LSPLauncher.createClientLauncher(ServiceEndpoints.toServiceObject(client, LanguageClient.class), inClient, outClient);
+ clientListening = clientLauncher.startListening();
+
+ Logger logger = Logger.getLogger(StreamMessageProducer.class.getName());
+ logLevel = logger.getLevel();
+ logger.setLevel(Level.SEVERE);
+ }
+
+ @After public void teardown() throws InterruptedException, ExecutionException {
+ clientListening.cancel(true);
+ serverListening.cancel(true);
+ Thread.sleep(10);
+ Logger logger = Logger.getLogger(StreamMessageProducer.class.getName());
+ logger.setLevel(logLevel);
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/performance/PerformanceMeasurement.xtend b/javatests/org/eclipse/lsp4j/performance/PerformanceMeasurement.xtend
new file mode 100644
index 0000000..0c3aaf7
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/performance/PerformanceMeasurement.xtend
@@ -0,0 +1,87 @@
+package org.eclipse.lsp4j.test.performance
+
+import com.google.gson.Gson
+import java.util.ArrayList
+import java.util.List
+import java.util.Random
+import org.eclipse.lsp4j.Location
+import org.eclipse.lsp4j.Position
+import org.eclipse.lsp4j.Range
+import org.eclipse.lsp4j.SymbolInformation
+import org.eclipse.lsp4j.SymbolKind
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler
+
+class PerformanceMeasurement implements Runnable {
+
+ def static void main(String[] args) {
+ new PerformanceMeasurement().run()
+ }
+
+ val random = new Random(0)
+
+ override run() {
+ measureSymbolInformation()
+ }
+
+ def void measureSymbolInformation() {
+ measure(new Measurement {
+ static val SIZE = 100_000
+ Gson gson
+ List<SymbolInformation> data
+
+ override prepare() {
+ data = new ArrayList(SIZE)
+ for (var i = 0; i < SIZE; i++) {
+ data += new SymbolInformation => [
+ name = randomString
+ kind = SymbolKind.forValue(random.nextInt(SymbolKind.values.length) + 1)
+ location = new Location => [
+ uri = randomString
+ range = new Range => [
+ start = new Position(random.nextInt(100), random.nextInt(100))
+ end = new Position(random.nextInt(100), random.nextInt(100))
+ ]
+ ]
+ ]
+ }
+ gson = new MessageJsonHandler(emptyMap).gson
+ }
+
+ override run() {
+ gson.toJson(data)
+ }
+ }, 'measureSymbolInformation')
+ }
+
+ private def measure(Measurement measurement, String name) {
+ // Warmup
+ measurement.prepare()
+ measurement.run()
+
+ // Measure
+ val startTime = System.nanoTime
+ for (var i = 0; i < 10; i++) {
+ measurement.run()
+ }
+ val endTime = System.nanoTime
+
+ // Display
+ val duration = (endTime - startTime) * 1e-7
+ println(name + ': ' + duration + ' ms')
+ }
+
+ private def randomString() {
+ val length = random.nextInt(30) + 2
+ val builder = new StringBuilder(length)
+ for (var i = 0; i < length; i++) {
+ val c = (random.nextInt(75) + 48) as char
+ builder.append(c)
+ }
+ return builder.toString
+ }
+
+ private interface Measurement extends Runnable {
+ def void prepare()
+ }
+
+}
\ No newline at end of file
diff --git a/javatests/org/eclipse/lsp4j/services/JsonParseTest.xtend b/javatests/org/eclipse/lsp4j/services/JsonParseTest.xtend
new file mode 100644
index 0000000..bd2caa8
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/JsonParseTest.xtend
@@ -0,0 +1,1621 @@
+/******************************************************************************
+ * Copyright (c) 2016-2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services
+
+import com.google.gson.JsonArray
+import com.google.gson.JsonObject
+import com.google.gson.internal.LazilyParsedNumber
+import java.util.ArrayList
+import java.util.Collection
+import java.util.HashMap
+import java.util.List
+import org.eclipse.lsp4j.ClientCapabilities
+import org.eclipse.lsp4j.CodeAction
+import org.eclipse.lsp4j.CodeActionCapabilities
+import org.eclipse.lsp4j.CodeLens
+import org.eclipse.lsp4j.CodeLensCapabilities
+import org.eclipse.lsp4j.ColorProviderCapabilities
+import org.eclipse.lsp4j.Command
+import org.eclipse.lsp4j.CompletionCapabilities
+import org.eclipse.lsp4j.CompletionItemCapabilities
+import org.eclipse.lsp4j.CompletionItemKind
+import org.eclipse.lsp4j.CompletionItemKindCapabilities
+import org.eclipse.lsp4j.CompletionParams
+import org.eclipse.lsp4j.CreateFile
+import org.eclipse.lsp4j.CreateFileOptions
+import org.eclipse.lsp4j.DefinitionCapabilities
+import org.eclipse.lsp4j.DeleteFile
+import org.eclipse.lsp4j.Diagnostic
+import org.eclipse.lsp4j.DiagnosticSeverity
+import org.eclipse.lsp4j.DidChangeTextDocumentParams
+import org.eclipse.lsp4j.DocumentFormattingParams
+import org.eclipse.lsp4j.DocumentHighlightCapabilities
+import org.eclipse.lsp4j.DocumentLinkCapabilities
+import org.eclipse.lsp4j.DocumentSymbol
+import org.eclipse.lsp4j.DocumentSymbolCapabilities
+import org.eclipse.lsp4j.FormattingCapabilities
+import org.eclipse.lsp4j.FormattingOptions
+import org.eclipse.lsp4j.Hover
+import org.eclipse.lsp4j.HoverCapabilities
+import org.eclipse.lsp4j.ImplementationCapabilities
+import org.eclipse.lsp4j.InitializeParams
+import org.eclipse.lsp4j.Location
+import org.eclipse.lsp4j.LocationLink
+import org.eclipse.lsp4j.MarkedString
+import org.eclipse.lsp4j.MarkupContent
+import org.eclipse.lsp4j.MarkupKind
+import org.eclipse.lsp4j.OnTypeFormattingCapabilities
+import org.eclipse.lsp4j.ParameterInformation
+import org.eclipse.lsp4j.Position
+import org.eclipse.lsp4j.PrepareRenameResult
+import org.eclipse.lsp4j.ProgressParams
+import org.eclipse.lsp4j.PublishDiagnosticsParams
+import org.eclipse.lsp4j.Range
+import org.eclipse.lsp4j.RangeFormattingCapabilities
+import org.eclipse.lsp4j.ReferencesCapabilities
+import org.eclipse.lsp4j.RenameCapabilities
+import org.eclipse.lsp4j.RenameFile
+import org.eclipse.lsp4j.ResourceOperation
+import org.eclipse.lsp4j.SignatureHelp
+import org.eclipse.lsp4j.SignatureHelpCapabilities
+import org.eclipse.lsp4j.SignatureInformation
+import org.eclipse.lsp4j.SignatureInformationCapabilities
+import org.eclipse.lsp4j.SymbolInformation
+import org.eclipse.lsp4j.SymbolKind
+import org.eclipse.lsp4j.SymbolKindCapabilities
+import org.eclipse.lsp4j.SynchronizationCapabilities
+import org.eclipse.lsp4j.TextDocumentClientCapabilities
+import org.eclipse.lsp4j.TextDocumentContentChangeEvent
+import org.eclipse.lsp4j.TextDocumentEdit
+import org.eclipse.lsp4j.TextDocumentIdentifier
+import org.eclipse.lsp4j.TextEdit
+import org.eclipse.lsp4j.TypeDefinitionCapabilities
+import org.eclipse.lsp4j.VersionedTextDocumentIdentifier
+import org.eclipse.lsp4j.WorkDoneProgressCancelParams
+import org.eclipse.lsp4j.WorkDoneProgressCreateParams
+import org.eclipse.lsp4j.WorkDoneProgressEnd
+import org.eclipse.lsp4j.WorkDoneProgressNotification
+import org.eclipse.lsp4j.WorkspaceClientCapabilities
+import org.eclipse.lsp4j.WorkspaceEdit
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler
+import org.eclipse.lsp4j.jsonrpc.messages.Either
+import org.eclipse.lsp4j.jsonrpc.messages.Message
+import org.eclipse.lsp4j.jsonrpc.messages.MessageIssue
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
+import org.eclipse.lsp4j.jsonrpc.messages.Tuple
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints
+import org.eclipse.lsp4j.services.LanguageClient
+import org.eclipse.lsp4j.services.LanguageServer
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+import org.junit.Before
+import org.junit.Test
+
+import static org.junit.Assert.*
+
+class JsonParseTest {
+
+ /**
+ * Gson parses numbers with {@link LazilyParsedNumber}, which is not
+ * equals-compatible with {@link Integer}.
+ */
+ @FinalFieldsConstructor
+ private static class MyInteger extends Number {
+
+ val int value
+
+ override doubleValue() { value }
+ override floatValue() { value }
+ override intValue() { value }
+ override longValue() { value }
+
+ override equals(Object obj) {
+ if (obj instanceof Number) {
+ return value as double == obj.doubleValue
+ }
+ return false
+ }
+
+ override hashCode() {
+ Integer.hashCode(value)
+ }
+
+ override toString() {
+ Integer.toString(value)
+ }
+
+ }
+
+ MessageJsonHandler jsonHandler
+
+ @Before
+ def void setup() {
+ val methods = ServiceEndpoints.getSupportedMethods(LanguageServer)
+ val clientMethods = ServiceEndpoints.getSupportedMethods(LanguageClient)
+ val all = new HashMap
+ all.putAll(methods)
+ all.putAll(clientMethods)
+ jsonHandler = new MessageJsonHandler(all)
+ }
+
+ private def void assertParse(CharSequence json, Message expected) {
+ val actual = jsonHandler.parseMessage(json)
+ assertEquals(expected.toString, actual.toString)
+ assertEquals(expected, actual)
+ }
+
+ @Test
+ def void testCompletion() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "textDocument/completion",
+ "params": {
+ "textDocument": {
+ "uri": "file:///tmp/foo"
+ },
+ "position": {
+ "line": 4,
+ "character": 22
+ }
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.DOC_COMPLETION
+ params = new CompletionParams => [
+ textDocument = new TextDocumentIdentifier => [
+ uri = "file:///tmp/foo"
+ ]
+ position = new Position => [
+ line = 4
+ character = 22
+ ]
+ ]
+ ])
+ }
+
+
+
+ @Test
+ def void testDidChange() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "method": "textDocument/didChange",
+ "params": {
+ "textDocument": {
+ "uri": "file:///tmp/foo",
+ "version": 1234
+ },
+ "contentChanges": [
+ {
+ "range": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ },
+ "rangeLength": 20,
+ "text": "bar"
+ }
+ ]
+ }
+ }
+ '''.assertParse(new NotificationMessage => [
+ jsonrpc = "2.0"
+ method = MessageMethods.DID_CHANGE_DOC
+ params = new DidChangeTextDocumentParams => [
+ textDocument = new VersionedTextDocumentIdentifier => [
+ uri = "file:///tmp/foo"
+ version = 1234
+ ]
+ contentChanges = new ArrayList => [
+ add(new TextDocumentContentChangeEvent => [
+ range = new Range => [
+ start = new Position(7, 12)
+ end = new Position(8, 16)
+ ]
+ rangeLength = 20
+ text = "bar"
+ ])
+ ]
+ ]
+ ])
+ }
+
+ @Test
+ def void testPublishDiagnostics() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "method": "textDocument/publishDiagnostics",
+ "params": {
+ "uri": "file:///tmp/foo",
+ "diagnostics": [
+ {
+ "message": "Couldn\u0027t resolve reference to State \u0027bar\u0027.",
+ "range": {
+ "start": {
+ "character": 22,
+ "line": 4
+ },
+ "end": {
+ "character": 25,
+ "line": 4
+ }
+ },
+ "severity": 1
+ }
+ ],
+ version: 1
+ }
+ }
+ '''.assertParse(new NotificationMessage => [
+ jsonrpc = "2.0"
+ method = MessageMethods.SHOW_DIAGNOSTICS
+ params = new PublishDiagnosticsParams => [
+ uri = "file:///tmp/foo"
+ diagnostics = new ArrayList => [
+ add(new Diagnostic => [
+ range = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ severity = DiagnosticSeverity.Error
+ message = "Couldn't resolve reference to State 'bar'."
+ ])
+ ]
+ version = 1
+ ]
+ ])
+ }
+
+ @Test
+ def void testDocumentSymbolResponse1() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_SYMBOL
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "name" : "foobar",
+ "kind" : 9,
+ "location" : {
+ "uri": "file:/baz.txt",
+ "range" : {
+ "start": {
+ "character": 22,
+ "line": 4
+ },
+ "end": {
+ "character": 25,
+ "line": 4
+ }
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = newArrayList(Either.forLeft(
+ new SymbolInformation => [
+ name = "foobar"
+ kind = SymbolKind.Constructor
+ location = new Location => [
+ uri = "file:/baz.txt"
+ range = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ ]
+ ]
+ ))
+ ])
+ }
+
+ @Test
+ def void testDocumentSymbolResponse2() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_SYMBOL
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "name" : "foobar",
+ "kind" : 9,
+ "range" : {
+ "start": {
+ "character": 22,
+ "line": 4
+ },
+ "end": {
+ "character": 25,
+ "line": 4
+ }
+ },
+ "selectionRange": {
+ "start": {
+ "character": 22,
+ "line": 4
+ },
+ "end": {
+ "character": 25,
+ "line": 4
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = newArrayList(Either.forRight(
+ new DocumentSymbol => [
+ name = "foobar"
+ kind = SymbolKind.Constructor
+ range = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ selectionRange = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ ]
+ ))
+ ])
+ }
+
+ @Test
+ def void testCodeActionResponse1() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_CODE_ACTION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "title": "fixme",
+ "command": "fix"
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = newArrayList(Either.forLeft(
+ new Command => [
+ title = "fixme"
+ command = "fix"
+ ]
+ ))
+ ])
+ }
+
+ @Test
+ def void testCodeActionResponse2() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_CODE_ACTION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "title": "fixme",
+ "kind": "fix",
+ "diagnostics": [],
+ "edit": {
+ "changes": {
+ "file:test1533196529126.lspt": [
+ {
+ "range": {
+ "start": {
+ "line": 0,
+ "character": 0
+ },
+ "end": {
+ "line": 0,
+ "character": 5
+ }
+ },
+ "newText": "fixed"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = newArrayList(Either.forRight(
+ new CodeAction => [
+ title = "fixme"
+ kind = "fix"
+ diagnostics = newArrayList
+ edit = new WorkspaceEdit => [
+ changes.put("file:test1533196529126.lspt", newArrayList(
+ new TextEdit => [
+ range = new Range => [
+ start = new Position(0, 0)
+ end = new Position(0, 5)
+ ]
+ newText = "fixed"
+ ]
+ ))
+ ]
+ ]
+ ))
+ ])
+ }
+
+ @Test
+ def void testCodeActionResponse3() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_CODE_ACTION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "title": "fixme"
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = newArrayList(Either.forRight(
+ new CodeAction => [
+ title = "fixme"
+ ]
+ ))
+ ])
+ }
+
+ @Test
+ def void testPrepareRenameResponse1() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_PREPARE_RENAME
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "range": {
+ "start": {
+ "character": 32,
+ "line": 3
+ },
+ "end": {
+ "character": 35,
+ "line": 3
+ }
+ },
+ "placeholder": "someVar"
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.forRight(new PrepareRenameResult => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ placeholder = "someVar"
+ ])
+ ])
+ }
+
+ @Test
+ def void testPrepareRenameResponse2() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_PREPARE_RENAME
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "start": {
+ "character": 32,
+ "line": 3
+ },
+ "end": {
+ "character": 35,
+ "line": 3
+ }
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.forLeft(new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ])
+ ])
+ }
+
+ @Test
+ def void testRenameResponse1() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_RENAME
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "changes": {
+ "file:///tmp/foo": [
+ {
+ "range": {
+ "start": {
+ "character": 32,
+ "line": 3
+ },
+ "end": {
+ "character": 35,
+ "line": 3
+ }
+ },
+ "newText": "foobar"
+ },
+ {
+ "range": {
+ "start": {
+ "character": 22,
+ "line": 4
+ },
+ "end": {
+ "character": 25,
+ "line": 4
+ }
+ },
+ "newText": "foobar"
+ }
+ ]
+ }
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new WorkspaceEdit => [
+ changes = new HashMap => [
+ put("file:///tmp/foo", newArrayList(
+ new TextEdit => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ newText = "foobar"
+ ],
+ new TextEdit => [
+ range = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ newText = "foobar"
+ ]
+ ))
+ ]
+ ]
+ ])
+ }
+
+ @Test
+ def void testRenameResponse3() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_RENAME
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "documentChanges": [
+ {
+ "kind": "create",
+ "uri": "file:/foo.txt",
+ "options": {
+ "overwrite": true,
+ "ignoreIfExists": true
+ }
+ },
+ {
+ "kind": "delete",
+ "uri": "file:/foo.txt"
+ },
+ {
+ "kind": "rename",
+ "oldUri": "file:/foo.txt",
+ "newUri": "file:/bar.txt"
+ },
+ {
+ "textDocument": {
+ "uri": "file:/baz.txt",
+ "version": 17
+ },
+ "edits": [
+ {
+ "range": {
+ "start": {
+ "character": 32,
+ "line": 3
+ },
+ "end": {
+ "character": 35,
+ "line": 3
+ }
+ },
+ "newText": "asdfqweryxcv"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new WorkspaceEdit => [
+ documentChanges = newArrayList(
+ Either.forRight((new CreateFile => [
+ uri = "file:/foo.txt"
+ options = new CreateFileOptions => [
+ overwrite = true
+ ignoreIfExists = true
+ ]
+ ]) as ResourceOperation),
+ Either.forRight((new DeleteFile => [
+ uri = "file:/foo.txt"
+ ]) as ResourceOperation),
+ Either.forRight((new RenameFile => [
+ oldUri = "file:/foo.txt"
+ newUri = "file:/bar.txt"
+ ]) as ResourceOperation),
+ Either.forLeft(new TextDocumentEdit => [
+ textDocument = new VersionedTextDocumentIdentifier("file:/baz.txt", 17)
+ edits = newArrayList(
+ new TextEdit => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ newText = "asdfqweryxcv"
+ ]
+ )
+ ])
+ )
+ ]
+ ])
+ }
+
+ @Test
+ def void testResponseError() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12':
+ 'textDocument/rename'
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "error": {
+ "code": -32600,
+ "message": "Could not parse request."
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ error = new ResponseError => [
+ code = ResponseErrorCode.InvalidRequest
+ message = "Could not parse request."
+ ]
+ ])
+ }
+
+ @Test
+ def void testTelemetry() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "method": "telemetry/event",
+ "params": {
+ "foo": 12.3,
+ "bar": "qwertz"
+ }
+ }
+ '''.assertParse(new NotificationMessage => [
+ jsonrpc = "2.0"
+ method = MessageMethods.TELEMETRY_EVENT
+ params = newLinkedHashMap('foo' -> 12.3, 'bar' -> 'qwertz')
+ ])
+ }
+
+ @Test
+ def void testHoverResponse1() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_HOVER
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "range": {
+ "start": {
+ "character": 32,
+ "line": 3
+ },
+ "end": {
+ "character": 35,
+ "line": 3
+ }
+ },
+ "contents": [
+ "foo",
+ "boo shuby doo"
+ ]
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new Hover => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ contents = newArrayList(
+ Either.forLeft("foo"),
+ Either.forLeft("boo shuby doo")
+ )
+ ]
+ ])
+ }
+
+ @Test
+ def void testHoverResponse2() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_HOVER
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "contents": {
+ "kind": "plaintext",
+ "value": "foo"
+ }
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new Hover => [
+ contents = new MarkupContent => [
+ kind = "plaintext"
+ value = "foo"
+ ]
+ ]
+ ])
+ }
+
+ @Test
+ def void testHoverResponse3() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_HOVER
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "contents": "foo"
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new Hover => [
+ contents = newArrayList(Either.forLeft("foo"))
+ ]
+ ])
+ }
+
+ @Test
+ def void testHoverResponse4() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_HOVER
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "contents": {
+ "language": "plaintext",
+ "value": "foo"
+ }
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new Hover => [
+ contents = newArrayList(Either.forRight(new MarkedString => [
+ language = "plaintext"
+ value = "foo"
+ ]))
+ ]
+ ])
+ }
+
+ @Test
+ def void testCodeLensResponse() {
+ val json = '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "range": {
+ "start": {
+ "character": 32,
+ "line": 3
+ },
+ "end": {
+ "character": 35,
+ "line": 3
+ }
+ },
+ "command": {
+ "title": "save",
+ "command": "saveCommand",
+ "arguments": [
+ {
+ "uri": "file:/foo",
+ "version": 5
+ }
+ ]
+ },
+ "data": [
+ 42,
+ "qwert",
+ {
+ "key": "value"
+ }
+ ]
+ }
+ }
+ '''
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_CODE_LENS
+ }
+ ]
+ val message = jsonHandler.parseMessage(json)
+ assertTrue("Expected a ResponseMessage", message instanceof ResponseMessage)
+ val response = message as ResponseMessage
+ assertTrue("Expected a Collection in result", response.result instanceof Collection<?>)
+ val result = response.result as Collection<?>
+ assertTrue("Expected a CodeLens in result[0]", result.head instanceof CodeLens)
+ val codeLens = result.head as CodeLens
+ assertNotNull(codeLens.command)
+ val argument = codeLens.command.arguments.head
+ assertTrue("Expected a JsonObject in command.arguments[0]", argument instanceof JsonObject)
+ assertEquals("file:/foo", (argument as JsonObject).get("uri").asString)
+ assertEquals(5, (argument as JsonObject).get("version").asInt)
+ assertTrue("Expected a JsonArray in data", codeLens.data instanceof JsonArray)
+ val data = codeLens.data as JsonArray
+ assertEquals(42, data.get(0).asInt)
+ assertEquals("qwert", data.get(1).asString)
+ assertTrue("Expected a JsonObject in data[2]", data.get(2) instanceof JsonObject)
+ assertEquals("value", (data.get(2) as JsonObject).get("key").asString)
+ }
+
+ @Test
+ def void testDeclarationResponse() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_DECLARATION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "uri": "foo",
+ "range": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.<List<? extends Location>, List<? extends LocationLink>>forLeft(#[
+ new Location('foo', new Range(new Position(7, 12), new Position(8, 16)))
+ ])
+ ])
+
+ }
+
+ @Test
+ def void testItemInsteadOfListResponse() {
+ //test parse direct item without the list
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_DECLARATION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "uri": "foo",
+ "range": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ }
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.<List<? extends Location>, List<? extends LocationLink>>forLeft(#[
+ new Location('foo', new Range(new Position(7, 12), new Position(8, 16)))
+ ])
+ ])
+ }
+
+ @Test
+ def void testDefinitionResponse1() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_DEFINITION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "targetUri": "foo",
+ "targetRange": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.<List<? extends Location>, List<? extends LocationLink>>forRight(#[
+ new LocationLink => [
+ targetUri = 'foo'
+ targetRange = new Range(new Position(7, 12), new Position(8, 16))
+ ]
+ ])
+ ])
+ }
+
+ @Test
+ def void testDefinitionResponse2() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_DEFINITION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": []
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.<List<? extends Location>, List<? extends LocationLink>>forLeft(emptyList)
+ ])
+ }
+
+ @Test
+ def void testTypeDefinitionResponse() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_TYPE_DEFINITION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "uri": "foo",
+ "range": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.<List<? extends Location>, List<? extends LocationLink>>forLeft(#[
+ new Location('foo', new Range(new Position(7, 12), new Position(8, 16)))
+ ])
+ ])
+ }
+
+ @Test
+ def void testImplementationResponse() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_IMPLEMENTATION
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": [
+ {
+ "targetUri": "foo",
+ "targetRange": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ }
+ }
+ ]
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = Either.<List<? extends Location>, List<? extends LocationLink>>forRight(#[
+ new LocationLink => [
+ targetUri = 'foo'
+ targetRange = new Range(new Position(7, 12), new Position(8, 16))
+ ]
+ ])
+ ])
+ }
+
+ @Test
+ def void testSignatureHelpResponse() {
+ jsonHandler.methodProvider = [ id |
+ switch id {
+ case '12': MessageMethods.DOC_SIGNATURE_HELP
+ }
+ ]
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "signatures": [
+ {
+ "label": "Foo",
+ "parameters": [
+ {
+ "label": "label1"
+ },
+ {
+ "label": [12, 25]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ '''.assertParse(new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new SignatureHelp => [
+ signatures = #[
+ new SignatureInformation => [
+ label = "Foo"
+ parameters = #[
+ new ParameterInformation => [
+ label = Either.forLeft("label1")
+ ],
+ new ParameterInformation => [
+ label = Either.forRight(Tuple.two(12, 25))
+ ]
+ ]
+ ]
+ ]
+ ]
+ ])
+ }
+
+ @Test
+ def void testDocumentFormatting() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "method": "textDocument/formatting",
+ "params": {
+ "textDocument": {
+ "uri": "file:///tmp/foo"
+ },
+ "options": {
+ "insertSpaces": false,
+ "tabSize": 4,
+ "customProperty": -7
+ }
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ method = MessageMethods.DOC_FORMATTING
+ params = new DocumentFormattingParams => [
+ textDocument = new TextDocumentIdentifier("file:///tmp/foo")
+ options = new FormattingOptions => [
+ insertSpaces = false
+ putNumber('tabSize', new MyInteger(4))
+ putNumber('customProperty', new MyInteger(-7))
+ ]
+ ]
+ ])
+ }
+
+ @Test
+ def void testMessageIssue() {
+ val issue = jsonHandler.gson.fromJson('''
+ {
+ "text": "Howdy!",
+ "code": 1234,
+ "cause": {
+ "message": "Foo",
+ "cause": {
+ "message": "Bar"
+ }
+ }
+ }
+ ''', MessageIssue)
+ assertEquals('Howdy!', issue.text)
+ assertEquals(1234, issue.issueCode)
+ assertEquals('Foo', issue.cause.message)
+ assertEquals('Bar', issue.cause.cause.message)
+ }
+
+ @Test
+ def void testInitialize() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "initialize",
+ "params": {
+ "rootUri": "file:///tmp/foo"
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.INITIALIZE
+ params = new InitializeParams => [
+ rootUri = "file:///tmp/foo"
+ ]
+ ])
+ }
+
+ @Test
+ def void testInitializeClientCapabilities() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "initialize",
+ "params": {
+ "rootUri": "file:///tmp/foo",
+ "capabilities": {
+ "textDocument": {
+ "synchronization": {
+ "dynamicRegistration": false,
+ "willSave": true,
+ "willSaveWaitUntil": false,
+ "didSave": true
+ },
+ "completion": {
+ "dynamicRegistration": false,
+ "completionItem": {
+ "snippetSupport": true,
+ "commitCharactersSupport": true,
+ "documentationFormat": ["plaintext", "markdown"]
+ },
+ "completionItemKind": {
+ "valueSet": [2, 3]
+ },
+ "contextSupport": false
+ },
+ "hover": {
+ "dynamicRegistration": false,
+ "contentFormat": ["plaintext", "markdown"]
+ },
+ "signatureHelp": {
+ "dynamicRegistration": false,
+ "signatureInformation": {
+ "documentationFormat": ["plaintext", "markdown"]
+ }
+ },
+ "references": {
+ "dynamicRegistration": false
+ },
+ "documentHighlight": {
+ "dynamicRegistration": false
+ },
+ "documentSymbol": {
+ "dynamicRegistration": false,
+ "symbolKind": {
+ valueSet: [2, 3, 4, 5]
+ }
+ },
+ "formatting": {
+ "dynamicRegistration": false
+ },
+ "rangeFormatting": {
+ "dynamicRegistration": false
+ },
+ "onTypeFormatting": {
+ "dynamicRegistration": false
+ },
+ "definition": {
+ "dynamicRegistration": false
+ },
+ "typeDefinition": {
+ "dynamicRegistration": false
+ },
+ "implementation": {
+ "dynamicRegistration": false
+ },
+ "codeAction": {
+ "dynamicRegistration": false
+ },
+ "codeLens": {
+ "dynamicRegistration": false
+ },
+ "documentLink": {
+ "dynamicRegistration": false
+ },
+ "colorProvider": {
+ "dynamicRegistration": false
+ },
+ "rename": {
+ "dynamicRegistration": false
+ }
+ },
+ "workspace": {}
+ }
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.INITIALIZE
+ params = new InitializeParams => [
+ rootUri = "file:///tmp/foo"
+ capabilities = new ClientCapabilities => [
+ textDocument = new TextDocumentClientCapabilities => [
+ synchronization = new SynchronizationCapabilities => [
+ dynamicRegistration = false
+ willSave= true
+ willSaveWaitUntil= false
+ didSave = true
+ ]
+ completion = new CompletionCapabilities => [
+ dynamicRegistration = false
+ completionItem = new CompletionItemCapabilities => [
+ snippetSupport = true
+ commitCharactersSupport = true
+ documentationFormat = #[MarkupKind.PLAINTEXT, MarkupKind.MARKDOWN]
+ ]
+ completionItemKind = new CompletionItemKindCapabilities => [
+ valueSet = #[CompletionItemKind.Method, CompletionItemKind.Function]
+ ]
+ contextSupport = false
+ ]
+ hover = new HoverCapabilities => [
+ dynamicRegistration = false
+ contentFormat = #[MarkupKind.PLAINTEXT, MarkupKind.MARKDOWN]
+ ]
+ signatureHelp = new SignatureHelpCapabilities => [
+ dynamicRegistration = false
+ signatureInformation = new SignatureInformationCapabilities => [
+ documentationFormat = #[MarkupKind.PLAINTEXT, MarkupKind.MARKDOWN]
+ ]
+ ]
+ references = new ReferencesCapabilities => [
+ dynamicRegistration = false
+ ]
+ documentHighlight = new DocumentHighlightCapabilities => [
+ dynamicRegistration = false
+ ]
+ documentSymbol = new DocumentSymbolCapabilities => [
+ dynamicRegistration = false
+ symbolKind = new SymbolKindCapabilities => [
+ valueSet = #[SymbolKind.Module, SymbolKind.Namespace, SymbolKind.Package, SymbolKind.Class]
+ ]
+ ]
+ formatting = new FormattingCapabilities => [
+ dynamicRegistration = false
+ ]
+ rangeFormatting = new RangeFormattingCapabilities => [
+ dynamicRegistration = false
+ ]
+ onTypeFormatting = new OnTypeFormattingCapabilities => [
+ dynamicRegistration = false
+ ]
+ definition= new DefinitionCapabilities => [
+ dynamicRegistration = false
+ ]
+ typeDefinition= new TypeDefinitionCapabilities => [
+ dynamicRegistration = false
+ ]
+ implementation= new ImplementationCapabilities => [
+ dynamicRegistration = false
+ ]
+ codeAction = new CodeActionCapabilities => [
+ dynamicRegistration = false
+ ]
+ codeLens= new CodeLensCapabilities => [
+ dynamicRegistration = false
+ ]
+ documentLink= new DocumentLinkCapabilities => [
+ dynamicRegistration = false
+ ]
+ colorProvider = new ColorProviderCapabilities => [
+ dynamicRegistration = false
+ ]
+ rename = new RenameCapabilities => [
+ dynamicRegistration = false
+ ]
+ ]
+ workspace = new WorkspaceClientCapabilities
+ ]
+ ]
+ ])
+ }
+
+
+
+ @Test
+ def void testProgressCreate() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "window/workDoneProgress/create",
+ "params": {
+ "token": "progress-token"
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.PROGRESS_CREATE
+ params = new WorkDoneProgressCreateParams => [
+ token = Either.forLeft("progress-token")
+ ]
+ ])
+
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "window/workDoneProgress/create",
+ "params": {
+ "token": 1234
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.PROGRESS_CREATE
+ params = new WorkDoneProgressCreateParams => [
+ token = Either.forRight(1234)
+ ]
+ ])
+ }
+
+ @Test
+ def void testProgressCancel() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "window/workDoneProgress/cancel",
+ "params": {
+ "token": "progress-token"
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.PROGRESS_CANCEL
+ params = new WorkDoneProgressCancelParams => [
+ token = Either.forLeft("progress-token")
+ ]
+ ])
+
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "window/workDoneProgress/cancel",
+ "params": {
+ "token": 1234
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.PROGRESS_CANCEL
+ params = new WorkDoneProgressCancelParams => [
+ token = Either.forRight(1234)
+ ]
+ ])
+ }
+
+ @Test
+ def void testProgressNotify() {
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "$/progress",
+ "params": {
+ "token": "progress-token",
+ "value": {
+ "kind": "end",
+ "message": "message"
+ }
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.PROGRESS_NOTIFY
+ params = new ProgressParams => [
+ token = Either.forLeft("progress-token")
+ value = Either.<WorkDoneProgressNotification, Object>forLeft(new WorkDoneProgressEnd => [
+ message = "message"
+ ])
+ ]
+ ])
+
+ '''
+ {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "$/progress",
+ "params": {
+ "token": 1234,
+ "value": {
+ "foo": "bar"
+ }
+ }
+ }
+ '''.assertParse(new RequestMessage => [
+ jsonrpc = "2.0"
+ id = 1
+ method = MessageMethods.PROGRESS_NOTIFY
+ params = new ProgressParams => [
+ token = Either.forRight(1234)
+ value = Either.<WorkDoneProgressNotification, Object>forRight(new JsonObject => [
+ addProperty("foo", "bar")
+ ])
+ ]
+ ])
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/services/JsonSerializeTest.xtend b/javatests/org/eclipse/lsp4j/services/JsonSerializeTest.xtend
new file mode 100644
index 0000000..2f94e14
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/JsonSerializeTest.xtend
@@ -0,0 +1,932 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services
+
+import com.google.gson.JsonObject
+import java.util.ArrayList
+import java.util.HashMap
+import org.eclipse.lsp4j.ClientCapabilities
+import org.eclipse.lsp4j.CodeActionCapabilities
+import org.eclipse.lsp4j.CodeLens
+import org.eclipse.lsp4j.CodeLensCapabilities
+import org.eclipse.lsp4j.ColorProviderCapabilities
+import org.eclipse.lsp4j.Command
+import org.eclipse.lsp4j.CompletionCapabilities
+import org.eclipse.lsp4j.CompletionItem
+import org.eclipse.lsp4j.CompletionItemCapabilities
+import org.eclipse.lsp4j.CompletionItemKind
+import org.eclipse.lsp4j.CompletionItemKindCapabilities
+import org.eclipse.lsp4j.CompletionList
+import org.eclipse.lsp4j.DefinitionCapabilities
+import org.eclipse.lsp4j.Diagnostic
+import org.eclipse.lsp4j.DiagnosticSeverity
+import org.eclipse.lsp4j.DidChangeTextDocumentParams
+import org.eclipse.lsp4j.DocumentFormattingParams
+import org.eclipse.lsp4j.DocumentHighlightCapabilities
+import org.eclipse.lsp4j.DocumentLinkCapabilities
+import org.eclipse.lsp4j.DocumentSymbolCapabilities
+import org.eclipse.lsp4j.FormattingCapabilities
+import org.eclipse.lsp4j.FormattingOptions
+import org.eclipse.lsp4j.Hover
+import org.eclipse.lsp4j.HoverCapabilities
+import org.eclipse.lsp4j.ImplementationCapabilities
+import org.eclipse.lsp4j.InitializeParams
+import org.eclipse.lsp4j.InitializeResult
+import org.eclipse.lsp4j.MarkupContent
+import org.eclipse.lsp4j.MarkupKind
+import org.eclipse.lsp4j.OnTypeFormattingCapabilities
+import org.eclipse.lsp4j.Position
+import org.eclipse.lsp4j.ProgressParams
+import org.eclipse.lsp4j.PublishDiagnosticsParams
+import org.eclipse.lsp4j.Range
+import org.eclipse.lsp4j.RangeFormattingCapabilities
+import org.eclipse.lsp4j.ReferencesCapabilities
+import org.eclipse.lsp4j.RenameCapabilities
+import org.eclipse.lsp4j.ServerCapabilities
+import org.eclipse.lsp4j.SignatureHelpCapabilities
+import org.eclipse.lsp4j.SignatureInformationCapabilities
+import org.eclipse.lsp4j.SymbolKind
+import org.eclipse.lsp4j.SymbolKindCapabilities
+import org.eclipse.lsp4j.SynchronizationCapabilities
+import org.eclipse.lsp4j.TextDocumentClientCapabilities
+import org.eclipse.lsp4j.TextDocumentContentChangeEvent
+import org.eclipse.lsp4j.TextDocumentIdentifier
+import org.eclipse.lsp4j.TextDocumentPositionParams
+import org.eclipse.lsp4j.TextEdit
+import org.eclipse.lsp4j.TypeDefinitionCapabilities
+import org.eclipse.lsp4j.VersionedTextDocumentIdentifier
+import org.eclipse.lsp4j.WorkDoneProgressCancelParams
+import org.eclipse.lsp4j.WorkDoneProgressCreateParams
+import org.eclipse.lsp4j.WorkDoneProgressEnd
+import org.eclipse.lsp4j.WorkDoneProgressNotification
+import org.eclipse.lsp4j.WorkspaceClientCapabilities
+import org.eclipse.lsp4j.WorkspaceEdit
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler
+import org.eclipse.lsp4j.jsonrpc.messages.Either
+import org.eclipse.lsp4j.jsonrpc.messages.Message
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseError
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints
+import org.eclipse.lsp4j.services.LanguageServer
+import org.junit.Before
+import org.junit.Test
+
+import static org.junit.Assert.*
+
+import static extension org.eclipse.lsp4j.test.services.LineEndings.*
+
+class JsonSerializeTest {
+
+ MessageJsonHandler jsonHandler
+
+ @Before
+ def void setup() {
+ val methods = ServiceEndpoints.getSupportedMethods(LanguageServer)
+ jsonHandler = new MessageJsonHandler(methods) [
+ setPrettyPrinting()
+ ]
+ }
+
+ private def assertSerialize(Message message, CharSequence expected) {
+ assertEquals(expected.toString.trim, jsonHandler.serialize(message).toSystemLineEndings)
+ }
+
+ @Test
+ def void testCompletion() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.DOC_COMPLETION
+ params = new TextDocumentPositionParams => [
+ textDocument = new TextDocumentIdentifier("file:///tmp/foo")
+ position = new Position(4, 22)
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "textDocument/completion",
+ "params": {
+ "textDocument": {
+ "uri": "file:///tmp/foo"
+ },
+ "position": {
+ "line": 4,
+ "character": 22
+ }
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testInit() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.INITIALIZE
+ params = new InitializeParams => [
+ rootUri = "file:///tmp/foo"
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "initialize",
+ "params": {
+ "processId": null,
+ "rootUri": "file:///tmp/foo"
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testInitClientCapabilities() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.INITIALIZE
+ params = new InitializeParams => [
+ rootUri = "file:///tmp/foo"
+ capabilities = new ClientCapabilities => [
+ textDocument = new TextDocumentClientCapabilities => [
+ synchronization = new SynchronizationCapabilities => [
+ dynamicRegistration = false
+ willSave= true
+ willSaveWaitUntil= false
+ didSave = true
+ ]
+ completion = new CompletionCapabilities => [
+ dynamicRegistration = false
+ completionItem = new CompletionItemCapabilities => [
+ snippetSupport = true
+ commitCharactersSupport = true
+ documentationFormat = #[MarkupKind.PLAINTEXT, MarkupKind.MARKDOWN]
+ ]
+ completionItemKind = new CompletionItemKindCapabilities => [
+ valueSet = #[CompletionItemKind.Method, CompletionItemKind.Function]
+ ]
+ contextSupport = false
+ ]
+ hover = new HoverCapabilities => [
+ dynamicRegistration = false
+ contentFormat = #[MarkupKind.PLAINTEXT, MarkupKind.MARKDOWN]
+ ]
+ signatureHelp = new SignatureHelpCapabilities => [
+ dynamicRegistration = false
+ signatureInformation = new SignatureInformationCapabilities => [
+ documentationFormat = #[MarkupKind.PLAINTEXT, MarkupKind.MARKDOWN]
+ ]
+ ]
+ references = new ReferencesCapabilities => [
+ dynamicRegistration = false
+ ]
+ documentHighlight = new DocumentHighlightCapabilities => [
+ dynamicRegistration = false
+ ]
+ documentSymbol = new DocumentSymbolCapabilities => [
+ dynamicRegistration = false
+ symbolKind = new SymbolKindCapabilities => [
+ valueSet = #[SymbolKind.Module, SymbolKind.Namespace, SymbolKind.Package, SymbolKind.Class]
+ ]
+ ]
+ formatting = new FormattingCapabilities => [
+ dynamicRegistration = false
+ ]
+ rangeFormatting = new RangeFormattingCapabilities => [
+ dynamicRegistration = false
+ ]
+ onTypeFormatting = new OnTypeFormattingCapabilities => [
+ dynamicRegistration = false
+ ]
+ definition= new DefinitionCapabilities => [
+ dynamicRegistration = false
+ ]
+ typeDefinition= new TypeDefinitionCapabilities => [
+ dynamicRegistration = false
+ ]
+ implementation= new ImplementationCapabilities => [
+ dynamicRegistration = false
+ ]
+ codeAction = new CodeActionCapabilities => [
+ dynamicRegistration = false
+ ]
+ codeLens= new CodeLensCapabilities => [
+ dynamicRegistration = false
+ ]
+ documentLink= new DocumentLinkCapabilities => [
+ dynamicRegistration = false
+ ]
+ colorProvider = new ColorProviderCapabilities => [
+ dynamicRegistration = false
+ ]
+ rename = new RenameCapabilities => [
+ dynamicRegistration = false
+ ]
+ ]
+ workspace = new WorkspaceClientCapabilities
+ ]
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "initialize",
+ "params": {
+ "processId": null,
+ "rootUri": "file:///tmp/foo",
+ "capabilities": {
+ "workspace": {},
+ "textDocument": {
+ "synchronization": {
+ "willSave": true,
+ "willSaveWaitUntil": false,
+ "didSave": true,
+ "dynamicRegistration": false
+ },
+ "completion": {
+ "completionItem": {
+ "snippetSupport": true,
+ "commitCharactersSupport": true,
+ "documentationFormat": [
+ "plaintext",
+ "markdown"
+ ]
+ },
+ "completionItemKind": {
+ "valueSet": [
+ 2,
+ 3
+ ]
+ },
+ "contextSupport": false,
+ "dynamicRegistration": false
+ },
+ "hover": {
+ "contentFormat": [
+ "plaintext",
+ "markdown"
+ ],
+ "dynamicRegistration": false
+ },
+ "signatureHelp": {
+ "signatureInformation": {
+ "documentationFormat": [
+ "plaintext",
+ "markdown"
+ ]
+ },
+ "dynamicRegistration": false
+ },
+ "references": {
+ "dynamicRegistration": false
+ },
+ "documentHighlight": {
+ "dynamicRegistration": false
+ },
+ "documentSymbol": {
+ "symbolKind": {
+ "valueSet": [
+ 2,
+ 3,
+ 4,
+ 5
+ ]
+ },
+ "dynamicRegistration": false
+ },
+ "formatting": {
+ "dynamicRegistration": false
+ },
+ "rangeFormatting": {
+ "dynamicRegistration": false
+ },
+ "onTypeFormatting": {
+ "dynamicRegistration": false
+ },
+ "definition": {
+ "dynamicRegistration": false
+ },
+ "typeDefinition": {
+ "dynamicRegistration": false
+ },
+ "implementation": {
+ "dynamicRegistration": false
+ },
+ "codeAction": {
+ "dynamicRegistration": false
+ },
+ "codeLens": {
+ "dynamicRegistration": false
+ },
+ "documentLink": {
+ "dynamicRegistration": false
+ },
+ "colorProvider": {
+ "dynamicRegistration": false
+ },
+ "rename": {
+ "dynamicRegistration": false
+ }
+ }
+ }
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testInitResponse() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = 12
+ result = new InitializeResult => [
+ capabilities = new ServerCapabilities
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": 12,
+ "result": {
+ "capabilities": {}
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testDidChange() {
+ val message = new NotificationMessage => [
+ jsonrpc = "2.0"
+ method = MessageMethods.DID_CHANGE_DOC
+ params = new DidChangeTextDocumentParams => [
+ textDocument = new VersionedTextDocumentIdentifier => [
+ uri = "file:///tmp/foo"
+ ]
+ contentChanges = new ArrayList => [
+ add(new TextDocumentContentChangeEvent => [
+ range = new Range => [
+ start = new Position(7, 12)
+ end = new Position(8, 16)
+ ]
+ rangeLength = 20
+ text = "bar"
+ ])
+ ]
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "method": "textDocument/didChange",
+ "params": {
+ "textDocument": {
+ "version": null,
+ "uri": "file:///tmp/foo"
+ },
+ "contentChanges": [
+ {
+ "range": {
+ "start": {
+ "line": 7,
+ "character": 12
+ },
+ "end": {
+ "line": 8,
+ "character": 16
+ }
+ },
+ "rangeLength": 20,
+ "text": "bar"
+ }
+ ]
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testPublishDiagnostics() {
+ val message = new NotificationMessage => [
+ jsonrpc = "2.0"
+ method = MessageMethods.SHOW_DIAGNOSTICS
+ params = new PublishDiagnosticsParams => [
+ uri = "file:///tmp/foo"
+ diagnostics = new ArrayList => [
+ add(new Diagnostic => [
+ range = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ severity = DiagnosticSeverity.Error
+ message = "Couldn't resolve reference to State 'bar'."
+ ])
+ ]
+ version = 1
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "method": "textDocument/publishDiagnostics",
+ "params": {
+ "uri": "file:///tmp/foo",
+ "diagnostics": [
+ {
+ "range": {
+ "start": {
+ "line": 4,
+ "character": 22
+ },
+ "end": {
+ "line": 4,
+ "character": 25
+ }
+ },
+ "severity": 1,
+ "message": "Couldn\u0027t resolve reference to State \u0027bar\u0027."
+ }
+ ],
+ "version": 1
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testRenameResponse() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new WorkspaceEdit => [
+ changes = new HashMap => [
+ put("file:///tmp/foo", newArrayList(
+ new TextEdit => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ newText = "foobar"
+ ],
+ new TextEdit => [
+ range = new Range => [
+ start = new Position(4, 22)
+ end = new Position(4, 25)
+ ]
+ newText = "foobar"
+ ]
+ ))
+ ]
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "changes": {
+ "file:///tmp/foo": [
+ {
+ "range": {
+ "start": {
+ "line": 3,
+ "character": 32
+ },
+ "end": {
+ "line": 3,
+ "character": 35
+ }
+ },
+ "newText": "foobar"
+ },
+ {
+ "range": {
+ "start": {
+ "line": 4,
+ "character": 22
+ },
+ "end": {
+ "line": 4,
+ "character": 25
+ }
+ },
+ "newText": "foobar"
+ }
+ ]
+ }
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testHoverResponse1() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new Hover => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ contents = newArrayList(
+ Either.forLeft("foo"),
+ Either.forLeft("boo shuby doo")
+ )
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "contents": [
+ "foo",
+ "boo shuby doo"
+ ],
+ "range": {
+ "start": {
+ "line": 3,
+ "character": 32
+ },
+ "end": {
+ "line": 3,
+ "character": 35
+ }
+ }
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testHoverResponse2() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new Hover => [
+ contents = new MarkupContent => [
+ kind = "plaintext"
+ value = "foo"
+ ]
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "contents": {
+ "kind": "plaintext",
+ "value": "foo"
+ }
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testCodeLensResponse() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new CodeLens => [
+ range = new Range => [
+ start = new Position(3, 32)
+ end = new Position(3, 35)
+ ]
+ command = new Command => [
+ title = 'save'
+ command = 'saveCommand'
+ arguments = <Object>newArrayList(
+ new JsonObject => [
+ addProperty('uri', 'file:/foo')
+ addProperty('version', 5)
+ ]
+ )
+ ]
+ data = <Object>newArrayList(
+ 42,
+ 'qwert',
+ new JsonObject => [
+ addProperty('key', 'value')
+ ]
+ )
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "range": {
+ "start": {
+ "line": 3,
+ "character": 32
+ },
+ "end": {
+ "line": 3,
+ "character": 35
+ }
+ },
+ "command": {
+ "title": "save",
+ "command": "saveCommand",
+ "arguments": [
+ {
+ "uri": "file:/foo",
+ "version": 5
+ }
+ ]
+ },
+ "data": [
+ 42,
+ "qwert",
+ {
+ "key": "value"
+ }
+ ]
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testResponseError() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ error = new ResponseError => [
+ code = ResponseErrorCode.InvalidRequest
+ message = "Could not parse request."
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "error": {
+ "code": -32600,
+ "message": "Could not parse request."
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testCompletionResponse() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ result = new CompletionList => [
+ isIncomplete = true
+ items = #[
+ new CompletionItem => [
+ label = 'foo'
+ ]
+ ]
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": {
+ "isIncomplete": true,
+ "items": [
+ {
+ "label": "foo"
+ }
+ ]
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testDocumentFormatting() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ method = MessageMethods.DOC_FORMATTING
+ params = new DocumentFormattingParams => [
+ textDocument = new TextDocumentIdentifier("file:///tmp/foo")
+ options = new FormattingOptions => [
+ tabSize = 4
+ insertSpaces = false
+ ]
+ options.putNumber('customProperty', -7)
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "method": "textDocument/formatting",
+ "params": {
+ "textDocument": {
+ "uri": "file:///tmp/foo"
+ },
+ "options": {
+ "tabSize": 4,
+ "insertSpaces": false,
+ "customProperty": -7
+ }
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testTelemetry() {
+ val message = new NotificationMessage => [
+ jsonrpc = "2.0"
+ method = MessageMethods.TELEMETRY_EVENT
+ params = new TestObject
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "method": "telemetry/event",
+ "params": {
+ "foo": 12.3,
+ "bar": "qwertz"
+ }
+ }
+ ''')
+ }
+
+ private static class TestObject {
+ package double foo = 12.3
+ package String bar = "qwertz"
+ }
+
+ @Test
+ def void testNullResponse() {
+ val message = new ResponseMessage => [
+ jsonrpc = "2.0"
+ id = "12"
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "12",
+ "result": null
+ }
+ ''')
+ }
+
+ @Test
+ def void testProgressCreate() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.PROGRESS_CREATE
+ params = new WorkDoneProgressCreateParams => [
+ token = Either.forLeft("progress-token")
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "window/workDoneProgress/create",
+ "params": {
+ "token": "progress-token"
+ }
+ }
+ ''')
+
+ val message2 = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.PROGRESS_CREATE
+ params = new WorkDoneProgressCreateParams => [
+ token = Either.forRight(1234)
+ ]
+ ]
+ message2.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "window/workDoneProgress/create",
+ "params": {
+ "token": 1234
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testProgressCancel() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.PROGRESS_CANCEL
+ params = new WorkDoneProgressCancelParams => [
+ token = Either.forLeft("progress-token")
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "window/workDoneProgress/cancel",
+ "params": {
+ "token": "progress-token"
+ }
+ }
+ ''')
+
+ val message2 = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.PROGRESS_CANCEL
+ params = new WorkDoneProgressCancelParams => [
+ token = Either.forRight(1234)
+ ]
+ ]
+ message2.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "window/workDoneProgress/cancel",
+ "params": {
+ "token": 1234
+ }
+ }
+ ''')
+ }
+
+ @Test
+ def void testProgressNotify() {
+ val message = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.PROGRESS_NOTIFY
+ params = new ProgressParams => [
+ token = Either.forLeft("progress-token")
+ value = Either.<WorkDoneProgressNotification, Object>forLeft(new WorkDoneProgressEnd => [
+ message = "message"
+ ])
+ ]
+ ]
+ message.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "$/progress",
+ "params": {
+ "token": "progress-token",
+ "value": {
+ "kind": "end",
+ "message": "message"
+ }
+ }
+ }
+ ''')
+
+ val message2 = new RequestMessage => [
+ jsonrpc = "2.0"
+ id = "1"
+ method = MessageMethods.PROGRESS_NOTIFY
+ params = new ProgressParams => [
+ token = Either.forRight(1234)
+ value = Either.<WorkDoneProgressNotification, Object>forRight(new JsonObject => [
+ addProperty("foo", "bar")
+ ])
+ ]
+ ]
+ message2.assertSerialize('''
+ {
+ "jsonrpc": "2.0",
+ "id": "1",
+ "method": "$/progress",
+ "params": {
+ "token": 1234,
+ "value": {
+ "foo": "bar"
+ }
+ }
+ }
+ ''')
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/services/LineEndings.xtend b/javatests/org/eclipse/lsp4j/services/LineEndings.xtend
new file mode 100644
index 0000000..3b0640b
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/LineEndings.xtend
@@ -0,0 +1,27 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services
+
+import java.util.regex.Pattern
+import org.eclipse.xtend2.lib.StringConcatenation
+
+final class LineEndings {
+
+ static val LINE_ENDING_PAT = Pattern.compile('\\r?\\n')
+
+ private new() {}
+
+ static def toSystemLineEndings(CharSequence s) {
+ LINE_ENDING_PAT.matcher(s).replaceAll(StringConcatenation.DEFAULT_LINE_DELIMITER)
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/services/MessageMethods.xtend b/javatests/org/eclipse/lsp4j/services/MessageMethods.xtend
new file mode 100644
index 0000000..3ee65cd
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/MessageMethods.xtend
@@ -0,0 +1,56 @@
+/******************************************************************************
+ * Copyright (c) 2016-2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services
+
+interface MessageMethods {
+
+ public static val INITIALIZE = 'initialize'
+ public static val SHUTDOWN = 'shutdown'
+ public static val EXIT = 'exit'
+ public static val DOC_COMPLETION = 'textDocument/completion'
+ public static val RESOLVE_COMPLETION = 'completionItem/resolve'
+ public static val DOC_HOVER = 'textDocument/hover'
+ public static val DOC_SIGNATURE_HELP = 'textDocument/signatureHelp'
+ public static val DOC_DECLARATION = 'textDocument/declaration'
+ public static val DOC_DEFINITION = 'textDocument/definition'
+ public static val DOC_TYPE_DEFINITION = 'textDocument/typeDefinition'
+ public static val DOC_IMPLEMENTATION = 'textDocument/implementation'
+ public static val DOC_HIGHLIGHT = 'textDocument/documentHighlight'
+ public static val DOC_REFERENCES = 'textDocument/references'
+ public static val DOC_SYMBOL = 'textDocument/documentSymbol'
+ public static val DOC_CODE_ACTION = 'textDocument/codeAction'
+ public static val DOC_CODE_LENS = 'textDocument/codeLens'
+ public static val RESOLVE_CODE_LENS = 'codeLens/resolve'
+ public static val DOC_FOLDING_RANGE = 'textDocument/foldingRange'
+ public static val DOC_FORMATTING = 'textDocument/formatting'
+ public static val DOC_RANGE_FORMATTING = 'textDocument/rangeFormatting'
+ public static val DOC_TYPE_FORMATTING = 'textDocument/onTypeFormatting'
+ public static val DOC_PREPARE_RENAME = 'textDocument/prepareRename'
+ public static val DOC_RENAME = 'textDocument/rename'
+ public static val WORKSPACE_SYMBOL = 'workspace/symbol'
+
+ public static val DID_OPEN_DOC = 'textDocument/didOpen'
+ public static val DID_CLOSE_DOC = 'textDocument/didClose'
+ public static val DID_CHANGE_DOC = 'textDocument/didChange'
+ public static val DID_SAVE_DOC = 'textDocument/didSave'
+ public static val DID_CHANGE_CONF = 'workspace/didChangeConfiguration'
+ public static val DID_CHANGE_FILES = 'workspace/didChangeWatchedFiles'
+ public static val SHOW_DIAGNOSTICS = 'textDocument/publishDiagnostics'
+ public static val SHOW_MESSAGE = 'window/showMessage'
+ public static val SHOW_MESSAGE_REQUEST = 'window/showMessageRequest'
+ public static val LOG_MESSAGE = 'window/logMessage'
+ public static val PROGRESS_NOTIFY = '$/progress'
+ public static val PROGRESS_CREATE = 'window/workDoneProgress/create'
+ public static val PROGRESS_CANCEL = 'window/workDoneProgress/cancel'
+ public static val TELEMETRY_EVENT = 'telemetry/event'
+
+}
diff --git a/javatests/org/eclipse/lsp4j/services/MockLanguageClient.java b/javatests/org/eclipse/lsp4j/services/MockLanguageClient.java
new file mode 100644
index 0000000..f1b9071
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/MockLanguageClient.java
@@ -0,0 +1,59 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.MessageActionItem;
+import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.lsp4j.PublishDiagnosticsParams;
+import org.eclipse.lsp4j.ShowDocumentParams;
+import org.eclipse.lsp4j.ShowDocumentResult;
+import org.eclipse.lsp4j.ShowMessageRequestParams;
+import org.eclipse.lsp4j.WorkspaceFolder;
+import org.eclipse.lsp4j.services.LanguageClient;
+
+public class MockLanguageClient implements LanguageClient {
+
+ @Override
+ public void telemetryEvent(Object object) {
+ }
+
+ @Override
+ public void publishDiagnostics(PublishDiagnosticsParams diagnostics) {
+ }
+
+ @Override
+ public void showMessage(MessageParams messageParams) {
+ }
+
+ @Override
+ public CompletableFuture<MessageActionItem> showMessageRequest(ShowMessageRequestParams requestParams) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public CompletableFuture<ShowDocumentResult> showDocument(ShowDocumentParams requestParams) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void logMessage(MessageParams message) {
+ }
+
+ @Override
+ public CompletableFuture<List<WorkspaceFolder>> workspaceFolders() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/services/MockLanguageServer.java b/javatests/org/eclipse/lsp4j/services/MockLanguageServer.java
new file mode 100644
index 0000000..7e09e37
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/MockLanguageServer.java
@@ -0,0 +1,82 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.eclipse.lsp4j.DidChangeConfigurationParams;
+import org.eclipse.lsp4j.DidChangeTextDocumentParams;
+import org.eclipse.lsp4j.DidChangeWatchedFilesParams;
+import org.eclipse.lsp4j.DidCloseTextDocumentParams;
+import org.eclipse.lsp4j.DidOpenTextDocumentParams;
+import org.eclipse.lsp4j.DidSaveTextDocumentParams;
+import org.eclipse.lsp4j.InitializeParams;
+import org.eclipse.lsp4j.InitializeResult;
+import org.eclipse.lsp4j.WorkDoneProgressCancelParams;
+import org.eclipse.lsp4j.services.LanguageServer;
+import org.eclipse.lsp4j.services.TextDocumentService;
+import org.eclipse.lsp4j.services.WorkspaceService;
+
+public class MockLanguageServer implements LanguageServer, TextDocumentService, WorkspaceService {
+
+ @Override
+ public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public CompletableFuture<Object> shutdown() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void exit() {
+ }
+
+ @Override
+ public TextDocumentService getTextDocumentService() {
+ return this;
+ }
+
+ @Override
+ public WorkspaceService getWorkspaceService() {
+ return this;
+ }
+
+ @Override
+ public void didChangeConfiguration(DidChangeConfigurationParams params) {
+ }
+
+ @Override
+ public void didChangeWatchedFiles(DidChangeWatchedFilesParams params) {
+ }
+
+ @Override
+ public void didOpen(DidOpenTextDocumentParams params) {
+ }
+
+ @Override
+ public void didChange(DidChangeTextDocumentParams params) {
+ }
+
+ @Override
+ public void didClose(DidCloseTextDocumentParams params) {
+ }
+
+ @Override
+ public void didSave(DidSaveTextDocumentParams params) {
+ }
+
+ @Override
+ public void cancelProgress(WorkDoneProgressCancelParams params) {
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/services/NullResponseTest.java b/javatests/org/eclipse/lsp4j/services/NullResponseTest.java
new file mode 100644
index 0000000..09ce173
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/NullResponseTest.java
@@ -0,0 +1,96 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.lsp4j.InitializeParams;
+import org.eclipse.lsp4j.InitializeResult;
+import org.eclipse.lsp4j.jsonrpc.Endpoint;
+import org.eclipse.lsp4j.jsonrpc.MessageConsumer;
+import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint;
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.services.LanguageServer;
+import org.eclipse.lsp4j.services.TextDocumentService;
+import org.eclipse.lsp4j.services.WorkspaceService;
+import org.eclipse.lsp4j.test.LogMessageAccumulator;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NullResponseTest implements LanguageServer {
+
+ private Object shutdownReturn;
+
+ @Test
+ public void testNullResponse() throws InterruptedException, ExecutionException {
+ LogMessageAccumulator logMessages = new LogMessageAccumulator();
+ try {
+ logMessages.registerTo(GenericEndpoint.class);
+
+ Endpoint endpoint = ServiceEndpoints.toEndpoint(this);
+ Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(LanguageServer.class);
+ MessageJsonHandler handler = new MessageJsonHandler(methods);
+ List<Message> msgs = new ArrayList<>();
+ MessageConsumer consumer = (message) -> {
+ msgs.add(message);
+ };
+ RemoteEndpoint re = new RemoteEndpoint(consumer, endpoint);
+
+ RequestMessage request = new RequestMessage();
+ request.setId("1");
+ request.setMethod("shutdown");
+ re.consume(request);
+ Assert.assertEquals("{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":null}", handler.serialize(msgs.get(0)));
+ msgs.clear();
+ shutdownReturn = new Object();
+ re.consume(request);
+ Assert.assertEquals("{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":{}}", handler.serialize(msgs.get(0)));
+ } finally {
+ logMessages.unregister();
+ }
+ }
+
+ @Override
+ public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public CompletableFuture<Object> shutdown() {
+ return CompletableFuture.completedFuture(shutdownReturn);
+ }
+
+ @Override
+ public void exit() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public TextDocumentService getTextDocumentService() {
+ return null;
+ }
+
+ @Override
+ public WorkspaceService getWorkspaceService() {
+ return null;
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/services/ProtocolTest.java b/javatests/org/eclipse/lsp4j/services/ProtocolTest.java
new file mode 100644
index 0000000..de69b86
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/ProtocolTest.java
@@ -0,0 +1,114 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.lsp4j.DocumentLink;
+import org.eclipse.lsp4j.DocumentLinkParams;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.CompletableFutures;
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.services.LanguageServer;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ProtocolTest {
+
+ private static final long TIMEOUT = 2000;
+
+ @Test public void testDocumentLink_01() throws Exception, ExecutionException {
+ LanguageServer languageServer = wrap(LanguageServer.class, new MockLanguageServer() {
+ @Override
+ public CompletableFuture<List<DocumentLink>> documentLink(DocumentLinkParams params) {
+ return CompletableFutures.computeAsync(canceler -> {
+ return new ArrayList<>();
+ });
+ }
+ });
+
+ CompletableFuture<List<DocumentLink>> future = languageServer.getTextDocumentService().documentLink(new DocumentLinkParams(new TextDocumentIdentifier("test")));
+ List<DocumentLink> list = future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertTrue(list.isEmpty());
+ }
+
+ @Test public void testDocumentLink_02() throws Exception, ExecutionException {
+ LanguageServer languageServer = wrap(LanguageServer.class, new MockLanguageServer() {
+ @Override
+ public CompletableFuture<List<DocumentLink>> documentLink(DocumentLinkParams params) {
+ return CompletableFutures.computeAsync(canceler -> {
+ return null;
+ });
+ }
+ });
+
+ CompletableFuture<List<DocumentLink>> future = languageServer.getTextDocumentService().documentLink(new DocumentLinkParams(new TextDocumentIdentifier("test")));
+ List<DocumentLink> list = future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertNull(list);
+ }
+
+ @Test public void testDocumentResolve() throws Exception, ExecutionException {
+ LanguageServer languageServer = wrap(LanguageServer.class, new MockLanguageServer() {
+ @Override
+ public CompletableFuture<DocumentLink> documentLinkResolve(DocumentLink params) {
+ return CompletableFutures.computeAsync(canceler -> {
+ params.setTarget("resolved");
+ return params;
+ });
+ }
+ });
+
+ CompletableFuture<DocumentLink> future = languageServer.getTextDocumentService().documentLinkResolve(
+ new DocumentLink(new Range(new Position(0, 0), new Position(0, 0)), "unresolved")
+ );
+ DocumentLink resolved = future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+
+ Assert.assertEquals("resolved", resolved.getTarget());
+ }
+
+ /**
+ * creates a proxy, delegating to a remote endpoint, forwarding to another remote endpoint, that delegates to an actual implementation.
+ * @param intf
+ * @param impl
+ * @return
+ * @throws IOException
+ */
+ public <T> T wrap(Class<T> intf, T impl) {
+ PipedInputStream in1 = new PipedInputStream();
+ PipedOutputStream out1 = new PipedOutputStream();
+ Launcher<T> launcher1 = Launcher.createLauncher(impl, intf, in1, out1);
+
+ PipedInputStream in2 = new PipedInputStream();
+ PipedOutputStream out2 = new PipedOutputStream();
+ Launcher<T> launcher2 = Launcher.createLauncher(new Object(), intf, in2, out2);
+ try {
+ in1.connect(out2);
+ in2.connect(out1);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ launcher1.startListening();
+ launcher2.startListening();
+ return launcher2.getRemoteProxy();
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/services/RpcMethodTest.java b/javatests/org/eclipse/lsp4j/services/RpcMethodTest.java
new file mode 100644
index 0000000..23e1d34
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/RpcMethodTest.java
@@ -0,0 +1,35 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services;
+
+import java.util.Map;
+
+import org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod;
+import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints;
+import org.eclipse.lsp4j.services.TextDocumentService;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RpcMethodTest {
+
+ @Test public void testDocumentSymbol() {
+ Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(TextDocumentService.class);
+ JsonRpcMethod jsonRpcMethod = methods.get("textDocument/documentSymbol");
+ Assert.assertNotNull(jsonRpcMethod);
+ }
+
+ @Test public void testCodelensResolve() {
+ Map<String, JsonRpcMethod> methods = ServiceEndpoints.getSupportedMethods(TextDocumentService.class);
+ Assert.assertNotNull(methods.get("codeLens/resolve"));
+ Assert.assertNotNull(methods.get("completionItem/resolve"));
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/services/ValidationTest.java b/javatests/org/eclipse/lsp4j/services/ValidationTest.java
new file mode 100644
index 0000000..5db16e4
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/services/ValidationTest.java
@@ -0,0 +1,68 @@
+/******************************************************************************
+ * Copyright (c) 2016 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.services;
+
+import org.eclipse.lsp4j.CodeLens;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.eclipse.lsp4j.jsonrpc.MessageIssueException;
+import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.RequestMessage;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
+import org.eclipse.lsp4j.jsonrpc.validation.ReflectiveMessageValidator;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ValidationTest {
+
+ ReflectiveMessageValidator validator = new ReflectiveMessageValidator();
+
+ @Test
+ public void testInvalidCompletion() {
+ RequestMessage message = new RequestMessage();
+ message.setJsonrpc("2.0");
+ message.setId("1");
+ message.setMethod(MessageMethods.DOC_COMPLETION);
+
+ TextDocumentPositionParams params = new TextDocumentPositionParams();
+ params.setTextDocument(new TextDocumentIdentifier("file:///tmp/foo"));
+ message.setParams(params);
+
+ assertIssues(message, "The accessor 'TextDocumentPositionParams.getPosition()' must return a non-null value.");
+ }
+
+ @Test
+ public void testInvalidCodeLens() {
+ ResponseMessage message = new ResponseMessage();
+ message.setId("1");
+ CodeLens codeLens = new CodeLens(new Range(new Position(3, 32), new Position(3, 35)), null, null);
+ // forbidden self reference!
+ codeLens.setData(codeLens);
+ message.setResult(codeLens);
+ assertIssues(message, "An element of the message has a direct or indirect reference to itself.");
+ }
+
+ private void assertIssues(Message message, CharSequence expectedIssues) {
+ try {
+ validator.consume(message);
+ Assert.fail("Expected InvalidMessageException: " + expectedIssues + ".");
+ } catch (MessageIssueException e) {
+ String expected = expectedIssues.toString();
+ String actual = LineEndings.toSystemLineEndings(e.getMessage());
+ // The expectation may be a prefix of the actual exception message
+ if (!actual.startsWith(expected))
+ Assert.assertEquals(expected, actual);
+ }
+ }
+}
diff --git a/javatests/org/eclipse/lsp4j/util/DocumentSymbolsTest.java b/javatests/org/eclipse/lsp4j/util/DocumentSymbolsTest.java
new file mode 100644
index 0000000..33addfc
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/util/DocumentSymbolsTest.java
@@ -0,0 +1,74 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.util;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import org.eclipse.lsp4j.DocumentSymbol;
+import org.eclipse.lsp4j.util.DocumentSymbols;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DocumentSymbolsTest {
+
+ @Test(expected = NullPointerException.class)
+ public void asIterator_null() {
+ DocumentSymbols.asIterator(null);
+ }
+
+ @Test
+ public void asIterator() {
+ DocumentSymbol depth0 = new DocumentSymbol();
+ depth0.setName("root");
+
+ DocumentSymbol depth1_0 = new DocumentSymbol();
+ depth1_0.setName("A1");
+ DocumentSymbol depth1_1 = new DocumentSymbol();
+ depth1_1.setName("B1");
+ DocumentSymbol depth1_2 = new DocumentSymbol();
+ depth1_2.setName("C1");
+ depth0.setChildren(Arrays.asList(depth1_0, depth1_1, depth1_2));
+
+ DocumentSymbol depth2_0_0 = new DocumentSymbol();
+ depth2_0_0.setName("A11");
+ DocumentSymbol depth2_0_1 = new DocumentSymbol();
+ depth2_0_1.setName("A12");
+ depth1_0.setChildren(Arrays.asList(depth2_0_0, depth2_0_1));
+
+ DocumentSymbol depth2_1_0 = new DocumentSymbol();
+ depth2_1_0.setName("B11");
+ DocumentSymbol depth2_1_1 = new DocumentSymbol();
+ depth2_1_1.setName("B12");
+ depth1_1.setChildren(Arrays.asList(depth2_1_0, depth2_1_1));
+
+ DocumentSymbol depth2_2_0 = new DocumentSymbol();
+ depth2_2_0.setName("C11");
+ DocumentSymbol depth2_2_1 = new DocumentSymbol();
+ depth2_2_1.setName("C12");
+ depth1_2.setChildren(Arrays.asList(depth2_2_0, depth2_2_1));
+
+ Iterator<DocumentSymbol> iterator = DocumentSymbols.asIterator(depth0);
+ Iterable<DocumentSymbol> iterable = () -> iterator;
+ Stream<DocumentSymbol> stream = StreamSupport.stream(iterable.spliterator(), false);
+ List<String> actual = stream.map(symbol -> symbol.getName()).collect(toList());
+ List<String> expected = Arrays.asList("root, A1", "B1", "C1", "A11", "A12", "B11", "B12", "C11", "C12");
+
+ Assert.assertEquals(Arrays.toString(expected.toArray()), Arrays.toString(actual.toArray()));
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/util/PositionsTest.java b/javatests/org/eclipse/lsp4j/util/PositionsTest.java
new file mode 100644
index 0000000..ea047d1
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/util/PositionsTest.java
@@ -0,0 +1,62 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.util;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.util.Positions;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PositionsTest {
+
+ @Test(expected = NullPointerException.class)
+ public void isBefore_nullLeft() {
+ Positions.isBefore(null, new Position(0, 0));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void isBefore_nullRight() {
+ Positions.isBefore(new Position(0, 0), null);
+ }
+
+ @Test
+ public void isBefore_equals() {
+ Position position = new Position(3, 3);
+ Assert.assertFalse(Positions.isBefore(position, position));
+ }
+
+ @Test
+ public void isBefore_same() {
+ Assert.assertFalse(Positions.isBefore(new Position(3, 3), new Position(3, 3)));
+ }
+
+ @Test
+ public void isBefore_beforeSameLine() {
+ Assert.assertTrue(Positions.isBefore(new Position(3, 3), new Position(3, 4)));
+ }
+
+ @Test
+ public void isBefore_before() {
+ Assert.assertTrue(Positions.isBefore(new Position(3, 3), new Position(4, 3)));
+ }
+
+ @Test
+ public void isBefore_afterSameLine() {
+ Assert.assertFalse(Positions.isBefore(new Position(3, 3), new Position(3, 2)));
+ }
+
+ @Test
+ public void isBefore_after() {
+ Assert.assertFalse(Positions.isBefore(new Position(3, 3), new Position(2, 3)));
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/util/RangesTest.java b/javatests/org/eclipse/lsp4j/util/RangesTest.java
new file mode 100644
index 0000000..62ecaae
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/util/RangesTest.java
@@ -0,0 +1,132 @@
+/******************************************************************************
+ * Copyright (c) 2018 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.test.util;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+import org.eclipse.lsp4j.util.Ranges;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RangesTest {
+
+ @Test(expected = NullPointerException.class)
+ public void containsRange_nullBigger() {
+ Ranges.containsRange(null, newRange(0, 0, 1, 1));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void containsRange_nullSmaller() {
+ Ranges.containsRange(newRange(0, 0, 1, 1), null);
+ }
+
+ @Test
+ public void containsRange_beforeAbove() {
+ Assert.assertFalse(Ranges.containsRange(newRange(2, 2, 3, 3), newRange(0, 0, 1, 1)));
+ }
+
+ @Test
+ public void containsRange_beforeSameLine() {
+ Assert.assertFalse(Ranges.containsRange(newRange(1, 2, 3, 3), newRange(0, 0, 1, 1)));
+ }
+
+ @Test
+ public void containsRange_beforeIntersects() {
+ Assert.assertFalse(Ranges.containsRange(newRange(1, 2, 3, 3), newRange(0, 0, 1, 3)));
+ }
+
+ @Test
+ public void containsRange_same() {
+ Assert.assertTrue(Ranges.containsRange(newRange(0, 0, 1, 3), newRange(0, 0, 1, 3)));
+ }
+
+ @Test
+ public void containsRange_equals() {
+ Range range = newRange(0, 0, 1, 3);
+ Assert.assertTrue(Ranges.containsRange(range, range));
+ }
+
+ @Test
+ public void containsRange_inside() {
+ Assert.assertTrue(Ranges.containsRange(newRange(0, 0, 3, 3), newRange(1, 1, 2, 2)));
+ }
+
+ @Test
+ public void containsRange_afterBelow() {
+ Assert.assertFalse(Ranges.containsRange(newRange(2, 2, 3, 3), newRange(4, 4, 5, 5)));
+ }
+
+ @Test
+ public void containsRange_afterSameLine() {
+ Assert.assertFalse(Ranges.containsRange(newRange(2, 2, 3, 3), newRange(3, 4, 5, 5)));
+ }
+
+ @Test
+ public void containsRange_afterIntersects() {
+ Assert.assertFalse(Ranges.containsRange(newRange(2, 2, 3, 3), newRange(3, 1, 5, 5)));
+ }
+
+ @Test
+ public void containsRange_overlaps() {
+ Assert.assertFalse(Ranges.containsRange(newRange(2, 2, 3, 3), newRange(1, 1, 5, 5)));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void containsPosition_nullRange() {
+ Ranges.containsPosition(null, new Position(0, 0));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void containsPosition_nullPosition() {
+ Ranges.containsPosition(newRange(0, 0, 1, 1), null);
+ }
+
+ @Test
+ public void containsPosition_beforeAbove() {
+ Assert.assertFalse(Ranges.containsPosition(newRange(1, 1, 2, 2), new Position(0, 1)));
+ }
+
+ @Test
+ public void containsPosition_beforeSameLine() {
+ Assert.assertFalse(Ranges.containsPosition(newRange(1, 3, 2, 2), new Position(1, 2)));
+ }
+
+ @Test
+ public void containsPosition_leftBorder() {
+ Assert.assertTrue(Ranges.containsPosition(newRange(1, 3, 2, 2), new Position(1, 3)));
+ }
+
+ @Test
+ public void containsPosition_inside() {
+ Assert.assertTrue(Ranges.containsPosition(newRange(1, 3, 2, 2), new Position(1, 4)));
+ }
+
+ @Test
+ public void containsPosition_rightBorder() {
+ Assert.assertTrue(Ranges.containsPosition(newRange(1, 3, 2, 2), new Position(2, 2)));
+ }
+
+ @Test
+ public void containsPosition_afterSameLine() {
+ Assert.assertFalse(Ranges.containsPosition(newRange(1, 1, 2, 2), new Position(2, 4)));
+ }
+
+ @Test
+ public void containsPosition_afterBelow() {
+ Assert.assertFalse(Ranges.containsPosition(newRange(1, 3, 2, 2), new Position(3, 3)));
+ }
+
+ private static Range newRange(int startLine, int startCharacter, int endLine, int endCharacter) {
+ return new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter));
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockConnectionTest.java b/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockConnectionTest.java
new file mode 100644
index 0000000..c44dd44
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockConnectionTest.java
@@ -0,0 +1,170 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta.test;
+
+import java.util.Collection;
+import java.util.Random;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.websocket.jakarta.WebSocketEndpoint;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MockConnectionTest {
+
+ private static final long TIMEOUT = 2000;
+
+ private Client client;
+ private Server server;
+
+ @SuppressWarnings("resource")
+ @Before
+ public void setup() {
+ client = new Client();
+ server = new Server();
+ MockSession clientSession = new MockSession();
+ MockSession serverSession = new MockSession();
+ clientSession.connect(serverSession);
+ clientSession.open(new ClientSideEndpoint());
+ serverSession.open(new ServerSideEndpoint());
+ }
+
+ @Test
+ public void testClientRequest() throws Exception {
+ CompletableFuture<String> future = client.server.request("foo");
+ String result = future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.assertEquals("foobar", result);
+ }
+
+ @Test
+ public void testNotifications() throws Exception {
+ server.client.notify("12");
+ await(() -> client.result.length() == 2);
+ client.server.notify("foo");
+ await(() -> server.result.length() == 3);
+ server.client.notify("34");
+ await(() -> client.result.length() == 4);
+ client.server.notify("bar");
+ await(() -> server.result.length() == 6);
+ server.client.notify("56");
+ await(() -> client.result.length() == 6);
+
+ Assert.assertEquals("foobar", server.result);
+ Assert.assertEquals("123456", client.result);
+ }
+
+ @Test
+ public void testChunkedNotification() throws Exception {
+ StringBuilder messageBuilder = new StringBuilder();
+ Random random = new Random(1);
+ for (int i = 0; i < 3 * MockSession.MAX_CHUNK_SIZE; i++) {
+ messageBuilder.append((char) ('a' + random.nextInt('z' - 'a' + 1)));
+ }
+ String message = messageBuilder.toString();
+
+ server.client.notify(message);
+ await(() -> client.result.length() == message.length());
+
+ Assert.assertEquals(message, client.result);
+ }
+
+ private void await(Supplier<Boolean> condition) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (!condition.get()) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT) {
+ Assert.fail("Timeout elapsed while waiting for condition.\n");
+ }
+ }
+ }
+
+ private static interface ClientInterface {
+
+ @JsonNotification("client/notify")
+ void notify(String arg);
+
+ }
+
+ private static class Client implements ClientInterface {
+ ServerInterface server;
+ String result = "";
+
+ @Override
+ public void notify(String arg) {
+ this.result += arg;
+ }
+ }
+
+ private static interface ServerInterface {
+
+ @JsonRequest("server/request")
+ CompletableFuture<String> request(String arg);
+
+ @JsonNotification("server/notify")
+ void notify(String arg);
+
+ }
+
+ private static class Server implements ServerInterface {
+ ClientInterface client;
+ String result = "";
+
+ @Override
+ public CompletableFuture<String> request(String arg) {
+ return CompletableFuture.supplyAsync(() -> arg + "bar");
+ }
+
+ @Override
+ public void notify(String arg) {
+ this.result += arg;
+ }
+ }
+
+ private class ClientSideEndpoint extends WebSocketEndpoint<ServerInterface> {
+
+ @Override
+ protected void configure(Launcher.Builder<ServerInterface> builder) {
+ builder
+ .setLocalService(client)
+ .setRemoteInterface(ServerInterface.class);
+ }
+
+ @Override
+ protected void connect(Collection<Object> localServices, ServerInterface remoteProxy) {
+ localServices.forEach(s -> ((Client) s).server = remoteProxy);
+ }
+
+ }
+
+ private class ServerSideEndpoint extends WebSocketEndpoint<ClientInterface> {
+
+ @Override
+ protected void configure(Launcher.Builder<ClientInterface> builder) {
+ builder
+ .setLocalService(server)
+ .setRemoteInterface(ClientInterface.class);
+ }
+
+ @Override
+ protected void connect(Collection<Object> localServices, ClientInterface remoteProxy) {
+ localServices.forEach(s -> ((Server) s).client = remoteProxy);
+ }
+
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockEndpointConfig.java b/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockEndpointConfig.java
new file mode 100644
index 0000000..7304a69
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockEndpointConfig.java
@@ -0,0 +1,39 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta.test;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import jakarta.websocket.Decoder;
+import jakarta.websocket.Encoder;
+import jakarta.websocket.EndpointConfig;
+
+public class MockEndpointConfig implements EndpointConfig {
+
+ @Override
+ public List<Class<? extends Encoder>> getEncoders() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<Class<? extends Decoder>> getDecoders() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Map<String, Object> getUserProperties() {
+ return Collections.emptyMap();
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockSession.java b/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockSession.java
new file mode 100644
index 0000000..55e4770
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/websocket/jakarta/test/MockSession.java
@@ -0,0 +1,346 @@
+/******************************************************************************
+ * Copyright (c) 2019, 2021 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.jakarta.test;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
+import java.security.Principal;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Future;
+
+import jakarta.websocket.CloseReason;
+import jakarta.websocket.EncodeException;
+import jakarta.websocket.Endpoint;
+import jakarta.websocket.Extension;
+import jakarta.websocket.MessageHandler;
+import jakarta.websocket.MessageHandler.Partial;
+import jakarta.websocket.MessageHandler.Whole;
+import jakarta.websocket.RemoteEndpoint;
+import jakarta.websocket.SendHandler;
+import jakarta.websocket.SendResult;
+import jakarta.websocket.Session;
+import jakarta.websocket.WebSocketContainer;
+
+public class MockSession implements Session {
+
+ public static final int MAX_CHUNK_SIZE = 100;
+
+ private final BasicRemote basicRemote = new BasicRemote();
+ private final AsyncRemote asyncRemote = new AsyncRemote();
+ private final Set<MessageHandler> messageHandlers = new HashSet<>();
+ private Endpoint endpoint;
+ private MockSession connectedSession;
+ private boolean isClosed;
+ private StringBuilder partialMessage;
+
+ public void connect(MockSession other) {
+ this.connectedSession = other;
+ other.connectedSession = this;
+ }
+
+ @Override
+ public RemoteEndpoint.Async getAsyncRemote() {
+ return asyncRemote;
+ }
+
+ @Override
+ public RemoteEndpoint.Basic getBasicRemote() {
+ return basicRemote;
+ }
+
+ public void open(Endpoint endpoint) {
+ this.endpoint = endpoint;
+ endpoint.onOpen(this, new MockEndpointConfig());
+ }
+
+ @Override
+ public void close() throws IOException {
+ close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "OK"));
+ }
+
+ @Override
+ public void close(CloseReason closeReason) throws IOException {
+ isClosed = true;
+ endpoint.onClose(this, closeReason);
+ }
+
+ @Override
+ public void addMessageHandler(MessageHandler handler) throws IllegalStateException {
+ if (!messageHandlers.add(handler))
+ throw new IllegalStateException();
+ }
+
+
+ @Override
+ public <T> void addMessageHandler(Class<T> clazz, Whole<T> handler) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public <T> void addMessageHandler(Class<T> clazz, Partial<T> handler) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Set<MessageHandler> getMessageHandlers() {
+ return messageHandlers;
+ }
+
+ @Override
+ public void removeMessageHandler(MessageHandler handler) {
+ messageHandlers.remove(handler);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void dispatch(String message, boolean lastChunk) {
+ if (lastChunk) {
+ String wholeMessage = message;
+ if (partialMessage != null) {
+ partialMessage.append(message);
+ wholeMessage = partialMessage.toString();
+ partialMessage = null;
+ }
+ for (MessageHandler h : connectedSession.messageHandlers) {
+ if (h instanceof MessageHandler.Whole<?>)
+ ((MessageHandler.Whole<String>) h).onMessage(wholeMessage);
+ else
+ ((MessageHandler.Partial<String>) h).onMessage(message, true);
+ };
+ } else {
+ if (partialMessage == null) {
+ partialMessage = new StringBuilder();
+ }
+ for (MessageHandler h : connectedSession.messageHandlers) {
+ if (h instanceof MessageHandler.Partial<?>)
+ ((MessageHandler.Partial<String>) h).onMessage(message, false);
+ };
+ partialMessage.append(message);
+ }
+ }
+
+ @Override
+ public WebSocketContainer getContainer() {
+ return null;
+ }
+
+ @Override
+ public String getProtocolVersion() {
+ return "13";
+ }
+
+ @Override
+ public String getNegotiatedSubprotocol() {
+ return null;
+ }
+
+ @Override
+ public List<Extension> getNegotiatedExtensions() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public boolean isSecure() {
+ return true;
+ }
+
+ @Override
+ public boolean isOpen() {
+ return !isClosed;
+ }
+
+ @Override
+ public long getMaxIdleTimeout() {
+ return 10000;
+ }
+
+ @Override
+ public void setMaxIdleTimeout(long milliseconds) {
+ }
+
+ @Override
+ public void setMaxBinaryMessageBufferSize(int length) {
+ }
+
+ @Override
+ public int getMaxBinaryMessageBufferSize() {
+ return 100;
+ }
+
+ @Override
+ public void setMaxTextMessageBufferSize(int length) {
+ }
+
+ @Override
+ public int getMaxTextMessageBufferSize() {
+ return MAX_CHUNK_SIZE;
+ }
+
+ @Override
+ public String getId() {
+ return "mock";
+ }
+
+ @Override
+ public URI getRequestURI() {
+ try {
+ return new URI("http://localhost:8080/mock");
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public Map<String, List<String>> getRequestParameterMap() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public String getQueryString() {
+ return "";
+ }
+
+ @Override
+ public Map<String, String> getPathParameters() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Map<String, Object> getUserProperties() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Principal getUserPrincipal() {
+ return null;
+ }
+
+ @Override
+ public Set<Session> getOpenSessions() {
+ return Collections.singleton(this);
+ }
+
+ private class BasicRemote extends AbstractRemoteEndpoint implements RemoteEndpoint.Basic {
+
+ @Override
+ public void sendText(String text) throws IOException {
+ dispatch(text, true);
+ }
+
+ @Override
+ public void sendBinary(ByteBuffer data) throws IOException {
+ }
+
+ @Override
+ public void sendText(String partialMessage, boolean isLast) throws IOException {
+ dispatch(partialMessage, isLast);
+ }
+
+ @Override
+ public void sendBinary(ByteBuffer partialByte, boolean isLast) throws IOException {
+ }
+
+ @Override
+ public OutputStream getSendStream() throws IOException {
+ return null;
+ }
+
+ @Override
+ public Writer getSendWriter() throws IOException {
+ return null;
+ }
+
+ @Override
+ public void sendObject(Object data) throws IOException, EncodeException {
+ }
+
+ }
+
+ private class AsyncRemote extends AbstractRemoteEndpoint implements RemoteEndpoint.Async {
+
+ @Override
+ public long getSendTimeout() {
+ return 1000;
+ }
+
+ @Override
+ public void setSendTimeout(long timeoutmillis) {
+ }
+
+ @Override
+ public void sendText(String text, SendHandler handler) {
+ sendText(text).thenRun(() -> {
+ handler.onResult(new SendResult());
+ });
+ }
+
+ @Override
+ public CompletableFuture<Void> sendText(String text) {
+ return CompletableFuture.runAsync(() -> {
+ dispatch(text, true);
+ });
+ }
+
+ @Override
+ public Future<Void> sendBinary(ByteBuffer data) {
+ return null;
+ }
+
+ @Override
+ public void sendBinary(ByteBuffer data, SendHandler handler) {
+ }
+
+ @Override
+ public Future<Void> sendObject(Object data) {
+ return null;
+ }
+
+ @Override
+ public void sendObject(Object data, SendHandler handler) {
+ }
+
+ }
+
+ private static abstract class AbstractRemoteEndpoint implements RemoteEndpoint {
+
+ @Override
+ public void setBatchingAllowed(boolean allowed) throws IOException {
+ }
+
+ @Override
+ public boolean getBatchingAllowed() {
+ return false;
+ }
+
+ @Override
+ public void flushBatch() throws IOException {
+ }
+
+ @Override
+ public void sendPing(ByteBuffer applicationData) throws IOException, IllegalArgumentException {
+ }
+
+ @Override
+ public void sendPong(ByteBuffer applicationData) throws IOException, IllegalArgumentException {
+ }
+
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/websocket/test/MockConnectionTest.java b/javatests/org/eclipse/lsp4j/websocket/test/MockConnectionTest.java
new file mode 100644
index 0000000..37ecfd6
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/websocket/test/MockConnectionTest.java
@@ -0,0 +1,170 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.test;
+
+import java.util.Collection;
+import java.util.Random;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+import org.eclipse.lsp4j.jsonrpc.Launcher;
+import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.eclipse.lsp4j.websocket.WebSocketEndpoint;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MockConnectionTest {
+
+ private static final long TIMEOUT = 2000;
+
+ private Client client;
+ private Server server;
+
+ @SuppressWarnings("resource")
+ @Before
+ public void setup() {
+ client = new Client();
+ server = new Server();
+ MockSession clientSession = new MockSession();
+ MockSession serverSession = new MockSession();
+ clientSession.connect(serverSession);
+ clientSession.open(new ClientSideEndpoint());
+ serverSession.open(new ServerSideEndpoint());
+ }
+
+ @Test
+ public void testClientRequest() throws Exception {
+ CompletableFuture<String> future = client.server.request("foo");
+ String result = future.get(TIMEOUT, TimeUnit.MILLISECONDS);
+ Assert.assertEquals("foobar", result);
+ }
+
+ @Test
+ public void testNotifications() throws Exception {
+ server.client.notify("12");
+ await(() -> client.result.length() == 2);
+ client.server.notify("foo");
+ await(() -> server.result.length() == 3);
+ server.client.notify("34");
+ await(() -> client.result.length() == 4);
+ client.server.notify("bar");
+ await(() -> server.result.length() == 6);
+ server.client.notify("56");
+ await(() -> client.result.length() == 6);
+
+ Assert.assertEquals("foobar", server.result);
+ Assert.assertEquals("123456", client.result);
+ }
+
+ @Test
+ public void testChunkedNotification() throws Exception {
+ StringBuilder messageBuilder = new StringBuilder();
+ Random random = new Random(1);
+ for (int i = 0; i < 3 * MockSession.MAX_CHUNK_SIZE; i++) {
+ messageBuilder.append((char) ('a' + random.nextInt('z' - 'a' + 1)));
+ }
+ String message = messageBuilder.toString();
+
+ server.client.notify(message);
+ await(() -> client.result.length() == message.length());
+
+ Assert.assertEquals(message, client.result);
+ }
+
+ private void await(Supplier<Boolean> condition) throws InterruptedException {
+ long startTime = System.currentTimeMillis();
+ while (!condition.get()) {
+ Thread.sleep(20);
+ if (System.currentTimeMillis() - startTime > TIMEOUT) {
+ Assert.fail("Timeout elapsed while waiting for condition.\n");
+ }
+ }
+ }
+
+ private static interface ClientInterface {
+
+ @JsonNotification("client/notify")
+ void notify(String arg);
+
+ }
+
+ private static class Client implements ClientInterface {
+ ServerInterface server;
+ String result = "";
+
+ @Override
+ public void notify(String arg) {
+ this.result += arg;
+ }
+ }
+
+ private static interface ServerInterface {
+
+ @JsonRequest("server/request")
+ CompletableFuture<String> request(String arg);
+
+ @JsonNotification("server/notify")
+ void notify(String arg);
+
+ }
+
+ private static class Server implements ServerInterface {
+ ClientInterface client;
+ String result = "";
+
+ @Override
+ public CompletableFuture<String> request(String arg) {
+ return CompletableFuture.supplyAsync(() -> arg + "bar");
+ }
+
+ @Override
+ public void notify(String arg) {
+ this.result += arg;
+ }
+ }
+
+ private class ClientSideEndpoint extends WebSocketEndpoint<ServerInterface> {
+
+ @Override
+ protected void configure(Launcher.Builder<ServerInterface> builder) {
+ builder
+ .setLocalService(client)
+ .setRemoteInterface(ServerInterface.class);
+ }
+
+ @Override
+ protected void connect(Collection<Object> localServices, ServerInterface remoteProxy) {
+ localServices.forEach(s -> ((Client) s).server = remoteProxy);
+ }
+
+ }
+
+ private class ServerSideEndpoint extends WebSocketEndpoint<ClientInterface> {
+
+ @Override
+ protected void configure(Launcher.Builder<ClientInterface> builder) {
+ builder
+ .setLocalService(server)
+ .setRemoteInterface(ClientInterface.class);
+ }
+
+ @Override
+ protected void connect(Collection<Object> localServices, ClientInterface remoteProxy) {
+ localServices.forEach(s -> ((Server) s).client = remoteProxy);
+ }
+
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/websocket/test/MockEndpointConfig.java b/javatests/org/eclipse/lsp4j/websocket/test/MockEndpointConfig.java
new file mode 100644
index 0000000..72101cf
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/websocket/test/MockEndpointConfig.java
@@ -0,0 +1,39 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.test;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.websocket.Decoder;
+import javax.websocket.Encoder;
+import javax.websocket.EndpointConfig;
+
+public class MockEndpointConfig implements EndpointConfig {
+
+ @Override
+ public List<Class<? extends Encoder>> getEncoders() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<Class<? extends Decoder>> getDecoders() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Map<String, Object> getUserProperties() {
+ return Collections.emptyMap();
+ }
+
+}
diff --git a/javatests/org/eclipse/lsp4j/websocket/test/MockSession.java b/javatests/org/eclipse/lsp4j/websocket/test/MockSession.java
new file mode 100644
index 0000000..6d7039c
--- /dev/null
+++ b/javatests/org/eclipse/lsp4j/websocket/test/MockSession.java
@@ -0,0 +1,333 @@
+/******************************************************************************
+ * Copyright (c) 2019 TypeFox and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ ******************************************************************************/
+package org.eclipse.lsp4j.websocket.test;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
+import java.security.Principal;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Future;
+
+import javax.websocket.CloseReason;
+import javax.websocket.EncodeException;
+import javax.websocket.Endpoint;
+import javax.websocket.Extension;
+import javax.websocket.MessageHandler;
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.SendHandler;
+import javax.websocket.SendResult;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+public class MockSession implements Session {
+
+ public static final int MAX_CHUNK_SIZE = 100;
+
+ private final BasicRemote basicRemote = new BasicRemote();
+ private final AsyncRemote asyncRemote = new AsyncRemote();
+ private final Set<MessageHandler> messageHandlers = new HashSet<>();
+ private Endpoint endpoint;
+ private MockSession connectedSession;
+ private boolean isClosed;
+ private StringBuilder partialMessage;
+
+ public void connect(MockSession other) {
+ this.connectedSession = other;
+ other.connectedSession = this;
+ }
+
+ @Override
+ public RemoteEndpoint.Async getAsyncRemote() {
+ return asyncRemote;
+ }
+
+ @Override
+ public RemoteEndpoint.Basic getBasicRemote() {
+ return basicRemote;
+ }
+
+ public void open(Endpoint endpoint) {
+ this.endpoint = endpoint;
+ endpoint.onOpen(this, new MockEndpointConfig());
+ }
+
+ @Override
+ public void close() throws IOException {
+ close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "OK"));
+ }
+
+ @Override
+ public void close(CloseReason closeReason) throws IOException {
+ isClosed = true;
+ endpoint.onClose(this, closeReason);
+ }
+
+ @Override
+ public void addMessageHandler(MessageHandler handler) throws IllegalStateException {
+ if (!messageHandlers.add(handler))
+ throw new IllegalStateException();
+ }
+
+ @Override
+ public Set<MessageHandler> getMessageHandlers() {
+ return messageHandlers;
+ }
+
+ @Override
+ public void removeMessageHandler(MessageHandler handler) {
+ messageHandlers.remove(handler);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void dispatch(String message, boolean lastChunk) {
+ if (lastChunk) {
+ String wholeMessage = message;
+ if (partialMessage != null) {
+ partialMessage.append(message);
+ wholeMessage = partialMessage.toString();
+ partialMessage = null;
+ }
+ for (MessageHandler h : connectedSession.messageHandlers) {
+ if (h instanceof MessageHandler.Whole<?>)
+ ((MessageHandler.Whole<String>) h).onMessage(wholeMessage);
+ else
+ ((MessageHandler.Partial<String>) h).onMessage(message, true);
+ };
+ } else {
+ if (partialMessage == null) {
+ partialMessage = new StringBuilder();
+ }
+ for (MessageHandler h : connectedSession.messageHandlers) {
+ if (h instanceof MessageHandler.Partial<?>)
+ ((MessageHandler.Partial<String>) h).onMessage(message, false);
+ };
+ partialMessage.append(message);
+ }
+ }
+
+ @Override
+ public WebSocketContainer getContainer() {
+ return null;
+ }
+
+ @Override
+ public String getProtocolVersion() {
+ return "13";
+ }
+
+ @Override
+ public String getNegotiatedSubprotocol() {
+ return null;
+ }
+
+ @Override
+ public List<Extension> getNegotiatedExtensions() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public boolean isSecure() {
+ return true;
+ }
+
+ @Override
+ public boolean isOpen() {
+ return !isClosed;
+ }
+
+ @Override
+ public long getMaxIdleTimeout() {
+ return 10000;
+ }
+
+ @Override
+ public void setMaxIdleTimeout(long milliseconds) {
+ }
+
+ @Override
+ public void setMaxBinaryMessageBufferSize(int length) {
+ }
+
+ @Override
+ public int getMaxBinaryMessageBufferSize() {
+ return 100;
+ }
+
+ @Override
+ public void setMaxTextMessageBufferSize(int length) {
+ }
+
+ @Override
+ public int getMaxTextMessageBufferSize() {
+ return MAX_CHUNK_SIZE;
+ }
+
+ @Override
+ public String getId() {
+ return "mock";
+ }
+
+ @Override
+ public URI getRequestURI() {
+ try {
+ return new URI("http://localhost:8080/mock");
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public Map<String, List<String>> getRequestParameterMap() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public String getQueryString() {
+ return "";
+ }
+
+ @Override
+ public Map<String, String> getPathParameters() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Map<String, Object> getUserProperties() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Principal getUserPrincipal() {
+ return null;
+ }
+
+ @Override
+ public Set<Session> getOpenSessions() {
+ return Collections.singleton(this);
+ }
+
+ private class BasicRemote extends AbstractRemoteEndpoint implements RemoteEndpoint.Basic {
+
+ @Override
+ public void sendText(String text) throws IOException {
+ dispatch(text, true);
+ }
+
+ @Override
+ public void sendBinary(ByteBuffer data) throws IOException {
+ }
+
+ @Override
+ public void sendText(String partialMessage, boolean isLast) throws IOException {
+ dispatch(partialMessage, isLast);
+ }
+
+ @Override
+ public void sendBinary(ByteBuffer partialByte, boolean isLast) throws IOException {
+ }
+
+ @Override
+ public OutputStream getSendStream() throws IOException {
+ return null;
+ }
+
+ @Override
+ public Writer getSendWriter() throws IOException {
+ return null;
+ }
+
+ @Override
+ public void sendObject(Object data) throws IOException, EncodeException {
+ }
+
+ }
+
+ private class AsyncRemote extends AbstractRemoteEndpoint implements RemoteEndpoint.Async {
+
+ @Override
+ public long getSendTimeout() {
+ return 1000;
+ }
+
+ @Override
+ public void setSendTimeout(long timeoutmillis) {
+ }
+
+ @Override
+ public void sendText(String text, SendHandler handler) {
+ sendText(text).thenRun(() -> {
+ handler.onResult(new SendResult());
+ });
+ }
+
+ @Override
+ public CompletableFuture<Void> sendText(String text) {
+ return CompletableFuture.runAsync(() -> {
+ dispatch(text, true);
+ });
+ }
+
+ @Override
+ public Future<Void> sendBinary(ByteBuffer data) {
+ return null;
+ }
+
+ @Override
+ public void sendBinary(ByteBuffer data, SendHandler handler) {
+ }
+
+ @Override
+ public Future<Void> sendObject(Object data) {
+ return null;
+ }
+
+ @Override
+ public void sendObject(Object data, SendHandler handler) {
+ }
+
+ }
+
+ private static abstract class AbstractRemoteEndpoint implements RemoteEndpoint {
+
+ @Override
+ public void setBatchingAllowed(boolean allowed) throws IOException {
+ }
+
+ @Override
+ public boolean getBatchingAllowed() {
+ return false;
+ }
+
+ @Override
+ public void flushBatch() throws IOException {
+ }
+
+ @Override
+ public void sendPing(ByteBuffer applicationData) throws IOException, IllegalArgumentException {
+ }
+
+ @Override
+ public void sendPong(ByteBuffer applicationData) throws IOException, IllegalArgumentException {
+ }
+
+ }
+
+}