blob: c329110518e8a5ac3967476993d4c673b8fce9d4 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fidl/virtual_source_file.h"
namespace fidl {
SourceLocation VirtualSourceFile::AddLine(const std::string& line) {
assert(line.find('\n') == std::string::npos &&
"A single line should not contain a newline character");
return SourceLocation(*virtual_lines_.emplace_back(std::make_unique<std::string>(line)), *this);
}
std::string_view VirtualSourceFile::LineContaining(std::string_view view, Position* position_out) const {
for (int i = 0; i < static_cast<int>(virtual_lines_.size()); i++) {
const std::string& line = *virtual_lines_[i];
const char* line_begin = &*line.cbegin();
const char* line_end = &*line.cend();
if (view.data() < line_begin || view.data() + view.size() > line_end)
continue;
if (position_out != nullptr) {
auto column = (view.data() - line_begin) + 1;
assert(column < std::numeric_limits<int>::max());
*position_out = {i + 1, static_cast<int>(column)};
}
return std::string_view(line);
}
return std::string_view();
}
} // namespace fidl