in cucumber/src/org/jetbrains/plugins/cucumber/psi/GherkinLexer.java [95:252]
public void advance() {
if (myPosition >= myEndOffset) {
myCurrentToken = null;
return;
}
myCurrentTokenStart = myPosition;
char c = myBuffer.charAt(myPosition);
if (myState != STATE_INSIDE_PYSTRING && Character.isWhitespace(c)) {
advanceOverWhitespace();
myCurrentToken = TokenType.WHITE_SPACE;
while (myPosition < myEndOffset && Character.isWhitespace(myBuffer.charAt(myPosition))) {
advanceOverWhitespace();
}
} else if (c == '|' && myState != STATE_INSIDE_PYSTRING) {
myCurrentToken = GherkinTokenTypes.PIPE;
myPosition++;
myState = STATE_TABLE;
} else if (myState == STATE_PARAMETER_INSIDE_PYSTRING) {
if (c == '>') {
myState = STATE_INSIDE_PYSTRING;
myPosition++;
myCurrentToken = GherkinTokenTypes.STEP_PARAMETER_BRACE;
} else {
advanceToParameterEnd(PYSTRING_MARKER);
myCurrentToken = GherkinTokenTypes.STEP_PARAMETER_TEXT;
}
} else if (myState == STATE_INSIDE_PYSTRING) {
if (isStringAtPosition(PYSTRING_MARKER)) {
myPosition += 3 /* marker length */;
myCurrentToken = GherkinTokenTypes.PYSTRING;
myState = STATE_DEFAULT;
} else {
if (myBuffer.charAt(myPosition) == '<') {
if (isStepParameter(PYSTRING_MARKER)) {
myPosition++;
myState = STATE_PARAMETER_INSIDE_PYSTRING;
myCurrentToken = GherkinTokenTypes.STEP_PARAMETER_BRACE;
} else {
myPosition++;
advanceToParameterOrSymbol(PYSTRING_MARKER, STATE_INSIDE_PYSTRING, false);
myCurrentToken = GherkinTokenTypes.PYSTRING_TEXT;
}
} else {
advanceToParameterOrSymbol(PYSTRING_MARKER, STATE_INSIDE_PYSTRING, false);
myCurrentToken = GherkinTokenTypes.PYSTRING_TEXT;
}
}
} else if (myState == STATE_TABLE) {
myCurrentToken = GherkinTokenTypes.TABLE_CELL;
while (myPosition < myEndOffset) {
// Cucumber: 0.7.3 Table cells can now contain escaped bars - \| and escaped backslashes - \\
if (myBuffer.charAt(myPosition) == '\\') {
final int nextPos = myPosition + 1;
if (nextPos < myEndOffset) {
final char nextChar = myBuffer.charAt(nextPos);
if (nextChar == '|' || nextChar == '\\') {
myPosition += 2;
continue;
}
// else - common case
}
}
else if (myBuffer.charAt(myPosition) == '|' || myBuffer.charAt(myPosition) == '\n') {
break;
}
myPosition++;
}
while(myPosition > 0 && Character.isWhitespace(myBuffer.charAt(myPosition - 1))) {
myPosition--;
}
}
else if (c == '#') {
myCurrentToken = GherkinTokenTypes.COMMENT;
advanceToEOL();
String commentText = myBuffer.subSequence(myCurrentTokenStart+1, myPosition).toString().trim();
final String language = fetchLocationLanguage(commentText);
if (language != null) {
updateLanguage(language);
}
}
else if (c == ':' && myState != STATE_AFTER_STEP_KEYWORD) {
myCurrentToken = GherkinTokenTypes.COLON;
myPosition++;
}
else if (c == '@' && myState != STATE_AFTER_STEP_KEYWORD) {
myCurrentToken = GherkinTokenTypes.TAG;
myPosition++;
while (myPosition < myEndOffset && isValidTagChar(myBuffer.charAt(myPosition))) {
myPosition++;
}
}
else if (isStringAtPosition(PYSTRING_MARKER)) {
myCurrentToken = GherkinTokenTypes.PYSTRING;
myState = STATE_INSIDE_PYSTRING;
myPosition += 3;
}
else {
if (myState == STATE_DEFAULT) {
for (String keyword : myKeywords) {
int length = keyword.length();
if (isStringAtPosition(keyword)) {
if (myKeywordProvider.isSpaceRequiredAfterKeyword(myCurLanguage, keyword) &&
myEndOffset - myPosition > length &&
Character.isLetterOrDigit(myBuffer.charAt(myPosition + length))) {
continue;
}
char followedByChar = myPosition + length < myEndOffset ? myBuffer.charAt(myPosition + length) : 0;
myCurrentToken = myKeywordProvider.getTokenType(myCurLanguage, keyword);
if (myCurrentToken == GherkinTokenTypes.STEP_KEYWORD) {
boolean followedByWhitespace = Character.isWhitespace(followedByChar) && followedByChar != '\n';
if (followedByWhitespace != myKeywordProvider.isSpaceRequiredAfterKeyword(myCurLanguage, keyword)) {
myCurrentToken = GherkinTokenTypes.TEXT;
}
}
myPosition += length;
if (myCurrentToken == GherkinTokenTypes.STEP_KEYWORD) {
myState = STATE_AFTER_STEP_KEYWORD;
} else if (myCurrentToken == GherkinTokenTypes.SCENARIO_OUTLINE_KEYWORD) {
myState = STATE_AFTER_SCENARIO_KEYWORD;
} else {
myState = STATE_AFTER_KEYWORD;
}
return;
}
}
}
if (myState == STATE_PARAMETER_INSIDE_STEP) {
if (c == '>') {
myState = STATE_AFTER_STEP_KEYWORD;
myPosition++;
myCurrentToken = GherkinTokenTypes.STEP_PARAMETER_BRACE;
} else {
advanceToParameterEnd("\n");
myCurrentToken = GherkinTokenTypes.STEP_PARAMETER_TEXT;
}
return;
} else if (isParameterAllowed()) {
if (myPosition < myEndOffset && myBuffer.charAt(myPosition) == '<' && isStepParameter("\n")) {
if (myPosition + 1 < myEndOffset && myBuffer.charAt(myPosition + 1) != '<' && !Character.isWhitespace(myBuffer.charAt(myPosition + 1))) {
myState = STATE_PARAMETER_INSIDE_STEP;
myCurrentToken = GherkinTokenTypes.STEP_PARAMETER_BRACE;
} else {
myCurrentToken = GherkinTokenTypes.TEXT;
}
myPosition++;
} else {
myCurrentToken = GherkinTokenTypes.TEXT;
advanceToParameterOrSymbol("\n", STATE_AFTER_STEP_KEYWORD, true);
}
return;
}
myCurrentToken = GherkinTokenTypes.TEXT;
advanceToEOL();
}
}