Defined a limit for code completion list entries PHPeclipsePlugin.MAX_PROPOSALS
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index dee6cca..c4ce375 100644 (file)
@@ -14,19 +14,24 @@ 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.internal.corext.template.ContextType;
 import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry;
 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 org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.TextPresentation;
@@ -38,6 +43,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.
@@ -306,6 +312,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) {
     IDocument document = viewer.getDocument();
     Object[] identifiers = null;
+    IProject project = null;
     if (offset > 0) {
 
       PHPEditor editor = null;
@@ -314,6 +321,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();
         outlinePage = editor.getfOutlinePage();
         if (outlinePage instanceof PHPContentOutlinePage) {
           identifiers = ((PHPContentOutlinePage) outlinePage).getVariables();
@@ -352,6 +361,23 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         }
       }
 
+      IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
+      if (project != null) {
+        DeclarationEngine identifierEngine;
+        String proposal;
+
+        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);
+          identifierEngine.complete(viewer, offset, sortedMap);
+          identifierResults = identifierEngine.getResults();
+        }
+      }
+
+      // built in function names from phpsyntax.xml
       IPHPCompletionProposal[] builtinResults = new IPHPCompletionProposal[0];
       if (PHPFunctionNames.FUNCTION_NAMES != null) {
         BuiltInEngine builtinEngine;
@@ -360,6 +386,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
         if (contextType != null) {
           builtinEngine = new BuiltInEngine(contextType);
+          // TODO PHPFunctionNames.FUNCTION_NAMES should be taken from phpsyntax.xml
           builtinEngine.complete(viewer, offset, PHPFunctionNames.FUNCTION_NAMES);
           builtinResults = builtinEngine.getResults();
         }
@@ -367,10 +394,21 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
       // concatenate arrays
       IPHPCompletionProposal[] total;
-      total = new IPHPCompletionProposal[templateResults.length + identifierResults.length + builtinResults.length];
+      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);