439f3028c0cd32e0a8d7af398bff96e2d8c0dd53
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / actions / IncludesScanner.java
1 package net.sourceforge.phpeclipse.actions;
2
3 import java.io.BufferedInputStream;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.util.ArrayList;
7 import java.util.HashSet;
8 import java.util.List;
9
10 import net.sourceforge.phpdt.core.compiler.ITerminalSymbols;
11 import net.sourceforge.phpdt.core.compiler.InvalidInputException;
12 import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
13 import net.sourceforge.phpdt.internal.compiler.parser.SyntaxError;
14 import net.sourceforge.phpdt.internal.compiler.util.Util;
15
16 import org.eclipse.core.resources.IContainer;
17 import org.eclipse.core.resources.IFile;
18 import org.eclipse.core.resources.IProject;
19 import org.eclipse.core.runtime.CoreException;
20 import org.eclipse.core.runtime.Path;
21 import org.eclipse.ui.IFileEditorInput;
22
23
24 public class IncludesScanner implements ITerminalSymbols {
25   private final PHPOpenAllIncludesEditorAction fLineCreator;
26   private IProject fProject;
27   private IFileEditorInput fEditorInput;
28   HashSet fSet;
29   public IncludesScanner(PHPOpenAllIncludesEditorAction action, IProject project, IFileEditorInput editorInput) {
30     fProject = project;
31     this.fLineCreator = action;
32     fEditorInput = editorInput;
33     fSet = new HashSet();
34   }
35   /**
36    * Add the information for a given IFile resource
37    *  
38    */
39   public void addFile(IFile fileToParse) {
40
41     try {
42       if (fileToParse.exists()) {
43         addInputStream(new BufferedInputStream(fileToParse.getContents()), fileToParse.getFullPath().toString());
44       }
45     } catch (CoreException e1) {
46       e1.printStackTrace();
47     }
48   }
49
50   private void addInputStream(InputStream stream, String filePath) throws CoreException {
51     try {
52       if (fSet.add(filePath)) { // new entry in set
53         parseIdentifiers(Util.getInputStreamAsCharArray(stream, -1, null));
54       }
55     } catch (IOException e) {
56       e.printStackTrace();
57     } finally {
58       try {
59         if (stream != null) {
60           stream.close();
61         }
62       } catch (IOException e) {
63       }
64     }
65   }
66
67   /**
68    * Get the next token from input
69    */
70   private int getNextToken(Scanner scanner) {
71     int token;
72     try {
73       token = scanner.getNextToken();
74       if (Scanner.DEBUG) {
75         int currentEndPosition = scanner.getCurrentTokenEndPosition();
76         int currentStartPosition = scanner.getCurrentTokenStartPosition();
77         System.out.print(currentStartPosition + "," + currentEndPosition + ": ");
78         System.out.println(scanner.toStringAction(token));
79       }
80       return token;
81     } catch (InvalidInputException e) {
82     }
83     return TokenNameERROR;
84   }
85
86   private void parseIdentifiers(char[] charArray) {
87     char[] ident;
88     IFile file;
89     String identifier;
90     int counter = 0;
91
92     Scanner scanner = new Scanner(false, false, false, false, true, null, null);
93     scanner.setSource(charArray);
94     scanner.setPHPMode(false);
95     int token = getNextToken(scanner);
96     try {
97       while (token != TokenNameEOF) { // && fToken != TokenNameERROR) {
98         if (token == TokenNameinclude || token == TokenNameinclude_once || token == TokenNamerequire
99             || token == TokenNamerequire_once) {
100           while (token != TokenNameEOF && token != TokenNameERROR && token != TokenNameSEMICOLON && token != TokenNameRPAREN
101               && token != TokenNameLBRACE && token != TokenNameRBRACE) {
102             token = getNextToken(scanner);
103             if (token == TokenNameStringDoubleQuote || token == TokenNameStringSingleQuote) {
104               char[] includeName = scanner.getCurrentStringLiteralSource();
105               try {
106                 file = getIncludeFile(new String(includeName));
107                 addFile(file);
108               } catch (Exception e) {
109                 // ignore
110               }
111               break;
112             }
113           }
114         }
115         token = getNextToken(scanner);
116       }
117     } catch (SyntaxError e) {
118      // e.printStackTrace();
119     }
120   }
121   public IFile getIncludeFile(String relativeFilename) {
122     IContainer container = this.fLineCreator.getWorkingLocation(fEditorInput);
123     String fullPath = fProject.getLocation().toString();
124     IFile file = null;
125     if (relativeFilename.startsWith("../")) {
126       Path path = new Path(relativeFilename);
127       file = container.getFile(path);
128       return file;
129     }
130     int index = relativeFilename.lastIndexOf('/');
131
132     if (index >= 0) {
133       Path path = new Path(relativeFilename);
134       file = fProject.getFile(path);
135       if (file.exists()) {
136         return file;
137       }
138     }
139     Path path = new Path(relativeFilename);
140     file = container.getFile(path);
141
142     return file;
143   }
144   /**
145    * Returns a list of includes
146    * @return the determined list of includes 
147    */
148   public List getList() {
149     ArrayList list = new ArrayList();
150     list.addAll(fSet);
151     return list;
152   }
153
154 }