mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-15 03:41:34 +00:00
Literals are now expressions, so in keeping with all the other expression types, suffix the class name with Expression. I'm not overly keen on requiring everything to have an Expression suffix, but consistency is better than personal preference. Note: this should have been part of 30848b6, but I managed to drop this change instead of squashing it. Opps. Bug: tint:888 Change-Id: Idfaf96abe165a6bf5028e60a160e7408aa2bf9db Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/68943 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: James Price <jrprice@google.com>
79 lines
2.3 KiB
C++
79 lines
2.3 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/array.h"
|
|
|
|
#include <cmath>
|
|
|
|
#include "src/program_builder.h"
|
|
|
|
TINT_INSTANTIATE_TYPEINFO(tint::ast::Array);
|
|
|
|
namespace tint {
|
|
namespace ast {
|
|
|
|
namespace {
|
|
// Returns the string representation of an array size expression.
|
|
std::string SizeExprToString(const Expression* size,
|
|
const SymbolTable& symbols) {
|
|
if (auto* ident = size->As<IdentifierExpression>()) {
|
|
return symbols.NameFor(ident->symbol);
|
|
}
|
|
if (auto* literal = size->As<IntLiteralExpression>()) {
|
|
return std::to_string(literal->ValueAsU32());
|
|
}
|
|
// This will never be exposed to the user as the Resolver will reject this
|
|
// expression for array size.
|
|
return "<invalid>";
|
|
}
|
|
} // namespace
|
|
|
|
Array::Array(ProgramID pid,
|
|
const Source& src,
|
|
const Type* subtype,
|
|
const Expression* cnt,
|
|
DecorationList decos)
|
|
: Base(pid, src), type(subtype), count(cnt), decorations(decos) {}
|
|
|
|
Array::Array(Array&&) = default;
|
|
|
|
Array::~Array() = default;
|
|
|
|
std::string Array::FriendlyName(const SymbolTable& symbols) const {
|
|
std::ostringstream out;
|
|
for (auto* deco : decorations) {
|
|
if (auto* stride = deco->As<ast::StrideDecoration>()) {
|
|
out << "[[stride(" << stride->stride << ")]] ";
|
|
}
|
|
}
|
|
out << "array<" << type->FriendlyName(symbols);
|
|
if (!IsRuntimeArray()) {
|
|
out << ", " << SizeExprToString(count, symbols);
|
|
}
|
|
out << ">";
|
|
return out.str();
|
|
}
|
|
|
|
const Array* Array::Clone(CloneContext* ctx) const {
|
|
// Clone arguments outside of create() call to have deterministic ordering
|
|
auto src = ctx->Clone(source);
|
|
auto* ty = ctx->Clone(type);
|
|
auto* cnt = ctx->Clone(count);
|
|
auto decos = ctx->Clone(decorations);
|
|
return ctx->dst->create<Array>(src, ty, cnt, decos);
|
|
}
|
|
|
|
} // namespace ast
|
|
} // namespace tint
|