Home | History | Annotate | Download | only in ir
      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 
     34     bool hasSideEffects() const override {
     35         return fBase->hasSideEffects();
     36     }
     37 
     38     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