// Copyright (c) 2011, 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 dart2js.scanner.string;

import '../io/source_file.dart' show SourceFile;
import '../tokens/precedence.dart' show PrecedenceInfo;
import '../tokens/token.dart' show StringToken, Token;

import 'array_based_scanner.dart' show ArrayBasedScanner;

/**
 * Scanner that reads from a String and creates tokens that points to
 * substrings.
 */
class StringScanner extends ArrayBasedScanner {
  /** The file content. */
  String string;

  /** The current offset in [string]. */
  int scanOffset = -1;

  StringScanner(SourceFile file, {bool includeComments: false})
      : string = file.slowText(),
        super(file, includeComments) {
    ensureZeroTermination();
  }

  StringScanner.fromString(this.string, {bool includeComments: false})
      : super(null, includeComments) {
    ensureZeroTermination();
  }

  void ensureZeroTermination() {
    if (string.isEmpty || string.codeUnitAt(string.length - 1) != 0) {
      // TODO(lry): abort instead of copying the array, or warn?
      string = string + '\x00';
    }
  }

  int advance() => string.codeUnitAt(++scanOffset);
  int peek() => string.codeUnitAt(scanOffset + 1);

  int get stringOffset => scanOffset;

  int currentAsUnicode(int next) => next;

  void handleUnicode(int startScanOffset) {}

  Token firstToken() => tokens.next;
  Token previousToken() => tail;

  void appendSubstringToken(PrecedenceInfo info, int start, bool asciiOnly,
      [int extraOffset = 0]) {
    tail.next = new StringToken.fromSubstring(
        info, string, start, scanOffset + extraOffset, tokenStart,
        canonicalize: true);
    tail = tail.next;
  }

  bool atEndOfFile() => scanOffset >= string.length - 1;
}
