slang_rs_reflection.h revision 9ef2f785e0cc490af678dfd685995dec787321ff
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef _SLANG_COMPILER_RS_REFLECTION_HPP
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#   define _SLANG_COMPILER_RS_REFLECTION_HPP
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
49ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "slang_rs_export_type.hpp"
59ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringExtras.h"
79ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <map>
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <vector>
10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cassert>
12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <fstream>
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <iostream>
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext;
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportVar;
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc;
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSReflection {
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSContext *mRSContext;
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mLastError;
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setError(const std::string &Error) { mLastError = Error; }
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  class Context {
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   private:
309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static const char *const ApacheLicenseNote;
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static const char *const Import[];
339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mVerbose;
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mInputRSFile;
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mPackageName;
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mResourceId;
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mClassName;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mLicenseNote;
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mIndent;
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mPaddingFieldIndex;
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNextExportVarSlot;
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int mNextExportFuncSlot;
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // A mapping from a field in a record type to its index in the rsType
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // instance. Only used when generates TypeClass (ScriptField_*).
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    typedef std::map<const RSExportRecordType::Field*, unsigned> FieldIndexMapTy;
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    FieldIndexMapTy mFieldIndexMap;
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Field index of current processing TypeClass.
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    unsigned mFieldIndex;
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void clear() {
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mClassName = "";
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mIndent = "";
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mPaddingFieldIndex = 1;
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mNextExportVarSlot = 0;
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mNextExportFuncSlot = 0;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   public:
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    typedef enum {
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      AM_Public,
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      AM_Protected,
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      AM_Private
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } AccessModifier;
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mUseStdout;
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mutable std::ofstream mOF;
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static const char *AccessModifierStr(AccessModifier AM);
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    Context(const std::string &InputRSFile,
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const std::string &PackageName,
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const std::string &ResourceId,
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            bool UseStdout)
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        : mVerbose(true),
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mInputRSFile(InputRSFile),
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mPackageName(PackageName),
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mResourceId(ResourceId),
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mLicenseNote(ApacheLicenseNote),
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mUseStdout(UseStdout) {
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      clear();
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline std::ostream &out() const {
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      if (mUseStdout) return std::cout; else return mOF;
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline std::ostream &indent() const {
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      out() << mIndent;
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return out();
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void incIndentLevel() {
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mIndent.append(4, ' ');
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void decIndentLevel() {
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      assert(getIndentLevel() > 0 && "No indent");
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mIndent.erase(0, 4);
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline int getIndentLevel() {
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return (mIndent.length() >> 2);
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline int getNextExportVarSlot() {
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return mNextExportVarSlot++;
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline int getNextExportFuncSlot() {
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return mNextExportFuncSlot++;
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Will remove later due to field name information is not necessary for
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // C-reflect-to-Java
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline std::string createPaddingField() {
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return "#padding_" + llvm::itostr(mPaddingFieldIndex++);
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
130cecd11d2af5d45d8ba322bed61fb48a99c305528Shih-wei Liao
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void setLicenseNote(const std::string &LicenseNote) {
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mLicenseNote = LicenseNote;
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool startClass(AccessModifier AM,
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    bool IsStatic,
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    const std::string &ClassName,
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    const char *SuperClassName,
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    std::string &ErrorMsg);
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endClass();
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startFunction(AccessModifier AM,
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       bool IsStatic,
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const char *ReturnType,
1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const std::string &FunctionName,
1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       int Argc, ...);
1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    typedef std::vector<std::pair<std::string, std::string> > ArgTy;
1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startFunction(AccessModifier AM,
1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       bool IsStatic,
1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const char *ReturnType,
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const std::string &FunctionName,
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const ArgTy &Args);
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endFunction();
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startBlock(bool ShouldIndent = false);
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endBlock();
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getPackageName() const { return mPackageName; }
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getClassName() const { return mClassName; }
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getResourceId() const { return mResourceId; }
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void startTypeClass(const std::string &ClassName);
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void endTypeClass();
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void incFieldIndex() {
1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mFieldIndex++;
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void resetFieldIndex() {
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mFieldIndex = 0;
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1739c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void addFieldIndexMapping(const RSExportRecordType::Field *F) {
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      assert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) &&
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             "Nested structure never occurs in C language.");
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mFieldIndexMap.insert(std::make_pair(F, mFieldIndex));
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline unsigned getFieldIndex(const RSExportRecordType::Field *F) const {
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F);
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      assert((I != mFieldIndexMap.end()) &&
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             "Requesting field is out of scope.");
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return I->second;
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline void clearFieldIndexMap() {
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      mFieldIndexMap.clear();
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  };
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool openScriptFile(Context &C,
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      const std::string &ClassName,
1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      std::string &ErrorMsg);
1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genScriptClass(Context &C,
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      const std::string &ClassName,
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                      std::string &ErrorMsg);
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genScriptClassConstructor(Context &C);
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genInitBoolExportVariable(Context &C,
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                 const std::string &VarName,
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                 const clang::APValue &Val);
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genInitPrimitiveExportVariable(Context &C,
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                      const std::string& VarName,
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                      const clang::APValue &Val);
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genInitExportVariable(Context &C,
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                             const RSExportType *ET,
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                             const std::string &VarName,
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                             const clang::APValue &Val);
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genExportVariable(Context &C, const RSExportVar *EV);
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genPrimitiveTypeExportVariable(Context &C, const RSExportVar *EV);
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genPointerTypeExportVariable(Context &C, const RSExportVar *EV);
2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genVectorTypeExportVariable(Context &C, const RSExportVar *EV);
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genRecordTypeExportVariable(Context &C, const RSExportVar *EV);
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genGetExportVariable(Context &C,
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const std::string &TypeName,
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const std::string &VarName);
2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genExportFunction(Context &C,
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                         const RSExportFunc *EF);
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genTypeClass(Context &C,
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    const RSExportRecordType *ERT,
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                    std::string &ErrorMsg);
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genTypeItemClass(Context &C,
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const RSExportRecordType *ERT,
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        std::string &ErrorMsg);
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassConstructor(Context &C,
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                               const RSExportRecordType *ERT);
2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassCopyToArray(Context &C,
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                               const RSExportRecordType *ERT);
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassItemSetter(Context &C,
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const RSExportRecordType *ERT);
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassItemGetter(Context &C, const RSExportRecordType *ERT);
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassComponentSetter(Context &C, const RSExportRecordType *ERT);
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassComponentGetter(Context &C, const RSExportRecordType *ERT);
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genTypeClassCopyAll(Context &C, const RSExportRecordType *ERT);
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genBuildElement(Context &C,
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const RSExportRecordType *ERT,
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                       const char *RenderScriptVar);
2429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genAddElementToElementBuilder(Context &C,
2439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const RSExportType *ERT,
2449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const std::string &VarName,
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const char *ElementBuilderName,
2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                     const char *RenderScriptVar);
2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genAddPaddingToElementBuiler(Context &C,
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    int PaddingSize,
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const char *ElementBuilderName,
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    const char *RenderScriptVar);
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool genCreateFieldPacker(Context &C,
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const RSExportType *T,
2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                            const char *FieldPackerName);
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genPackVarOfType(Context &C,
2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const RSExportType *T,
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const char *VarName,
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        const char *FieldPackerName);
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genNewItemBufferIfNull(Context &C, const char *Index);
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  void genNewItemBufferPackerIfNull(Context &C);
2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSReflection(const RSContext *Context)
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      : mRSContext(Context),
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        mLastError("") {
2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool reflect(const char *OutputPackageName,
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               const std::string &InputFileName,
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao               const std::string &OutputBCFileName);
2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const char *getLastError() const {
2749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (mLastError.empty())
2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return NULL;
2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    else
2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return mLastError.c_str();
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // class RSReflection
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif  // _SLANG_COMPILER_RS_REFLECTION_HPP
284