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
14namespace 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 */
20struct TypeReference : public Expression {
21 TypeReference(const Context& context, int offset, const Type& value)
22 : INHERITED(offset, kTypeReference_Kind, *context.fInvalid_Type)
23 , fValue(value) {}
24
25 bool hasProperty(Property property) const override {
26 return false;
27 }
28
29#ifdef SK_DEBUG
30 String description() const override {
31 return String(fValue.fName);
32 }
33#endif
34
35 std::unique_ptr<Expression> clone() const override {
36 return std::unique_ptr<Expression>(new TypeReference(fOffset, fValue, &fType));
37 }
38
39 const Type& fValue;
40
41 typedef Expression INHERITED;
42
43private:
44 TypeReference(int offset, const Type& value, const Type* type)
45 : INHERITED(offset, kTypeReference_Kind, *type)
46 , fValue(value) {}
47};
48
49} // namespace
50
51#endif
52