blob: 7909b4fcc48cd062b5dbb45f8abd6a1e2b2b8643 [file] [log] [blame]
/**
* Copyright (c) 2016-2018 TypeFox and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* 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());
}
}