Deleted PHPFunctionNames use only phpsyntax.xml instead !
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index c4ce375..976f385 100644 (file)
@@ -16,8 +16,14 @@ 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.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;
@@ -29,11 +35,15 @@ 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.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;
@@ -240,7 +250,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   //    }
   //  }
 
-  protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES;
+//  protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES;
 
   private char[] fProposalAutoActivationSet;
   protected IContextInformationValidator fValidator = new Validator();
@@ -309,6 +319,68 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
   }
 
+  private boolean isReference(ITextViewer viewer, int completionPosition) {
+    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;
+    try {
+      // search begin of 2 lines behind 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 lastToken = ITerminalSymbols.TokenNameEOF;
+
+        try {
+          token = scanner.getNextToken();
+          lastToken = token;
+          while (token != ITerminalSymbols.TokenNameERROR && token != ITerminalSymbols.TokenNameEOF) {
+            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");
+        }
+      }
+    } catch (BadLocationException e) {
+    }
+    return useClassEntries;
+  }
+  
   private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) {
     IDocument document = viewer.getDocument();
     Object[] identifiers = null;
@@ -361,6 +433,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         }
       }
 
+      boolean useClassEntries = isReference(viewer, offset);
       IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
       if (project != null) {
         DeclarationEngine identifierEngine;
@@ -371,23 +444,23 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
           IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(project);
           SortedMap sortedMap = indexManager.getIdentifierMap();
 
-          identifierEngine = new DeclarationEngine(contextType);
+          identifierEngine = new DeclarationEngine(contextType, useClassEntries);
           identifierEngine.complete(viewer, offset, sortedMap);
           identifierResults = identifierEngine.getResults();
         }
       }
 
       // built in function names from phpsyntax.xml
+                       ArrayList syntaxbuffer = PHPSyntaxRdr.getSyntaxData();
       IPHPCompletionProposal[] builtinResults = new IPHPCompletionProposal[0];
-      if (PHPFunctionNames.FUNCTION_NAMES != null) {
+      if ((!useClassEntries)&&syntaxbuffer != null) {
         BuiltInEngine builtinEngine;
         String proposal;
 
         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);
+          builtinEngine.complete(viewer, offset, syntaxbuffer);
           builtinResults = builtinEngine.getResults();
         }
       }