RC2 compatibility
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / actions / IncludesScanner.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/actions/IncludesScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/actions/IncludesScanner.java
new file mode 100644 (file)
index 0000000..439f302
--- /dev/null
@@ -0,0 +1,154 @@
+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 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 fLineCreator;
+  private IProject fProject;
+  private IFileEditorInput fEditorInput;
+  HashSet fSet;
+  public IncludesScanner(PHPOpenAllIncludesEditorAction action, IProject project, IFileEditorInput editorInput) {
+    fProject = project;
+    this.fLineCreator = 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.getFullPath().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);
+    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();
+    }
+  }
+  public IFile getIncludeFile(String relativeFilename) {
+    IContainer container = this.fLineCreator.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;
+  }
+
+}
\ No newline at end of file