public void advance()

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();
    }
  }