1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 20a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines * Copyright 2010-2012, 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 bool mVerbose; 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 54b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mOutputPathBase; 558c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mInputRSFile; 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mPackageName; 590a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines std::string mRSPackageName; 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mResourceId; 61a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines std::string mPaddingPrefix; 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mClassName; 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mLicenseNote; 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string mIndent; 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int mPaddingFieldIndex; 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int mNextExportVarSlot; 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int mNextExportFuncSlot; 73593a894650e81be54173106ec266f0311cebebd3Stephen Hines int mNextExportForEachSlot; 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // A mapping from a field in a record type to its index in the rsType 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // instance. Only used when generates TypeClass (ScriptField_*). 77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines typedef std::map<const RSExportRecordType::Field*, unsigned> 78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines FieldIndexMapTy; 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldIndexMapTy mFieldIndexMap; 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Field index of current processing TypeClass. 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao unsigned mFieldIndex; 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void clear() { 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mClassName = ""; 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mIndent = ""; 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPaddingFieldIndex = 1; 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNextExportVarSlot = 0; 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mNextExportFuncSlot = 0; 89593a894650e81be54173106ec266f0311cebebd3Stephen Hines mNextExportForEachSlot = 0; 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 938c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang bool openClassFile(const std::string &ClassName, 948c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang std::string &ErrorMsg); 958c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef enum { 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao AM_Public, 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao AM_Protected, 10038eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk AM_Private, 10138eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk AM_PublicSynchronized 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } AccessModifier; 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool mUseStdout; 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mutable std::ofstream mOF; 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1071f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Generated RS Elements for type-checking code. 10848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines std::set<std::string> mTypesToCheck; 10948b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 1101f6c331d622ac645ab68a016aa4c577998547373Stephen Hines // Generated FieldPackers for unsigned setters/validation. 1111f6c331d622ac645ab68a016aa4c577998547373Stephen Hines std::set<std::string> mFieldPackerTypes; 1121f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 1131f6c331d622ac645ab68a016aa4c577998547373Stephen Hines bool addTypeNameForElement(const std::string &TypeName); 1141f6c331d622ac645ab68a016aa4c577998547373Stephen Hines bool addTypeNameForFieldPacker(const std::string &TypeName); 1151f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao static const char *AccessModifierStr(AccessModifier AM); 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 118b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Context(const std::string &OutputPathBase, 1198c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang const std::string &InputRSFile, 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &PackageName, 1210a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines const std::string &RSPackageName, 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ResourceId, 123a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines const std::string &PaddingPrefix, 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool UseStdout) 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : mVerbose(true), 126b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mOutputPathBase(OutputPathBase), 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mInputRSFile(InputRSFile), 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mPackageName(PackageName), 1290a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines mRSPackageName(RSPackageName), 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mResourceId(ResourceId), 131a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines mPaddingPrefix(PaddingPrefix), 1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLicenseNote(ApacheLicenseNote), 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mUseStdout(UseStdout) { 1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clear(); 13566aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang resetFieldIndex(); 13666aa299de2b5e0b0c7bfae7628e29a3961247aedZonr Chang clearFieldIndexMap(); 1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::ostream &out() const { 1416315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr return ((mUseStdout) ? std::cout : mOF); 1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::ostream &indent() const { 1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out() << mIndent; 1459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return out(); 1469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void incIndentLevel() { 1499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mIndent.append(4, ' '); 1509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void decIndentLevel() { 1546e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(getIndentLevel() > 0 && "No indent"); 1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mIndent.erase(0, 4); 1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 15992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang inline int getIndentLevel() { return (mIndent.length() >> 2); } 1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang inline int getNextExportVarSlot() { return mNextExportVarSlot++; } 1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 16392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang inline int getNextExportFuncSlot() { return mNextExportFuncSlot++; } 164593a894650e81be54173106ec266f0311cebebd3Stephen Hines inline int getNextExportForEachSlot() { return mNextExportForEachSlot++; } 1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Will remove later due to field name information is not necessary for 1679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // C-reflect-to-Java 1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline std::string createPaddingField() { 169a9ae5ae8866d937a99601d24a922c8f3f4223f59Stephen Hines return mPaddingPrefix + llvm::itostr(mPaddingFieldIndex++); 1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 171cecd11d2af5d45d8ba322bed61fb48a99c305528Shih-wei Liao 1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void setLicenseNote(const std::string &LicenseNote) { 1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mLicenseNote = LicenseNote; 1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool startClass(AccessModifier AM, 1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *SuperClassName, 1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endClass(); 1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startFunction(AccessModifier AM, 1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int Argc, ...); 1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao typedef std::vector<std::pair<std::string, std::string> > ArgTy; 1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startFunction(AccessModifier AM, 1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool IsStatic, 1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ReturnType, 1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &FunctionName, 1949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const ArgTy &Args); 1959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endFunction(); 1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startBlock(bool ShouldIndent = false); 1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endBlock(); 1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string &getPackageName() const { return mPackageName; } 2010a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines inline const std::string &getRSPackageName() const { 2020a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines return mRSPackageName; 2030a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines } 2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string &getClassName() const { return mClassName; } 2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const std::string &getResourceId() const { return mResourceId; } 2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void startTypeClass(const std::string &ClassName); 2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void endTypeClass(); 2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 21092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang inline void incFieldIndex() { mFieldIndex++; } 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang inline void resetFieldIndex() { mFieldIndex = 0; } 2139c631ff2e65a8fa766981c9683c3b255ce0a2388Shih-wei Liao 2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline void addFieldIndexMapping(const RSExportRecordType::Field *F) { 2156e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((mFieldIndexMap.find(F) == mFieldIndexMap.end()) && 2166e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Nested structure never occurs in C language."); 2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao mFieldIndexMap.insert(std::make_pair(F, mFieldIndex)); 2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline unsigned getFieldIndex(const RSExportRecordType::Field *F) const { 2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao FieldIndexMapTy::const_iterator I = mFieldIndexMap.find(F); 2226e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert((I != mFieldIndexMap.end()) && 2236e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines "Requesting field is out of scope."); 2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return I->second; 2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 22792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang inline void clearFieldIndexMap() { mFieldIndexMap.clear(); } 2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao }; 2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genScriptClass(Context &C, 2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &ClassName, 2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genScriptClassConstructor(Context &C); 2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2355d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines static void genInitBoolExportVariable(Context &C, 2365d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const std::string &VarName, 2375d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val); 2385d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines static void genInitPrimitiveExportVariable(Context &C, 2395d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const std::string &VarName, 2405d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val); 2415d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines static void genInitExportVariable(Context &C, 2425d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const RSExportType *ET, 2435d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const std::string &VarName, 2445d67178077b50d0a02832e91053ee71ec33a25c2Stephen Hines const clang::APValue &Val); 2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genExportVariable(Context &C, const RSExportVar *EV); 2469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genPrimitiveTypeExportVariable(Context &C, const RSExportVar *EV); 2479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genPointerTypeExportVariable(Context &C, const RSExportVar *EV); 2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genVectorTypeExportVariable(Context &C, const RSExportVar *EV); 24992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang void genMatrixTypeExportVariable(Context &C, const RSExportVar *EV); 2502e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang void genConstantArrayTypeExportVariable(Context &C, const RSExportVar *EV); 2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genRecordTypeExportVariable(Context &C, const RSExportVar *EV); 2520d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines void genPrivateExportVariable(Context &C, 2530d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const std::string &TypeName, 2540d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const std::string &VarName); 2550d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines void genSetExportVariable(Context &C, 2560d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const std::string &TypeName, 2570d26cef64debfaa6862a27587c1fd0d30baa3b1dStephen Hines const RSExportVar *EV); 2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genGetExportVariable(Context &C, 2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &TypeName, 2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName); 26128d60bc2da19821af82d983902c3c78c078343c3Stephen Hines void genGetFieldID(Context &C, 26228d60bc2da19821af82d983902c3c78c078343c3Stephen Hines const std::string &VarName); 2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genExportFunction(Context &C, 2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportFunc *EF); 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 267593a894650e81be54173106ec266f0311cebebd3Stephen Hines void genExportForEach(Context &C, 268593a894650e81be54173106ec266f0311cebebd3Stephen Hines const RSExportForEach *EF); 269593a894650e81be54173106ec266f0311cebebd3Stephen Hines 27048b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static void genTypeCheck(Context &C, 27148b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *ET, 27248b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const char *VarName); 27348b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines 274a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines static void genTypeInstanceFromPointer(Context &C, 275a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines const RSExportType *ET); 276a6b54146b93eec68f6daa4b1877639cdc34801dcStephen Hines 27748b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines static void genTypeInstance(Context &C, 27848b72bf3ea4a7dc66a0b59734aeb0c4adfb4d9d1Stephen Hines const RSExportType *ET); 2791f6c331d622ac645ab68a016aa4c577998547373Stephen Hines 2801f6c331d622ac645ab68a016aa4c577998547373Stephen Hines static void genFieldPackerInstance(Context &C, 2811f6c331d622ac645ab68a016aa4c577998547373Stephen Hines const RSExportType *ET); 282b5a89fbfcba6d8817c1c3700ed78bd6482cf1a5dStephen Hines 2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genTypeClass(Context &C, 2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao std::string &ErrorMsg); 2862e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang void genTypeItemClass(Context &C, const RSExportRecordType *ERT); 28792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang void genTypeClassConstructor(Context &C, const RSExportRecordType *ERT); 28892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang void genTypeClassCopyToArray(Context &C, const RSExportRecordType *ERT); 28938eca1ad0d6bfac8f1fbf7c8360f4c18ecd205c2Alex Sakhartchouk void genTypeClassCopyToArrayLocal(Context &C, const RSExportRecordType *ERT); 29092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang void genTypeClassItemSetter(Context &C, const RSExportRecordType *ERT); 2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassItemGetter(Context &C, const RSExportRecordType *ERT); 2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassComponentSetter(Context &C, const RSExportRecordType *ERT); 2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassComponentGetter(Context &C, const RSExportRecordType *ERT); 2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genTypeClassCopyAll(Context &C, const RSExportRecordType *ERT); 295d42a429f42fd6f272188af64f412cd604f02b365Zonr Chang void genTypeClassResize(Context &C); 2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genBuildElement(Context &C, 29889273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *ElementBuilderName, 2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportRecordType *ERT, 30089273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *RenderScriptVar, 30189273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang bool IsInline); 3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genAddElementToElementBuilder(Context &C, 3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *ERT, 3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &VarName, 3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 30689273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang const char *RenderScriptVar, 30789273bd59a182fc0401d68f14ad206bf4dc800c7Zonr Chang unsigned ArraySize); 3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genAddPaddingToElementBuiler(Context &C, 3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao int PaddingSize, 3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *ElementBuilderName, 3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *RenderScriptVar); 3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool genCreateFieldPacker(Context &C, 3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *T, 3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName); 3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genPackVarOfType(Context &C, 3179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const RSExportType *T, 3189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *VarName, 3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const char *FieldPackerName); 3202e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang void genAllocateVarOfType(Context &C, 3212e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const RSExportType *T, 3222e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang const std::string &VarName); 3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genNewItemBufferIfNull(Context &C, const char *Index); 3249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void genNewItemBufferPackerIfNull(Context &C); 3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 3274cc67fce91f43215d61b2695746eab102a3db516Stephen Hines explicit RSReflection(const RSContext *Context, 3284cc67fce91f43215d61b2695746eab102a3db516Stephen Hines std::vector<std::string> *GeneratedFileNames) 3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao : mRSContext(Context), 3304cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mLastError(""), 3314cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames(GeneratedFileNames) { 3326e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(mGeneratedFileNames && "Must supply GeneratedFileNames"); 3339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return; 3349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 336b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao bool reflect(const std::string &OutputPathBase, 337b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const std::string &OutputPackageName, 3380a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines const std::string &RSPackageName, 3399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &InputFileName, 3409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const std::string &OutputBCFileName); 3419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao inline const char *getLastError() const { 3439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (mLastError.empty()) 3449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return NULL; 3459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao else 3469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return mLastError.c_str(); 3479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 3489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}; // class RSReflection 3499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 3519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 352e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_REFLECTION_H_ NOLINT 353