improved syntax highligthing
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPCodeScanner.java
index 84f31f4..9e75272 100644 (file)
@@ -19,8 +19,10 @@ import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
 import net.sourceforge.phpeclipse.phpeditor.util.PHPWordDetector;
 import org.eclipse.jface.text.TextAttribute;
 import org.eclipse.jface.text.rules.EndOfLineRule;
+import org.eclipse.jface.text.rules.ICharacterScanner;
 import org.eclipse.jface.text.rules.IRule;
 import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.IWordDetector;
 import org.eclipse.jface.text.rules.MultiLineRule;
 import org.eclipse.jface.text.rules.RuleBasedScanner;
 import org.eclipse.jface.text.rules.SingleLineRule;
@@ -2412,6 +2414,54 @@ public class PHPCodeScanner extends RuleBasedScanner {
                        "zzip_read",
                        "zzip_readdir" };
 
+  private IToken variable;
+  
+       private class PHPWordRule extends WordRule {
+    private StringBuffer fBuffer= new StringBuffer();
+
+               public PHPWordRule(IWordDetector detector) {
+                       super(detector, Token.UNDEFINED);
+               }
+
+               public PHPWordRule(IWordDetector detector, IToken defaultToken) {
+                       super(detector, defaultToken);
+               }
+
+               public IToken evaluate(ICharacterScanner scanner) {
+                       int c = scanner.read();
+      boolean isVariable = false;
+                       if (fDetector.isWordStart((char) c)) {
+        if (c=='$') {
+          isVariable = true;
+        }
+                               if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
+
+                                       fBuffer.setLength(0);
+                                       do {
+                                               fBuffer.append((char) c);
+                                               c = scanner.read();
+                                       } while (c != scanner.EOF && fDetector.isWordPart((char) c));
+                                       scanner.unread();
+
+          if (isVariable) {
+            return variable;
+          }
+                                       IToken token = (IToken) fWords.get(fBuffer.toString());
+                                       if (token != null)
+                                               return token;
+
+                                       if (fDefaultToken.isUndefined())
+                                               unreadBuffer(scanner);
+
+                                       return fDefaultToken;
+                               }
+                       }
+
+                       scanner.unread();
+                       return Token.UNDEFINED;
+               }
+       }
+
        private static String[] fgConstants = { "__LINE__", "__FILE__", "true", "false" };
        private TextAttribute fComment;
        private TextAttribute fKeyword;
@@ -2429,28 +2479,31 @@ public class PHPCodeScanner extends RuleBasedScanner {
                IToken string = new Token(new TextAttribute(provider.getColor(PHPColorProvider.STRING)));
                IToken comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.SINGLE_LINE_COMMENT)));
                IToken multi_comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT)));
-    IToken other = new Token(new TextAttribute(provider.getColor(PHPColorProvider.DEFAULT)));
+               IToken other = new Token(new TextAttribute(provider.getColor(PHPColorProvider.DEFAULT)));
 
+    variable = new Token(new TextAttribute(provider.getColor(PHPColorProvider.VARIABLE)));
+
+    
                List rules = new ArrayList();
 
                // Add rule for single line comments.
                rules.add(new EndOfLineRule("//", comment)); //$NON-NLS-1$
-    EndOfLineRule endOfLine = new EndOfLineRule("#", comment);
-    endOfLine.setColumnConstraint(0);
-    rules.add(endOfLine);
-    
+               //    EndOfLineRule endOfLine = new EndOfLineRule("#", comment);
+               //    endOfLine.setColumnConstraint(0);
+               rules.add(new EndOfLineRule("#", comment));
+
                // Add rule for strings and character constants.
                rules.add(new SingleLineRule("\"", "\"", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
                rules.add(new SingleLineRule("'", "'", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
 
-   // rules.add(new SingleLineRule("//", "//", php_comment));
-    rules.add(new MultiLineRule("/*", "*/", multi_comment));
-    
+               // rules.add(new SingleLineRule("//", "//", php_comment));
+               rules.add(new MultiLineRule("/*", "*/", multi_comment));
+
                // Add generic whitespace rule.
                rules.add(new WhitespaceRule(new PHPWhitespaceDetector()));
 
                // Add word rule for keywords, types, and constants.
-               WordRule wordRule = new WordRule(new PHPWordDetector(), other);
+               PHPWordRule wordRule = new PHPWordRule(new PHPWordDetector(), other);
                for (int i = 0; i < fgKeywords.length; i++)
                        wordRule.addWord(fgKeywords[i], keyword);
                for (int i = 0; i < fgTypes.length; i++)