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_EXPRESSION
9 #define SKSL_EXPRESSION
10 
11 #include "SkSLType.h"
12 #include "SkSLVariable.h"
13 
14 #include <unordered_map>
15 
16 namespace SkSL {
17 
18 struct Expression;
19 class IRGenerator;
20 
21 typedef std::unordered_map<const Variable*, std::unique_ptr<Expression>*> DefinitionMap;
22 
23 /**
24  * Abstract supertype of all expressions.
25  */
26 struct Expression : public IRNode {
27     enum Kind {
28         kBinary_Kind,
29         kBoolLiteral_Kind,
30         kConstructor_Kind,
31         kIntLiteral_Kind,
32         kFieldAccess_Kind,
33         kFloatLiteral_Kind,
34         kFunctionReference_Kind,
35         kFunctionCall_Kind,
36         kIndex_Kind,
37         kPrefix_Kind,
38         kPostfix_Kind,
39         kSwizzle_Kind,
40         kVariableReference_Kind,
41         kTernary_Kind,
42         kTypeReference_Kind,
43         kDefined_Kind
44     };
45 
ExpressionExpression46     Expression(Position position, Kind kind, const Type& type)
47     : INHERITED(position)
48     , fKind(kind)
49     , fType(std::move(type)) {}
50 
isConstantExpression51     virtual bool isConstant() const {
52         return false;
53     }
54 
55     /**
56      * Given a map of known constant variable values, substitute them in for references to those
57      * variables occurring in this expression and its subexpressions.  Similar simplifications, such
58      * as folding a constant binary expression down to a single value, may also be performed.
59      * Returns a new expression which replaces this expression, or null if no replacements were
60      * made. If a new expression is returned, this expression is no longer valid.
61      */
constantPropagateExpression62     virtual std::unique_ptr<Expression> constantPropagate(const IRGenerator& irGenerator,
63                                                           const DefinitionMap& definitions) {
64         return nullptr;
65     }
66 
67     const Kind fKind;
68     const Type& fType;
69 
70     typedef IRNode INHERITED;
71 };
72 
73 } // namespace
74 
75 #endif
76