1/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SKSL_FIELDACCESS
9#define SKSL_FIELDACCESS
10
11#include "src/sksl/SkSLUtil.h"
12#include "src/sksl/ir/SkSLExpression.h"
13
14namespace SkSL {
15
16/**
17 * An expression which extracts a field from a struct, as in 'foo.bar'.
18 */
19struct FieldAccess : public Expression {
20 enum OwnerKind {
21 kDefault_OwnerKind,
22 // this field access is to a field of an anonymous interface block (and thus, the field name
23 // is actually in global scope, so only the field name needs to be written in GLSL)
24 kAnonymousInterfaceBlock_OwnerKind
25 };
26
27 FieldAccess(std::unique_ptr<Expression> base, int fieldIndex,
28 OwnerKind ownerKind = kDefault_OwnerKind)
29 : INHERITED(base->fOffset, kFieldAccess_Kind, *base->fType.fields()[fieldIndex].fType)
30 , fBase(std::move(base))
31 , fFieldIndex(fieldIndex)
32 , fOwnerKind(ownerKind) {}
33
34 bool hasProperty(Property property) const override {
35 return fBase->hasProperty(property);
36 }
37
38 int nodeCount() const override {
39 return 1 + fBase->nodeCount();
40 }
41
42 std::unique_ptr<Expression> clone() const override {
43 return std::unique_ptr<Expression>(new FieldAccess(fBase->clone(), fFieldIndex,
44 fOwnerKind));
45 }
46
47 String description() const override {
48 return fBase->description() + "." + fBase->fType.fields()[fFieldIndex].fName;
49 }
50
51 std::unique_ptr<Expression> fBase;
52 const int fFieldIndex;
53 const OwnerKind fOwnerKind;
54
55 typedef Expression INHERITED;
56};
57
58} // namespace SkSL
59
60#endif
61