16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_SOURCE_H 186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_SOURCE_H 196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream> 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 22a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#include <tuple> 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLineColumn; 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLine; 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents a file on disk. Used for logging and 316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * showing errors. 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Source { 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::string path; 356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski inline SourceLine line(size_t line) const; 376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents a file on disk and a line number in that file. 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Used for logging and showing errors. 426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLine { 446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::string path; 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski size_t line; 466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski inline SourceLineColumn column(size_t column) const; 486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/** 516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents a file on disk and a line:column number in that file. 526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Used for logging and showing errors. 536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLineColumn { 556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski std::string path; 566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski size_t line; 576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski size_t column; 586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// 616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// Implementations 626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// 636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiSourceLine Source::line(size_t line) const { 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return SourceLine{ path, line }; 666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiSourceLineColumn SourceLine::column(size_t column) const { 696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return SourceLineColumn{ path, line, column }; 706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const Source& source) { 736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out << source.path; 746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const SourceLine& source) { 776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out << source.path << ":" << source.line; 786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const SourceLineColumn& source) { 816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski return out << source.path << ":" << source.line << ":" << source.column; 826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 84a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskiinline bool operator<(const SourceLine& lhs, const SourceLine& rhs) { 85a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski return std::tie(lhs.path, lhs.line) < std::tie(rhs.path, rhs.line); 86a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski} 87a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_SOURCE_H 91