8c0d37a8761557c204f907a0c706b6c80091c9c7
[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
17 import net.sourceforge.phpeclipse.IPreferenceConstants;
18 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
19 import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
20 import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
21 import net.sourceforge.phpeclipse.phpeditor.util.PHPWordDetector;
22 import org.eclipse.jface.preference.IPreferenceStore;
23 import org.eclipse.jface.preference.PreferenceConverter;
24 import org.eclipse.jface.text.TextAttribute;
25 import org.eclipse.jface.text.rules.EndOfLineRule;
26 import org.eclipse.jface.text.rules.ICharacterScanner;
27 import org.eclipse.jface.text.rules.IRule;
28 import org.eclipse.jface.text.rules.IToken;
29 import org.eclipse.jface.text.rules.IWordDetector;
30 import org.eclipse.jface.text.rules.MultiLineRule;
31 import org.eclipse.jface.text.rules.RuleBasedScanner;
32 import org.eclipse.jface.text.rules.SingleLineRule;
33 import org.eclipse.jface.text.rules.Token;
34 import org.eclipse.jface.text.rules.WhitespaceRule;
35 import org.eclipse.jface.text.rules.WordRule;
36
37 /**
38  * PHP Code Scanner
39  */
40 public class PHPCodeScanner extends RuleBasedScanner implements IPreferenceConstants {
41
42   private static Token variable;
43   private static Token keyword;
44   private static Token functionName;
45   private static Token string;
46   private static Token comment;
47   private static Token multi_comment;
48   private static Token other;
49
50   private class PHPWordRule extends WordRule {
51     private StringBuffer fBuffer = new StringBuffer();
52
53     public PHPWordRule(IWordDetector detector) {
54       super(detector, Token.UNDEFINED);
55     }
56
57     public PHPWordRule(IWordDetector detector, IToken defaultToken) {
58       super(detector, defaultToken);
59     }
60
61     public IToken evaluate(ICharacterScanner scanner) {
62       int c = scanner.read();
63       boolean isVariable = false;
64       if (fDetector.isWordStart((char) c)) {
65         if (c == '$') {
66           isVariable = true;
67         }
68         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
69
70           fBuffer.setLength(0);
71           do {
72             fBuffer.append((char) c);
73             c = scanner.read();
74           } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
75           scanner.unread();
76
77           if (isVariable) {
78             return variable;
79           }
80           IToken token = (IToken) fWords.get(fBuffer.toString());
81           if (token != null)
82             return token;
83
84           if (fDefaultToken.isUndefined())
85             unreadBuffer(scanner);
86
87           return fDefaultToken;
88         }
89       }
90
91       scanner.unread();
92       return Token.UNDEFINED;
93     }
94   }
95
96   private static String[] fgConstants = { "__LINE__", "__FILE__", "true", "false", "null", "object", "array" };
97   //  private static TextAttribute fSingleLine;
98   //  private static TextAttribute fMultiLine;
99   //  private static TextAttribute fKeyword;
100   //  private static TextAttribute fFunctionName;
101   //  private static TextAttribute fString;
102   //  private static TextAttribute fVariable;
103   private PHPColorProvider fColorProvider;
104
105   /**
106    * Creates a PHP code scanner
107    */
108   public PHPCodeScanner(PHPColorProvider provider) {
109     final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
110
111     variable = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE))));
112     keyword = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD))));
113     functionName = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME))));
114     string = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_STRING))));
115     comment = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT))));
116     multi_comment = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT))));
117     other = new Token(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT))));
118
119     List rules = new ArrayList();
120
121     // Add rule for single line comments.
122     rules.add(new EndOfLineRule("//", comment)); //$NON-NLS-1$
123     rules.add(new EndOfLineRule("#", comment));
124
125     // Add rule for strings and character constants.
126     rules.add(new MultiLineRule("\"", "\"", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
127     rules.add(new SingleLineRule("'", "'", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
128
129     // rules.add(new SingleLineRule("//", "//", php_comment));
130     rules.add(new MultiLineRule("/*", "*/", multi_comment));
131
132     // Add generic whitespace rule.
133     rules.add(new WhitespaceRule(new PHPWhitespaceDetector()));
134
135     // Add word rule for keywords, types, and constants.
136     PHPWordRule wordRule = new PHPWordRule(new PHPWordDetector(), other);
137 //    //choochter-->
138 //    for (int i = 0; i < PHPKeywords.PHP_KEYWORS.length; i++)
139 //      wordRule.addWord(PHPKeywords.PHP_KEYWORS[i], keyword);
140 //
141 //    /*Read in the keywords from the XML file*/
142 //    PHPSyntaxRdr syntaxRdr = new PHPSyntaxRdr();
143 //    syntaxRdr.readFromFile(
144 //      "C:\\eclipse\\workspace\\net.sourceforge.phpeclipse\\src\\net\\sourceforge\\phpeclipse\\phpeditor"
145 //        + java.io.File.separator
146 //        + "syntax.xml");
147 //    {
148 //      Vector Vbuffer = syntaxRdr.getKeywords();
149 //      String VString = null;
150 //      //Read keywords
151 //      while ((Vbuffer != null) && (!Vbuffer.isEmpty() && ((VString = (String) Vbuffer.remove(0)) != null))) {
152 //        wordRule.addWord(VString, keyword);
153 //      }
154 //      //Read functions  - to be tested
155 //      Vbuffer = syntaxRdr.getFunctions();
156 //      while ((Vbuffer != null) && (!Vbuffer.isEmpty() && ((VString = (String) Vbuffer.remove(0)) != null))) {
157 //        wordRule.addWord(VString, functionName);
158 //      }
159 //    }
160 //    
161 //    //for (int i = 0; i < PHPFunctionNames.FUNCTION_NAMES.length; i++)
162 //    //  wordRule.addWord(PHPFunctionNames.FUNCTION_NAMES[i], functionName);
163 //    //<--choochter
164     for (int i = 0; i < PHPFunctionNames.FUNCTION_NAMES.length; i++)
165       wordRule.addWord(PHPFunctionNames.FUNCTION_NAMES[i], functionName);
166     for (int i = 0; i < fgConstants.length; i++)
167       wordRule.addWord(fgConstants[i], functionName);
168     rules.add(wordRule);
169
170     IRule[] result = new IRule[rules.size()];
171     rules.toArray(result);
172     setRules(result);
173   }
174
175   public void updateToken(PHPColorProvider provider) {
176     final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
177
178     variable.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE))));
179     keyword.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD))));
180     functionName.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME))));
181     string.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_STRING))));
182     comment.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT))));
183     multi_comment.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT))));
184     other.setData(new TextAttribute(provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT))));
185
186   }
187 }