added a builder to parse files with eclipse's build mechanisms
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / mover / obfuscator / PHPAnalyzer.java
1 package net.sourceforge.phpeclipse.mover.obfuscator;
2
3 /**
4  * Analyze the file with the PHP Scanner
5  */
6 import java.io.BufferedReader;
7 import java.io.File;
8 import java.io.FileReader;
9 import java.io.IOException;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12
13 import net.sourceforge.phpdt.core.compiler.ITerminalSymbols;
14 import net.sourceforge.phpdt.core.compiler.InvalidInputException;
15 import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
16 import net.sourceforge.phpdt.internal.compiler.parser.SyntaxError;
17 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
18 import net.sourceforge.phpeclipse.mover.DefaultMover;
19 import net.sourceforge.phpeclipse.views.PHPConsole;
20
21 import org.eclipse.jface.preference.IPreferenceStore;
22
23 public class PHPAnalyzer extends DefaultMover implements ITerminalSymbols {
24
25   protected Scanner fScanner;
26   protected int fToken;
27
28   protected HashMap fIdentifierMap;
29
30   /**
31    * buffer, for obvious reasons access to this buffer must
32    * be synchronized
33    */
34   protected byte[] bytes = new byte[1024];
35   /**
36    * Creates a PHPAnalyzer
37    * @param console reports error to the PHPConsole
38    */
39   public PHPAnalyzer(PHPConsole console, Scanner scanner, HashMap identifierMap) {
40     super(console);
41     this.fScanner = scanner;
42     this.fIdentifierMap = identifierMap;
43   }
44
45   /**
46    * gets the next token from input
47    */
48   private void getNextToken() {
49
50     try {
51       fToken = fScanner.getNextToken();
52       if (Scanner.DEBUG) {
53         int currentEndPosition = fScanner.getCurrentTokenEndPosition();
54         int currentStartPosition = fScanner.getCurrentTokenStartPosition();
55
56         System.out.print(currentStartPosition + "," + currentEndPosition + ": ");
57         System.out.println(fScanner.toStringAction(fToken));
58       }
59       return;
60     } catch (InvalidInputException e) {
61
62     }
63     fToken = TokenNameERROR;
64   }
65
66   private void parseIdentifiers(boolean goBack) {
67     char[] ident;
68     String identifier;
69     PHPIdentifier value;
70     int counter = 0;
71
72     IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
73     try {
74       while (fToken != TokenNameEOF && fToken != TokenNameERROR) {
75         if (fToken == TokenNameVariable) {
76           identifier = new String(fScanner.getCurrentIdentifierSource());
77           value = (PHPIdentifier) fIdentifierMap.get(identifier);
78           if (value == null) {
79             fIdentifierMap.put(identifier, new PHPIdentifier(null, PHPIdentifier.VARIABLE));
80           }
81           getNextToken();
82           //        } else if (fToken == TokenNamefunction) {
83           //          getNextToken();
84           //          if (fToken == TokenNameAND) {
85           //            getNextToken();
86           //          }
87           //          if (fToken == TokenNameIdentifier) {
88           //            ident = fScanner.getCurrentIdentifierSource();
89           //            outlineInfo.addVariable(new String(ident));
90           //            temp = new PHPFunctionDeclaration(current, new String(ident), fScanner.getCurrentTokenStartPosition());
91           //            current.add(temp);
92           //            getNextToken();
93           //            parseDeclarations(outlineInfo, temp, true);
94           //          }
95           //        } else if (fToken == TokenNameclass) {
96           //          getNextToken();
97           //          if (fToken == TokenNameIdentifier) {
98           //            ident = fScanner.getCurrentIdentifierSource();
99           //            outlineInfo.addVariable(new String(ident));
100           //            temp = new PHPClassDeclaration(current, new String(ident), fScanner.getCurrentTokenStartPosition());
101           //            current.add(temp);
102           //            getNextToken();
103           //
104           //            //skip fTokens for classname, extends and others until we have the opening '{'
105           //            while (fToken != TokenNameLBRACE && fToken != TokenNameEOF && fToken != TokenNameERROR) {
106           //              getNextToken();
107           //            }
108           //            parseDeclarations(outlineInfo, temp, true);
109           //            //        stack.pop();
110           //          }
111         } else if (fToken == TokenNameStringLiteral) {
112           char currentCharacter;
113           int i = fScanner.startPosition;
114           ArrayList varList = new ArrayList();
115
116           while (i < fScanner.currentPosition) {
117             currentCharacter = fScanner.source[i++];
118             if (currentCharacter == '$' && fScanner.source[i - 2] != '\\') {
119               StringBuffer varName = new StringBuffer();
120               varName.append("$");
121               while (i < fScanner.currentPosition) {
122                 currentCharacter = fScanner.source[i++];
123                 if (!Scanner.isPHPIdentifierPart(currentCharacter)) {
124                   break; // while loop
125                 }
126                 varName.append(currentCharacter);
127               }
128               varList.add(varName.toString());
129             }
130           }
131
132           for (i = 0; i < varList.size(); i++) {
133             identifier = (String) varList.get(i);
134             value = (PHPIdentifier) fIdentifierMap.get(identifier);
135             if (value == null) {
136               fIdentifierMap.put(identifier, new PHPIdentifier(null, PHPIdentifier.VARIABLE));
137             }
138           }
139
140           getNextToken();
141         } else if ((fToken == TokenNameLBRACE) || (fToken == TokenNameDOLLAR_LBRACE)) {
142           getNextToken();
143           counter++;
144         } else if (fToken == TokenNameRBRACE) {
145           getNextToken();
146           --counter;
147           if (counter == 0 && goBack) {
148             return;
149           }
150         } else {
151           getNextToken();
152         }
153       }
154     } catch (SyntaxError sytaxErr) {
155       // do nothing 
156     }
157   }
158   /**
159    * Move one file.
160    * @param sourceFile the file to move
161    * @param targetDir the directory to copy the result to
162    * @return file or null if the file was ignored
163    */
164   public File move(File sourceFile, File targetDir) {
165
166     StringBuffer buf = new StringBuffer();
167
168     try {
169       long filelen = sourceFile.length();
170       char[] charArray = new char[(int) filelen];
171
172       BufferedReader br = new BufferedReader(new FileReader(sourceFile.getAbsolutePath()));
173       br.read(charArray, 0, (int) filelen);
174       br.close();
175
176       //  String input = buf.toString();
177       /* fScanner initialization */
178       fScanner.setSource(charArray);
179       fScanner.setPHPMode(false);
180       fToken = TokenNameEOF;
181       getNextToken();
182       parseIdentifiers(false);
183       return null;
184     } catch (IOException e) {
185       fConsole.write(e.toString());
186     }
187     return null;
188   }
189 }