Line data Source code
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 :
14 : namespace SkSL {
15 :
16 : /**
17 : * An expression which extracts a field from a struct, as in 'foo.bar'.
18 : */
19 0 : struct 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 0 : FieldAccess(std::unique_ptr<Expression> base, int fieldIndex,
28 : OwnerKind ownerKind = kDefault_OwnerKind)
29 0 : : INHERITED(base->fPosition, kFieldAccess_Kind, *base->fType.fields()[fieldIndex].fType)
30 0 : , fBase(std::move(base))
31 : , fFieldIndex(fieldIndex)
32 0 : , fOwnerKind(ownerKind) {}
33 :
34 0 : virtual String description() const override {
35 0 : 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
|