Prepared better HEREDOC support; see comment for bug #1319276
[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, IPreferenceConstants.PHP_VARIABLE_DOLLAR};
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       boolean isUnderscore = false;
49       if (fDetector.isWordStart((char) c)) {
50         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
51
52           fBuffer.setLength(0);
53           fBuffer.append((char) c);
54           c = scanner.read();
55           if (c=='_') {
56                 isUnderscore = true;
57           }
58           while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c)) {
59             fBuffer.append((char) c);
60             c = scanner.read();
61           } 
62           scanner.unread();
63           if (isUnderscore) {
64                 return getToken(IPreferenceConstants.PHP_VARIABLE_DOLLAR);
65           }
66           return getToken(IPreferenceConstants.PHP_VARIABLE);
67         }
68       }
69
70       scanner.unread();
71       return Token.UNDEFINED;
72     }
73   }
74
75   public PHPStringDQCodeScanner(IColorManager manager, IPreferenceStore store) {
76     super(manager, store);
77     initialize();
78   }
79
80   public IDocument getDocument() {
81     return fDocument;
82   }
83
84   /*
85    * @see AbstractJavaScanner#getTokenProperties()
86    */
87   protected String[] getTokenProperties() {
88     return fgTokenProperties;
89   }
90
91   /*
92    * @see AbstractJavaScanner#createRules()
93    */
94   protected List createRules() {
95
96     List list = new ArrayList();
97
98     // Add rule for tags.
99     Token token = getToken(IPreferenceConstants.PHP_STRING_DQ);
100     PHPWordRule wordRule = new PHPWordRule(new PHPVariableDetector(), token);
101
102     list.add(wordRule);
103
104     setDefaultReturnToken(getToken(IPreferenceConstants.PHP_STRING_DQ));
105     return list;
106   }
107 }
108