12#ifndef LIB_SOURCE_FILE_H_
13#define LIB_SOURCE_FILE_H_
20#include "absl/strings/str_format.h"
26#ifdef P4C_GTEST_ENABLED
27#include "gtest/gtest_prod.h"
35using namespace P4::literals;
58 return columnNumber == rhs.columnNumber && lineNumber == rhs.lineNumber;
60 inline bool operator!=(
const SourcePosition &rhs)
const {
return !this->operator==(rhs); }
63 return (lineNumber < rhs.lineNumber) ||
64 (lineNumber == rhs.lineNumber && columnNumber < rhs.columnNumber);
66 inline bool operator>(
const SourcePosition &rhs)
const {
return rhs.operator<(*this); }
67 inline bool operator<=(
const SourcePosition &rhs)
const {
return !this->operator>(rhs); }
68 inline bool operator>=(
const SourcePosition &rhs)
const {
return !this->operator<(rhs); }
72 if (columnNumber > 0) columnNumber--;
82 if (this->
operator<(rhs))
return *
this;
87 if (this->
operator>(rhs))
return *
this;
91 cstring toString()
const;
93 bool isValid()
const {
return lineNumber != 0; }
95 unsigned getLineNumber()
const {
return lineNumber; }
97 unsigned getColumnNumber()
const {
return columnNumber; }
99 template <
typename Sink>
101 absl::Format(&sink,
"%d:%d", p.lineNumber, p.columnNumber);
106 unsigned lineNumber = 0;
107 unsigned columnNumber = 0;
123class SourceInfo final {
138 SourceInfo(
const SourceInfo &other) =
default;
139 SourceInfo &operator=(
const SourceInfo &other) =
default;
140 ~SourceInfo() =
default;
146 if (!this->isValid())
return rhs;
147 if (!rhs.isValid())
return *
this;
155 }
else if (rhs.isValid()) {
156 start = start.min(rhs.start);
157 end = end.max(rhs.end);
162 bool operator==(
const SourceInfo &rhs)
const {
return start == rhs.start && end == rhs.end; }
164 cstring toString()
const;
166 void dbprint(std::ostream &out)
const { out << this->toString(); }
176 cstring toBriefSourceFragment()
const;
177 cstring toPositionString()
const;
178 cstring toSourcePositionData(
unsigned *outLineNumber,
unsigned *outColumnNumber)
const;
179 SourceFileLine toPosition()
const;
180 SourceFileLine toPositionEnd()
const;
182 bool isValid()
const {
return this->start.isValid(); }
183 explicit operator bool()
const {
return isValid(); }
185 cstring getSourceFile()
const;
186 cstring getLineNum()
const;
188 const SourcePosition &getStart()
const {
return this->start; }
190 const SourcePosition &getEnd()
const {
return this->end; }
198 if (!rhs.isValid())
return false;
199 if (!isValid())
return true;
200 return this->start < rhs.start;
202 inline bool operator>(
const SourceInfo &rhs)
const {
return rhs.operator<(*this); }
203 inline bool operator<=(
const SourceInfo &rhs)
const {
return !this->operator>(rhs); }
206 friend std::ostream &operator<<(std::ostream &os,
const SourceInfo &
info);
209 const InputSources *sources =
nullptr;
210 SourcePosition start = SourcePosition();
211 SourcePosition end = SourcePosition();
217 virtual cstring toString()
const = 0;
222template <
class,
class =
void>
233struct SourceFileLine {
238 SourceFileLine(std::string_view file,
unsigned line) :
fileName(file), sourceLine(line) {}
251 : srcInfo(srcInfo), singleLine(singleLine), body(body) {}
252 cstring toString()
const override {
253 std::stringstream str;
257 void dbprint(std::ostream &out)
const override {
263 if (!singleLine) out <<
"*/";
280class InputSources final {
281#ifdef P4C_GTEST_ENABLED
282 FRIEND_TEST(UtilSourceFile, InputSources);
287 std::string_view getLine(
unsigned lineNumber)
const;
291 unsigned lineCount()
const;
293 unsigned getCurrentLineNumber()
const;
304 void mapLine(std::string_view file,
unsigned originalSourceLineNo);
323 void appendToLastLine(std::string_view text);
325 void appendNewline(std::string_view newline);
330 std::map<unsigned, SourceFileLine> line_file_map;
333 std::vector<std::string> contents;
335 std::vector<Comment *> comments;
Definition stringify.h:24
Definition source_file.h:214
Definition source_file.h:123
bool operator<(const SourceInfo &rhs) const
Definition source_file.h:197
SourceInfo operator+(const SourceInfo &rhs) const
Definition source_file.h:145
SourceInfo()=default
Creates an "invalid" SourceInfo.
cstring toSourceFragment(int trimWidth=-1, bool useMarker=true) const
Definition source_file.cpp:318
Definition source_file.h:47
SourcePosition & operator--()
Move one column back. This never moves one line back.
Definition source_file.h:71
SourcePosition()=default
Creates an invalid source position.
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
void info(const int kind, const char *format, const T *node, Args &&...args)
Report info messages of type kind. Requires that the node argument have source info.
Definition lib/error.h:158
Definition source_file.h:233
cstring fileName
an empty filename indicates stdin
Definition source_file.h:235
SFINAE helper to check if given class has a getSourceInfo method.
Definition source_file.h:223