scanToken method

void scanToken()

Implementation

void scanToken() {
  String c = advance();
  switch (c) {
    case '(':
      addToken(TokenType.leftParen);
      break;
    case ')':
      addToken(TokenType.rightParen);
      break;
    case '{':
      addToken(TokenType.leftBrace);
      break;
    case '}':
      addToken(TokenType.rightBrace);
      break;
    case '[':
      addToken(TokenType.leftBracket);
      break;
    case ']':
      addToken(TokenType.rightBracket);
      break;
    case ';':
      addToken(TokenType.semicolon);
      break;
    case ':':
      addToken(TokenType.colon);
      break;
    case ',':
      addToken(TokenType.comma);
      break;
    case '.':
      addToken(TokenType.dot);
      break;
    case '+':
      addToken(match('=')
          ? TokenType.plusAssign
          : match('+')
              ? TokenType.plusPlus
              : TokenType.plus);
      break;
    case '-':
      addToken(match('=')
          ? TokenType.minusAssign
          : match('-')
              ? TokenType.minusMinus
              : TokenType.minus);
      break;
    case '*':
      addToken(match('=') ? TokenType.multiplyAssign : TokenType.multiply);
      break;
    case '/':
      if (match('/')) {
        while (peek() != '\n' && !isAtEnd()) {
          advance();
        }
      } else if (match('*')) {
        while (!isAtEnd() && !(peek() == '*' && peekNext() == '/')) {
          if (peek() == '\n') line++;
          advance();
        }
        if (!isAtEnd()) {
          advance();
          advance();
        }
      } else {
        addToken(match('=') ? TokenType.divideAssign : TokenType.divide);
      }
      break;
    case '%':
      addToken(TokenType.modulo);
      break;
    case '!':
      addToken(match('=') ? TokenType.notEqual : TokenType.not);
      break;
    case '=':
      addToken(match('=') ? TokenType.equal : TokenType.assign);
      break;
    case '<':
      addToken(match('=') ? TokenType.lessEqual : TokenType.less);
      break;
    case '>':
      addToken(match('=') ? TokenType.greaterEqual : TokenType.greater);
      break;
    case '&':
      addToken(match('&') ? TokenType.and : TokenType.unknown);
      break;
    case '|':
      addToken(match('|') ? TokenType.or : TokenType.unknown);
      break;
    case ' ':
    case '\r':
    case '\t':
      // Ignore whitespace
      break;
    case '\n':
      line++;
      break;
    case '"':
    case "'":
      string(c);
      break;
    case 'p':
      if (match(':')) {
        addToken(TokenType.flutterParam);
      } else if (source.length >= current + 10 &&
          source.substring(current - 1, current + 10) == 'parameter::') {
        advance(10);
        addToken(TokenType.flutterParam);
      } else {
        identifier();
      }
      break;
    case 'f':
      if (match(':')) {
        addToken(TokenType.flutterWidget);
      } else if (match('p')) {
        addToken(TokenType.flutterParam);
      } else if (source.length >= current + 8 &&
          source.substring(current - 1, current + 8) == 'flutter::') {
        advance(8);
        addToken(TokenType.flutterWidget);
      } else {
        identifier();
      }
      break;
    default:
      if (isDigit(c)) {
        number();
      } else if (isAlpha(c)) {
        identifier();
      } else {
        addToken(TokenType.unknown);
      }
      break;
  }
}