void () { if (myTokenType != null) return; if (myTokenEndOffset == myBufferEndOffset) { myBufferIndex = myBufferEndOffset; return; } myBufferIndex = myTokenEndOffset; char c = locateCharAt(myBufferIndex); switch (c) { case ' ': case '\t': case '\n': case '\r': case '\f': myTokenType = TokenType.WHITE_SPACE; myTokenEndOffset = getWhitespaces(myBufferIndex + mySymbolLength); break; case '{': int count1 = myStateStack.topInt() >> 16; if (count1 > 0) myStateStack.push((myStateStack.popInt() & STATE_TEXT_BLOCK_TEMPLATE) | ((count1 + 1) << 16)); myTokenType = JavaTokenType.LBRACE; myTokenEndOffset = myBufferIndex + mySymbolLength; break; case '}': int count2 = myStateStack.topInt() >> 16; if (count2 > 0) { if (count2 != 1) { myStateStack.push((myStateStack.popInt() & STATE_TEXT_BLOCK_TEMPLATE) | ((count2 - 1) << 16)); } else { int state = myStateStack.popInt(); if (myStateStack.isEmpty()) myStateStack.push(STATE_DEFAULT); if ((state & STATE_TEXT_BLOCK_TEMPLATE) != 0) { boolean fragment = locateLiteralEnd(myBufferIndex + mySymbolLength, LiteralType.TEXT_BLOCK); myTokenType = fragment ? JavaTokenType.TEXT_BLOCK_TEMPLATE_MID : JavaTokenType.TEXT_BLOCK_TEMPLATE_END; } else { boolean fragment = locateLiteralEnd(myBufferIndex + mySymbolLength, LiteralType.STRING); myTokenType = fragment ? JavaTokenType.STRING_TEMPLATE_MID : JavaTokenType.STRING_TEMPLATE_END; } break; } } myTokenType = JavaTokenType.RBRACE; myTokenEndOffset = myBufferIndex + mySymbolLength; break; case '/': if (myBufferIndex + mySymbolLength >= myBufferEndOffset) { myTokenType = JavaTokenType.DIV; myTokenEndOffset = myBufferEndOffset; } else { int l1 = mySymbolLength; char nextChar = locateCharAt(myBufferIndex + l1); if (nextChar == '/') { myTokenType = JavaTokenType.END_OF_LINE_COMMENT; myTokenEndOffset = getLineTerminator(myBufferIndex + l1 + mySymbolLength); } else if (nextChar == '*') { int l2 = mySymbolLength; if (myBufferIndex + l1 + l2 < myBufferEndOffset && locateCharAt(myBufferIndex + l1 + l2) == '*') { int l3 = mySymbolLength; if (myBufferIndex + l1 + l2 + l3 < myBufferEndOffset && locateCharAt(myBufferIndex + l1 + l2 + l3) == '/') { myTokenType = JavaTokenType.C_STYLE_COMMENT; myTokenEndOffset = myBufferIndex + l1 + l2 + l3 + mySymbolLength; } else { myTokenType = myJavaDocElementTypeContainer.DOC_COMMENT; myTokenEndOffset = getClosingComment(myBufferIndex + l1 + l2 + l3); } } else { myTokenType = JavaTokenType.C_STYLE_COMMENT; myTokenEndOffset = getClosingComment(myBufferIndex + l1 + l2 + mySymbolLength); } } else { flexLocateToken(); } } break; case '#': // this assumes the Unix shell used does not understand Unicode escapes sequences if (myBufferIndex == 0 && mySymbolLength == 1 && myBufferEndOffset > 1 && charAt(1) == '!' && mySymbolLength == 1) { myTokenType = JavaTokenType.END_OF_LINE_COMMENT; myTokenEndOffset = getLineTerminator(2); } else { flexLocateToken(); } break; case '\'': myTokenType = JavaTokenType.CHARACTER_LITERAL; locateLiteralEnd(myBufferIndex + mySymbolLength, LiteralType.CHAR); break; case '"': int l1 = mySymbolLength; if (myBufferIndex + l1 < myBufferEndOffset && locateCharAt(myBufferIndex + l1) == '"') { int l2 = mySymbolLength; if (myBufferIndex + l1 + l2 < myBufferEndOffset && locateCharAt(myBufferIndex + l1 + l2) == '"') { boolean fragment = locateLiteralEnd(myBufferIndex + l1 + l2 + mySymbolLength, LiteralType.TEXT_BLOCK); myTokenType = fragment ? JavaTokenType.TEXT_BLOCK_TEMPLATE_BEGIN : JavaTokenType.TEXT_BLOCK_LITERAL; } else { myTokenType = JavaTokenType.STRING_LITERAL; myTokenEndOffset = myBufferIndex + l1 + l2; } } else { boolean fragment = locateLiteralEnd(myBufferIndex + l1, LiteralType.STRING); myTokenType = fragment ? JavaTokenType.STRING_TEMPLATE_BEGIN : JavaTokenType.STRING_LITERAL; } break; default: flexLocateToken(); } if (myTokenEndOffset > myBufferEndOffset) { myTokenEndOffset = myBufferEndOffset; } }