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;
}
};
- // 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 <code>null</code>.
- // *
- // * @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;
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;
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) {
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();
}
}
+ 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) {
}
}
- 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;
}
}
- // concatenate arrays
+ // concatenate the result arrays
IPHPCompletionProposal[] total;
total =
new IPHPCompletionProposal[templateResults.length