Timur Iskhakov | 0e7c2a9 | 2017-09-06 11:40:59 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2017 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #include "Location.h" |
| 18 | |
| 19 | #include <android-base/logging.h> |
Neel Mehta | f9de483 | 2019-06-12 19:38:09 -0700 | [diff] [blame] | 20 | #include <tuple> |
Timur Iskhakov | 0e7c2a9 | 2017-09-06 11:40:59 -0700 | [diff] [blame] | 21 | |
| 22 | namespace android { |
| 23 | |
| 24 | Position::Position(std::string filename, size_t line, size_t column) |
| 25 | : mFilename(filename), mLine(line), mColumn(column) {} |
| 26 | |
| 27 | const std::string& Position::filename() const { |
| 28 | return mFilename; |
| 29 | } |
| 30 | |
| 31 | size_t Position::line() const { |
| 32 | return mLine; |
| 33 | } |
| 34 | |
| 35 | size_t Position::column() const { |
| 36 | return mColumn; |
| 37 | } |
| 38 | |
| 39 | bool Position::inSameFile(const Position& lhs, const Position& rhs) { |
| 40 | return lhs.mFilename == rhs.mFilename; |
| 41 | } |
| 42 | |
| 43 | bool Position::operator<(const Position& pos) const { |
Neel Mehta | f9de483 | 2019-06-12 19:38:09 -0700 | [diff] [blame] | 44 | return std::tie(mFilename, mLine, mColumn) < std::tie(pos.mFilename, pos.mLine, pos.mColumn); |
Timur Iskhakov | 0e7c2a9 | 2017-09-06 11:40:59 -0700 | [diff] [blame] | 45 | } |
| 46 | |
| 47 | std::ostream& operator<<(std::ostream& ostr, const Position& pos) { |
| 48 | if (!pos.filename().empty()) { |
| 49 | ostr << pos.filename() << ":"; |
| 50 | } |
| 51 | return ostr << pos.line() << "." << pos.column(); |
| 52 | } |
| 53 | |
| 54 | //////////////////////////////////////// |
| 55 | |
| 56 | Location::Location(const Position& begin, const Position& end) |
| 57 | : mIsValid(true), mBegin(begin), mEnd(end) {} |
| 58 | |
| 59 | void Location::setLocation(const Position& begin, const Position& end) { |
| 60 | mIsValid = true; |
| 61 | mBegin = begin; |
| 62 | mEnd = end; |
| 63 | } |
| 64 | |
| 65 | bool Location::isValid() const { |
| 66 | return mIsValid; |
| 67 | } |
| 68 | |
| 69 | const Position& Location::begin() const { |
| 70 | return mBegin; |
| 71 | } |
| 72 | |
| 73 | const Position& Location::end() const { |
| 74 | return mEnd; |
| 75 | } |
| 76 | |
| 77 | Location Location::startOf(const std::string& path) { |
| 78 | return Location(Position(path, 1, 1), Position(path, 1, 1)); |
| 79 | } |
| 80 | |
| 81 | bool Location::inSameFile(const Location& lhs, const Location& rhs) { |
| 82 | return Position::inSameFile(lhs.mBegin, rhs.mBegin); |
| 83 | } |
| 84 | |
| 85 | bool Location::intersect(const Location& lhs, const Location& rhs) { |
| 86 | if (!inSameFile(lhs, rhs)) return false; |
| 87 | return !(lhs.mEnd < rhs.mBegin || rhs.mEnd < lhs.mBegin); |
| 88 | } |
| 89 | |
| 90 | bool Location::operator<(const Location& loc) const { |
Neel Mehta | f9de483 | 2019-06-12 19:38:09 -0700 | [diff] [blame] | 91 | return std::tie(mBegin, mEnd) < std::tie(loc.mBegin, loc.mEnd); |
Timur Iskhakov | 0e7c2a9 | 2017-09-06 11:40:59 -0700 | [diff] [blame] | 92 | } |
| 93 | |
| 94 | std::ostream& operator<<(std::ostream& ostr, const Location& loc) { |
| 95 | Position last = Position(loc.end().filename(), loc.end().line(), |
| 96 | std::max<size_t>(1u, loc.end().column() - 1)); |
| 97 | ostr << loc.begin(); |
| 98 | if (loc.begin().filename() != last.filename()) { |
| 99 | ostr << "-" << last; |
| 100 | } else if (loc.begin().line() != last.line()) { |
| 101 | ostr << "-" << last.line() << "." << last.column(); |
| 102 | } else if (loc.begin().column() != last.column()) { |
| 103 | ostr << "-" << last.column(); |
| 104 | } |
| 105 | return ostr; |
| 106 | } |
| 107 | |
| 108 | } // namespace android |