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 976f385..4d4acc5 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 @@ -41,9 +41,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextPresentation; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; @@ -132,126 +130,6 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } }; - // public final class VariablesCompletionProposal implements IJavaCompletionProposal { - // private String fDisplayString; - // private String fReplacementString; - // private int fReplacementOffset; - // private int fReplacementLength; - // private int fCursorPosition; - // private Image fImage; - // private IContextInformation fContextInformation; - // private String fAdditionalProposalInfo; - // - // /** - // * Creates a new completion proposal based on the provided information. The replacement string is - // * considered being the display string too. All remaining fields are set to null. - // * - // * @param replacementString the actual string to be inserted into the document - // * @param replacementOffset the offset of the text to be replaced - // * @param replacementLength the length of the text to be replaced - // * @param cursorPosition the position of the cursor following the insert relative to replacementOffset - // */ - // public VariablesCompletionProposal( - // String replacementString, - // int replacementOffset, - // int replacementLength, - // int cursorPosition) { - // this(replacementString, replacementOffset, replacementLength, cursorPosition, null, null, null, null); - // } - // - // /** - // * Creates a new completion proposal. All fields are initialized based on the provided information. - // * - // * @param replacementString the actual string to be inserted into the document - // * @param replacementOffset the offset of the text to be replaced - // * @param replacementLength the length of the text to be replaced - // * @param cursorPosition the position of the cursor following the insert relative to replacementOffset - // * @param image the image to display for this proposal - // * @param displayString the string to be displayed for the proposal - // * @param contentInformation the context information associated with this proposal - // * @param additionalProposalInfo the additional information associated with this proposal - // */ - // public VariablesCompletionProposal( - // String replacementString, - // int replacementOffset, - // int replacementLength, - // int cursorPosition, - // Image image, - // String displayString, - // IContextInformation contextInformation, - // String additionalProposalInfo) { - // // Assert.isNotNull(replacementString); - // // Assert.isTrue(replacementOffset >= 0); - // // Assert.isTrue(replacementLength >= 0); - // // Assert.isTrue(cursorPosition >= 0); - // - // fReplacementString = replacementString; - // fReplacementOffset = replacementOffset; - // fReplacementLength = replacementLength; - // fCursorPosition = cursorPosition; - // fImage = image; - // fDisplayString = displayString; - // fContextInformation = contextInformation; - // fAdditionalProposalInfo = additionalProposalInfo; - // } - // - // /* - // * @see ICompletionProposal#apply - // */ - // public void apply(IDocument document) { - // try { - // document.replace(fReplacementOffset, fReplacementLength, fReplacementString); - // } catch (BadLocationException x) { - // // ignore - // } - // } - // - // /* - // * @see ICompletionProposal#getSelection - // */ - // public Point getSelection(IDocument document) { - // return new Point(fReplacementOffset + fCursorPosition, 0); - // } - // - // /* - // * @see ICompletionProposal#getContextInformation() - // */ - // public IContextInformation getContextInformation() { - // return fContextInformation; - // } - // - // /* - // * @see ICompletionProposal#getImage() - // */ - // public Image getImage() { - // return fImage; - // } - // - // /* - // * @see ICompletionProposal#getDisplayString() - // */ - // public String getDisplayString() { - // if (fDisplayString != null) - // return fDisplayString; - // return fReplacementString; - // } - // - // /* - // * @see ICompletionProposal#getAdditionalProposalInfo() - // */ - // public String getAdditionalProposalInfo() { - // return fAdditionalProposalInfo; - // } - // /** - // * Returns the relevance of the proposal. - // */ - // public int getRelevance() { - // return 0; - // } - // } - -// protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES; - private char[] fProposalAutoActivationSet; protected IContextInformationValidator fValidator = new Validator(); private TemplateEngine fTemplateEngine; @@ -285,55 +163,25 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { public void setCompletionProposalAutoActivationCharacters(char[] activationSet) { fProposalAutoActivationSet = activationSet; } + /* (non-Javadoc) * Method declared on IContentAssistProcessor */ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) { - // IDocument document = viewer.getDocument(); - // if (documentOffset > 0) { - // try { - // ICompletionProposal[] result; - // char character = document.getChar(documentOffset - 1); - // if (character == '$') { - ////viewer. .getActivePage().getActiveEditor(); - // result = new ICompletionProposal[fgProposals.length]; - // for (int i = 0; i < fgProposals.length; i++) { - // IContextInformation info = new ContextInformation(fgProposals[i], MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$ - // result[i] = new CompletionProposal(fgProposals[i], documentOffset, 0, fgProposals[i].length(), null, fgProposals[i], info, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$ - // } - // return result; - // } - // } catch (BadLocationException e) { - // return new ICompletionProposal[0]; - // } - // } - // - // ICompletionProposal[] result = new ICompletionProposal[fgProposals.length]; - // for (int i = 0; i < fgProposals.length; i++) { - // IContextInformation info = new ContextInformation(fgProposals[i], MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$ - // result[i] = new CompletionProposal(fgProposals[i], documentOffset, 0, fgProposals[i].length(), null, fgProposals[i], info, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$ - // } - // return result; int contextInformationPosition = guessContextInformationPosition(viewer, documentOffset); return internalComputeCompletionProposals(viewer, documentOffset, contextInformationPosition); - } - private boolean isReference(ITextViewer viewer, int completionPosition) { + private int getLastToken(ITextViewer viewer, int completionPosition, PHPUnitContext context) { IDocument document = viewer.getDocument(); - ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$ - ((CompilationUnitContextType) contextType).setContextParameters(document, completionPosition, 0); - - PHPUnitContext context = (PHPUnitContext) contextType.createContext(); int start = context.getStart(); int end = context.getEnd(); - String prefix = context.getKey(); - IRegion region = new Region(start, end - start); String startText; - boolean useClassEntries = false; + int lastSignificantToken = ITerminalSymbols.TokenNameEOF; + try { - // search begin of 2 lines behind this + // begin search 2 lines behind of this int j = start; if (j != 0) { char ch; @@ -358,32 +206,42 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { scanner.setSource(startText.toCharArray()); scanner.setPHPMode(true); int token = ITerminalSymbols.TokenNameEOF; + int beforeLastToken = ITerminalSymbols.TokenNameEOF; int lastToken = ITerminalSymbols.TokenNameEOF; try { token = scanner.getNextToken(); lastToken = token; while (token != ITerminalSymbols.TokenNameERROR && token != ITerminalSymbols.TokenNameEOF) { + beforeLastToken = lastToken; lastToken = token; // System.out.println(scanner.toStringAction(lastToken)); token = scanner.getNextToken(); } } catch (InvalidInputException e1) { } - if (lastToken == ITerminalSymbols.TokenNameMINUS_GREATER) { - // dereferencing operator '->' found - useClassEntries = true; - // System.out.println("useClassEntries = true"); + switch (lastToken) { + case ITerminalSymbols.TokenNameMINUS_GREATER : + // dereferencing operator '->' found + lastSignificantToken = ITerminalSymbols.TokenNameMINUS_GREATER; + if (beforeLastToken == ITerminalSymbols.TokenNamethis) { + lastSignificantToken = ITerminalSymbols.TokenNamethis; + } + break; + case ITerminalSymbols.TokenNamenew : + lastSignificantToken = ITerminalSymbols.TokenNamenew; + break; } } } catch (BadLocationException e) { } - return useClassEntries; + return lastSignificantToken; } - + private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) { IDocument document = viewer.getDocument(); Object[] identifiers = null; + IFile file = null; IProject project = null; if (offset > 0) { @@ -393,8 +251,8 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { IEditorPart targetEditor = PHPeclipsePlugin.getActiveWorkbenchWindow().getActivePage().getActiveEditor(); if (targetEditor != null && (targetEditor instanceof PHPEditor)) { editor = (PHPEditor) targetEditor; - IFile f = ((IFileEditorInput) editor.getEditorInput()).getFile(); - project = f.getProject(); + file = ((IFileEditorInput) editor.getEditorInput()).getFile(); + project = file.getProject(); outlinePage = editor.getfOutlinePage(); if (outlinePage instanceof PHPContentOutlinePage) { identifiers = ((PHPContentOutlinePage) outlinePage).getVariables(); @@ -402,28 +260,32 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } } + ContextType phpContextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$ + ((CompilationUnitContextType) phpContextType).setContextParameters(document, offset, 0); + + PHPUnitContext context = (PHPUnitContext) phpContextType.createContext(); + String prefix = context.getKey(); + + int lastSignificantToken = getLastToken(viewer, offset, context); + boolean useClassMembers = + (lastSignificantToken == ITerminalSymbols.TokenNameMINUS_GREATER) || + (lastSignificantToken == ITerminalSymbols.TokenNamethis) || + (lastSignificantToken == ITerminalSymbols.TokenNamenew); + boolean emptyPrefix = prefix == null || prefix.equals(""); + if (fTemplateEngine != null) { - ICompletionProposal[] results; - // try { - fTemplateEngine.reset(); - fTemplateEngine.complete(viewer, offset); //, unit); - // } catch (JavaModelException x) { - // Shell shell= viewer.getTextWidget().getShell(); - // ErrorDialog.openError(shell, JavaTextMessages.getString("CompletionProcessor.error.accessing.title"), JavaTextMessages.getString("CompletionProcessor.error.accessing.message"), x.getStatus()); //$NON-NLS-2$ //$NON-NLS-1$ - // } + IPHPCompletionProposal[] templateResults = new IPHPCompletionProposal[0]; - IPHPCompletionProposal[] templateResults = fTemplateEngine.getResults(); + ICompletionProposal[] results; + if (!emptyPrefix) { + fTemplateEngine.reset(); + fTemplateEngine.complete(viewer, offset); //, unit); + templateResults = fTemplateEngine.getResults(); + } IPHPCompletionProposal[] identifierResults = new IPHPCompletionProposal[0]; - if (identifiers != null) { + if ((!useClassMembers) && identifiers != null) { IdentifierEngine identifierEngine; - String proposal; - // int j = 0; - // for (int i = templateResults.length; i < templateResults.length + variables.length; i++) { - // proposal = (String) variables[j++]; - // IContextInformation info = new ContextInformation(proposal, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { proposal })); //$NON-NLS-1$ - // results[i] = new VariablesCompletionProposal(proposal, offset, 0, proposal.length(), null, proposal, info, MessageFormat.format(PHPEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { proposal })); //$NON-NLS-1$ - // } ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$ if (contextType != null) { @@ -433,27 +295,26 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } } - boolean useClassEntries = isReference(viewer, offset); + // declarations stored in file project.index on project level IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0]; if (project != null) { - DeclarationEngine identifierEngine; - String proposal; + DeclarationEngine declarationEngine; ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$ if (contextType != null) { IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(project); SortedMap sortedMap = indexManager.getIdentifierMap(); - identifierEngine = new DeclarationEngine(contextType, useClassEntries); - identifierEngine.complete(viewer, offset, sortedMap); - identifierResults = identifierEngine.getResults(); + declarationEngine = new DeclarationEngine(contextType, lastSignificantToken, file); + declarationEngine.complete(viewer, offset, sortedMap); + declarationResults = declarationEngine.getResults(); } } // built in function names from phpsyntax.xml - ArrayList syntaxbuffer = PHPSyntaxRdr.getSyntaxData(); + ArrayList syntaxbuffer = PHPSyntaxRdr.getSyntaxData(); IPHPCompletionProposal[] builtinResults = new IPHPCompletionProposal[0]; - if ((!useClassEntries)&&syntaxbuffer != null) { + if ((!useClassMembers) && syntaxbuffer != null) { BuiltInEngine builtinEngine; String proposal; @@ -465,7 +326,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } } - // concatenate arrays + // concatenate the result arrays IPHPCompletionProposal[] total; total = new IPHPCompletionProposal[templateResults.length