blob: 0f66dec5a4360ccecf46c7afe2f87f45cb411cd1 [file] [log] [blame]
ethannicholasb3058bd2016-07-01 08:22:01 -07001/*
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 */
Ethan Nicholas0df1b042017-03-31 13:56:23 -04007
ethannicholasb3058bd2016-07-01 08:22:01 -07008#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 {
ethannicholasf789b382016-08-03 12:43:36 -070020 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
Ethan Nicholas0df1b042017-03-31 13:56:23 -040027 FieldAccess(std::unique_ptr<Expression> base, int fieldIndex,
ethannicholasf789b382016-08-03 12:43:36 -070028 OwnerKind ownerKind = kDefault_OwnerKind)
Ethan Nicholas5b5f0962017-09-11 13:50:14 -070029 : INHERITED(base->fOffset, kFieldAccess_Kind, *base->fType.fields()[fieldIndex].fType)
ethannicholasb3058bd2016-07-01 08:22:01 -070030 , fBase(std::move(base))
ethannicholasf789b382016-08-03 12:43:36 -070031 , fFieldIndex(fieldIndex)
32 , fOwnerKind(ownerKind) {}
ethannicholasb3058bd2016-07-01 08:22:01 -070033
Ethan Nicholascb670962017-04-20 19:31:52 -040034 bool hasSideEffects() const override {
35 return fBase->hasSideEffects();
36 }
37
38 String description() const override {
ethannicholasd598f792016-07-25 10:08:54 -070039 return fBase->description() + "." + fBase->fType.fields()[fFieldIndex].fName;
ethannicholasb3058bd2016-07-01 08:22:01 -070040 }
41
Ethan Nicholas86a43402017-01-19 13:32:00 -050042 std::unique_ptr<Expression> fBase;
ethannicholasb3058bd2016-07-01 08:22:01 -070043 const int fFieldIndex;
ethannicholasf789b382016-08-03 12:43:36 -070044 const OwnerKind fOwnerKind;
ethannicholasb3058bd2016-07-01 08:22:01 -070045
46 typedef Expression INHERITED;
47};
48
49} // namespace
50
51#endif