import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
import java.util.SortedMap;
import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.IJavaElement;
+import net.sourceforge.phpdt.core.IMethod;
+import net.sourceforge.phpdt.core.ISourceRange;
import net.sourceforge.phpdt.core.ToolFactory;
import net.sourceforge.phpdt.core.compiler.ITerminalSymbols;
import net.sourceforge.phpdt.core.compiler.InvalidInputException;
import net.sourceforge.phpdt.internal.ui.text.template.BuiltInEngine;
import net.sourceforge.phpdt.internal.ui.text.template.DeclarationEngine;
import net.sourceforge.phpdt.internal.ui.text.template.IdentifierEngine;
+import net.sourceforge.phpdt.internal.ui.text.template.LocalVariableProposal;
import net.sourceforge.phpdt.internal.ui.text.template.SQLProposal;
import net.sourceforge.phpdt.internal.ui.text.template.contentassist.TemplateEngine;
import net.sourceforge.phpdt.ui.IWorkingCopyManager;
*/
public class PHPCompletionProcessor implements IContentAssistProcessor {
/**
- * Simple content assist tip closer. The tip is valid in a range of 5
- * characters around its popup location.
+ * Simple content assist tip closer. The tip is valid in a range of 5 characters around its popup location.
*/
- protected static class Validator implements IContextInformationValidator,
- IContextInformationPresenter {
+ protected static class Validator implements IContextInformationValidator, IContextInformationPresenter {
protected int fInstallOffset;
/*
}
/*
- * @see IContextInformationValidator#install(IContextInformation,
- * ITextViewer, int)
+ * @see IContextInformationValidator#install(IContextInformation, ITextViewer, int)
*/
public void install(IContextInformation info, ITextViewer viewer, int offset) {
fInstallOffset = offset;
}
/*
- * @see org.eclipse.jface.text.contentassist.IContextInformationPresenter#updatePresentation(int,
- * TextPresentation)
+ * @see org.eclipse.jface.text.contentassist.IContextInformationPresenter#updatePresentation(int, TextPresentation)
*/
- public boolean updatePresentation(int documentPosition,
- TextPresentation presentation) {
+ public boolean updatePresentation(int documentPosition, TextPresentation presentation) {
return false;
}
};
- private static class ContextInformationWrapper implements
- IContextInformation, IContextInformationExtension {
+ private static class ContextInformationWrapper implements IContextInformation, IContextInformationExtension {
private final IContextInformation fContextInformation;
private int fPosition;
public PHPCompletionProcessor(IEditorPart editor) {
fEditor = editor;
fManager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
- TemplateContextType contextType = PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
- "php"); //$NON-NLS-1$
+ TemplateContextType contextType = PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType("php"); //$NON-NLS-1$
if (contextType != null)
fTemplateEngine = new TemplateEngine(contextType);
fComparator = new PHPCompletionProposalComparator();
}
/**
- * Sets this processor's set of characters triggering the activation of the
- * completion proposal computation.
+ * Sets this processor's set of characters triggering the activation of the completion proposal computation.
*
* @param activationSet
* the activation set
/*
* (non-Javadoc) Method declared on IContentAssistProcessor
*/
- public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
- int documentOffset) {
- int contextInformationPosition = guessContextInformationPosition(viewer,
- documentOffset);
- return internalComputeCompletionProposals(viewer, documentOffset,
- contextInformationPosition);
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
+ int contextInformationPosition = guessContextInformationPosition(viewer, documentOffset);
+ return internalComputeCompletionProposals(viewer, documentOffset, contextInformationPosition);
}
- private int getLastToken(ITextViewer viewer, int completionPosition,
- JavaContext context, TableName tableName) {
+ private int getLastToken(ITextViewer viewer, int completionPosition, JavaContext context, TableName tableName) {
IDocument document = viewer.getDocument();
int start = context.getStart();
int end = context.getEnd();
try {
token = scanner.getNextToken();
lastToken = token;
- while (token != ITerminalSymbols.TokenNameERROR
- && token != ITerminalSymbols.TokenNameEOF) {
+ while (token != ITerminalSymbols.TokenNameERROR && token != ITerminalSymbols.TokenNameEOF) {
beforeLastToken = lastToken;
- if (lastToken==ITerminalSymbols.TokenNameVariable) {
+ if (lastToken == ITerminalSymbols.TokenNameVariable) {
ident = scanner.getCurrentTokenSource();
- if (ident.length==5 &&
- ident[0]=='$' &&
- ident[1]=='t' &&
- ident[2]=='h' &&
- ident[3]=='i' &&
- ident[4]=='s') {
+ if (ident.length == 5 && ident[0] == '$' && ident[1] == 't' && ident[2] == 'h' && ident[3] == 'i' && ident[4] == 's') {
beforeLastToken = ITerminalSymbols.TokenNamethis_PHP_COMPLETION;
}
}
tableNameStart = currentCharacterPosition - 1;
} else {
if (!Character.isJavaIdentifierPart(ch)) {
- return sqlText.substring(tableNameStart,
- currentCharacterPosition - 1);
+ return sqlText.substring(tableNameStart, currentCharacterPosition - 1);
}
}
}
if (ident.equals("select")) {
// System.out.println("select");
token = ITerminalSymbols.TokenNameSQLselect;
- return token;
+ return token;
} else if (ident.equals("insert")) {
// System.out.println("insert");
token = ITerminalSymbols.TokenNameSQLinsert;
return ITerminalSymbols.TokenNameEOF;
}
- private ICompletionProposal[] internalComputeCompletionProposals(
- ITextViewer viewer, int offset, int contextOffset) {
- ICompilationUnit unit= fManager.getWorkingCopy(fEditor.getEditorInput());
+ private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) {
+ ICompilationUnit unit = fManager.getWorkingCopy(fEditor.getEditorInput());
IDocument document = viewer.getDocument();
Object[] identifiers = null;
IFile file = null;
project = file.getProject();
}
}
-
- Point selection= viewer.getSelectedRange();
-
- // remember selected text
- String selectedText= null;
- if (selection.y != 0) {
- try {
- selectedText= document.get(selection.x, selection.y);
- } catch (BadLocationException e) {}
- }
-
- JavaContextType phpContextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
- "php"); //$NON-NLS-1$
-// ((CompilationUnitContextType) phpContextType).setContextParameters(
-// document, offset, 0);
- JavaContext context = (JavaContext) phpContextType.createContext(document, offset,selection.y,unit);
+
+ Point selection = viewer.getSelectedRange();
+
+ // remember selected text
+ String selectedText = null;
+ if (selection.y != 0) {
+ try {
+ selectedText = document.get(selection.x, selection.y);
+ } catch (BadLocationException e) {
+ }
+ }
+
+ JavaContextType phpContextType = (JavaContextType) PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+ "php"); //$NON-NLS-1$
+ JavaContext context = (JavaContext) phpContextType.createContext(document, offset, selection.y, unit);
context.setVariable("selection", selectedText); //$NON-NLS-1$
String prefix = context.getKey();
+ boolean emptyPrefix = prefix == null || prefix.equals("");
+ IPHPCompletionProposal[] localVariableResults = new IPHPCompletionProposal[0];
+ if (!emptyPrefix && prefix.length() >= 1 && prefix.charAt(0) == '$') { // php Variable ?
+ HashSet localVariables = getLocalVariableProposals(viewer, project, context, prefix);
+ if (localVariables.size() > 0) {
+ localVariableResults = (IPHPCompletionProposal[]) localVariables.toArray(new IPHPCompletionProposal[localVariables.size()]);
+ }
+ }
+
TableName sqlTable = new TableName();
int lastSignificantToken = getLastToken(viewer, offset, context, sqlTable);
boolean useClassMembers = (lastSignificantToken == ITerminalSymbols.TokenNameMINUS_GREATER)
- || (lastSignificantToken == ITerminalSymbols.TokenNameVariable)
- || (lastSignificantToken == ITerminalSymbols.TokenNamenew)
+ || (lastSignificantToken == ITerminalSymbols.TokenNameVariable) || (lastSignificantToken == ITerminalSymbols.TokenNamenew)
|| (lastSignificantToken == ITerminalSymbols.TokenNamethis_PHP_COMPLETION);
- boolean emptyPrefix = prefix == null || prefix.equals("");
+
if (fTemplateEngine != null) {
IPHPCompletionProposal[] templateResults = new IPHPCompletionProposal[0];
ICompletionProposal[] results;
IPHPCompletionProposal[] identifierResults = new IPHPCompletionProposal[0];
if ((!useClassMembers) && identifiers != null) {
IdentifierEngine identifierEngine;
- JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
- "php"); //$NON-NLS-1$
+ JavaContextType contextType = (JavaContextType) PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+ "php"); //$NON-NLS-1$
if (contextType != null) {
identifierEngine = new IdentifierEngine(contextType);
- identifierEngine.complete(viewer, offset, identifiers,unit);
+ identifierEngine.complete(viewer, offset, identifiers, unit);
identifierResults = identifierEngine.getResults();
}
}
IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
if (project != null) {
DeclarationEngine declarationEngine;
- JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
- "php"); //$NON-NLS-1$
+ JavaContextType contextType = (JavaContextType) PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+ "php"); //$NON-NLS-1$
if (contextType != null) {
- IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault()
- .getIndexManager(project);
+ IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(project);
SortedMap sortedMap = indexManager.getIdentifierMap();
- declarationEngine = new DeclarationEngine(project, contextType,
- lastSignificantToken, file);
- declarationEngine.complete(viewer, offset, sortedMap,unit);
+ declarationEngine = new DeclarationEngine(project, contextType, lastSignificantToken, file);
+ declarationEngine.complete(viewer, offset, sortedMap, unit);
declarationResults = declarationEngine.getResults();
}
}
if ((!useClassMembers) && syntaxbuffer != null) {
BuiltInEngine builtinEngine;
String proposal;
- JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
- "php"); //$NON-NLS-1$
+ JavaContextType contextType = (JavaContextType) PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+ "php"); //$NON-NLS-1$
if (contextType != null) {
builtinEngine = new BuiltInEngine(contextType);
builtinEngine.complete(viewer, offset, syntaxbuffer, unit);
}
// concatenate the result arrays
IPHPCompletionProposal[] total;
- total = new IPHPCompletionProposal[templateResults.length
- + identifierResults.length + builtinResults.length
- + declarationResults.length + sqlResults.length];
+ total = new IPHPCompletionProposal[localVariableResults.length + templateResults.length + identifierResults.length
+ + builtinResults.length + declarationResults.length + sqlResults.length];
System.arraycopy(templateResults, 0, total, 0, templateResults.length);
- System.arraycopy(identifierResults, 0, total, templateResults.length,
- identifierResults.length);
- System.arraycopy(builtinResults, 0, total, templateResults.length
- + identifierResults.length, builtinResults.length);
- System.arraycopy(declarationResults, 0, total, templateResults.length
- + identifierResults.length + builtinResults.length,
+ System.arraycopy(identifierResults, 0, total, templateResults.length, identifierResults.length);
+ System.arraycopy(builtinResults, 0, total, templateResults.length + identifierResults.length, builtinResults.length);
+ System.arraycopy(declarationResults, 0, total, templateResults.length + identifierResults.length + builtinResults.length,
declarationResults.length);
- System.arraycopy(sqlResults, 0, total, templateResults.length
- + identifierResults.length + builtinResults.length
+ System.arraycopy(sqlResults, 0, total, templateResults.length + identifierResults.length + builtinResults.length
+ declarationResults.length, sqlResults.length);
+ System.arraycopy(localVariableResults, 0, total, templateResults.length + identifierResults.length + builtinResults.length
+ + declarationResults.length + sqlResults.length, localVariableResults.length);
results = total;
fNumberOfComputedResults = (results == null ? 0 : results.length);
/*
- * Order here and not in result collector to make sure that the order
- * applies to all proposals and not just those of the compilation unit.
+ * Order here and not in result collector to make sure that the order applies to all proposals and not just those of the
+ * compilation unit.
*/
return order(results);
}
* @param project
* @param context
* @param prefix
+ * @return
+ */
+ private HashSet getLocalVariableProposals(ITextViewer viewer, IProject project, JavaContext context, String prefix) {
+ HashSet localVariables = new HashSet();
+ try {
+ IMethod method = (IMethod) context.findEnclosingElement(IJavaElement.METHOD);
+ int start = context.getStart();
+ int end = context.getEnd();
+ IRegion region = new Region(start, end - start);
+ char[] varName;
+ boolean matchesVarName;
+ if (method != null) {
+ ISourceRange range = method.getSourceRange();
+ char[] source = method.getSource().toCharArray();
+ Scanner scanner = new Scanner();
+ scanner.setSource(source);
+ scanner.phpMode = true;
+ int token = Scanner.TokenNameWHITESPACE;
+ while ((token = scanner.getNextToken()) != Scanner.TokenNameEOF) {
+ if (token == Scanner.TokenNameVariable) {
+ varName = scanner.getCurrentTokenSource();
+ if (varName.length >= prefix.length()) {
+ matchesVarName = true;
+ for (int i = 0; i < prefix.length(); i++) {
+ if (prefix.charAt(i) != varName[i]) {
+ matchesVarName = false;
+ break;
+ }
+ }
+ if (matchesVarName) {
+ LocalVariableProposal prop = new LocalVariableProposal(new String(varName), region, viewer);
+ if (varName.length == prefix.length()) {
+ prop.setRelevance(98);
+ }
+ localVariables.add(prop);
+ }
+ }
+ }
+ }
+ }
+ } catch (Throwable e) {
+ // ignore - Syntax exceptions could occur, if there are syntax errors !
+ }
+ return localVariables;
+ }
+
+ /**
+ * @param viewer
+ * @param project
+ * @param context
+ * @param prefix
* @param sqlTable
* @param sqlResults
* @return
*/
- private IPHPCompletionProposal[] getSQLProposals(ITextViewer viewer, IProject project, JavaContext context, String prefix, TableName sqlTable, IPHPCompletionProposal[] sqlResults) {
+ private IPHPCompletionProposal[] getSQLProposals(ITextViewer viewer, IProject project, JavaContext context, String prefix,
+ TableName sqlTable, IPHPCompletionProposal[] sqlResults) {
// Get The Database bookmark from the Quantum SQL plugin:
BookmarkCollection sqlBookMarks = BookmarkCollection.getInstance();
if (sqlBookMarks != null) {
- String bookmarkString = Util.getMiscProjectsPreferenceValue(project,
- IPreferenceConstants.PHP_BOOKMARK_DEFAULT);
+ String bookmarkString = Util.getMiscProjectsPreferenceValue(project, IPreferenceConstants.PHP_BOOKMARK_DEFAULT);
if (bookmarkString != null && !bookmarkString.equals("")) {
Bookmark bookmark = sqlBookMarks.find(bookmarkString);
ArrayList sqlList = new ArrayList();
IRegion region = new Region(start, end - start);
ResultSet set;
if (!isDollarPrefix) {
- set = metaData.getTables(null, null, prefixWithoutDollar
- + "%", null);
+ set = metaData.getTables(null, null, prefixWithoutDollar + "%", null);
while (set.next()) {
// String tempSchema = set.getString("TABLE_SCHEM");
// tempSchema = (tempSchema == null) ? "" :
tableName = set.getString("TABLE_NAME");
tableName = (tableName == null) ? "" : tableName.trim();
if (tableName != null && tableName.length() > 0) {
- sqlList.add(new SQLProposal(tableName, context, region,
- viewer, PHPUiImages.get(PHPUiImages.IMG_TABLE)));
+ sqlList.add(new SQLProposal(tableName, context, region, viewer, PHPUiImages.get(PHPUiImages.IMG_TABLE)));
}
}
set.close();
}
- set = metaData.getColumns(null, null, "%",
- prefixWithoutDollar + "%");
+ set = metaData.getColumns(null, null, "%", prefixWithoutDollar + "%");
SQLProposal sqlProposal;
while (set.next()) {
columnName = set.getString("COLUMN_NAME");
columnName = (columnName == null) ? "" : columnName.trim();
tableName = set.getString("TABLE_NAME");
tableName = (tableName == null) ? "" : tableName.trim();
- if (tableName != null && tableName.length() > 0
- && columnName != null && columnName.length() > 0) {
+ if (tableName != null && tableName.length() > 0 && columnName != null && columnName.length() > 0) {
if (isDollarPrefix) {
- sqlProposal = new SQLProposal(tableName, "$"
- + columnName, context, region, viewer, PHPUiImages
+ sqlProposal = new SQLProposal(tableName, "$" + columnName, context, region, viewer, PHPUiImages
.get(PHPUiImages.IMG_COLUMN));
} else {
- sqlProposal = new SQLProposal(tableName, columnName,
- context, region, viewer, PHPUiImages
- .get(PHPUiImages.IMG_COLUMN));
+ sqlProposal = new SQLProposal(tableName, columnName, context, region, viewer, PHPUiImages
+ .get(PHPUiImages.IMG_COLUMN));
}
if (tableName.equals(foundSQLTableName)) {
sqlProposal.setRelevance(90);
return contextPosition;
}
- /*
- * (non-Javadoc) Method declared on IContentAssistProcessor
- */
- // public IContextInformation[] computeContextInformation(ITextViewer viewer,
- // int documentOffset) {
- // IContextInformation[] result = new IContextInformation[5];
- // for (int i = 0; i < result.length; i++)
- // result[i] = new
- // ContextInformation(MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.ContextInfo.display.pattern"),
- // new Object[] { new Integer(i), new Integer(documentOffset)}),
- // //$NON-NLS-1$
- // MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.ContextInfo.value.pattern"),
- // new Object[] { new Integer(i), new Integer(documentOffset - 5), new
- // Integer(documentOffset + 5)})); //$NON-NLS-1$
- // return result;
- // }
/**
* @see IContentAssistProcessor#computeContextInformation(ITextViewer, int)
*/
- public IContextInformation[] computeContextInformation(ITextViewer viewer,
- int offset) {
- int contextInformationPosition = guessContextInformationPosition(viewer,
- offset);
+ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+ int contextInformationPosition = guessContextInformationPosition(viewer, offset);
List result = addContextInformations(viewer, contextInformationPosition);
- return (IContextInformation[]) result
- .toArray(new IContextInformation[result.size()]);
+ return (IContextInformation[]) result.toArray(new IContextInformation[result.size()]);
}
private List addContextInformations(ITextViewer viewer, int offset) {
- ICompletionProposal[] proposals = internalComputeCompletionProposals(
- viewer, offset, -1);
+ ICompletionProposal[] proposals = internalComputeCompletionProposals(viewer, offset, -1);
List result = new ArrayList();
for (int i = 0; i < proposals.length; i++) {
- IContextInformation contextInformation = proposals[i]
- .getContextInformation();
+ IContextInformation contextInformation = proposals[i].getContextInformation();
if (contextInformation != null) {
- ContextInformationWrapper wrapper = new ContextInformationWrapper(
- contextInformation);
+ ContextInformationWrapper wrapper = new ContextInformationWrapper(contextInformation);
wrapper.setContextInformationPosition(offset);
result.add(wrapper);
}