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->fOffset, 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 cloneFieldAccess38 std::unique_ptr<Expression> clone() const override { 39 return std::unique_ptr<Expression>(new FieldAccess(fBase->clone(), fFieldIndex, 40 fOwnerKind)); 41 } 42 descriptionFieldAccess43 String description() const override { 44 return fBase->description() + "." + fBase->fType.fields()[fFieldIndex].fName; 45 } 46 47 std::unique_ptr<Expression> fBase; 48 const int fFieldIndex; 49 const OwnerKind fOwnerKind; 50 51 typedef Expression INHERITED; 52 }; 53 54 } // namespace 55 56 #endif 57