mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-13 08:36:08 +00:00
The `std::string file_path` carried around by every Source was very expensive for heap allocations. Push this into the Source::File. Bug: tint:1383 Change-Id: Id9e3bdef1cf24aea5f3c83f348c05f5cf8ef4bbb Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/78321 Reviewed-by: Antonio Maiorano <amaiorano@google.com> Commit-Queue: Ben Clayton <bclayton@google.com> Kokoro: Ben Clayton <bclayton@google.com>
243 lines
7.8 KiB
C++
243 lines
7.8 KiB
C++
// Copyright 2020 The Tint Authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef SRC_DIAGNOSTIC_DIAGNOSTIC_H_
|
|
#define SRC_DIAGNOSTIC_DIAGNOSTIC_H_
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "src/source.h"
|
|
|
|
namespace tint {
|
|
namespace diag {
|
|
|
|
/// Severity is an enumerator of diagnostic severities.
|
|
enum class Severity { Note, Warning, Error, InternalCompilerError, Fatal };
|
|
|
|
/// @return true iff `a` is more than, or of equal severity to `b`
|
|
inline bool operator>=(Severity a, Severity b) {
|
|
return static_cast<int>(a) >= static_cast<int>(b);
|
|
}
|
|
|
|
/// System is an enumerator of Tint systems that can be the originator of a
|
|
/// diagnostic message.
|
|
enum class System {
|
|
AST,
|
|
Clone,
|
|
Inspector,
|
|
Program,
|
|
ProgramBuilder,
|
|
Reader,
|
|
Resolver,
|
|
Semantic,
|
|
Symbol,
|
|
Test,
|
|
Transform,
|
|
Utils,
|
|
Writer,
|
|
};
|
|
|
|
/// Diagnostic holds all the information for a single compiler diagnostic
|
|
/// message.
|
|
class Diagnostic {
|
|
public:
|
|
/// severity is the severity of the diagnostic message.
|
|
Severity severity = Severity::Error;
|
|
/// source is the location of the diagnostic.
|
|
Source source;
|
|
/// message is the text associated with the diagnostic.
|
|
std::string message;
|
|
/// system is the Tint system that raised the diagnostic.
|
|
System system;
|
|
/// code is the error code, for example a validation error might have the code
|
|
/// `"v-0001"`.
|
|
const char* code = nullptr;
|
|
};
|
|
|
|
/// List is a container of Diagnostic messages.
|
|
class List {
|
|
public:
|
|
/// iterator is the type used for range based iteration.
|
|
using iterator = std::vector<Diagnostic>::const_iterator;
|
|
|
|
/// Constructs the list with no elements.
|
|
List();
|
|
|
|
/// Copy constructor. Copies the diagnostics from `list` into this list.
|
|
/// @param list the list of diagnostics to copy into this list.
|
|
List(std::initializer_list<Diagnostic> list);
|
|
|
|
/// Copy constructor. Copies the diagnostics from `list` into this list.
|
|
/// @param list the list of diagnostics to copy into this list.
|
|
List(const List& list);
|
|
|
|
/// Move constructor. Moves the diagnostics from `list` into this list.
|
|
/// @param list the list of diagnostics to move into this list.
|
|
List(List&& list);
|
|
|
|
/// Destructor
|
|
~List();
|
|
|
|
/// Assignment operator. Copies the diagnostics from `list` into this list.
|
|
/// @param list the list to copy into this list.
|
|
/// @return this list.
|
|
List& operator=(const List& list);
|
|
|
|
/// Assignment move operator. Moves the diagnostics from `list` into this
|
|
/// list.
|
|
/// @param list the list to move into this list.
|
|
/// @return this list.
|
|
List& operator=(List&& list);
|
|
|
|
/// adds a diagnostic to the end of this list.
|
|
/// @param diag the diagnostic to append to this list.
|
|
void add(Diagnostic&& diag) {
|
|
if (diag.severity >= Severity::Error) {
|
|
error_count_++;
|
|
}
|
|
entries_.emplace_back(std::move(diag));
|
|
}
|
|
|
|
/// adds a list of diagnostics to the end of this list.
|
|
/// @param list the diagnostic to append to this list.
|
|
void add(const List& list) {
|
|
for (auto diag : list) {
|
|
add(std::move(diag));
|
|
}
|
|
}
|
|
|
|
/// adds the note message with the given Source to the end of this list.
|
|
/// @param system the system raising the note message
|
|
/// @param note_msg the note message
|
|
/// @param source the source of the note diagnostic
|
|
void add_note(System system,
|
|
const std::string& note_msg,
|
|
const Source& source) {
|
|
diag::Diagnostic note{};
|
|
note.severity = diag::Severity::Note;
|
|
note.system = system;
|
|
note.source = source;
|
|
note.message = note_msg;
|
|
add(std::move(note));
|
|
}
|
|
|
|
/// adds the warning message with the given Source to the end of this list.
|
|
/// @param system the system raising the warning message
|
|
/// @param warning_msg the warning message
|
|
/// @param source the source of the warning diagnostic
|
|
void add_warning(System system,
|
|
const std::string& warning_msg,
|
|
const Source& source) {
|
|
diag::Diagnostic warning{};
|
|
warning.severity = diag::Severity::Warning;
|
|
warning.system = system;
|
|
warning.source = source;
|
|
warning.message = warning_msg;
|
|
add(std::move(warning));
|
|
}
|
|
|
|
/// adds the error message without a source to the end of this list.
|
|
/// @param system the system raising the error message
|
|
/// @param err_msg the error message
|
|
void add_error(System system, std::string err_msg) {
|
|
diag::Diagnostic error{};
|
|
error.severity = diag::Severity::Error;
|
|
error.system = system;
|
|
error.message = std::move(err_msg);
|
|
add(std::move(error));
|
|
}
|
|
|
|
/// adds the error message with the given Source to the end of this list.
|
|
/// @param system the system raising the error message
|
|
/// @param err_msg the error message
|
|
/// @param source the source of the error diagnostic
|
|
void add_error(System system, std::string err_msg, const Source& source) {
|
|
diag::Diagnostic error{};
|
|
error.severity = diag::Severity::Error;
|
|
error.system = system;
|
|
error.source = source;
|
|
error.message = std::move(err_msg);
|
|
add(std::move(error));
|
|
}
|
|
|
|
/// adds the error message with the given code and Source to the end of this
|
|
/// list.
|
|
/// @param system the system raising the error message
|
|
/// @param code the error code
|
|
/// @param err_msg the error message
|
|
/// @param source the source of the error diagnostic
|
|
void add_error(System system,
|
|
const char* code,
|
|
std::string err_msg,
|
|
const Source& source) {
|
|
diag::Diagnostic error{};
|
|
error.code = code;
|
|
error.severity = diag::Severity::Error;
|
|
error.system = system;
|
|
error.source = source;
|
|
error.message = std::move(err_msg);
|
|
add(std::move(error));
|
|
}
|
|
|
|
/// adds an internal compiler error message to the end of this list.
|
|
/// @param system the system raising the error message
|
|
/// @param err_msg the error message
|
|
/// @param source the source of the internal compiler error
|
|
void add_ice(System system,
|
|
const std::string& err_msg,
|
|
const Source& source) {
|
|
diag::Diagnostic ice{};
|
|
ice.severity = diag::Severity::InternalCompilerError;
|
|
ice.system = system;
|
|
ice.source = source;
|
|
ice.message = err_msg;
|
|
add(std::move(ice));
|
|
}
|
|
|
|
/// Adds the file to the list of files owned by this diagnostic list.
|
|
/// When this list is destructed, all the owned files will be deleted.
|
|
/// @param file the file that this List should own
|
|
void own_file(const Source::File* file) {
|
|
owned_files_.emplace_back(std::unique_ptr<const Source::File>(file));
|
|
}
|
|
|
|
/// @returns true iff the diagnostic list contains errors diagnostics (or of
|
|
/// higher severity).
|
|
bool contains_errors() const { return error_count_ > 0; }
|
|
/// @returns the number of error diagnostics (or of higher severity).
|
|
size_t error_count() const { return error_count_; }
|
|
/// @returns the number of entries in the list.
|
|
size_t count() const { return entries_.size(); }
|
|
/// @returns the first diagnostic in the list.
|
|
iterator begin() const { return entries_.begin(); }
|
|
/// @returns the last diagnostic in the list.
|
|
iterator end() const { return entries_.end(); }
|
|
|
|
/// @returns a formatted string of all the diagnostics in this list.
|
|
std::string str() const;
|
|
|
|
private:
|
|
std::vector<Diagnostic> entries_;
|
|
std::vector<std::unique_ptr<const Source::File>> owned_files_;
|
|
size_t error_count_ = 0;
|
|
};
|
|
|
|
} // namespace diag
|
|
} // namespace tint
|
|
|
|
#endif // SRC_DIAGNOSTIC_DIAGNOSTIC_H_
|