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