
// Copyright 2020 The Tint 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 SRC_SOURCE_H_
#define SRC_SOURCE_H_

#include <iostream>
#include <string>
#include <string_view>
#include <tuple>
#include <vector>

namespace tint {

/// Source describes a range of characters within a source file.
class Source {
 public:
  /// FileContent describes the content of a source file.
  class FileContent {
   public:
    /// Constructs the FileContent with the given file content.
    /// @param data the file contents
    explicit FileContent(const std::string& data);

    /// Copy constructor
    /// @param rhs the FileContent to copy
    FileContent(const FileContent& rhs);

    /// Destructor
    ~FileContent();

    /// The original un-split file content
    const std::string data;
    /// A string_view over #data
    const std::string_view data_view;
    /// #data split by lines
    const std::vector<std::string_view> lines;
  };

  /// File describes a source file, including path and content.
  class File {
   public:
    /// Constructs the File with the given file path and content.
    /// @param p the path for this file
    /// @param c the file contents
    inline File(const std::string& p, const std::string& c)
        : path(p), content(c) {}

    /// Destructor
    ~File();

    /// file path (optional)
    const std::string path;
    /// file content
    const FileContent content;
  };

  /// Location holds a 1-based line and column index.
  class Location {
   public:
    /// the 1-based line number. 0 represents no line information.
    size_t line = 0;
    /// the 1-based column number. 0 represents no column information.
    size_t column = 0;

    /// Returns true of `this` location is lexicographically less than `rhs`
    /// @param rhs location to compare against
    /// @returns true if `this` < `rhs`
    inline bool operator<(const Source::Location& rhs) {
      return std::tie(line, column) < std::tie(rhs.line, rhs.column);
    }

    /// Returns true of `this` location is equal to `rhs`
    /// @param rhs location to compare against
    /// @returns true if `this` == `rhs`
    inline bool operator==(const Location& rhs) const {
      return line == rhs.line && column == rhs.column;
    }

    /// Returns true of `this` location is not equal to `rhs`
    /// @param rhs location to compare against
    /// @returns true if `this` != `rhs`
    inline bool operator!=(const Location& rhs) const {
      return !(*this == rhs);
    }
  };

  /// Range holds a Location interval described by [begin, end).
  class Range {
   public:
    /// Constructs a zero initialized Range.
    inline Range() = default;

    /// Constructs a zero-length Range starting at `loc`
    /// @param loc the start and end location for the range
    inline constexpr explicit Range(const Location& loc)
        : begin(loc), end(loc) {}

    /// Constructs the Range beginning at `b` and ending at `e`
    /// @param b the range start location
    /// @param e the range end location
    inline constexpr Range(const Location& b, const Location& e)
        : begin(b), end(e) {}

    /// Return a column-shifted Range
    /// @param n the number of characters to shift by
    /// @returns a Range with a #begin and #end column shifted by `n`
    inline Range operator+(size_t n) const {
      return Range{{begin.line, begin.column + n}, {end.line, end.column + n}};
    }

    /// Returns true of `this` range is not equal to `rhs`
    /// @param rhs range to compare against
    /// @returns true if `this` != `rhs`
    inline bool operator==(const Range& rhs) const {
      return begin == rhs.begin && end == rhs.end;
    }

    /// Returns true of `this` range is equal to `rhs`
    /// @param rhs range to compare against
    /// @returns true if `this` == `rhs`
    inline bool operator!=(const Range& rhs) const { return !(*this == rhs); }

    /// The location of the first character in the range.
    Location begin;
    /// The location of one-past the last character in the range.
    Location end;
  };

  /// Constructs the Source with an zero initialized Range and null File.
  inline Source() : range() {}

  /// Constructs the Source with the Range `rng` and a null File
  /// @param rng the source range
  inline explicit Source(const Range& rng) : range(rng) {}

  /// Constructs the Source with the Range `loc` and a null File
  /// @param loc the start and end location for the source range
  inline explicit Source(const Location& loc) : range(Range(loc)) {}

  /// Constructs the Source with the Range `rng` and File `file`
  /// @param rng the source range
  /// @param file the source file
  inline Source(const Range& rng, File const* file)
      : range(rng), file_path(file->path), file_content(&file->content) {}

  /// Constructs the Source with the Range `rng`, file path `path` and content
  /// `content`
  /// @param rng the source range
  /// @param path the source file path
  /// @param content the source file content
  inline Source(const Range& rng,
                const std::string& path,
                const FileContent* content = nullptr)
      : range(rng), file_path(path), file_content(content) {}

  /// @returns a Source that points to the begin range of this Source.
  inline Source Begin() const {
    return Source(Range{range.begin}, file_path, file_content);
  }

  /// @returns a Source that points to the end range of this Source.
  inline Source End() const {
    return Source(Range{range.end}, file_path, file_content);
  }

  /// Return a column-shifted Source
  /// @param n the number of characters to shift by
  /// @returns a Source with the range's columns shifted by `n`
  inline Source operator+(size_t n) const {
    return Source(range + n, file_path, file_content);
  }

  /// Returns true of `this` Source is lexicographically less than `rhs`
  /// @param rhs source to compare against
  /// @returns true if `this` < `rhs`
  inline bool operator<(const Source& rhs) {
    if (file_path != rhs.file_path) {
      return false;
    }
    if (file_content != rhs.file_content) {
      return false;
    }
    return range.begin < rhs.range.begin;
  }

  /// Helper function that returns the range union of two source locations. The
  /// `start` and `end` locations are assumed to refer to the same source file.
  /// @param start the start source of the range
  /// @param end the end source of the range
  /// @returns the combined source
  inline static Source Combine(const Source& start, const Source& end) {
    return Source(Source::Range(start.range.begin, end.range.end),
                  start.file_path, start.file_content);
  }

  /// range is the span of text this source refers to in #file_path
  Range range;
  /// file is the optional file path this source refers to
  std::string file_path;
  /// file is the optional source content this source refers to
  const FileContent* file_content = nullptr;
};

/// Writes the Source::Location to the std::ostream.
/// @param out the std::ostream to write to
/// @param loc the location to write
/// @returns out so calls can be chained
inline std::ostream& operator<<(std::ostream& out,
                                const Source::Location& loc) {
  out << loc.line << ":" << loc.column;
  return out;
}

/// Writes the Source::Range to the std::ostream.
/// @param out the std::ostream to write to
/// @param range the range to write
/// @returns out so calls can be chained
inline std::ostream& operator<<(std::ostream& out, const Source::Range& range) {
  out << "[" << range.begin << ", " << range.end << "]";
  return out;
}

/// Writes the Source to the std::ostream.
/// @param out the std::ostream to write to
/// @param source the source to write
/// @returns out so calls can be chained
std::ostream& operator<<(std::ostream& out, const Source& source);

/// Writes the Source::FileContent to the std::ostream.
/// @param out the std::ostream to write to
/// @param content the file content to write
/// @returns out so calls can be chained
inline std::ostream& operator<<(std::ostream& out,
                                const Source::FileContent& content) {
  out << content.data;
  return out;
}

}  // namespace tint

#endif  // SRC_SOURCE_H_
