1 19 20 package edu.umd.cs.findbugs.sourceViewer; 21 22 import java.text.CharacterIterator ; 23 import java.util.HashSet ; 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 <String > KEYWORDS = new HashSet <String >(); 38 39 private final static int MAX_KEYWORD_LENGTH; 40 41 42 43 44 45 static { 46 String [] keywordList = new String [] { "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 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 buf = new StringBuffer (); 65 66 private int endPosition; 67 68 private final CharacterIterator iterator; 69 70 private int kind; 71 72 private int startPosition; 73 74 public JavaScanner(CharacterIterator 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(); 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(); } else if (c == '\'') { 157 kind = QUOTE; char c2 = iterator.current(); 160 if (c2 == '\\') c2 = iterator.next(); if (c2 != '\n' && c2 != '\r' && c2 != CharacterIterator.DONE) 162 c2 = iterator.next(); if (c2 != '\n' && c2 != '\r' && c2 != CharacterIterator.DONE) 164 iterator.next(); 166 } else 167 kind = NORMAL_TEXT; 168 return kind; 170 } 171 172 } 173 | Popular Tags |