// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "common/lexer/token_stream_adapter.h"

#include "absl/status/status.h"
#include "common/lexer/lexer.h"
#include "common/lexer/token_generator.h"
#include "common/text/token_info.h"

namespace verible {

TokenGenerator MakeTokenGenerator(Lexer* l) {
  return [=]() { return l->DoNextToken(); };
}

absl::Status MakeTokenSequence(
    Lexer* lexer, absl::string_view text, TokenSequence* tokens,
    const std::function<void(const TokenInfo&)>& error_token_handler) {
  // TODO(fangism): provide a Lexer interface to grab all tokens en masse,
  // which would save virtual function dispatch overhead.
  lexer->Restart(text);
  do {
    const auto& new_token = lexer->DoNextToken();
    tokens->push_back(new_token);
    if (lexer->TokenIsError(new_token)) {  // one more virtual function call
      error_token_handler(new_token);
      // Stop-on-first-error.
      return absl::InvalidArgumentError("Lexical error.");
    }
  } while (!tokens->back().isEOF());
  // Final token is EOF.
  // Force EOF token's text range to be empty, pointing to end of original
  // string.  Otherwise, its range ends up overlapping with the previous token.
  tokens->back() = TokenInfo::EOFToken(text);
  return absl::OkStatus();
}

}  // namespace verible
