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 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 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 hasSideEffectsFieldAccess34 bool hasSideEffects() const override { 35 return fBase->hasSideEffects(); 36 } 37 descriptionFieldAccess38 String description() const override { 39 return fBase->description() + "." + fBase->fType.fields()[fFieldIndex].fName; 40 } 41 42 std::unique_ptr<Expression> fBase; 43 const int fFieldIndex; 44 const OwnerKind fOwnerKind; 45 46 typedef Expression INHERITED; 47 }; 48 49 } // namespace 50 51 #endif 52