X-Git-Url: http://git.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 a96712b..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
@@ -14,17 +14,32 @@ package net.sourceforge.phpeclipse.phpeditor.php;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.SortedMap;
+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.parser.Scanner;
import net.sourceforge.phpdt.internal.corext.template.ContextType;
import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry;
-import net.sourceforge.phpdt.internal.ui.text.java.IJavaCompletionProposal;
-import net.sourceforge.phpdt.internal.ui.text.java.JavaCompletionProposalComparator;
+import net.sourceforge.phpdt.internal.corext.template.php.CompilationUnitContextType;
+import net.sourceforge.phpdt.internal.corext.template.php.PHPUnitContext;
+import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal;
+import net.sourceforge.phpdt.internal.ui.text.java.PHPCompletionProposalComparator;
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.TemplateEngine;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.builder.IdentifierIndexManager;
+import net.sourceforge.phpeclipse.phpeditor.AbstractContentOutlinePage;
import net.sourceforge.phpeclipse.phpeditor.PHPContentOutlinePage;
import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
+import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
+
+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.ITextViewer;
import org.eclipse.jface.text.TextPresentation;
@@ -36,6 +51,7 @@ import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
/**
* Example PHP completion processor.
@@ -114,129 +130,10 @@ 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;
- private JavaCompletionProposalComparator fComparator;
+ private PHPCompletionProposalComparator fComparator;
private int fNumberOfComputedResults = 0;
public PHPCompletionProcessor() {
@@ -245,80 +142,150 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
if (contextType != null)
fTemplateEngine = new TemplateEngine(contextType);
- fComparator = new JavaCompletionProposalComparator();
+ fComparator = new PHPCompletionProposalComparator();
+ }
+
+ /**
+ * Tells this processor to order the proposals alphabetically.
+ *
+ * @param order true
if proposals should be ordered.
+ */
+ public void orderProposalsAlphabetically(boolean order) {
+ fComparator.setOrderAlphabetically(order);
+ }
+
+ /**
+ * Sets this processor's set of characters triggering the activation of the
+ * completion proposal computation.
+ *
+ * @param activationSet the activation set
+ */
+ 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 int getLastToken(ITextViewer viewer, int completionPosition, PHPUnitContext context) {
+ IDocument document = viewer.getDocument();
+ int start = context.getStart();
+ int end = context.getEnd();
+
+ String startText;
+ int lastSignificantToken = ITerminalSymbols.TokenNameEOF;
+
+ try {
+ // begin search 2 lines behind of this
+ int j = start;
+ if (j != 0) {
+ char ch;
+ while (j-- > 0) {
+ ch = document.getChar(j);
+ if (ch == '\n') {
+ break;
+ }
+ }
+ while (j-- > 0) {
+ ch = document.getChar(j);
+ if (ch == '\n') {
+ break;
+ }
+ }
+ }
+ if (j != start) {
+ // scan the line for the dereferencing operator '->'
+ startText = document.get(j, start - j);
+ // System.out.println(startText);
+ Scanner scanner = ToolFactory.createScanner(false, false, false);
+ 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) {
+ }
+ 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 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) {
PHPEditor editor = null;
- PHPContentOutlinePage outlinePage = null;
+ AbstractContentOutlinePage outlinePage = null;
IEditorPart targetEditor = PHPeclipsePlugin.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (targetEditor != null && (targetEditor instanceof PHPEditor)) {
editor = (PHPEditor) targetEditor;
+ file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+ project = file.getProject();
outlinePage = editor.getfOutlinePage();
- identifiers = outlinePage.getVariables();
+ 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) {
+ IPHPCompletionProposal[] templateResults = new IPHPCompletionProposal[0];
+
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$
- // }
-
- IJavaCompletionProposal[] templateResults = fTemplateEngine.getResults();
-
- IJavaCompletionProposal[] identifierResults = new IJavaCompletionProposal[0];
- if (identifiers != null) {
+ if (!emptyPrefix) {
+ fTemplateEngine.reset();
+ fTemplateEngine.complete(viewer, offset); //, unit);
+ templateResults = fTemplateEngine.getResults();
+ }
+
+ IPHPCompletionProposal[] identifierResults = new IPHPCompletionProposal[0];
+ 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) {
@@ -328,25 +295,54 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
}
}
- IJavaCompletionProposal[] builtinResults = new IJavaCompletionProposal[0];
- if (PHPFunctionNames.FUNCTION_NAMES != null) {
+ // declarations stored in file project.index on project level
+ IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
+ if (project != null) {
+ DeclarationEngine declarationEngine;
+
+ ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
+ if (contextType != null) {
+ IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(project);
+ SortedMap sortedMap = indexManager.getIdentifierMap();
+
+ 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();
+ IPHPCompletionProposal[] builtinResults = new IPHPCompletionProposal[0];
+ if ((!useClassMembers) && syntaxbuffer != null) {
BuiltInEngine builtinEngine;
String proposal;
ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
if (contextType != null) {
builtinEngine = new BuiltInEngine(contextType);
- builtinEngine.complete(viewer, offset, PHPFunctionNames.FUNCTION_NAMES);
+ builtinEngine.complete(viewer, offset, syntaxbuffer);
builtinResults = builtinEngine.getResults();
}
}
- // concatenate arrays
- IJavaCompletionProposal[] total;
- total = new IJavaCompletionProposal[templateResults.length + identifierResults.length + builtinResults.length];
+ // concatenate the result arrays
+ IPHPCompletionProposal[] total;
+ total =
+ new IPHPCompletionProposal[templateResults.length
+ + identifierResults.length
+ + builtinResults.length
+ + declarationResults.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,
+ declarationResults.length);
+
results = total;
fNumberOfComputedResults = (results == null ? 0 : results.length);
@@ -356,7 +352,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
*/
return order(results);
}
- return new IJavaCompletionProposal[0];
+ return new IPHPCompletionProposal[0];
}
private int guessContextInformationPosition(ITextViewer viewer, int offset) {
@@ -366,13 +362,13 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
// try {
//
- // JavaCodeReader reader= new JavaCodeReader();
+ // PHPCodeReader reader= new PHPCodeReader();
// reader.configureBackwardReader(document, offset, true, true);
//
// int nestingLevel= 0;
//
// int curr= reader.read();
- // while (curr != JavaCodeReader.EOF) {
+ // while (curr != PHPCodeReader.EOF) {
//
// if (')' == (char) curr)
// ++ nestingLevel;
@@ -441,7 +437,8 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
* Method declared on IContentAssistProcessor
*/
public char[] getCompletionProposalAutoActivationCharacters() {
- return null; // new char[] { '$' };
+ return fProposalAutoActivationSet;
+ // return null; // new char[] { '$' };
}
/* (non-Javadoc)