@SuppressWarnings("CloneDoesntCallSuperClone") public TextWalker clone() { TextWalker clone = new TextWalker(myText); clone.myOffset = myOffset; clone.myRow = myRow; clone.myPos = myPos; clone.myChar = myChar; return clone; }
protected void skipEmptySpace(@NotNull TextWalker walker) { while (!walker.isEOT()) { char c1 = walker.getChar(); if (Character.isWhitespace(c1)) { walker.next(); continue; char c2 = walker.getNextChar(); if (c1 == '-' && c2 == '-') { while (!walker.isEOT()) { walker.next(); if (walker.getChar() == '\n') { walker.next(); break; walker.next(); walker.next(); while (!walker.isEOT()) { if (walker.getChar() == '*' && walker.getNextChar() == '/') { walker.next(); walker.next(); break; walker.next();
private void extractPLBlock(@NotNull TextWalker walker) { final TextPointer begin = walker.getPointer(); int position; while (true) { position = walker.getOffset(); if (walker.isEOT()) break; String row = walker.popRow().trim(); if (row.equals("/")) break; } String plText = rtrim(walker.getText().substring(begin.offset, position)); SqlCommand command = new SqlCommand(plText, begin.row, null); myStatements.add(command); }
private void extractSQLCommand(@NotNull TextWalker walker) { skipEmptySpace(walker); final TextPointer begin = walker.getPointer(); final Matcher matcher = walker.skipToPattern(SQL_END_MARKER); final String sqlText = rtrim(walker.getText().substring(begin.offset, walker.getOffset())); SqlCommand command = new SqlCommand(sqlText, begin.row, null); myStatements.add(command); if (matcher != null) { walker.skipToOffset(matcher.end()); } }
public void parse(@NotNull final String text) { TextWalker walker = new TextWalker(text); while (!walker.isEOT()) { skipEmptySpace(walker); if (walker.isEOT()) break; String essentialWords = extractEssentialWords(walker, 6); boolean pl = determinePL(essentialWords); if (pl) { extractPLBlock(walker); } else { extractSQLCommand(walker); } } }
public void skipToOffset(int newOffset) { if (newOffset < myOffset) throw new IllegalArgumentException("Attempted to skip back"); if (newOffset > myLength) throw new IllegalArgumentException("Attempted to skip out of the end of text"); int distance = newOffset - myOffset; for (int i = 1; i <= distance; i++) next(); }
@SuppressWarnings("ConstantConditions") static String extractEssentialWords(@NotNull final TextWalker walker, int limitWords) { TextWalker w = walker.clone(); StringBuilder b = new StringBuilder(40); int wordsCnt = 0; boolean inSingleLineComment = false; boolean inMultiLineComment = false; while (!w.isEOT()) { char c = w.getChar(); char c2 = w.getNextChar(); final boolean isWordChar = Character.isJavaIdentifierPart(c); if (inSingleLineComment) { w.next(); // additional w.next() - because 2 chars inMultiLineComment = false; if (c == '-' && c2 == '-') { inSingleLineComment = true; w.next(); w.next(); w.next();