21#ifndef LIB_SOURCE_FILE_H_
22#define LIB_SOURCE_FILE_H_
30#ifdef P4C_GTEST_ENABLED
31#include "gtest/gtest_prod.h"
40 virtual void dbprint(std::ostream &out)
const = 0;
67 return columnNumber == rhs.columnNumber && lineNumber == rhs.lineNumber;
69 inline bool operator!=(
const SourcePosition &rhs)
const {
return !this->operator==(rhs); }
72 return (lineNumber < rhs.lineNumber) ||
73 (lineNumber == rhs.lineNumber && columnNumber < rhs.columnNumber);
75 inline bool operator>(
const SourcePosition &rhs)
const {
return rhs.operator<(*this); }
76 inline bool operator<=(
const SourcePosition &rhs)
const {
return !this->operator>(rhs); }
77 inline bool operator>=(
const SourcePosition &rhs)
const {
return !this->operator<(rhs); }
81 if (columnNumber > 0) columnNumber--;
91 if (this->
operator<(rhs))
return *
this;
96 if (this->
operator>(rhs))
return *
this;
102 bool isValid()
const {
return lineNumber != 0; }
104 unsigned getLineNumber()
const {
return lineNumber; }
106 unsigned getColumnNumber()
const {
return columnNumber; }
110 unsigned lineNumber = 0;
111 unsigned columnNumber = 0;
133 this->filename = filename;
135 this->column = column;
136 this->srcBrief = srcBrief;
143 : sources(sources), start(point), end(point) {}
155 if (!this->isValid())
return rhs;
156 if (!rhs.isValid())
return *
this;
164 }
else if (rhs.isValid()) {
165 start = start.min(rhs.start);
166 end = end.max(rhs.end);
171 bool operator==(
const SourceInfo &rhs)
const {
return start == rhs.start && end == rhs.end; }
175 void dbprint(std::ostream &out)
const { out << this->toDebugString(); }
177 cstring toSourceFragment(
bool useMarker =
true)
const;
178 cstring toBriefSourceFragment()
const;
179 cstring toPositionString()
const;
180 cstring toSourcePositionData(
unsigned *outLineNumber,
unsigned *outColumnNumber)
const;
181 SourceFileLine toPosition()
const;
183 bool isValid()
const {
return this->start.isValid(); }
184 explicit operator bool()
const {
return isValid(); }
189 const SourcePosition &getStart()
const {
return this->start; }
191 const SourcePosition &getEnd()
const {
return this->end; }
199 if (!rhs.isValid())
return false;
200 if (!isValid())
return true;
201 return this->start < rhs.start;
203 inline bool operator>(
const SourceInfo &rhs)
const {
return rhs.operator<(*this); }
204 inline bool operator<=(
const SourceInfo &rhs)
const {
return !this->operator>(rhs); }
208 const InputSources *sources =
nullptr;
209 SourcePosition start = SourcePosition();
210 SourcePosition end = SourcePosition();
216 virtual cstring toString()
const = 0;
239 : srcInfo(srcInfo), singleLine(singleLine), body(body) {}
247 if (!singleLine) result +=
"*/";
250 void dbprint(std::ostream &out)
const { out << toString(); }
264#ifdef P4C_GTEST_ENABLED
271 cstring getLine(
unsigned lineNumber)
const;
275 unsigned lineCount()
const;
277 unsigned getCurrentLineNumber()
const;
304 void appendToLastLine(std::string_view text);
306 void appendNewline(std::string_view newline);
311 std::map<unsigned, SourceFileLine> line_file_map;
314 std::vector<std::string> contents;
316 std::vector<Comment *> comments;
Definition source_file.h:38
Definition source_file.h:213
Definition source_file.h:126
bool operator<(const SourceInfo &rhs) const
Definition source_file.h:198
SourceInfo()=default
Creates an "invalid" SourceInfo.
SourceInfo(const InputSources *sources, SourcePosition point)
Creates a SourceInfo for a 'point' in the source, or invalid.
Definition source_file.h:142
SourceInfo operator+(const SourceInfo &rhs) const
Definition source_file.h:154
Definition source_file.h:56
SourcePosition()=default
Creates an invalid source position.
SourcePosition & operator--()
Move one column back. This never moves one line back.
Definition source_file.h:80
Definition source_file.h:221
cstring fileName
an empty filename indicates stdin
Definition source_file.h:223