| // 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 "verilog/tools/kythe/indexing_facts_tree.h" |
| |
| #include <algorithm> |
| #include <iostream> |
| |
| #include "absl/memory/memory.h" |
| #include "absl/strings/str_cat.h" |
| #include "absl/strings/str_format.h" |
| #include "absl/strings/str_join.h" |
| #include "common/util/range.h" |
| #include "common/util/tree_operations.h" |
| |
| namespace verilog { |
| namespace kythe { |
| |
| Anchor::Anchor(const Anchor& other) |
| : content_(other.content_), source_text_range_(other.source_text_range_) {} |
| |
| std::string Anchor::DebugString() const { |
| if (source_text_range_) { |
| return absl::StrCat("{", Text(), " @", source_text_range_->begin, "-", |
| source_text_range_->begin + source_text_range_->length, |
| "}"); |
| } |
| return absl::StrCat("{", Text(), "}"); |
| } |
| |
| std::ostream& operator<<(std::ostream& stream, const Anchor& anchor) { |
| return stream << anchor.DebugString(); |
| } |
| |
| bool Anchor::operator==(const Anchor& rhs) const { |
| if (source_text_range_) { |
| if (!rhs.source_text_range_) { |
| return false; |
| } |
| if (std::tie(source_text_range_->begin, source_text_range_->length) != |
| std::tie(rhs.source_text_range_->begin, |
| rhs.source_text_range_->length)) { |
| return false; |
| } |
| } |
| return Text() == rhs.Text(); |
| } |
| |
| std::ostream& IndexingNodeData::DebugString(std::ostream* stream) const { |
| *stream << indexing_fact_type_ << ": [" |
| << absl::StrJoin(anchors_.begin(), anchors_.end(), ", ", |
| [](std::string* out, const Anchor& anchor) { |
| absl::StrAppend(out, anchor.DebugString()); |
| }) |
| << ']'; |
| return *stream; |
| } |
| |
| std::ostream& operator<<(std::ostream& stream, const IndexingNodeData& data) { |
| const auto& anchors(data.Anchors()); |
| return stream << data.GetIndexingFactType() << ": [" |
| << absl::StrJoin(anchors.begin(), anchors.end(), ", ", |
| absl::StreamFormatter()) |
| << ']'; |
| } |
| |
| bool IndexingNodeData::operator==(const IndexingNodeData& rhs) const { |
| return indexing_fact_type_ == rhs.GetIndexingFactType() && |
| anchors_.size() == rhs.Anchors().size() && |
| std::equal(anchors_.begin(), anchors_.end(), rhs.Anchors().begin()); |
| } |
| |
| std::ostream& operator<<(std::ostream& stream, |
| const PrintableIndexingNodeData& printable_node) { |
| return printable_node.data.DebugString(&stream); |
| } |
| |
| std::ostream& operator<<(std::ostream& stream, |
| const PrintableIndexingFactNode& printable_node) { |
| return PrintTree( |
| printable_node.data, &stream, |
| [&printable_node](std::ostream& s, |
| const IndexingNodeData& d) -> std::ostream& { |
| return s << PrintableIndexingNodeData(d, printable_node.base); |
| }); |
| } |
| |
| } // namespace kythe |
| } // namespace verilog |