tint/writer: Handle diagnostic directives
The WGSL writer emits them, the other writers ignore them. Bug: tint:1809 Change-Id: I163d868005c076b8fd4602f13d3e267b16c474c0 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/117567 Reviewed-by: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
81e55754e1
commit
e8ea579bce
|
@ -1672,6 +1672,7 @@ if (tint_build_unittests) {
|
||||||
"writer/wgsl/generator_impl_cast_test.cc",
|
"writer/wgsl/generator_impl_cast_test.cc",
|
||||||
"writer/wgsl/generator_impl_const_assert_test.cc",
|
"writer/wgsl/generator_impl_const_assert_test.cc",
|
||||||
"writer/wgsl/generator_impl_continue_test.cc",
|
"writer/wgsl/generator_impl_continue_test.cc",
|
||||||
|
"writer/wgsl/generator_impl_diagnostic_test.cc",
|
||||||
"writer/wgsl/generator_impl_discard_test.cc",
|
"writer/wgsl/generator_impl_discard_test.cc",
|
||||||
"writer/wgsl/generator_impl_enable_test.cc",
|
"writer/wgsl/generator_impl_enable_test.cc",
|
||||||
"writer/wgsl/generator_impl_function_test.cc",
|
"writer/wgsl/generator_impl_function_test.cc",
|
||||||
|
|
|
@ -1212,6 +1212,7 @@ if(TINT_BUILD_TESTS)
|
||||||
writer/wgsl/generator_impl_cast_test.cc
|
writer/wgsl/generator_impl_cast_test.cc
|
||||||
writer/wgsl/generator_impl_const_assert_test.cc
|
writer/wgsl/generator_impl_const_assert_test.cc
|
||||||
writer/wgsl/generator_impl_continue_test.cc
|
writer/wgsl/generator_impl_continue_test.cc
|
||||||
|
writer/wgsl/generator_impl_diagnostic_test.cc
|
||||||
writer/wgsl/generator_impl_discard_test.cc
|
writer/wgsl/generator_impl_discard_test.cc
|
||||||
writer/wgsl/generator_impl_enable_test.cc
|
writer/wgsl/generator_impl_enable_test.cc
|
||||||
writer/wgsl/generator_impl_function_test.cc
|
writer/wgsl/generator_impl_function_test.cc
|
||||||
|
|
|
@ -250,7 +250,7 @@ bool GeneratorImpl::Generate() {
|
||||||
|
|
||||||
auto* mod = builder_.Sem().Module();
|
auto* mod = builder_.Sem().Module();
|
||||||
for (auto* decl : mod->DependencyOrderedDeclarations()) {
|
for (auto* decl : mod->DependencyOrderedDeclarations()) {
|
||||||
if (decl->IsAnyOf<ast::Alias, ast::ConstAssert>()) {
|
if (decl->IsAnyOf<ast::Alias, ast::ConstAssert, ast::DiagnosticControl>()) {
|
||||||
continue; // These are not emitted.
|
continue; // These are not emitted.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,7 +310,7 @@ bool GeneratorImpl::Generate() {
|
||||||
|
|
||||||
auto* mod = builder_.Sem().Module();
|
auto* mod = builder_.Sem().Module();
|
||||||
for (auto* decl : mod->DependencyOrderedDeclarations()) {
|
for (auto* decl : mod->DependencyOrderedDeclarations()) {
|
||||||
if (decl->IsAnyOf<ast::Alias, ast::Enable, ast::ConstAssert>()) {
|
if (decl->IsAnyOf<ast::Alias, ast::DiagnosticControl, ast::Enable, ast::ConstAssert>()) {
|
||||||
continue; // These are not emitted.
|
continue; // These are not emitted.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,10 @@ bool GeneratorImpl::Generate() {
|
||||||
}
|
}
|
||||||
return EmitFunction(func);
|
return EmitFunction(func);
|
||||||
},
|
},
|
||||||
|
[&](const ast::DiagnosticControl*) {
|
||||||
|
// Do nothing for diagnostic directives in MSL
|
||||||
|
return true;
|
||||||
|
},
|
||||||
[&](const ast::Enable*) {
|
[&](const ast::Enable*) {
|
||||||
// Do nothing for enabling extension in MSL
|
// Do nothing for enabling extension in MSL
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -63,18 +63,28 @@ GeneratorImpl::GeneratorImpl(const Program* program) : TextGenerator(program) {}
|
||||||
GeneratorImpl::~GeneratorImpl() = default;
|
GeneratorImpl::~GeneratorImpl() = default;
|
||||||
|
|
||||||
bool GeneratorImpl::Generate() {
|
bool GeneratorImpl::Generate() {
|
||||||
// Generate enable directives before any other global declarations.
|
// Generate directives before any other global declarations.
|
||||||
|
bool has_directives = false;
|
||||||
for (auto enable : program_->AST().Enables()) {
|
for (auto enable : program_->AST().Enables()) {
|
||||||
if (!EmitEnable(enable)) {
|
if (!EmitEnable(enable)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
has_directives = true;
|
||||||
}
|
}
|
||||||
if (!program_->AST().Enables().IsEmpty()) {
|
for (auto diagnostic : program_->AST().DiagnosticControls()) {
|
||||||
|
auto out = line();
|
||||||
|
if (!EmitDiagnosticControl(out, diagnostic)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
out << ";";
|
||||||
|
has_directives = true;
|
||||||
|
}
|
||||||
|
if (has_directives) {
|
||||||
line();
|
line();
|
||||||
}
|
}
|
||||||
// Generate global declarations in the order they appear in the module.
|
// Generate global declarations in the order they appear in the module.
|
||||||
for (auto* decl : program_->AST().GlobalDeclarations()) {
|
for (auto* decl : program_->AST().GlobalDeclarations()) {
|
||||||
if (decl->Is<ast::Enable>()) {
|
if (decl->IsAnyOf<ast::DiagnosticControl, ast::Enable>()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!Switch(
|
if (!Switch(
|
||||||
|
@ -97,6 +107,13 @@ bool GeneratorImpl::Generate() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GeneratorImpl::EmitDiagnosticControl(std::ostream& out,
|
||||||
|
const ast::DiagnosticControl* diagnostic) {
|
||||||
|
out << "diagnostic(" << diagnostic->severity << ", "
|
||||||
|
<< program_->Symbols().NameFor(diagnostic->rule_name->symbol) << ")";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitEnable(const ast::Enable* enable) {
|
bool GeneratorImpl::EmitEnable(const ast::Enable* enable) {
|
||||||
auto out = line();
|
auto out = line();
|
||||||
out << "enable " << enable->extension << ";";
|
out << "enable " << enable->extension << ";";
|
||||||
|
|
|
@ -52,7 +52,12 @@ class GeneratorImpl : public TextGenerator {
|
||||||
/// @returns true on successful generation; false otherwise
|
/// @returns true on successful generation; false otherwise
|
||||||
bool Generate();
|
bool Generate();
|
||||||
|
|
||||||
/// Handles generating a enable directive
|
/// Handles generating a diagnostic control
|
||||||
|
/// @param out the output of the expression stream
|
||||||
|
/// @param diagnostic the diagnostic control node
|
||||||
|
/// @returns true if the diagnostic control was emitted
|
||||||
|
bool EmitDiagnosticControl(std::ostream& out, const ast::DiagnosticControl* diagnostic);
|
||||||
|
/// Handles generating an enable directive
|
||||||
/// @param enable the enable node
|
/// @param enable the enable node
|
||||||
/// @returns true if the enable directive was emitted
|
/// @returns true if the enable directive was emitted
|
||||||
bool EmitEnable(const ast::Enable* enable);
|
bool EmitEnable(const ast::Enable* enable);
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
// Copyright 2022 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.
|
||||||
|
|
||||||
|
#include "src/tint/writer/wgsl/test_helper.h"
|
||||||
|
|
||||||
|
namespace tint::writer::wgsl {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using WgslGeneratorImplTest = TestHelper;
|
||||||
|
|
||||||
|
TEST_F(WgslGeneratorImplTest, Emit_DiagnosticDirective) {
|
||||||
|
DiagnosticDirective(ast::DiagnosticSeverity::kError, Expr("chromium_unreachable_code"));
|
||||||
|
|
||||||
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
|
ASSERT_TRUE(gen.Generate());
|
||||||
|
EXPECT_EQ(gen.result(), R"(diagnostic(error, chromium_unreachable_code);
|
||||||
|
|
||||||
|
)");
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace tint::writer::wgsl
|
Loading…
Reference in New Issue