slang_rs_reflection.h revision a6b54146b93eec68f6daa4b1877639cdc34801dc
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines * Copyright 2010-2011, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <fstream>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <iostream>
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <map>
2348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines#include <set>
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string>
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector>
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringExtras.h"
286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
296e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h"
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h"
316315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSContext;
356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSExportVar;
366315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSExportFunc;
37593a894650e81be54173106ec266f0311cebebd3Stephen Hines  class RSExportForEach;
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSReflection {
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSContext *mRSContext;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mLastError;
444cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  std::vector<std::string> *mGeneratedFileNames;
454cc67fce91f43215d61b2695746eab102a3db516Stephen Hines
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setError(const std::string &Error) { mLastError = Error; }
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  class Context {
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   private:
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static const char *const ApacheLicenseNote;
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static const char *const Import[];
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mVerbose;
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
56b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    std::string mOutputPathBase;
578c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mInputRSFile;
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mPackageName;
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mResourceId;
62a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines    std::string mPaddingPrefix;
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mClassName;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mLicenseNote;
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mIndent;
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mPaddingFieldIndex;
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNextExportVarSlot;
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNextExportFuncSlot;
74593a894650e81be54173106ec266f0311cebebd3Stephen Hines    int mNextExportForEachSlot;
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // A mapping from a field in a record type to its index in the rsType
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // instance. Only used when generates TypeClass (ScriptField_*).
78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    typedef std::map<const RSExportRecordType::Field*, unsigned>
79e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines        FieldIndexMapTy;
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    FieldIndexMapTy mFieldIndexMap;
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Field index of current processing TypeClass.
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    unsigned mFieldIndex;
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void clear() {
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mClassName = "";
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mIndent = "";
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mPaddingFieldIndex = 1;
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mNextExportVarSlot = 0;
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mNextExportFuncSlot = 0;
90593a894650e81be54173106ec266f0311cebebd3Stephen Hines      mNextExportForEachSlot = 0;
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
948c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    bool openClassFile(const std::string &ClassName,
958c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang                       std::string &ErrorMsg);
968c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   public:
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    typedef enum {
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      AM_Public,
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      AM_Protected,
10138eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk      AM_Private,
10238eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk      AM_PublicSynchronized
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } AccessModifier;
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mUseStdout;
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mutable std::ofstream mOF;
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
10848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines    std::set<std::string> mTypesToCheck;
10948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static const char *AccessModifierStr(AccessModifier AM);
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
112b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    Context(const std::string &OutputPathBase,
1138c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang            const std::string &InputRSFile,
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const std::string &PackageName,
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const std::string &ResourceId,
116a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines            const std::string &PaddingPrefix,
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            bool UseStdout)
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        : mVerbose(true),
119b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao          mOutputPathBase(OutputPathBase),
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mInputRSFile(InputRSFile),
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mPackageName(PackageName),
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mResourceId(ResourceId),
123a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines          mPaddingPrefix(PaddingPrefix),
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mLicenseNote(ApacheLicenseNote),
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mUseStdout(UseStdout) {
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      clear();
12766aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang      resetFieldIndex();
12866aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang      clearFieldIndexMap();
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline std::ostream &out() const {
1336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      return ((mUseStdout) ? std::cout : mOF);
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline std::ostream &indent() const {
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      out() << mIndent;
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return out();
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void incIndentLevel() {
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mIndent.append(4, ' ');
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void decIndentLevel() {
1466e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(getIndentLevel() > 0 && "No indent");
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mIndent.erase(0, 4);
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    inline int getIndentLevel() { return (mIndent.length() >> 2); }
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    inline int getNextExportVarSlot() { return mNextExportVarSlot++; }
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
15592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    inline int getNextExportFuncSlot() { return mNextExportFuncSlot++; }
156593a894650e81be54173106ec266f0311cebebd3Stephen Hines    inline int getNextExportForEachSlot() { return mNextExportForEachSlot++; }
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Will remove later due to field name information is not necessary for
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // C-reflect-to-Java
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline std::string createPaddingField() {
161a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines      return mPaddingPrefix + llvm::itostr(mPaddingFieldIndex++);
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
163cecd11d2af5d45d8ba322bed61fb48a99c305528Shih-wei Liao
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void setLicenseNote(const std::string &LicenseNote) {
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mLicenseNote = LicenseNote;
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool startClass(AccessModifier AM,
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    bool IsStatic,
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    const std::string &ClassName,
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    const char *SuperClassName,
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    std::string &ErrorMsg);
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endClass();
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startFunction(AccessModifier AM,
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       bool IsStatic,
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const char *ReturnType,
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const std::string &FunctionName,
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       int Argc, ...);
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    typedef std::vector<std::pair<std::string, std::string> > ArgTy;
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startFunction(AccessModifier AM,
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       bool IsStatic,
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const char *ReturnType,
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const std::string &FunctionName,
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const ArgTy &Args);
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endFunction();
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startBlock(bool ShouldIndent = false);
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endBlock();
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getPackageName() const { return mPackageName; }
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getClassName() const { return mClassName; }
1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getResourceId() const { return mResourceId; }
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startTypeClass(const std::string &ClassName);
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endTypeClass();
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
19992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    inline void incFieldIndex() { mFieldIndex++; }
200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    inline void resetFieldIndex() { mFieldIndex = 0; }
2029c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void addFieldIndexMapping(const RSExportRecordType::Field *F) {
2046e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) &&
2056e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                  "Nested structure never occurs in C language.");
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mFieldIndexMap.insert(std::make_pair(F, mFieldIndex));
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline unsigned getFieldIndex(const RSExportRecordType::Field *F) const {
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F);
2116e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert((I != mFieldIndexMap.end()) &&
2126e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines                  "Requesting field is out of scope.");
2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return I->second;
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
21692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    inline void clearFieldIndexMap() { mFieldIndexMap.clear(); }
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  };
2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genScriptClass(Context &C,
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      const std::string &ClassName,
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      std::string &ErrorMsg);
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genScriptClassConstructor(Context &C);
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2245d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  static void genInitBoolExportVariable(Context &C,
2255d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                        const std::string &VarName,
2265d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                        const clang::APValue &Val);
2275d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  static void genInitPrimitiveExportVariable(Context &C,
2285d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                             const std::string &VarName,
2295d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                             const clang::APValue &Val);
2305d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  static void genInitExportVariable(Context &C,
2315d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                    const RSExportType *ET,
2325d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                    const std::string &VarName,
2335d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines                                    const clang::APValue &Val);
2345d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines  static void genInitValue(Context &C, const clang::APValue &Val);
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genExportVariable(Context &C, const RSExportVar *EV);
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genPrimitiveTypeExportVariable(Context &C, const RSExportVar *EV);
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genPointerTypeExportVariable(Context &C, const RSExportVar *EV);
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genVectorTypeExportVariable(Context &C, const RSExportVar *EV);
23992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  void genMatrixTypeExportVariable(Context &C, const RSExportVar *EV);
2402e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  void genConstantArrayTypeExportVariable(Context &C, const RSExportVar *EV);
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genRecordTypeExportVariable(Context &C, const RSExportVar *EV);
2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genGetExportVariable(Context &C,
2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const std::string &TypeName,
2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const std::string &VarName);
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genExportFunction(Context &C,
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                         const RSExportFunc *EF);
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
249593a894650e81be54173106ec266f0311cebebd3Stephen Hines  void genExportForEach(Context &C,
250593a894650e81be54173106ec266f0311cebebd3Stephen Hines                        const RSExportForEach *EF);
251593a894650e81be54173106ec266f0311cebebd3Stephen Hines
25248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  static void genTypeCheck(Context &C,
25348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines                           const RSExportType *ET,
25448b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines                           const char *VarName);
25548b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines
256a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines  static void genTypeInstanceFromPointer(Context &C,
257a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines                                         const RSExportType *ET);
258a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines
25948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines  static void genTypeInstance(Context &C,
26048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines                              const RSExportType *ET);
261b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genTypeClass(Context &C,
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    const RSExportRecordType *ERT,
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    std::string &ErrorMsg);
2652e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  void genTypeItemClass(Context &C, const RSExportRecordType *ERT);
26692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  void genTypeClassConstructor(Context &C, const RSExportRecordType *ERT);
26792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  void genTypeClassCopyToArray(Context &C, const RSExportRecordType *ERT);
26838eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk  void genTypeClassCopyToArrayLocal(Context &C, const RSExportRecordType *ERT);
26992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang  void genTypeClassItemSetter(Context &C, const RSExportRecordType *ERT);
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassItemGetter(Context &C, const RSExportRecordType *ERT);
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassComponentSetter(Context &C, const RSExportRecordType *ERT);
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassComponentGetter(Context &C, const RSExportRecordType *ERT);
2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassCopyAll(Context &C, const RSExportRecordType *ERT);
274d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang  void genTypeClassResize(Context &C);
2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genBuildElement(Context &C,
27789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                       const char *ElementBuilderName,
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const RSExportRecordType *ERT,
27989273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                       const char *RenderScriptVar,
28089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                       bool IsInline);
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genAddElementToElementBuilder(Context &C,
2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const RSExportType *ERT,
2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const std::string &VarName,
2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const char *ElementBuilderName,
28589273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                     const char *RenderScriptVar,
28689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang                                     unsigned ArraySize);
2879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genAddPaddingToElementBuiler(Context &C,
2889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    int PaddingSize,
2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const char *ElementBuilderName,
2909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const char *RenderScriptVar);
2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genCreateFieldPacker(Context &C,
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const RSExportType *T,
2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const char *FieldPackerName);
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genPackVarOfType(Context &C,
2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const RSExportType *T,
2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const char *VarName,
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const char *FieldPackerName);
2992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang  void genAllocateVarOfType(Context &C,
3002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                            const RSExportType *T,
3012e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang                            const std::string &VarName);
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genNewItemBufferIfNull(Context &C, const char *Index);
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genNewItemBufferPackerIfNull(Context &C);
3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
3064cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  explicit RSReflection(const RSContext *Context,
3074cc67fce91f43215d61b2695746eab102a3db516Stephen Hines      std::vector<std::string> *GeneratedFileNames)
3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      : mRSContext(Context),
3094cc67fce91f43215d61b2695746eab102a3db516Stephen Hines        mLastError(""),
3104cc67fce91f43215d61b2695746eab102a3db516Stephen Hines        mGeneratedFileNames(GeneratedFileNames) {
3116e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines    slangAssert(mGeneratedFileNames && "Must supply GeneratedFileNames");
3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
3139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
315b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  bool reflect(const std::string &OutputPathBase,
316b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao               const std::string &OutputPackageName,
3179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               const std::string &InputFileName,
3189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               const std::string &OutputBCFileName);
3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const char *getLastError() const {
3219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (mLastError.empty())
3229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return NULL;
3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
3249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return mLastError.c_str();
3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // class RSReflection
3279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
330e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_  NOLINT
331