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 "SkSLExpression.h"
12#include "SkSLUtil.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->fPosition, kFieldAccess_Kind, *base->fType.fields()[fieldIndex].fType)
30    , fBase(std::move(base))
31    , fFieldIndex(fieldIndex)
32    , fOwnerKind(ownerKind) {}
33
34    virtual SkString description() const override {
35        return fBase->description() + "." + fBase->fType.fields()[fFieldIndex].fName;
36    }
37
38    std::unique_ptr<Expression> fBase;
39    const int fFieldIndex;
40    const OwnerKind fOwnerKind;
41
42    typedef Expression INHERITED;
43};
44
45} // namespace
46
47#endif
48