| // 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/text/token_info.h" |
| |
| #include <algorithm> |
| #include <cstddef> |
| #include <iterator> |
| #include <sstream> // IWYU pragma: keep // for ostringstream |
| #include <string> |
| #include <vector> |
| |
| #include "absl/strings/string_view.h" |
| #include "common/strings/rebase.h" |
| #include "common/util/logging.h" |
| #include "common/util/range.h" |
| |
| namespace verible { |
| |
| TokenInfo TokenInfo::EOFToken() { |
| static constexpr absl::string_view null_text; |
| return TokenInfo(TK_EOF, null_text); |
| } |
| |
| TokenInfo TokenInfo::EOFToken(absl::string_view buffer) { |
| return TokenInfo(TK_EOF, absl::string_view(buffer.end(), 0)); |
| } |
| |
| bool TokenInfo::operator==(const TokenInfo& token) const { |
| return token_enum_ == token.token_enum_ && |
| (token_enum_ == TK_EOF || // All EOF tokens considered equal. |
| BoundsEqual(text_, token.text_)); |
| } |
| |
| TokenInfo::Context::Context(absl::string_view b) |
| : base(b), |
| // By default, just print the enum integer value, un-translated. |
| token_enum_translator([](std::ostream& stream, int e) { stream << e; }) {} |
| |
| std::ostream& TokenInfo::ToStream(std::ostream& output_stream, |
| const Context& context) const { |
| output_stream << "(#"; |
| context.token_enum_translator(output_stream, token_enum_); |
| output_stream << " @" << left(context.base) << '-' << right(context.base) |
| << ": \"" << text_ << "\")"; |
| const auto dist = std::distance(context.base.end(), text_.end()); |
| CHECK(IsSubRange(text_, context.base)) << "text.end() is off by " << dist; |
| return output_stream; |
| } |
| |
| std::ostream& TokenInfo::ToStream(std::ostream& output_stream) const { |
| return output_stream << "(#" << token_enum_ << ": \"" << text_ << "\")"; |
| } |
| |
| std::string TokenInfo::ToString(const Context& context) const { |
| std::ostringstream output_stream; |
| ToStream(output_stream, context); |
| return output_stream.str(); |
| } |
| |
| std::string TokenInfo::ToString() const { |
| std::ostringstream output_stream; |
| ToStream(output_stream); |
| return output_stream.str(); |
| } |
| |
| void TokenInfo::RebaseStringView(absl::string_view new_text) { |
| verible::RebaseStringView(&text_, new_text); |
| } |
| |
| void TokenInfo::Concatenate(std::string* out, std::vector<TokenInfo>* tokens) { |
| ConcatenateTokenInfos(out, tokens->begin(), tokens->end()); |
| } |
| |
| // Print human-readable token information. |
| std::ostream& operator<<(std::ostream& stream, const TokenInfo& token) { |
| // This will exclude any byte offset information because the base address |
| // of the enclosing stream is not known to this function. |
| return token.ToStream(stream); |
| } |
| |
| std::ostream& operator<<(std::ostream& stream, const TokenWithContext& t) { |
| return t.token.ToStream(stream, t.context); |
| } |
| |
| } // namespace verible |