Syntax highlighting is changeable.
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCompletionProcessor.java
index 69f3124..5d50dee 100644 (file)
@@ -18,29 +18,16 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 import java.util.SortedMap;
 
-import net.sourceforge.phpdt.core.IBuffer;
 import net.sourceforge.phpdt.core.ICompilationUnit;
-import net.sourceforge.phpdt.core.IJavaProject;
-import net.sourceforge.phpdt.core.JavaModelException;
 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.IProblemFactory;
-import net.sourceforge.phpdt.internal.compiler.SourceElementParser;
-import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions;
 import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
-import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory;
-import net.sourceforge.phpdt.internal.core.CompilationUnit;
-import net.sourceforge.phpdt.internal.core.CompilationUnitStructureRequestor;
-import net.sourceforge.phpdt.internal.core.JavaModelManager;
-import net.sourceforge.phpdt.internal.core.JavaProject;
-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.corext.template.php.JavaContext;
+import net.sourceforge.phpdt.internal.corext.template.php.JavaContextType;
 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
 import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal;
 import net.sourceforge.phpdt.internal.ui.text.java.PHPCompletionProposalComparator;
@@ -48,15 +35,14 @@ 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.SQLProposal;
-import net.sourceforge.phpdt.internal.ui.text.template.TemplateEngine;
+import net.sourceforge.phpdt.internal.ui.text.template.contentassist.TemplateEngine;
 import net.sourceforge.phpdt.ui.IWorkingCopyManager;
-import net.sourceforge.phpeclipse.IPreferenceConstants;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 import net.sourceforge.phpeclipse.builder.IdentifierIndexManager;
-import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration;
-import net.sourceforge.phpeclipse.overlaypages.Util;
 import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
 import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
+import net.sourceforge.phpeclipse.ui.IPreferenceConstants;
+import net.sourceforge.phpeclipse.ui.overlaypages.Util;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -72,7 +58,9 @@ import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationExtension;
 import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.text.templates.TemplateContextType;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IFileEditorInput;
 
@@ -204,7 +192,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   public PHPCompletionProcessor(IEditorPart editor) {
     fEditor = editor;
     fManager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
-    ContextType contextType = ContextTypeRegistry.getInstance().getContextType(
+    TemplateContextType contextType = PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
         "php"); //$NON-NLS-1$
     if (contextType != null)
       fTemplateEngine = new TemplateEngine(contextType);
@@ -244,7 +232,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
   }
 
   private int getLastToken(ITextViewer viewer, int completionPosition,
-      PHPUnitContext context, TableName tableName) {
+      JavaContext context, TableName tableName) {
     IDocument document = viewer.getDocument();
     int start = context.getStart();
     int end = context.getEnd();
@@ -282,12 +270,24 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         scanner.setPHPMode(true);
         int beforeLastToken = ITerminalSymbols.TokenNameEOF;
         int lastToken = ITerminalSymbols.TokenNameEOF;
+        char[] ident;
         try {
           token = scanner.getNextToken();
           lastToken = token;
           while (token != ITerminalSymbols.TokenNameERROR
               && token != ITerminalSymbols.TokenNameEOF) {
             beforeLastToken = lastToken;
+            if (lastToken==ITerminalSymbols.TokenNameVariable) {
+              ident = scanner.getCurrentTokenSource();
+              if (ident.length==5 &&
+                  ident[0]=='$' &&
+                  ident[1]=='t' &&
+                  ident[2]=='h' &&
+                  ident[3]=='i' &&
+                  ident[4]=='s') {
+                beforeLastToken = ITerminalSymbols.TokenNamethis_PHP_COMPLETION;
+              }
+            }
             lastToken = token;
             //                                                         System.out.println(scanner.toStringAction(lastToken));
             token = scanner.getNextToken();
@@ -516,7 +516,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
 
   private ICompletionProposal[] internalComputeCompletionProposals(
       ITextViewer viewer, int offset, int contextOffset) {
-
+    ICompilationUnit unit= fManager.getWorkingCopy(fEditor.getEditorInput());
     IDocument document = viewer.getDocument();
     Object[] identifiers = null;
     IFile file = null;
@@ -527,96 +527,49 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
         editor = (PHPEditor) fEditor;
         file = ((IFileEditorInput) editor.getEditorInput()).getFile();
         project = file.getProject();
-        //        outlinePage = editor.getfOutlinePage();
-        // TODO: get the identifiers from the new model
-        //        if (outlinePage instanceof PHPContentOutlinePage) {
-        //          identifiers = ((PHPContentOutlinePage) outlinePage).getVariables();
-        //        }
-      }
-    }
-
-    final ICompilationUnit unit = fManager.getWorkingCopy(fEditor
-        .getEditorInput());
-
-    //  get buffer contents
-    final IBuffer buffer;
-    CompilationUnitDeclaration unitDecl=null;
-    try {
-      buffer = unit.getBuffer();
-
-      if (project != null && buffer != null) {
-
-        //     final char[] contents = buffer == null ? null :
-        // buffer.getCharacters();
-        //
-        //     // generate structure and compute syntax problems if needed
-        //     CompilationUnitStructureRequestor requestor = new
-        // CompilationUnitStructureRequestor(this, unitInfo, newElements);
-        //     JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo =
-        // getPerWorkingCopyInfo();
-        //     IJavaProject project = getJavaProject();
-        //     boolean computeProblems =
-        // JavaProject.hasJavaNature(project.getProject()) && perWorkingCopyInfo
-        // != null && perWorkingCopyInfo.isActive();
-        IProblemFactory problemFactory = new DefaultProblemFactory();
-        //     Map options = project.getOptions(true);
-        SourceElementParser parser = new SourceElementParser(null,
-            problemFactory, new CompilerOptions(null));
-        //, true/*report local declarations*/);
-        unitDecl = parser.parseCompletionUnit(
-            new net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit() {
-              public char[] getContents() {
-                return buffer.getCharacters();
-              }
-
-              public char[] getMainTypeName() {
-                return null;
-              }
-
-              public char[][] getPackageName() {
-                return null;
-              }
-
-              public char[] getFileName() {
-                return null;
-              }
-            }, true /* full parse to find local elements */);
-
       }
-//      System.out.println(unit.toString());
-    } catch (Exception e1) {
-      // TODO Auto-generated catch block
-      e1.printStackTrace();
     }
-
-    ContextType phpContextType = ContextTypeRegistry.getInstance()
-        .getContextType("php"); //$NON-NLS-1$
-    ((CompilationUnitContextType) phpContextType).setContextParameters(
-        document, offset, 0);
-    PHPUnitContext context = (PHPUnitContext) phpContextType.createContext();
+    
+    Point selection= viewer.getSelectedRange();
+
+       // remember selected text
+       String selectedText= null;
+       if (selection.y != 0) {
+               try {
+                       selectedText= document.get(selection.x, selection.y);
+               } catch (BadLocationException e) {}
+       }
+
+    JavaContextType phpContextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+    "php"); //$NON-NLS-1$
+//    ((CompilationUnitContextType) phpContextType).setContextParameters(
+//        document, offset, 0);
+    JavaContext context = (JavaContext) phpContextType.createContext(document, offset,selection.y,unit);
+    context.setVariable("selection", selectedText); //$NON-NLS-1$
     String prefix = context.getKey();
     TableName sqlTable = new TableName();
     int lastSignificantToken = getLastToken(viewer, offset, context, sqlTable);
     boolean useClassMembers = (lastSignificantToken == ITerminalSymbols.TokenNameMINUS_GREATER)
         || (lastSignificantToken == ITerminalSymbols.TokenNameVariable)
-        || (lastSignificantToken == ITerminalSymbols.TokenNamenew);
+        || (lastSignificantToken == ITerminalSymbols.TokenNamenew)
+        || (lastSignificantToken == ITerminalSymbols.TokenNamethis_PHP_COMPLETION);
     boolean emptyPrefix = prefix == null || prefix.equals("");
     if (fTemplateEngine != null) {
       IPHPCompletionProposal[] templateResults = new IPHPCompletionProposal[0];
       ICompletionProposal[] results;
       if (!emptyPrefix) {
         fTemplateEngine.reset();
-        fTemplateEngine.complete(viewer, offset); //, unit);
+        fTemplateEngine.complete(viewer, offset, unit);
         templateResults = fTemplateEngine.getResults();
       }
       IPHPCompletionProposal[] identifierResults = new IPHPCompletionProposal[0];
       if ((!useClassMembers) && identifiers != null) {
         IdentifierEngine identifierEngine;
-        ContextType contextType = ContextTypeRegistry.getInstance()
-            .getContextType("php"); //$NON-NLS-1$
+        JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+        "php"); //$NON-NLS-1$
         if (contextType != null) {
           identifierEngine = new IdentifierEngine(contextType);
-          identifierEngine.complete(viewer, offset, identifiers);
+          identifierEngine.complete(viewer, offset, identifiers,unit);
           identifierResults = identifierEngine.getResults();
         }
       }
@@ -624,15 +577,15 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
       IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0];
       if (project != null) {
         DeclarationEngine declarationEngine;
-        ContextType contextType = ContextTypeRegistry.getInstance()
-            .getContextType("php"); //$NON-NLS-1$
+        JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+        "php"); //$NON-NLS-1$
         if (contextType != null) {
           IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault()
               .getIndexManager(project);
           SortedMap sortedMap = indexManager.getIdentifierMap();
-          declarationEngine = new DeclarationEngine(contextType,
+          declarationEngine = new DeclarationEngine(project, contextType,
               lastSignificantToken, file);
-          declarationEngine.complete(viewer, offset, sortedMap);
+          declarationEngine.complete(viewer, offset, sortedMap,unit);
           declarationResults = declarationEngine.getResults();
         }
       }
@@ -642,11 +595,11 @@ public class PHPCompletionProcessor implements IContentAssistProcessor {
       if ((!useClassMembers) && syntaxbuffer != null) {
         BuiltInEngine builtinEngine;
         String proposal;
-        ContextType contextType = ContextTypeRegistry.getInstance()
-            .getContextType("php"); //$NON-NLS-1$
+        JavaContextType contextType = (JavaContextType)PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType(
+        "php"); //$NON-NLS-1$
         if (contextType != null) {
           builtinEngine = new BuiltInEngine(contextType);
-          builtinEngine.complete(viewer, offset, syntaxbuffer);
+          builtinEngine.complete(viewer, offset, syntaxbuffer, unit);
           builtinResults = builtinEngine.getResults();
         }
       }