// 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.

#ifndef VERIBLE_COMMON_TEXT_TOKEN_INFO_H_
#define VERIBLE_COMMON_TEXT_TOKEN_INFO_H_

#include <algorithm>  // for std::distance, std::copy
#include <cstddef>
#include <functional>  // for std::function
#include <iosfwd>
#include <iterator>
#include <string>
#include <utility>
#include <vector>

#include "absl/strings/string_view.h"
#include "common/text/constants.h"
#include "common/util/iterator_range.h"

namespace verible {

// TokenInfo describes the text and location of a lexed token.
// TokenInfo is a unit returned by the FlexLexerAdapter.
// Reminder: The text string_view doesn't own its memory, so the owner must
// always out-live the token.
//
class TokenInfo {
 public:
  // Construct an EOF token.
  // Note, however, that the bounds of the internal string_view in this case
  // do not correspond to any subrange of valid string.
  // If you need the string_view range to refer to (the end of) another string,
  // use the following overload that accepts a string.
  static TokenInfo EOFToken();

  // Construct an EOF token that points to the end of a string buffer.
  static TokenInfo EOFToken(absl::string_view);

  // Hide default constructor, force explicit initialization or call to
  // EOFToken().
  TokenInfo() = delete;

  TokenInfo(int token_enum, absl::string_view text)
      : token_enum_(token_enum), text_(text) {}

  TokenInfo(const TokenInfo&) = default;
  TokenInfo(TokenInfo&&) = default;
  TokenInfo& operator=(const TokenInfo&) = default;

  // Context contains the information needed to display meaningful information
  // about a TokenInfo.
  struct Context {
    // Full range of text in which a token appears.
    // This is used to calculate byte offsets.
    absl::string_view base;

    // Prints a human-readable interpretation form of a token enumeration.
    std::function<void(std::ostream&, int)> token_enum_translator;

    explicit Context(absl::string_view b);

    Context(absl::string_view b,
            std::function<void(std::ostream&, int)> translator)
        : base(b), token_enum_translator(std::move(translator)) {}
  };

  int token_enum() const { return token_enum_; }
  void set_token_enum(int t) { token_enum_ = t; }
  absl::string_view text() const { return text_; }
  void set_text(absl::string_view t) { text_ = t; }

  // Return position of this token's text start relative to a base buffer.
  int left(absl::string_view base) const {
    return std::distance(base.begin(), text_.begin());
  }

  // Return position of this token's text end relative to a base buffer.
  int right(absl::string_view base) const {
    return std::distance(base.begin(), text_.end());
  }

  // Advances the text range along the same memory buffer to span the
  // next token of size token_length.  Successive calls to this yield
  // a series of abutting substring ranges.  Useful for lexer operation.
  void AdvanceText(int token_length) {
    // The end of the previous token is the beginning of the next.
    text_ = absl::string_view(text_.end(), token_length);
  }

  // Writes a human-readable string representation of the token.
  std::ostream& ToStream(std::ostream&, const Context& context) const;

  // Prints token representation without byte offsets.
  std::ostream& ToStream(std::ostream&) const;

  // Returns a human-readable string representation of the token.
  std::string ToString(const Context&) const;

  // Prints token representation without byte offsets.
  std::string ToString() const;

  // 'Moves' text string_view to point to another buffer, where the
  // contents still matches.  This is useful for analyzing different copies
  // of text, and transplanting to buffers that belong to different
  // memory owners.
  // This is a potentially dangerous operation, which can be validated
  // using a combination of object lifetime management and range-checking.
  // It is the caller's responsibility that it points to valid memory.
  void RebaseStringView(absl::string_view new_text);

  // This overload assumes that the string of interest from other has the
  // same length as the current string_view.
  // string_view::iterator happens to be const char*, but don't rely on that
  // fact as it can be implementation-dependent.
  void RebaseStringView(const char* new_text) {
    RebaseStringView(absl::string_view(new_text, text_.length()));
  }

  // Joins the text from a sequence of (text-disjoint) tokens, and also
  // transforms the sequence of tokens in-place to point to corresponding
  // substrings of the newly concatenated string (out).  The updated tokens'
  // string_views will be abutting *subranges* of 'out', and their left/right
  // offsets will be updated to be relative to out->begin().
  // This is very useful for lexer test case construction.
  static void Concatenate(std::string* out, std::vector<TokenInfo>* tokens);

  // The default comparison operator requires that not only the contents
  // of the internal string_view be equal, but that they point to the
  // same buffer range.  See EquivalentWithoutLocation() for the variant that
  // doesn't require range equality.
  bool operator==(const TokenInfo& token) const;
  bool operator!=(const TokenInfo& token) const { return !(*this == token); }

  // Returns true if tokens are considered equivalent, ignoring location.
  bool EquivalentWithoutLocation(const TokenInfo& token) const {
    return token_enum_ == token.token_enum_ &&
           (token_enum_ == TK_EOF || text_ == token.text_);
  }

  // Returns true if tokens have equal enum and equal string length (but
  // otherwise ignoring string contents).  This is useful for verifying
  // space-preserving obfuscation transformations.
  bool EquivalentBySpace(const TokenInfo& token) const {
    return token_enum_ == token.token_enum_ &&
           (token_enum_ == TK_EOF || text_.length() == token.text_.length());
  }

  bool isEOF() const { return token_enum_ == TK_EOF; }

 protected:  // protected, as ExpectedTokenInfo accesses it.
  int token_enum_;

  // The substring of a larger text that this token represents.
  absl::string_view text_;
};

std::ostream& operator<<(std::ostream&, const TokenInfo&);

// Streamable structure that combines a token with its detailed context.
struct TokenWithContext {
  TokenInfo token;
  TokenInfo::Context context;
};

std::ostream& operator<<(std::ostream&, const TokenWithContext&);

// Joins a range of TokenInfo-like objects to form a string whose contents
// match those of the elements's ranges, and also points the elements
// to the corresponding matching substrings of the new string (rebase).
// TokenInfo must be a write-able iterator.
// TokenInfo's element type must have the same interface as TokenInfo,
// e.g. a (public) subclass of TokenInfo.
template <class TokenIter>
void ConcatenateTokenInfos(std::string* out, TokenIter begin, TokenIter end) {
  // Inspired by absl::StrCat implementation details.

  // Calculate total string length, used to allocate one-time.
  const auto token_range = make_range(begin, end);
  size_t total_length = 0;
  for (const auto& token : token_range) {
    total_length += token.text().length();
  }
  out->resize(total_length);
  const absl::string_view out_view(*out);

  // Copy text into new buffer.
  auto code_iter = out->begin();  // writeable iterator (like char*)
  int offset = 0;
  for (auto& token : token_range) {
    // Expect library/compiler to optimize this to a strcpy()/memcpy().
    code_iter = std::copy(token.text().begin(), token.text().end(), code_iter);
    const auto new_text = out_view.substr(offset, token.text().length());
    // Adjust locations relative to newly concatenated string.
    token.RebaseStringView(new_text);
    offset += token.text().length();
  }
}

}  // namespace verible

#endif  // VERIBLE_COMMON_TEXT_TOKEN_INFO_H_
