Compatibility fragment commit
[phpeclipse.git] / net.sourceforge.phpeclipse.32.compatibility / src / net / sourceforge / phpeclipse / actions / IncludesScanner.java
diff --git a/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/actions/IncludesScanner.java b/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/actions/IncludesScanner.java
new file mode 100644 (file)
index 0000000..bb1c88f
--- /dev/null
@@ -0,0 +1,187 @@
+package net.sourceforge.phpeclipse.actions;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+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.compiler.parser.SyntaxError;
+import net.sourceforge.phpdt.internal.compiler.util.Util;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.ui.IFileEditorInput;
+
+public class IncludesScanner implements ITerminalSymbols {
+       // private final PHPOpenAllIncludesEditorAction fOpenAllIncludesAction;
+       private IProject fProject;
+
+       private IFileEditorInput fEditorInput;
+
+       private HashSet fSet;
+
+       public IncludesScanner(IProject project, IFileEditorInput editorInput) {
+               fProject = project;
+               // fOpenAllIncludesAction = action;
+               fEditorInput = editorInput;
+               fSet = new HashSet();
+       }
+
+       /**
+        * Add the information for a given IFile resource
+        * 
+        */
+       public void addFile(IFile fileToParse) {
+
+               try {
+                       if (fileToParse.exists()) {
+                               addInputStream(new BufferedInputStream(fileToParse
+                                               .getContents()), fileToParse.getProjectRelativePath()
+                                               .toString());
+                       }
+               } catch (CoreException e1) {
+                       e1.printStackTrace();
+               }
+       }
+
+       private void addInputStream(InputStream stream, String filePath)
+                       throws CoreException {
+               try {
+                       if (fSet.add(filePath)) { // new entry in set
+                               parseIdentifiers(Util.getInputStreamAsCharArray(stream, -1,
+                                               null));
+                       }
+               } catch (IOException e) {
+                       e.printStackTrace();
+               } finally {
+                       try {
+                               if (stream != null) {
+                                       stream.close();
+                               }
+                       } catch (IOException e) {
+                       }
+               }
+       }
+
+       /**
+        * Get the next token from input
+        */
+       private int getNextToken(Scanner scanner) {
+               int token;
+               try {
+                       token = scanner.getNextToken();
+                       if (Scanner.DEBUG) {
+                               int currentEndPosition = scanner.getCurrentTokenEndPosition();
+                               int currentStartPosition = scanner
+                                               .getCurrentTokenStartPosition();
+                               System.out.print(currentStartPosition + ","
+                                               + currentEndPosition + ": ");
+                               System.out.println(scanner.toStringAction(token));
+                       }
+                       return token;
+               } catch (InvalidInputException e) {
+               }
+               return TokenNameERROR;
+       }
+
+       private void parseIdentifiers(char[] charArray) {
+               char[] ident;
+               IFile file;
+               String identifier;
+               int counter = 0;
+
+               Scanner scanner = new Scanner(false, false, false, false, true, null,
+                               null, true /* taskCaseSensitive */);
+               scanner.setSource(charArray);
+               scanner.setPHPMode(false);
+               int token = getNextToken(scanner);
+               try {
+                       while (token != TokenNameEOF) { // && fToken != TokenNameERROR) {
+                               if (token == TokenNameinclude || token == TokenNameinclude_once
+                                               || token == TokenNamerequire
+                                               || token == TokenNamerequire_once) {
+                                       while (token != TokenNameEOF && token != TokenNameERROR
+                                                       && token != TokenNameSEMICOLON
+                                                       && token != TokenNameRPAREN
+                                                       && token != TokenNameLBRACE
+                                                       && token != TokenNameRBRACE) {
+                                               token = getNextToken(scanner);
+                                               if (token == TokenNameStringDoubleQuote
+                                                               || token == TokenNameStringSingleQuote) {
+                                                       char[] includeName = scanner
+                                                                       .getCurrentStringLiteralSource();
+                                                       try {
+                                                               file = getIncludeFile(new String(includeName));
+                                                               addFile(file);
+                                                       } catch (Exception e) {
+                                                               // ignore
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                               token = getNextToken(scanner);
+                       }
+               } catch (SyntaxError e) {
+                       // e.printStackTrace();
+               }
+       }
+
+       private IContainer getWorkingLocation(IFileEditorInput editorInput) {
+               if (editorInput == null || editorInput.getFile() == null) {
+                       return null;
+               }
+               return editorInput.getFile().getParent();
+       }
+
+       public IFile getIncludeFile(String relativeFilename) {
+               IContainer container = getWorkingLocation(fEditorInput);
+               String fullPath = fProject.getLocation().toString();
+               IFile file = null;
+               if (relativeFilename.startsWith("../")) {
+                       Path path = new Path(relativeFilename);
+                       file = container.getFile(path);
+                       return file;
+               }
+               int index = relativeFilename.lastIndexOf('/');
+
+               if (index >= 0) {
+                       Path path = new Path(relativeFilename);
+                       file = fProject.getFile(path);
+                       if (file.exists()) {
+                               return file;
+                       }
+               }
+               Path path = new Path(relativeFilename);
+               file = container.getFile(path);
+
+               return file;
+       }
+
+       /**
+        * Returns a list of includes
+        * 
+        * @return the determined list of includes
+        */
+       public List getList() {
+               ArrayList list = new ArrayList();
+               list.addAll(fSet);
+               return list;
+       }
+
+       /**
+        * @return Returns the set.
+        */
+       public Set getSet() {
+               return fSet;
+       }
+}
\ No newline at end of file