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_TYPEREFERENCE 9 #define SKSL_TYPEREFERENCE 10 11 #include "src/sksl/SkSLContext.h" 12 #include "src/sksl/ir/SkSLExpression.h" 13 14 namespace SkSL { 15 16 /** 17 * Represents an identifier referring to a type. This is an intermediate value: TypeReferences are 18 * always eventually replaced by Constructors in valid programs. 19 */ 20 struct TypeReference : public Expression { TypeReferenceTypeReference21 TypeReference(const Context& context, int offset, const Type& value) 22 : INHERITED(offset, kTypeReference_Kind, *context.fInvalid_Type) 23 , fValue(value) {} 24 hasSideEffectsTypeReference25 bool hasSideEffects() const override { 26 return false; 27 } 28 descriptionTypeReference29 String description() const override { 30 return String(fValue.fName); 31 } 32 cloneTypeReference33 std::unique_ptr<Expression> clone() const override { 34 return std::unique_ptr<Expression>(new TypeReference(fOffset, fValue, &fType)); 35 } 36 37 const Type& fValue; 38 39 typedef Expression INHERITED; 40 41 private: TypeReferenceTypeReference42 TypeReference(int offset, const Type& value, const Type* type) 43 : INHERITED(offset, kTypeReference_Kind, *type) 44 , fValue(value) {} 45 }; 46 47 } // namespace 48 49 #endif 50