X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java index 69f3124..939bd77 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java @@ -7,7 +7,6 @@ Contributors: IBM Corporation - Initial implementation - Klaus Hartlage - www.eclipseproject.de **********************************************************************/ package net.sourceforge.phpeclipse.phpeditor.php; @@ -18,29 +17,15 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.SortedMap; -import net.sourceforge.phpdt.core.IBuffer; import net.sourceforge.phpdt.core.ICompilationUnit; -import net.sourceforge.phpdt.core.IJavaProject; -import net.sourceforge.phpdt.core.JavaModelException; 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.compiler.IProblemFactory; -import net.sourceforge.phpdt.internal.compiler.SourceElementParser; -import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; import net.sourceforge.phpdt.internal.compiler.parser.Scanner; -import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory; -import net.sourceforge.phpdt.internal.core.CompilationUnit; -import net.sourceforge.phpdt.internal.core.CompilationUnitStructureRequestor; -import net.sourceforge.phpdt.internal.core.JavaModelManager; -import net.sourceforge.phpdt.internal.core.JavaProject; -import net.sourceforge.phpdt.internal.corext.template.ContextType; -import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry; -import net.sourceforge.phpdt.internal.corext.template.php.CompilationUnitContextType; -import net.sourceforge.phpdt.internal.corext.template.php.PHPUnitContext; +import net.sourceforge.phpdt.internal.corext.template.php.JavaContext; +import net.sourceforge.phpdt.internal.corext.template.php.JavaContextType; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal; import net.sourceforge.phpdt.internal.ui.text.java.PHPCompletionProposalComparator; @@ -48,15 +33,14 @@ 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.SQLProposal; -import net.sourceforge.phpdt.internal.ui.text.template.TemplateEngine; +import net.sourceforge.phpdt.internal.ui.text.template.contentassist.TemplateEngine; import net.sourceforge.phpdt.ui.IWorkingCopyManager; -import net.sourceforge.phpeclipse.IPreferenceConstants; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.builder.IdentifierIndexManager; -import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration; -import net.sourceforge.phpeclipse.overlaypages.Util; import net.sourceforge.phpeclipse.phpeditor.PHPEditor; import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; +import net.sourceforge.phpeclipse.ui.IPreferenceConstants; +import net.sourceforge.phpeclipse.ui.overlaypages.Util; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -72,7 +56,9 @@ import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.contentassist.IContextInformationExtension; import org.eclipse.jface.text.contentassist.IContextInformationPresenter; import org.eclipse.jface.text.contentassist.IContextInformationValidator; +import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; @@ -204,7 +190,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { public PHPCompletionProcessor(IEditorPart editor) { fEditor = editor; fManager = PHPeclipsePlugin.getDefault().getWorkingCopyManager(); - ContextType contextType = ContextTypeRegistry.getInstance().getContextType( + TemplateContextType contextType = PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType( "php"); //$NON-NLS-1$ if (contextType != null) fTemplateEngine = new TemplateEngine(contextType); @@ -244,7 +230,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } private int getLastToken(ITextViewer viewer, int completionPosition, - PHPUnitContext context, TableName tableName) { + JavaContext context, TableName tableName) { IDocument document = viewer.getDocument(); int start = context.getStart(); int end = context.getEnd(); @@ -282,12 +268,24 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { scanner.setPHPMode(true); int beforeLastToken = ITerminalSymbols.TokenNameEOF; int lastToken = ITerminalSymbols.TokenNameEOF; + char[] ident; try { token = scanner.getNextToken(); lastToken = token; while (token != ITerminalSymbols.TokenNameERROR && token != ITerminalSymbols.TokenNameEOF) { beforeLastToken = lastToken; + 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') { + beforeLastToken = ITerminalSymbols.TokenNamethis_PHP_COMPLETION; + } + } lastToken = token; // System.out.println(scanner.toStringAction(lastToken)); token = scanner.getNextToken(); @@ -516,7 +514,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { 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; @@ -527,96 +525,49 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { editor = (PHPEditor) fEditor; file = ((IFileEditorInput) editor.getEditorInput()).getFile(); project = file.getProject(); - // outlinePage = editor.getfOutlinePage(); - // TODO: get the identifiers from the new model - // if (outlinePage instanceof PHPContentOutlinePage) { - // identifiers = ((PHPContentOutlinePage) outlinePage).getVariables(); - // } - } - } - - final ICompilationUnit unit = fManager.getWorkingCopy(fEditor - .getEditorInput()); - - // get buffer contents - final IBuffer buffer; - CompilationUnitDeclaration unitDecl=null; - try { - buffer = unit.getBuffer(); - - if (project != null && buffer != null) { - - // final char[] contents = buffer == null ? null : - // buffer.getCharacters(); - // - // // generate structure and compute syntax problems if needed - // CompilationUnitStructureRequestor requestor = new - // CompilationUnitStructureRequestor(this, unitInfo, newElements); - // JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = - // getPerWorkingCopyInfo(); - // IJavaProject project = getJavaProject(); - // boolean computeProblems = - // JavaProject.hasJavaNature(project.getProject()) && perWorkingCopyInfo - // != null && perWorkingCopyInfo.isActive(); - IProblemFactory problemFactory = new DefaultProblemFactory(); - // Map options = project.getOptions(true); - SourceElementParser parser = new SourceElementParser(null, - problemFactory, new CompilerOptions(null)); - //, true/*report local declarations*/); - unitDecl = parser.parseCompletionUnit( - new net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit() { - public char[] getContents() { - return buffer.getCharacters(); - } - - public char[] getMainTypeName() { - return null; - } - - public char[][] getPackageName() { - return null; - } - - public char[] getFileName() { - return null; - } - }, true /* full parse to find local elements */); - } -// System.out.println(unit.toString()); - } catch (Exception e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); } - - ContextType phpContextType = ContextTypeRegistry.getInstance() - .getContextType("php"); //$NON-NLS-1$ - ((CompilationUnitContextType) phpContextType).setContextParameters( - document, offset, 0); - PHPUnitContext context = (PHPUnitContext) phpContextType.createContext(); + + 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); + context.setVariable("selection", selectedText); //$NON-NLS-1$ String prefix = context.getKey(); 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.TokenNamenew) + || (lastSignificantToken == ITerminalSymbols.TokenNamethis_PHP_COMPLETION); boolean emptyPrefix = prefix == null || prefix.equals(""); if (fTemplateEngine != null) { IPHPCompletionProposal[] templateResults = new IPHPCompletionProposal[0]; ICompletionProposal[] results; if (!emptyPrefix) { fTemplateEngine.reset(); - fTemplateEngine.complete(viewer, offset); //, unit); + fTemplateEngine.complete(viewer, offset, unit); templateResults = fTemplateEngine.getResults(); } IPHPCompletionProposal[] identifierResults = new IPHPCompletionProposal[0]; if ((!useClassMembers) && identifiers != null) { IdentifierEngine identifierEngine; - ContextType contextType = ContextTypeRegistry.getInstance() - .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); + identifierEngine.complete(viewer, offset, identifiers,unit); identifierResults = identifierEngine.getResults(); } } @@ -624,15 +575,15 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0]; if (project != null) { DeclarationEngine declarationEngine; - ContextType contextType = ContextTypeRegistry.getInstance() - .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); SortedMap sortedMap = indexManager.getIdentifierMap(); - declarationEngine = new DeclarationEngine(contextType, + declarationEngine = new DeclarationEngine(project, contextType, lastSignificantToken, file); - declarationEngine.complete(viewer, offset, sortedMap); + declarationEngine.complete(viewer, offset, sortedMap,unit); declarationResults = declarationEngine.getResults(); } } @@ -642,103 +593,17 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { if ((!useClassMembers) && syntaxbuffer != null) { BuiltInEngine builtinEngine; String proposal; - ContextType contextType = ContextTypeRegistry.getInstance() - .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); + builtinEngine.complete(viewer, offset, syntaxbuffer, unit); builtinResults = builtinEngine.getResults(); } } IPHPCompletionProposal[] sqlResults = new IPHPCompletionProposal[0]; if (project != null) { - // 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); - if (bookmarkString != null && !bookmarkString.equals("")) { - Bookmark bookmark = sqlBookMarks.find(bookmarkString); - ArrayList sqlList = new ArrayList(); - if (bookmark != null && !bookmark.isConnected()) { - new ConnectionUtil().connect(bookmark, null); - } - if (bookmark != null && bookmark.isConnected()) { - try { - Connection connection = bookmark.getConnection(); - DatabaseMetaData metaData = connection.getMetaData(); - - if (metaData != null) { - int start = context.getStart(); - int end = context.getEnd(); - String foundSQLTableName = sqlTable.getTableName(); - String tableName; - String columnName; - String prefixWithoutDollar = prefix; - boolean isDollarPrefix = false; - if (prefix.length() > 0 && prefix.charAt(0) == '$') { - prefixWithoutDollar = prefix.substring(1); - isDollarPrefix = true; - } - IRegion region = new Region(start, end - start); - ResultSet set; - if (!isDollarPrefix) { - set = metaData.getTables(null, null, prefixWithoutDollar - + "%", null); - while (set.next()) { - // String tempSchema = set.getString("TABLE_SCHEM"); - // tempSchema = (tempSchema == null) ? "" : - // tempSchema.trim(); - 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))); - } - } - set.close(); - } - 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 (isDollarPrefix) { - 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)); - } - if (tableName.equals(foundSQLTableName)) { - sqlProposal.setRelevance(90); - } else if (tableName.indexOf(foundSQLTableName) >= 0) { - sqlProposal.setRelevance(75); - } - sqlList.add(sqlProposal); - } - } - set.close(); - sqlResults = new IPHPCompletionProposal[sqlList.size()]; - for (int i = 0; i < sqlList.size(); i++) { - sqlResults[i] = (SQLProposal) sqlList.get(i); - } - } - } catch (NotConnectedException e) { - // ignore this - not mission critical - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } + sqlResults = getSQLProposals(viewer, project, context, prefix, sqlTable, sqlResults); } // concatenate the result arrays IPHPCompletionProposal[] total; @@ -767,6 +632,106 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { return new IPHPCompletionProposal[0]; } + /** + * @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) { + // 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); + if (bookmarkString != null && !bookmarkString.equals("")) { + Bookmark bookmark = sqlBookMarks.find(bookmarkString); + ArrayList sqlList = new ArrayList(); + if (bookmark != null && !bookmark.isConnected()) { + new ConnectionUtil().connect(bookmark, null); + } + if (bookmark != null && bookmark.isConnected()) { + try { + Connection connection = bookmark.getConnection(); + DatabaseMetaData metaData = connection.getMetaData(); + + if (metaData != null) { + int start = context.getStart(); + int end = context.getEnd(); + String foundSQLTableName = sqlTable.getTableName(); + String tableName; + String columnName; + String prefixWithoutDollar = prefix; + boolean isDollarPrefix = false; + if (prefix.length() > 0 && prefix.charAt(0) == '$') { + prefixWithoutDollar = prefix.substring(1); + isDollarPrefix = true; + } + IRegion region = new Region(start, end - start); + ResultSet set; + if (!isDollarPrefix) { + set = metaData.getTables(null, null, prefixWithoutDollar + + "%", null); + while (set.next()) { + // String tempSchema = set.getString("TABLE_SCHEM"); + // tempSchema = (tempSchema == null) ? "" : + // tempSchema.trim(); + 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))); + } + } + set.close(); + } + 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 (isDollarPrefix) { + 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)); + } + if (tableName.equals(foundSQLTableName)) { + sqlProposal.setRelevance(90); + } else if (tableName.indexOf(foundSQLTableName) >= 0) { + sqlProposal.setRelevance(75); + } + sqlList.add(sqlProposal); + } + } + set.close(); + sqlResults = new IPHPCompletionProposal[sqlList.size()]; + for (int i = 0; i < sqlList.size(); i++) { + sqlResults[i] = (SQLProposal) sqlList.get(i); + } + } + } catch (NotConnectedException e) { + // ignore this - not mission critical + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } + return sqlResults; + } + private int guessContextInformationPosition(ITextViewer viewer, int offset) { int contextPosition = offset; IDocument document = viewer.getDocument();