Small improvements in parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / ui / text / PHPStringDQCodeScanner.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  **********************************************************************/
11 package net.sourceforge.phpdt.ui.text;
12
13 import java.util.ArrayList;
14 import java.util.List;
15
16 import net.sourceforge.phpdt.internal.ui.text.AbstractJavaScanner;
17 import net.sourceforge.phpeclipse.IPreferenceConstants;
18 import net.sourceforge.phpeclipse.phpeditor.util.PHPVariableDetector;
19
20 import org.eclipse.jface.preference.IPreferenceStore;
21 import org.eclipse.jface.text.IDocument;
22 import org.eclipse.jface.text.rules.ICharacterScanner;
23 import org.eclipse.jface.text.rules.IToken;
24 import org.eclipse.jface.text.rules.IWordDetector;
25 import org.eclipse.jface.text.rules.Token;
26 import org.eclipse.jface.text.rules.WordRule;
27
28 /**
29  * A rule based PHPDoc scanner.
30  */
31 public final class PHPStringDQCodeScanner extends AbstractJavaScanner {
32
33   private static String[] fgTokenProperties = { IPreferenceConstants.PHP_STRING_DQ, IPreferenceConstants.PHP_VARIABLE };
34
35   private class PHPWordRule extends WordRule {
36     private StringBuffer fBuffer = new StringBuffer();
37
38     public PHPWordRule(IWordDetector detector) {
39       super(detector, Token.UNDEFINED);
40     }
41
42     public PHPWordRule(IWordDetector detector, IToken defaultToken) {
43       super(detector, defaultToken);
44     }
45
46     public IToken evaluate(ICharacterScanner scanner) {
47       int c = scanner.read();
48
49       if (fDetector.isWordStart((char) c)) {
50         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
51
52           fBuffer.setLength(0);
53           do {
54             fBuffer.append((char) c);
55             c = scanner.read();
56           } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
57           scanner.unread();
58
59           return getToken(IPreferenceConstants.PHP_VARIABLE);
60         }
61       }
62
63       scanner.unread();
64       return Token.UNDEFINED;
65     }
66   }
67
68   public PHPStringDQCodeScanner(IColorManager manager, IPreferenceStore store) {
69     super(manager, store);
70     initialize();
71   }
72
73   public IDocument getDocument() {
74     return fDocument;
75   }
76
77   /*
78    * @see AbstractJavaScanner#getTokenProperties()
79    */
80   protected String[] getTokenProperties() {
81     return fgTokenProperties;
82   }
83
84   /*
85    * @see AbstractJavaScanner#createRules()
86    */
87   protected List createRules() {
88
89     List list = new ArrayList();
90
91     // Add rule for tags.
92     Token token = getToken(IPreferenceConstants.PHP_STRING_DQ);
93     PHPWordRule wordRule = new PHPWordRule(new PHPVariableDetector(), token);
94
95     list.add(wordRule);
96
97     setDefaultReturnToken(getToken(IPreferenceConstants.PHP_STRING_DQ));
98     return list;
99   }
100 }
101