/*******************************************************************************
* Copyright (c) 2015 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.tooling.completion;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import static melnorme.utilbox.core.CoreUtil.areEqual;
import java.text.MessageFormat;
import melnorme.lang.tooling.CompletionProposalKind;
import melnorme.lang.tooling.ElementAttributes;
import melnorme.lang.tooling.ast.SourceRange;
import melnorme.utilbox.collections.Indexable;
import melnorme.utilbox.misc.CollectionUtil;
import melnorme.utilbox.misc.HashcodeUtil;
public abstract class LangToolCompletionProposal {
protected final int replaceOffset;
protected final int replaceLength;
protected final String baseReplaceString;
protected final String label;
protected final CompletionProposalKind kind;
protected final ElementAttributes attributes;
protected final String typeLabel; // can be null
protected final String moduleName; // can be null
protected final String documentation; // can be null
protected final String fullReplaceString;
protected final Indexable<SourceRange> sourceSubElements;
public LangToolCompletionProposal(int replaceOffset, int replaceLength, String baseReplaceString,
String label, CompletionProposalKind kind, ElementAttributes attributes,
String typeLabel, String moduleName, String documentation,
String fullReplaceString, Indexable<SourceRange> sourceSubElements) {
assertTrue(replaceOffset >= 0);
assertTrue(replaceLength >= 0);
this.replaceOffset = replaceOffset;
this.replaceLength = replaceLength;
this.baseReplaceString = assertNotNull(baseReplaceString);
this.label = assertNotNull(label);
this.kind = kind != null ? kind : CompletionProposalKind.UNKNOWN;
this.attributes = assertNotNull(attributes);
this.typeLabel = typeLabel;
this.moduleName = moduleName;
this.documentation = documentation;
this.fullReplaceString = assertNotNull(fullReplaceString);
this.sourceSubElements = CollectionUtil.nullToEmpty(sourceSubElements);
}
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof LangToolCompletionProposal)) return false;
LangToolCompletionProposal other = (LangToolCompletionProposal) obj;
return
areEqual(replaceOffset, other.replaceOffset) &&
areEqual(replaceLength, other.replaceLength) &&
areEqual(baseReplaceString, other.baseReplaceString) &&
areEqual(label, other.label) &&
areEqual(kind, other.kind) &&
areEqual(attributes, other.attributes) &&
areEqual(typeLabel, other.typeLabel) &&
areEqual(moduleName, other.moduleName) &&
areEqual(documentation, other.documentation) &&
areEqual(fullReplaceString, other.fullReplaceString) &&
areEqual(sourceSubElements, other.sourceSubElements) &&
subclassEquals(other);
}
protected abstract boolean subclassEquals(LangToolCompletionProposal other);
@Override
public int hashCode() {
return HashcodeUtil.combinedHashCode(
replaceOffset, replaceLength, baseReplaceString, label, kind, moduleName);
}
/* ----------------- ----------------- */
public int getReplaceOffset() {
return replaceOffset;
}
public int getReplaceLength() {
return replaceLength;
}
public String getBaseReplaceString() {
return baseReplaceString;
}
public String getLabel() {
return assertNotNull(label);
}
public CompletionProposalKind getKind() {
return assertNotNull(kind);
}
public ElementAttributes getAttributes() {
return attributes;
}
public String getTypeLabel() {
return typeLabel;
}
public String getModuleName() {
return moduleName;
}
public String getDocumentation() {
return documentation;
}
/** @return Alternative replace string, with more completion text.
* Usually used for functions complete proposals that include parameters as well.*/
public String getFullReplaceString() {
return fullReplaceString;
}
public Indexable<SourceRange> getSourceSubElements() {
return sourceSubElements;
}
@Override
public String toString() {
return MessageFormat.format("PROPOSAL: @{0}+{1} {2} [{3}] {4} {5} {6}",
getReplaceOffset(),
getReplaceLength(),
getLabel(),
getKind(),
getAttributes(),
getTypeLabel(),
moduleName == null ? "" : (" - " + moduleName)
);
}
}