KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > edu > umd > cs > findbugs > sourceViewer > JavaScanner


1 /*
2  * FindBugs - Find Bugs in Java programs
3  * Copyright (C) 2006, University of Maryland
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
18  */

19
20 package edu.umd.cs.findbugs.sourceViewer;
21
22 import java.text.CharacterIterator JavaDoc;
23 import java.util.HashSet JavaDoc;
24
25 public class JavaScanner {
26     public final static int NORMAL_TEXT = 0;
27     public final static int COMMENT= 1;
28     public final static int JAVADOC = 2;
29
30     public final static int KEYWORD = 3;
31     public final static int QUOTE= 4;
32     public final static int EOF = -1;
33
34
35
36
37     private final static HashSet JavaDoc<String JavaDoc> KEYWORDS = new HashSet JavaDoc<String JavaDoc>();
38
39     private final static int MAX_KEYWORD_LENGTH;
40
41
42
43
44
45     static {
46         String JavaDoc[] keywordList = new String JavaDoc[] { "abstract", "assert", "boolean",
47                 "break", "byte", "case", "catch", "char", "class", "const",
48                 "continue", "default", "do", "double", "else", "enum",
49                 "extends", "false", "final", "finally", "float", "for", "goto",
50                 "if", "implements", "import", "instanceof", "int", "interface",
51                 "long", "native", "new", "null", "package", "private",
52                 "protected", "public", "return", "short", "static", "strictfp",
53                 "super", "switch", "synchronized", "this", "throw", "throws",
54                 "transient", "true", "try", "void", "volatile", "while" };
55         int max = 0;
56         for (String JavaDoc s : keywordList) {
57             if (max < s.length())
58                 max = s.length();
59             KEYWORDS.add(s);
60         }
61         MAX_KEYWORD_LENGTH = max;
62     }
63
64     private final StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
65
66     private int endPosition;
67
68     private final CharacterIterator JavaDoc iterator;
69
70     private int kind;
71
72     private int startPosition;
73
74     public JavaScanner(CharacterIterator JavaDoc iterator) {
75         this.iterator = iterator;
76     }
77
78     public int getStartPosition() {
79         return startPosition;
80     }
81
82     public int getEndPosition() {
83         return iterator.getIndex();
84     }
85
86     public int getLength() {
87         return iterator.getIndex() - startPosition;
88     }
89     public int getKind() {
90         return kind;
91     }
92     public int next() {
93         startPosition = iterator.getIndex();
94         char c = iterator.current();
95         iterator.next(); // advance
96
if (c == CharacterIterator.DONE) {
97             kind = EOF;
98         }
99         else if (Character.isJavaIdentifierStart(c)) {
100             buf.append(c);
101             boolean couldBeKeyword = Character.isLowerCase(c);
102             while (true) {
103                 c = iterator.current();
104                 if (!Character.isJavaIdentifierPart(c))
105                     break;
106                 buf.append(c);
107                 if (couldBeKeyword) {
108                     if (!Character.isLowerCase(c)
109                             || buf.length() >= MAX_KEYWORD_LENGTH)
110                         couldBeKeyword = false;
111                 }
112                 c = iterator.next();
113             }
114             kind = NORMAL_TEXT;
115             if (couldBeKeyword) {
116                 if (KEYWORDS.contains(buf.toString()))
117                     kind = KEYWORD;
118             }
119             buf.setLength(0);
120         } else if (c == '/') {
121             char c2 = iterator.current();
122             if (c2 == '/') {
123                 while (true) {
124                     c2 = iterator.next();
125                     if (c2 == '\n' || c2 == '\r' || c2 == CharacterIterator.DONE)
126                         break;
127                 }
128                 kind = COMMENT;
129                 return kind;
130             } else if (c2 == '*') {
131                 scanComment: while (c2 != CharacterIterator.DONE) {
132                     c2 = iterator.next();
133                     if (c2 == '*') {
134                         do {
135                         c2 = iterator.next();
136                         if (c2 == '/')
137                             break scanComment;
138                         } while(c2 == '*');
139                     }
140                 }
141                 kind = JAVADOC;
142                 return kind;
143             }
144         } else if (c == '"') {
145             kind = QUOTE;
146             char c2 = iterator.current();
147             while (c2 != '"' && c2 != '\n' && c2 != '\r' && c2 != CharacterIterator.DONE) {
148                 if (c2 == '\\') {
149                     c2 = iterator.next();
150                     if (c2 == '\n' || c2 == '\r')
151                         break;
152                 }
153                 c2 = iterator.next();
154             }
155             iterator.next(); // advance past closing char
156
} else if (c == '\'') {
157              // need to catch '"' so isn't considered to start a String
158
kind = QUOTE; // or NORMAL_TEXT ?
159
char c2 = iterator.current();
160             if (c2 == '\\') c2 = iterator.next(); // advance past the escape char
161
if (c2 != '\n' && c2 != '\r' && c2 != CharacterIterator.DONE)
162                 c2 = iterator.next(); // advance past the content char
163
if (c2 != '\n' && c2 != '\r' && c2 != CharacterIterator.DONE)
164                 iterator.next(); // advance past closing char
165

166         } else
167             kind = NORMAL_TEXT;
168         // System.out.println(kind + " " + startPosition + "-" + iterator.getIndex());
169
return kind;
170     }
171
172 }
173
Popular Tags