| // 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_STRINGS_DIFF_H_ |
| #define VERIBLE_COMMON_STRINGS_DIFF_H_ |
| |
| #include <iosfwd> |
| #include <vector> |
| |
| #include "absl/strings/string_view.h" |
| #include "common/strings/position.h" |
| #include "external_libs/editscript.h" |
| |
| namespace verible { |
| |
| // The LineDiffs structure holds line-based views of two texts |
| // and the edit sequence (diff) to go from 'before_text' to 'after_text'. |
| // No string copying is done, and the caller is responsible for ensuring |
| // that the externally owned string memory outlives this object. |
| // |
| // Usage: |
| // LineDiffs diffs(old_text, new_text); |
| // |
| struct LineDiffs { |
| const absl::string_view before_text; |
| const absl::string_view after_text; |
| const std::vector<absl::string_view> before_lines; // lines (excluding \n) |
| const std::vector<absl::string_view> after_lines; // lines (excluding \n) |
| const diff::Edits edits; // line difference/edit-sequence between texts. |
| |
| // Computes the line-difference between before_text and after_text. |
| LineDiffs(absl::string_view before_text, absl::string_view after_text); |
| |
| std::ostream& PrintEdit(std::ostream&, const diff::Edit&) const; |
| }; |
| |
| // Prints a monolithic single-hunk unified-diff. |
| std::ostream& operator<<(std::ostream&, const LineDiffs& diffs); |
| |
| // Translates diff::Edits to an interval-set representation. |
| // diff::Edits are 0-indexed, but the returned line numbers will be 1-indexed. |
| LineNumberSet DiffEditsToAddedLineNumbers(const diff::Edits&); |
| |
| // Divides a single edit-sequence (that covers two whole sequences) into |
| // subsequences of of edits ("patch hunks") that skip over unchanged sections. |
| // 'edits' must be a well-formed edit sequence, where the start and end |
| // indices line up and form contiguous range that span two sequences |
| // that were diff'd (e.g. output of diff::GetTokenDiffs()). |
| // 'common_context' is the number of lines of common context to pad before and |
| // after each hunk. This is used to determine subsequence cut points. |
| // |
| // Example: |
| // {DELETE, 0, 1} // delete one line |
| // {EQUALS, 1, 100} // unchanged |
| // {INSERT, 99, 100} // add one line |
| // with 2 elements of common context |
| // |
| // splits into two hunks: |
| // {DELETE, 0, 1} // delete one line |
| // {EQUALS, 1, 3} // unchanged |
| // |
| // {EQUALS, 98, 100} // unchanged |
| // {INSERT, 99, 100} // add one line |
| // |
| // This function could be upstreamed to the editscript library because it is |
| // agnostic to the type being diff-ed. |
| std::vector<diff::Edits> DiffEditsToPatchHunks(const diff::Edits& edits, |
| int common_context); |
| |
| } // namespace verible |
| |
| #endif // VERIBLE_COMMON_STRINGS_DIFF_H_ |