// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library fasta.scanner.recover;

import '../../scanner/token.dart' show TokenType;

import '../../scanner/token.dart' show Token;

import 'token.dart' show StringToken;

import 'error_token.dart' show ErrorToken;

/// Recover from errors in [tokens]. The original sources are provided as
/// [bytes]. [lineStarts] are the beginning character offsets of lines, and
/// must be updated if recovery is performed rewriting the original source
/// code.
Token scannerRecovery(List<int> bytes, Token tokens, List<int> lineStarts) {
  // Sanity check that all error tokens are prepended.

  // TODO(danrubel): Remove this in a while after the dust has settled.

  // Skip over prepended error tokens
  Token token = tokens;
  while (token is ErrorToken) {
    token = token.next;
  }

  // Assert no error tokens in the remaining tokens
  while (!token.isEof) {
    if (token is ErrorToken) {
      for (int count = 0; count < 3; ++count) {
        Token previous = token.previous;
        if (previous.isEof) break;
        token = previous;
      }
      StringBuffer msg = new StringBuffer(
          "Internal error: All error tokens should have been prepended:");
      for (int count = 0; count < 7; ++count) {
        if (token.isEof) break;
        msg.write(' ${token.runtimeType},');
        token = token.next;
      }
      throw msg.toString();
    }
    token = token.next;
  }

  return tokens;
}

Token synthesizeToken(int charOffset, String value, TokenType type) {
  return new StringToken.fromString(type, value, charOffset);
}

Token skipToEof(Token token) {
  while (!token.isEof) {
    token = token.next;
  }
  return token;
}

String closeBraceFor(String openBrace) {
  return const {
    '(': ')',
    '[': ']',
    '{': '}',
    '<': '>',
    r'${': '}',
    '?.[': ']',
  }[openBrace];
}

String closeQuoteFor(String openQuote) {
  return const {
    '"': '"',
    "'": "'",
    '"""': '"""',
    "'''": "'''",
    'r"': '"',
    "r'": "'",
    'r"""': '"""',
    "r'''": "'''",
  }[openQuote];
}
