package org.maziarz.yiiclipse.completion;
import org.eclipse.dltk.core.CompletionRequestor;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.php.core.codeassist.ICompletionContext;
import org.eclipse.php.internal.core.codeassist.contexts.AbstractCompletionContext;
import org.eclipse.php.internal.core.codeassist.contexts.StatementContext;
import org.eclipse.php.internal.core.util.text.PHPTextSequenceUtilities;
import org.eclipse.php.internal.core.util.text.TextSequence;
public class AliasEnabledContext extends AbstractCompletionContext implements ICompletionContext {
@Override
public boolean isValid(ISourceModule sourceModule, int offset, CompletionRequestor requestor) {
if (!super.isValid(sourceModule, offset, requestor)) {
return false;
}
TextSequence statementText = getStatementText();
if (statementText.toString().startsWith("$this->widget") || statementText.toString().startsWith("Yii::import")) {
return isFirstArgument(statementText);
}
return false;
}
private boolean isFirstArgument(TextSequence textSequence) {
int startPosition = textSequence.length();
int rv = startPosition;
int openParanCount = 0;
for (; rv > 0; rv--) {
if (textSequence.charAt(rv - 1) == '(') {
openParanCount++;
} else if (textSequence.charAt(rv -1) == ','){
return false;
}
}
return openParanCount == 1;
}
@Override
public String getPrefix() throws BadLocationException {
if (hasWhitespaceBeforeCursor()) {
return ""; //$NON-NLS-1$
}
TextSequence statementText = getStatementText();
int statementLength = statementText.length();
int prefixEnd = readBackwardSpaces(statementText, statementLength);
int prefixStart = readAliasStartIndex(statementText, prefixEnd, true);
return statementText.subSequence(prefixStart, prefixEnd).toString();
}
public static int readBackwardSpaces(CharSequence textSequence, int startPosition) {
int rv = startPosition;
for (; rv > 0; rv--) {
if (!Character.isWhitespace(textSequence.charAt(rv - 1))) {
break;
}
}
return rv;
}
public static int readAliasStartIndex(CharSequence textSequence, int startPosition, boolean includeDolar) {
while (startPosition > 0) {
char ch = textSequence.charAt(startPosition - 1);
if (ch == '"' || ch == '\'') {
break;
}
startPosition--;
}
return startPosition;
}
}