1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SKSL_FIELDACCESS 9cb93a386Sopenharmony_ci#define SKSL_FIELDACCESS 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "src/sksl/SkSLUtil.h" 12cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLExpression.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cinamespace SkSL { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cienum class FieldAccessOwnerKind : int8_t { 17cb93a386Sopenharmony_ci kDefault, 18cb93a386Sopenharmony_ci // this field access is to a field of an anonymous interface block (and thus, the field name 19cb93a386Sopenharmony_ci // is actually in global scope, so only the field name needs to be written in GLSL) 20cb93a386Sopenharmony_ci kAnonymousInterfaceBlock 21cb93a386Sopenharmony_ci}; 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci/** 24cb93a386Sopenharmony_ci * An expression which extracts a field from a struct, as in 'foo.bar'. 25cb93a386Sopenharmony_ci */ 26cb93a386Sopenharmony_ciclass FieldAccess final : public Expression { 27cb93a386Sopenharmony_cipublic: 28cb93a386Sopenharmony_ci using OwnerKind = FieldAccessOwnerKind; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci inline static constexpr Kind kExpressionKind = Kind::kFieldAccess; 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci FieldAccess(std::unique_ptr<Expression> base, int fieldIndex, 33cb93a386Sopenharmony_ci OwnerKind ownerKind = OwnerKind::kDefault) 34cb93a386Sopenharmony_ci : INHERITED(base->fLine, kExpressionKind, base->type().fields()[fieldIndex].fType) 35cb93a386Sopenharmony_ci , fFieldIndex(fieldIndex) 36cb93a386Sopenharmony_ci , fOwnerKind(ownerKind) 37cb93a386Sopenharmony_ci , fBase(std::move(base)) {} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci // Returns a field-access expression; reports errors via the ErrorReporter. 40cb93a386Sopenharmony_ci static std::unique_ptr<Expression> Convert(const Context& context, 41cb93a386Sopenharmony_ci SymbolTable& symbolTable, 42cb93a386Sopenharmony_ci std::unique_ptr<Expression> base, 43cb93a386Sopenharmony_ci skstd::string_view field); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci // Returns a field-access expression; reports errors via ASSERT. 46cb93a386Sopenharmony_ci static std::unique_ptr<Expression> Make(const Context& context, 47cb93a386Sopenharmony_ci std::unique_ptr<Expression> base, 48cb93a386Sopenharmony_ci int fieldIndex, 49cb93a386Sopenharmony_ci OwnerKind ownerKind = OwnerKind::kDefault); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci std::unique_ptr<Expression>& base() { 52cb93a386Sopenharmony_ci return fBase; 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci const std::unique_ptr<Expression>& base() const { 56cb93a386Sopenharmony_ci return fBase; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci int fieldIndex() const { 60cb93a386Sopenharmony_ci return fFieldIndex; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci OwnerKind ownerKind() const { 64cb93a386Sopenharmony_ci return fOwnerKind; 65cb93a386Sopenharmony_ci } 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci bool hasProperty(Property property) const override { 68cb93a386Sopenharmony_ci return this->base()->hasProperty(property); 69cb93a386Sopenharmony_ci } 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci std::unique_ptr<Expression> clone() const override { 72cb93a386Sopenharmony_ci return std::unique_ptr<Expression>(new FieldAccess(this->base()->clone(), 73cb93a386Sopenharmony_ci this->fieldIndex(), 74cb93a386Sopenharmony_ci this->ownerKind())); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci String description() const override { 78cb93a386Sopenharmony_ci return this->base()->description() + "." + 79cb93a386Sopenharmony_ci this->base()->type().fields()[this->fieldIndex()].fName; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ciprivate: 83cb93a386Sopenharmony_ci int fFieldIndex; 84cb93a386Sopenharmony_ci FieldAccessOwnerKind fOwnerKind; 85cb93a386Sopenharmony_ci std::unique_ptr<Expression> fBase; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci using INHERITED = Expression; 88cb93a386Sopenharmony_ci}; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci} // namespace SkSL 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci#endif 93