/******************************************************************************* * Copyright (c) 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.core; import net.sourceforge.phpdt.core.compiler.IProblem; /** * Abstract base class for a completion requestor which is passed completion * proposals as they are generated in response to a code assist request. *
* This class is intended to be subclassed by clients. *
** The code assist engine normally invokes methods on completion requestors in * the following sequence: * *
* requestor.beginReporting(); * requestor.accept(proposal_1); * requestor.accept(proposal_2); * ... * requestor.endReporting(); ** * If, however, the engine is unable to offer completion proposals for whatever * reason,
completionFailure
is called with a problem object
* describing why completions were unavailable. In this case, the sequence of
* calls is:
*
* * requestor.beginReporting(); * requestor.completionFailure(problem); * requestor.endReporting(); ** * In either case, the bracketing
beginReporting
* endReporting
* calls are always made.
*
*
* The class was introduced in 3.0 as a more evolvable replacement for the
* ICompletionRequestor
interface.
*
0
means the set is empty. 1 << completionProposalKind
*/
private int ignoreSet = 0;
/**
* Creates a new completion requestor. The requestor is interested in all
* kinds of completion proposals; none will be ignored.
*/
public CompletionRequestor() {
// do nothing
}
/**
* Returns whether the given kind of completion proposal is ignored.
*
* @param completionProposalKind
* one of the kind constants declared on
* CompletionProposal
* @return true
if the given kind of completion proposal is
* ignored by this requestor, and false
if it is of
* interest
* @see #setIgnored(int, boolean)
* @see CompletionProposal#getKind()
*/
public final boolean isIgnored(int completionProposalKind) {
if (completionProposalKind < CompletionProposal.ANONYMOUS_CLASS_DECLARATION
|| completionProposalKind > CompletionProposal.VARIABLE_DECLARATION) {
throw new IllegalArgumentException();
}
return 0 != (this.ignoreSet & (1 << completionProposalKind));
}
/**
* Sets whether the given kind of completion proposal is ignored.
*
* @param completionProposalKind
* one of the kind constants declared on
* CompletionProposal
* @param ignore
* true
if the given kind of completion proposal
* is ignored by this requestor, and false
if it
* is of interest
* @see #isIgnored(int)
* @see CompletionProposal#getKind()
*/
public final void setIgnored(int completionProposalKind, boolean ignore) {
if (completionProposalKind < CompletionProposal.ANONYMOUS_CLASS_DECLARATION
|| completionProposalKind > CompletionProposal.VARIABLE_DECLARATION) {
throw new IllegalArgumentException();
}
if (ignore) {
this.ignoreSet |= (1 << completionProposalKind);
} else {
this.ignoreSet &= ~(1 << completionProposalKind);
}
}
/**
* Pro forma notification sent before reporting a batch of completion
* proposals.
* * The default implementation of this method does nothing. Clients may * override. *
*/ public void beginReporting() { // do nothing } /** * Pro forma notification sent after reporting a batch of completion * proposals. ** The default implementation of this method does nothing. Clients may * override. *
*/ public void endReporting() { // do nothing } /** * Notification of failure to produce any completions. The problem object * explains what prevented completing. ** The default implementation of this method does nothing. Clients may * override to receive this kind of notice. *
* * @param problem * the problem object */ public void completionFailure(IProblem problem) { // default behavior is to ignore } /** * Proposes a completion. Has no effect if the kind of proposal is being * ignored by this requestor. Callers should consider checking * {@link #isIgnored(int)} before avoid creating proposal objects that would * only be ignored. ** Similarly, implementers should check * {@link #isIgnored(int) isIgnored(proposal.getKind())} and ignore * proposals that have been declared as uninteresting. The proposal object * passed in only valid for the duration of this call; implementors must not * hang on to these objects. * * @param proposal * the completion proposal * @exception IllegalArgumentException * if the proposal is null */ public abstract void accept(CompletionProposal proposal); }