context_->Emit(o, sources);
}
sources.Identify(o, provenance_, "");
- o << ": " << message_ << '\n';
+ o << " " << message_ << '\n';
}
void Messages::Emit(std::ostream &o, const AllSources &sources) const {
start_.clear();
nextStart_ = 0;
char_.clear();
+ provenances_.clear();
}
void TokenSequence::pop_back() {
}
TokenSequence(TokenSequence &&that)
: start_{std::move(that.start_)},
- nextStart_{that.nextStart_}, char_{std::move(that.char_)} {}
+ nextStart_{that.nextStart_}, char_{std::move(that.char_)},
+ provenances_{std::move(that.provenances_)} {}
TokenSequence(const std::string &s) { Put(s, 0); } // TODO predefined prov.
TokenSequence &operator=(const TokenSequence &that) {
}
void CloseToken() {
- // CHECK(char_.size() > nextStart_);
start_.emplace_back(nextStart_);
nextStart_ = char_.size();
}
namespace Fortran {
namespace parser {
+void OffsetToProvenanceMappings::clear() {
+ bytes_ = 0;
+ provenanceMap_.clear();
+}
+
void OffsetToProvenanceMappings::Put(ProvenanceRange range) {
if (provenanceMap_.empty()) {
provenanceMap_.push_back({bytes_, range});
std::pair<int, int> pos{
inc.source.FindOffsetLineAndColumn(at - origin.start)};
o << prefix << "at line " << pos.first << ", column "
- << pos.second << "in the file " << inc.source.path() << '\n';
+ << pos.second << " in the file " << inc.source.path() << '\n';
if (origin.replaces.bytes > 0) {
o << prefix << " that was included\n";
Identify(o, origin.replaces.start, indented);
}
void CookedSource::Marshal() {
+ CHECK(provenanceMap_.size() == buffer_.size());
+ provenanceMap_.Put(sources_.AddCompilerInsertion("EOF"));
data_.resize(buffer_.size());
char *p{&data_[0]};
for (char ch : buffer_) {
public:
OffsetToProvenanceMappings() {}
size_t size() const { return bytes_; }
+ void clear();
void shrink_to_fit() { provenanceMap_.shrink_to_fit(); }
void Put(ProvenanceRange);
void Put(const OffsetToProvenanceMappings &);
std::cout << "demo PASS\n" << *result << '\n';
} else {
std::cerr << "demo FAIL\n";
- allSources.Identify(std::cerr, state.GetProvenance(), " ");
+ if (!state.IsAtEnd()) {
+ std::cerr << "final position: ";
+ allSources.Identify(std::cerr, state.GetProvenance(), " ");
+ }
state.messages()->Emit(std::cerr, allSources);
return EXIT_FAILURE;
}