the PHP_NEW field must be before the field PHPPARSER
[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   /**
37    * Creates a PHPAnalyzer
38    * @param console reports error to the PHPConsole
39    */
40   public PHPAnalyzer(PHPConsole console, Scanner scanner, HashMap identifierMap) {
41     super(console);
42     this.fScanner = scanner;
43     this.fIdentifierMap = identifierMap;
44   }
45
46   /**
47    * gets the next token from input
48    */
49   private void getNextToken() {
50
51     try {
52       fToken = fScanner.getNextToken();
53       if (Scanner.DEBUG) {
54         int currentEndPosition = fScanner.getCurrentTokenEndPosition();
55         int currentStartPosition = fScanner.getCurrentTokenStartPosition();
56
57         System.out.print(currentStartPosition + "," + currentEndPosition + ": ");
58         System.out.println(fScanner.toStringAction(fToken));
59       }
60       return;
61     } catch (InvalidInputException e) {
62
63     }
64     fToken = TokenNameERROR;
65   }
66
67   private void parseIdentifiers(boolean goBack) {
68     char[] ident;
69     String identifier;
70     PHPIdentifier value;
71     int counter = 0;
72
73     IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
74     try {
75       while (fToken != TokenNameEOF && fToken != TokenNameERROR) {
76         if (fToken == TokenNameVariable) {
77           identifier = new String(fScanner.getCurrentIdentifierSource());
78           value = (PHPIdentifier) fIdentifierMap.get(identifier);
79           if (value == null) {
80             fIdentifierMap.put(identifier, new PHPIdentifier(null, PHPIdentifier.VARIABLE));
81           }
82           getNextToken();
83           //        } else if (fToken == TokenNamefunction) {
84           //          getNextToken();
85           //          if (fToken == TokenNameAND) {
86           //            getNextToken();
87           //          }
88           //          if (fToken == TokenNameIdentifier) {
89           //            ident = fScanner.getCurrentIdentifierSource();
90           //            outlineInfo.addVariable(new String(ident));
91           //            temp = new PHPFunctionDeclaration(current, new String(ident), fScanner.getCurrentTokenStartPosition());
92           //            current.add(temp);
93           //            getNextToken();
94           //            parseDeclarations(outlineInfo, temp, true);
95           //          }
96           //        } else if (fToken == TokenNameclass) {
97           //          getNextToken();
98           //          if (fToken == TokenNameIdentifier) {
99           //            ident = fScanner.getCurrentIdentifierSource();
100           //            outlineInfo.addVariable(new String(ident));
101           //            temp = new PHPClassDeclaration(current, new String(ident), fScanner.getCurrentTokenStartPosition());
102           //            current.add(temp);
103           //            getNextToken();
104           //
105           //            //skip fTokens for classname, extends and others until we have the opening '{'
106           //            while (fToken != TokenNameLBRACE && fToken != TokenNameEOF && fToken != TokenNameERROR) {
107           //              getNextToken();
108           //            }
109           //            parseDeclarations(outlineInfo, temp, true);
110           //            //        stack.pop();
111           //          }
112         } else if (fToken == TokenNameStringLiteral) {
113           char currentCharacter;
114           int i = fScanner.startPosition;
115           ArrayList varList = new ArrayList();
116
117           while (i < fScanner.currentPosition) {
118             currentCharacter = fScanner.source[i++];
119             if (currentCharacter == '$' && fScanner.source[i - 2] != '\\') {
120               StringBuffer varName = new StringBuffer();
121               varName.append("$");
122               while (i < fScanner.currentPosition) {
123                 currentCharacter = fScanner.source[i++];
124                 if (!Scanner.isPHPIdentifierPart(currentCharacter)) {
125                   break; // while loop
126                 }
127                 varName.append(currentCharacter);
128               }
129               varList.add(varName.toString());
130             }
131           }
132
133           for (i = 0; i < varList.size(); i++) {
134             identifier = (String) varList.get(i);
135             value = (PHPIdentifier) fIdentifierMap.get(identifier);
136             if (value == null) {
137               fIdentifierMap.put(identifier, new PHPIdentifier(null, PHPIdentifier.VARIABLE));
138             }
139           }
140
141           getNextToken();
142         } else if ((fToken == TokenNameLBRACE) || (fToken == TokenNameDOLLAR_LBRACE)) {
143           getNextToken();
144           counter++;
145         } else if (fToken == TokenNameRBRACE) {
146           getNextToken();
147           --counter;
148           if (counter == 0 && goBack) {
149             return;
150           }
151         } else {
152           getNextToken();
153         }
154       }
155     } catch (SyntaxError sytaxErr) {
156       // do nothing 
157     }
158   }
159   /**
160    * Move one file.
161    * @param sourceFile the file to move
162    * @param targetDir the directory to copy the result to
163    * @return file or null if the file was ignored
164    */
165   public File move(File sourceFile, File targetDir) {
166
167     StringBuffer buf = new StringBuffer();
168
169     try {
170       long filelen = sourceFile.length();
171       char[] charArray = new char[(int) filelen];
172
173       BufferedReader br = new BufferedReader(new FileReader(sourceFile.getAbsolutePath()));
174       br.read(charArray, 0, (int) filelen);
175       br.close();
176
177       //  String input = buf.toString();
178       /* fScanner initialization */
179       fScanner.setSource(charArray);
180       fScanner.setPHPMode(false);
181       fToken = TokenNameEOF;
182       getNextToken();
183       parseIdentifiers(false);
184       return null;
185     } catch (IOException e) {
186       fConsole.write(e.toString());
187     }
188     return null;
189   }
190 }