11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/*
21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project
31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License.
61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at
71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software
111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and
141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License.
151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */
161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber
17521656973a277bd727a96fa812315daf416668f4Yifan Hong#ifndef CONSTANT_EXPRESSION_H_
18521656973a277bd727a96fa812315daf416668f4Yifan Hong
19521656973a277bd727a96fa812315daf416668f4Yifan Hong#define CONSTANT_EXPRESSION_H_
20521656973a277bd727a96fa812315daf416668f4Yifan Hong
21521656973a277bd727a96fa812315daf416668f4Yifan Hong#include <android-base/macros.h>
22891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov#include <functional>
237296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov#include <memory>
24521656973a277bd727a96fa812315daf416668f4Yifan Hong#include <string>
25891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov#include <unordered_set>
26891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov#include <vector>
277296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
287296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov#include "Reference.h"
295788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong#include "ScalarType.h"
30521656973a277bd727a96fa812315daf416668f4Yifan Hong
31521656973a277bd727a96fa812315daf416668f4Yifan Hongnamespace android {
32521656973a277bd727a96fa812315daf416668f4Yifan Hong
337296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct LocalIdentifier;
347296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
357296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct LiteralConstantExpression;
367296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct UnaryConstantExpression;
377296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct BinaryConstantExpression;
387296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct TernaryConstantExpression;
397296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct ReferenceConstantExpression;
407296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
41521656973a277bd727a96fa812315daf416668f4Yifan Hong/**
42521656973a277bd727a96fa812315daf416668f4Yifan Hong * A constant expression is represented by a tree.
43521656973a277bd727a96fa812315daf416668f4Yifan Hong */
44521656973a277bd727a96fa812315daf416668f4Yifan Hongstruct ConstantExpression {
457296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    static std::unique_ptr<ConstantExpression> Zero(ScalarType::Kind kind);
467296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    static std::unique_ptr<ConstantExpression> One(ScalarType::Kind kind);
477296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    static std::unique_ptr<ConstantExpression> ValueOf(ScalarType::Kind kind, uint64_t value);
485788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong
497296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    virtual ~ConstantExpression() {}
507296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
51a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov    virtual bool isReferenceConstantExpression() const;
52a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov
53891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov    // Proceeds recursive pass
54891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov    // Makes sure to visit each node only once
55891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov    // Used to provide lookup and lazy evaluation
56891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov    status_t recursivePass(const std::function<status_t(ConstantExpression*)>& func,
5782c048e98ad337a1771849a0b7c775c1d0d133e9Timur Iskhakov                           std::unordered_set<const ConstantExpression*>* visited,
5882c048e98ad337a1771849a0b7c775c1d0d133e9Timur Iskhakov                           bool processBeforeDependencies);
59b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    status_t recursivePass(const std::function<status_t(const ConstantExpression*)>& func,
6082c048e98ad337a1771849a0b7c775c1d0d133e9Timur Iskhakov                           std::unordered_set<const ConstantExpression*>* visited,
6182c048e98ad337a1771849a0b7c775c1d0d133e9Timur Iskhakov                           bool processBeforeDependencies) const;
62891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov
63891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov    // Evaluates current constant expression
64891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov    // Doesn't call recursive evaluation, so must be called after dependencies
657296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    virtual void evaluate() = 0;
66f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong
67b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<ConstantExpression*> getConstantExpressions();
68b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    virtual std::vector<const ConstantExpression*> getConstantExpressions() const = 0;
69891a866402345777c7e746cf8d0e4ffd0bd28ca2Timur Iskhakov
7077dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    std::vector<Reference<LocalIdentifier>*> getReferences();
7177dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    virtual std::vector<const Reference<LocalIdentifier>*> getReferences() const;
7277dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov
7377dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    // Recursive tree pass checkAcyclic return type.
7477dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    // Stores cycle end for nice error messages.
7577dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    struct CheckAcyclicStatus {
76a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov        CheckAcyclicStatus(status_t status, const ConstantExpression* cycleEnd = nullptr,
77a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov                           const ReferenceConstantExpression* lastReferenceExpression = nullptr);
7877dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov
7977dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov        status_t status;
8077dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov
8177dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov        // If a cycle is found, stores the end of cycle.
8277dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov        // While going back in recursion, this is used to stop printing the cycle.
8377dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov        const ConstantExpression* cycleEnd;
84a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov
85a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov        // The last ReferenceConstantExpression visited on the cycle.
86a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov        const ReferenceConstantExpression* lastReference;
8777dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    };
8877dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov
8977dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    // Recursive tree pass that ensures that constant expressions definitions
9077dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    // are acyclic.
9177dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    CheckAcyclicStatus checkAcyclic(std::unordered_set<const ConstantExpression*>* visited,
9277dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov                                    std::unordered_set<const ConstantExpression*>* stack) const;
9377dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov
947296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    /* Returns true iff the value has already been evaluated. */
957296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    bool isEvaluated() const;
965788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    /* Evaluated result in a string form. */
97fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong    std::string value() const;
98f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    /* Evaluated result in a string form. */
99f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    std::string cppValue() const;
100f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    /* Evaluated result in a string form. */
101f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    std::string javaValue() const;
1025788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    /* Evaluated result in a string form, with given contextual kind. */
103c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong    std::string value(ScalarType::Kind castKind) const;
104c07b202bc91024356c50ded5a65d69f03b92e557Yifan Hong    /* Evaluated result in a string form, with given contextual kind. */
105fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong    std::string cppValue(ScalarType::Kind castKind) const;
10619ca75ae47df5cd9447b232c31c5df1d110e85d9Yifan Hong    /* Evaluated result in a string form, with given contextual kind. */
107fc610cd36bb07244f46c9a9baed6634bbdc564e9Yifan Hong    std::string javaValue(ScalarType::Kind castKind) const;
1087296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    /* Formatted expression with type. */
1097296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    const std::string& description() const;
1105706a43b2955b30f5611588dadfb9e33c7aa4c89Yifan Hong    /* See mTrivialDescription */
1115706a43b2955b30f5611588dadfb9e33c7aa4c89Yifan Hong    bool descriptionIsTrivial() const;
112f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    /* Return a ConstantExpression that is 1 plus the original. */
1137296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    std::unique_ptr<ConstantExpression> addOne(ScalarType::Kind baseKind);
114e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong
115e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong    size_t castSizeT() const;
116521656973a277bd727a96fa812315daf416668f4Yifan Hong
11735930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov    // Marks that package proceeding is completed
11835930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov    // Post parse passes must be proceeded during owner package parsin
11935930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov    void setPostParseCompleted();
12035930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov
1217296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov   private:
1227296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    /* If the result value has been evaluated. */
1237296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    bool mIsEvaluated = false;
1245788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    /* The formatted expression. */
125f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    std::string mExpr;
126f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    /* The kind of the result value. */
1275788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    ScalarType::Kind mValueKind;
128f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    /* The stored result value. */
1295788697381666844eeb23e04e5c6f83ec6ec8b44Yifan Hong    uint64_t mValue;
1305706a43b2955b30f5611588dadfb9e33c7aa4c89Yifan Hong    /* true if description() does not offer more information than value(). */
1315706a43b2955b30f5611588dadfb9e33c7aa4c89Yifan Hong    bool mTrivialDescription = false;
132521656973a277bd727a96fa812315daf416668f4Yifan Hong
13335930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov    bool mIsPostParseCompleted = false;
13435930c43ef3ccc79ae5ad07ca8dab5e94902d30eTimur Iskhakov
135f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    /*
136f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong     * Helper function for all cpp/javaValue methods.
137f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong     * Returns a plain string (without any prefixes or suffixes, just the
138f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong     * digits) converted from mValue.
139f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong     */
140f24fa85b362d7eb66c7b880f48e1e2e9916bc8a9Yifan Hong    std::string rawValue(ScalarType::Kind castKind) const;
141e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong
142e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong    /*
143e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong     * Return the value casted to the given type.
144e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong     * First cast it according to mValueKind, then cast it to T.
145e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong     * Assumes !containsIdentifiers()
146e77ca13d32e329fb1e516c27831b082082ef83c3Yifan Hong     */
1477296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    template <typename T>
1487296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    T cast() const;
1497296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1507296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    friend struct LiteralConstantExpression;
1517296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    friend struct UnaryConstantExpression;
1527296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    friend struct BinaryConstantExpression;
1537296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    friend struct TernaryConstantExpression;
1547296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    friend struct ReferenceConstantExpression;
1557296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov};
1567296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1577296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct LiteralConstantExpression : public ConstantExpression {
1587296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    LiteralConstantExpression(ScalarType::Kind kind, uint64_t value);
1597296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    void evaluate() override;
160b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const ConstantExpression*> getConstantExpressions() const override;
161d9d6dcbb14081aea0dd461346ed3cd5b74424d4bSteven Moreland
162d9d6dcbb14081aea0dd461346ed3cd5b74424d4bSteven Moreland    static LiteralConstantExpression* tryParse(const std::string& value);
163d9d6dcbb14081aea0dd461346ed3cd5b74424d4bSteven Moreland
164d9d6dcbb14081aea0dd461346ed3cd5b74424d4bSteven Morelandprivate:
165d9d6dcbb14081aea0dd461346ed3cd5b74424d4bSteven Moreland    LiteralConstantExpression(ScalarType::Kind kind, uint64_t value, const std::string& expr);
1667296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov};
1677296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1687296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct UnaryConstantExpression : public ConstantExpression {
169d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    UnaryConstantExpression(const std::string& mOp, ConstantExpression* value);
1707296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    void evaluate() override;
171b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const ConstantExpression*> getConstantExpressions() const override;
1727296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1737296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov   private:
174d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    ConstantExpression* const mUnary;
175d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    std::string mOp;
1767296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov};
1777296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1787296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct BinaryConstantExpression : public ConstantExpression {
1797296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    BinaryConstantExpression(ConstantExpression* lval, const std::string& op,
1807296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov                             ConstantExpression* rval);
1817296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    void evaluate() override;
182b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const ConstantExpression*> getConstantExpressions() const override;
1837296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1847296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov   private:
185d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    ConstantExpression* const mLval;
186d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    ConstantExpression* const mRval;
187d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    const std::string mOp;
1887296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov};
1897296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1907296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct TernaryConstantExpression : public ConstantExpression {
1917296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    TernaryConstantExpression(ConstantExpression* cond, ConstantExpression* trueVal,
1927296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov                              ConstantExpression* falseVal);
1937296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    void evaluate() override;
194b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const ConstantExpression*> getConstantExpressions() const override;
1957296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
1967296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov   private:
197d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    ConstantExpression* const mCond;
198d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    ConstantExpression* const mTrueVal;
199d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    ConstantExpression* const mFalseVal;
2007296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov};
2017296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
2027296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakovstruct ReferenceConstantExpression : public ConstantExpression {
2037296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    ReferenceConstantExpression(const Reference<LocalIdentifier>& value, const std::string& expr);
204a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov
205a6d3388c2611bb04abeb87c53ce70967e6e246dfTimur Iskhakov    bool isReferenceConstantExpression() const override;
2067296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov    void evaluate() override;
207b58f4185934a93fc511c03a8a970b31c5ea0dfcaTimur Iskhakov    std::vector<const ConstantExpression*> getConstantExpressions() const override;
20877dd65c66019e219e8989327ae0c12b6527c2e2fTimur Iskhakov    std::vector<const Reference<LocalIdentifier>*> getReferences() const override;
2097296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov
2107296af19687b1c90dfd238398cd2c8ccb6bcd232Timur Iskhakov   private:
211d27580c26d0832c052b139882141de8a3b36e586Timur Iskhakov    Reference<LocalIdentifier> mReference;
212521656973a277bd727a96fa812315daf416668f4Yifan Hong};
213521656973a277bd727a96fa812315daf416668f4Yifan Hong
214521656973a277bd727a96fa812315daf416668f4Yifan Hong}  // namespace android
215521656973a277bd727a96fa812315daf416668f4Yifan Hong
216521656973a277bd727a96fa812315daf416668f4Yifan Hong#endif  // CONSTANT_EXPRESSION_H_
217