1/* 2 * Copyright 2019 Google LLC 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_EXTERNALFUNCTIONREFERENCE 9#define SKSL_EXTERNALFUNCTIONREFERENCE 10 11#include "src/sksl/ir/SkSLExpression.h" 12#include "src/sksl/ir/SkSLExternalFunction.h" 13 14namespace SkSL { 15 16/** 17 * Represents an identifier referring to an ExternalFunction. This is an intermediate value: 18 * ExternalFunctionReferences are always eventually replaced by ExternalFunctionCalls in valid 19 * programs. 20 */ 21class ExternalFunctionReference final : public Expression { 22public: 23 inline static constexpr Kind kExpressionKind = Kind::kExternalFunctionReference; 24 25 ExternalFunctionReference(int line, const ExternalFunction* ef) 26 : INHERITED(line, kExpressionKind, &ef->type()) 27 , fFunction(*ef) {} 28 29 const ExternalFunction& function() const { 30 return fFunction; 31 } 32 33 bool hasProperty(Property property) const override { 34 return property == Property::kSideEffects; 35 } 36 37 String description() const override { 38 return String(this->function().name()); 39 } 40 41 std::unique_ptr<Expression> clone() const override { 42 return std::make_unique<ExternalFunctionReference>(fLine, &this->function()); 43 } 44 45private: 46 const ExternalFunction& fFunction; 47 48 using INHERITED = Expression; 49}; 50 51} // namespace SkSL 52 53#endif 54