mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-19 11:35:58 +00:00
This CL adds the parsing of structs with names. The parsing of type aliased structs remains to allow for migration to the new system. The named struct format is always emitted. Bug: tint:175 Change-Id: Ic0579dedbd2dd0edc7dfd30bc2ec02972091e718 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/30341 Commit-Queue: dan sinclair <dsinclair@chromium.org> Reviewed-by: David Neto <dneto@google.com>
119 lines
2.9 KiB
C++
119 lines
2.9 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.
|
|
|
|
#include "src/ast/module.h"
|
|
|
|
#include <sstream>
|
|
|
|
#include "src/ast/type/struct_type.h"
|
|
|
|
namespace tint {
|
|
namespace ast {
|
|
|
|
Module::Module() = default;
|
|
|
|
Module::Module(Module&&) = default;
|
|
|
|
Module::~Module() = default;
|
|
|
|
Function* Module::FindFunctionByName(const std::string& name) const {
|
|
for (const auto& func : functions_) {
|
|
if (func->name() == name) {
|
|
return func.get();
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
Function* Module::FindFunctionByNameAndStage(const std::string& name,
|
|
ast::PipelineStage stage) const {
|
|
for (const auto& func : functions_) {
|
|
if (func->name() == name && func->pipeline_stage() == stage) {
|
|
return func.get();
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
bool Module::IsValid() const {
|
|
for (const auto& var : global_variables_) {
|
|
if (var == nullptr || !var->IsValid()) {
|
|
return false;
|
|
}
|
|
}
|
|
for (auto* const ty : constructed_types_) {
|
|
if (ty == nullptr) {
|
|
return false;
|
|
}
|
|
if (ty->IsAlias()) {
|
|
auto* alias = ty->AsAlias();
|
|
if (alias->type() == nullptr) {
|
|
return false;
|
|
}
|
|
if (alias->type()->IsStruct() &&
|
|
alias->type()->AsStruct()->name().empty()) {
|
|
return false;
|
|
}
|
|
} else if (ty->IsStruct()) {
|
|
auto* str = ty->AsStruct();
|
|
if (str->name().empty()) {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
for (const auto& func : functions_) {
|
|
if (func == nullptr || !func->IsValid()) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::string Module::to_str() const {
|
|
std::ostringstream out;
|
|
|
|
out << "Module{" << std::endl;
|
|
const auto indent = 2;
|
|
for (auto* const ty : constructed_types_) {
|
|
for (size_t i = 0; i < indent; ++i) {
|
|
out << " ";
|
|
}
|
|
if (ty->IsAlias()) {
|
|
auto* alias = ty->AsAlias();
|
|
out << alias->name() << " -> " << alias->type()->type_name() << std::endl;
|
|
if (alias->type()->IsStruct()) {
|
|
alias->type()->AsStruct()->impl()->to_str(out, indent);
|
|
}
|
|
} else if (ty->IsStruct()) {
|
|
auto* str = ty->AsStruct();
|
|
out << str->name() << " ";
|
|
str->impl()->to_str(out, indent);
|
|
}
|
|
}
|
|
for (const auto& var : global_variables_) {
|
|
var->to_str(out, indent);
|
|
}
|
|
for (const auto& func : functions_) {
|
|
func->to_str(out, indent);
|
|
}
|
|
out << "}" << std::endl;
|
|
|
|
return out.str();
|
|
}
|
|
|
|
} // namespace ast
|
|
} // namespace tint
|