A lot of changes
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCodeScanner.java
1 /**********************************************************************
2 Copyright (c) 2000, 2002 IBM Corp. and others.
3 All rights reserved. This program and the accompanying materials
4 are made available under the terms of the Common Public License v1.0
5 which accompanies this distribution, and is available at
6 http://www.eclipse.org/legal/cpl-v10.html
7
8 Contributors:
9     IBM Corporation - Initial implementation
10     Klaus Hartlage - www.eclipseproject.de
11 **********************************************************************/
12 package net.sourceforge.phpeclipse.phpeditor.php;
13
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.Vector;
17
18 import net.sourceforge.phpdt.internal.ui.text.AbstractJavaScanner;
19 import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
20 import net.sourceforge.phpdt.ui.text.IColorManager;
21 import net.sourceforge.phpdt.ui.text.IJavaColorConstants;
22 import net.sourceforge.phpeclipse.IPreferenceConstants;
23 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
24 import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr;
25 import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
26 import net.sourceforge.phpeclipse.phpeditor.util.PHPWordDetector;
27
28 import org.eclipse.jface.preference.IPreferenceStore;
29 import org.eclipse.jface.preference.PreferenceConverter;
30 import org.eclipse.jface.text.TextAttribute;
31 import org.eclipse.jface.text.rules.EndOfLineRule;
32 import org.eclipse.jface.text.rules.ICharacterScanner;
33 import org.eclipse.jface.text.rules.IRule;
34 import org.eclipse.jface.text.rules.IToken;
35 import org.eclipse.jface.text.rules.IWordDetector;
36 import org.eclipse.jface.text.rules.MultiLineRule;
37 import org.eclipse.jface.text.rules.SingleLineRule;
38 import org.eclipse.jface.text.rules.Token;
39 import org.eclipse.jface.text.rules.WhitespaceRule;
40 import org.eclipse.jface.text.rules.WordRule;
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.graphics.Color;
43
44 /**
45  * PHP Code Scanner
46  */
47 public class PHPCodeScanner
48   extends AbstractJavaScanner {
49
50 //  private static Token variable;
51 //  private static Token keyword;
52 //  private static Token type;
53 //  private static Token constant;
54 //  private static Token functionName;
55 //  private static Token string;
56 //  private static Token comment;
57 //  private static Token multi_comment;
58 //  private static Token other;
59
60   private class PHPWordRule extends WordRule {
61     private StringBuffer fBuffer = new StringBuffer();
62
63     public PHPWordRule(IWordDetector detector) {
64       super(detector, Token.UNDEFINED);
65     }
66
67     public PHPWordRule(IWordDetector detector, IToken defaultToken) {
68       super(detector, defaultToken);
69     }
70
71     public IToken evaluate(ICharacterScanner scanner) {
72       int c = scanner.read();
73       boolean isVariable = false;
74       if (fDetector.isWordStart((char) c)) {
75         if (c == '$') {
76           isVariable = true;
77         }
78         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
79
80           fBuffer.setLength(0);
81           do {
82             fBuffer.append((char) c);
83             c = scanner.read();
84           } while (
85             c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
86           scanner.unread();
87
88           if (isVariable) {
89             return getToken(IJavaColorConstants.PHP_VARIABLE);
90           }
91           IToken token = (IToken) fWords.get(fBuffer.toString());
92           if (token != null)
93             return token;
94
95           if (fDefaultToken.isUndefined())
96             unreadBuffer(scanner);
97
98           return fDefaultToken;
99         }
100       }
101
102       scanner.unread();
103       return Token.UNDEFINED;
104     }
105   }
106
107   //private PHPColorProvider fColorProvider;
108
109   private static String[] fgTokenProperties = {
110     IJavaColorConstants.PHP_MULTI_LINE_COMMENT,
111     IJavaColorConstants.PHP_SINGLE_LINE_COMMENT,
112     IJavaColorConstants.PHP_KEYWORD,
113     IJavaColorConstants.PHP_FUNCTIONNAME,
114     IJavaColorConstants.PHP_VARIABLE,
115     IJavaColorConstants.PHP_STRING,
116     IJavaColorConstants.PHP_TYPE,
117     IJavaColorConstants.PHP_CONSTANT,
118     IJavaColorConstants.PHP_DEFAULT };
119   /**
120         * Creates a PHP code scanner
121         */
122   // public PHPCodeScanner(JavaColorManager provider, IPreferenceStore store) {
123   public PHPCodeScanner(IColorManager manager, IPreferenceStore store) {
124     super(manager, store);
125     initialize();
126     //  //  final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
127     //   Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND));
128     //    variable =
129     //      new Token(
130     //        new TextAttribute(
131     //          provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE)),
132     //          BackgroundColor,
133     //          (store.getBoolean(PHP_VARIABLE_BOLD) ? SWT.BOLD : SWT.NONE)
134     //            + (store.getBoolean(PHP_VARIABLE_ITALIC) ? SWT.ITALIC : SWT.NONE)));
135     //      keyword =
136     //        new Token(new TextAttribute(
137     //          provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD)),
138     //          BackgroundColor,
139     //    //SWT.NONE));
140     //   (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE)));
141     //      type =
142     //        new Token(new TextAttribute(
143     //          provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)),
144     //          BackgroundColor,
145     //    //SWT.NONE));
146     //   (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE)));
147     //      functionName =
148     //        new Token(new TextAttribute(
149     //          provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)),
150     //          BackgroundColor,
151     //    //SWT.NONE));
152     //  (store.getBoolean(PHP_FUNCTIONNAME_BOLD) ? SWT.BOLD : SWT.NONE)
153     //    + (store.getBoolean(PHP_FUNCTIONNAME_ITALIC) ? SWT.ITALIC : SWT.NONE)));
154     //      constant =
155     //        new Token(new TextAttribute(
156     //          provider.getColor(PreferenceConverter.getColor(store, PHP_CONSTANT)),
157     //          BackgroundColor,
158     //    //SWT.NONE));
159     //   (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
160     //      string =
161     //        new Token(new TextAttribute(
162     //          provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)),
163     //          BackgroundColor,
164     //    //SWT.NONE));
165     //   (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE ) + (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE)));
166     //      comment =
167     //        new Token(new TextAttribute(
168     //          provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT)),
169     //          BackgroundColor,
170     //    //SWT.NONE));
171     //  (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE )
172     //    + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
173     //      multi_comment =
174     //        new Token(new TextAttribute(
175     //          provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT)),
176     //          BackgroundColor,
177     //    //SWT.NONE));
178     //  (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE)
179     //    + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
180     //      other =
181     //        new Token(new TextAttribute(
182     //          provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)),
183     //          BackgroundColor,
184     //    //SWT.NONE));
185     //   (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
186     //    updateWordRules();
187   }
188
189   //  public void updateToken(JavaColorManager provider) {
190   //    final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
191   //
192   //    Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND));
193   //
194   //    variable.setData(
195   //      new TextAttribute(
196   //        provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE)),
197   //        BackgroundColor,
198   //        (store.getBoolean(PHP_VARIABLE_BOLD) ? SWT.BOLD : SWT.NONE)
199   //          + (store.getBoolean(PHP_VARIABLE_ITALIC) ? SWT.ITALIC : SWT.NONE)));
200   //    keyword.setData(
201   //      new TextAttribute(
202   //        provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD)),
203   //        BackgroundColor,
204   //        (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE)
205   //          + (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE)));
206   //    type.setData(
207   //      new TextAttribute(
208   //        provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)),
209   //        BackgroundColor,
210   //        (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE)));
211   //    functionName.setData(
212   //      new TextAttribute(
213   //        provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)),
214   //        BackgroundColor,
215   //        (store.getBoolean(PHP_FUNCTIONNAME_BOLD) ? SWT.BOLD : SWT.NONE)
216   //          + (store.getBoolean(PHP_FUNCTIONNAME_ITALIC) ? SWT.ITALIC : SWT.NONE)));
217   //    constant.setData(
218   //      new TextAttribute(
219   //        provider.getColor(PreferenceConverter.getColor(store, PHP_CONSTANT)),
220   //        BackgroundColor,
221   //        (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE)
222   //          + (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
223   //    string.setData(
224   //      new TextAttribute(
225   //        provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)),
226   //        BackgroundColor,
227   //        (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE)));
228   //    comment.setData(
229   //      new TextAttribute(
230   //        provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT)),
231   //        BackgroundColor,
232   //        (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE)
233   //          + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
234   //    multi_comment.setData(
235   //      new TextAttribute(
236   //        provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT)),
237   //        BackgroundColor,
238   //        (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE)
239   //          + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
240   //    other.setData(
241   //      new TextAttribute(
242   //        provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)),
243   //        BackgroundColor,
244   //        (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE)
245   //          + (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE)));
246   //  }
247
248   // public void updateWordRules() {
249
250   /*
251    * @see AbstractJavaScanner#getTokenProperties()
252    */
253   protected String[] getTokenProperties() {
254     return fgTokenProperties;
255   }
256   /*
257    * @see AbstractJavaScanner#createRules()
258    */
259   protected List createRules() {
260     List rules = new ArrayList();
261     Token token= getToken(IJavaColorConstants.PHP_SINGLE_LINE_COMMENT);
262     // Add rule for single line comments.
263     rules.add(new EndOfLineRule("//", token)); //$NON-NLS-1$
264     rules.add(new EndOfLineRule("#", token));
265     // Add rule for strings and character constants.
266     token= getToken(IJavaColorConstants.PHP_STRING);
267     rules.add(new MultiLineRule("\"", "\"", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
268     rules.add(new SingleLineRule("'", "'", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
269     token= getToken(IJavaColorConstants.PHP_MULTI_LINE_COMMENT);
270     rules.add(new MultiLineRule("/*", "*/", token));
271     // Add generic whitespace rule.
272     rules.add(new WhitespaceRule(new PHPWhitespaceDetector()));
273     // Add word rule for keywords, types, and constants.
274     token= getToken(IJavaColorConstants.PHP_DEFAULT);
275     PHPWordRule wordRule = new PHPWordRule(new PHPWordDetector(), token);
276
277     Token keyword= getToken(IJavaColorConstants.PHP_KEYWORD);
278     Token functionName= getToken(IJavaColorConstants.PHP_FUNCTIONNAME);
279     Token type= getToken(IJavaColorConstants.PHP_TYPE);
280     Token constant= getToken(IJavaColorConstants.PHP_CONSTANT);
281     PHPSyntaxRdr.readInSyntax();
282     Vector buffer = PHPSyntaxRdr.getsyntaxdata();
283     String strbuffer = null;
284     PHPElement elbuffer = null;
285     while ((buffer != null)
286       && (!buffer.isEmpty()
287         && ((elbuffer = (PHPElement) buffer.remove(0)) != null))) {
288       if (elbuffer instanceof PHPKeyword)
289         wordRule.addWord(((PHPKeyword) elbuffer).getName(), keyword);
290       if (elbuffer instanceof PHPFunction)
291         wordRule.addWord(((PHPFunction) elbuffer).getName(), functionName);
292       if (elbuffer instanceof PHPType)
293         wordRule.addWord(elbuffer.getName(), type);
294       if (elbuffer instanceof PHPConstant)
295         wordRule.addWord(elbuffer.getName(), constant);
296     }
297     rules.add(wordRule);
298     IRule[] result = new IRule[rules.size()];
299     //    rules.toArray(result);
300     //    setRules(result);
301     return rules;
302   }
303 }