Initialize slang and Android.mk.

Change-Id: If74da8e54d45511c8c9bb236bcfeec508f4f2439
diff --git a/slang_rs_reflection.hpp b/slang_rs_reflection.hpp
new file mode 100644
index 0000000..7d61b28
--- /dev/null
+++ b/slang_rs_reflection.hpp
@@ -0,0 +1,179 @@
+#ifndef _SLANG_COMPILER_RS_REFLECTION_HPP
+#   define _SLANG_COMPILER_RS_REFLECTION_HPP
+
+#include <map>
+#include <vector>
+#include <string>
+#include <cassert>
+#include <fstream>
+#include <iostream>
+
+#include "slang_rs_export_type.hpp"
+
+#include "llvm/ADT/StringExtras.h"  /* for function llvm::utostr_32() and llvm::itostr() */
+
+namespace slang {
+
+class RSContext;
+class RSExportVar;
+class RSExportFunc;
+class RSExportRecordType;
+
+class RSReflection {
+private:
+    const RSContext* mRSContext;
+
+    std::string mLastError;
+    inline void setError(const std::string& Error) { mLastError = Error; }
+
+    class Context {
+    private:
+        static const char* const LicenseNote;
+        static const char* const Import[];
+
+        bool mUseStdout;
+        mutable std::ofstream mOF;
+
+        bool mVerbose;
+
+        std::string mPackageName;
+        std::string mResourceId;
+
+        std::string mClassName;
+
+        std::string mIndent;
+
+        int mPaddingFieldIndex;
+
+        int mNextExportVarSlot;
+        int mNextExportFuncSlot;
+
+        inline void clear() {
+            mClassName = "";
+            mIndent = "";
+            mPaddingFieldIndex = 1;
+            mNextExportVarSlot = 0;
+            mNextExportFuncSlot = 0;
+            return;
+        }
+
+    public:
+        typedef enum {
+            AM_Public,
+            AM_Protected,
+            AM_Private
+        } AccessModifier;
+
+        static const char* AccessModifierStr(AccessModifier AM);
+
+        Context(const std::string& PackageName, const std::string& ResourceId, bool UseStdout) : 
+            mPackageName(PackageName),
+            mResourceId(ResourceId),
+            mUseStdout(UseStdout),
+            mVerbose(true)
+        { 
+            clear();
+            return; 
+        }
+
+        inline std::ostream& out() const { if(mUseStdout) return std::cout; else return mOF; }
+        inline std::ostream& indent() const { 
+            out() << mIndent; 
+            return out();
+        }
+
+        inline void incIndentLevel() { 
+            mIndent.append(4, ' '); 
+            return; 
+        }
+
+        inline void decIndentLevel() { 
+            assert(getIndentLevel() > 0 && "No indent"); 
+            mIndent.erase(0, 4); 
+            return; 
+        }
+
+        inline int getIndentLevel() {
+            return (mIndent.length() >> 2);
+        }
+
+        inline int getNextExportVarSlot() {
+            return mNextExportVarSlot++;
+        }
+
+        inline int getNextExportFuncSlot() {
+            return mNextExportFuncSlot++;
+        }
+
+        /* Will remove later due to field name information is not necessary for C-reflect-to-Java */
+        inline std::string createPaddingField() {
+            return "#padding_" + llvm::itostr(mPaddingFieldIndex++);
+        }
+
+        bool startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg);
+        void endClass();
+
+        void startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...);
+        
+        typedef std::vector<std::pair<std::string, std::string> > ArgTy;
+        void startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, const ArgTy& Args);
+        void endFunction();
+
+        void startBlock(bool ShouldIndent = false);
+        void endBlock();
+
+        inline const std::string& getPackageName() const { return mPackageName; }
+        inline const std::string& getClassName() const { return mClassName; }
+        inline const std::string& getResourceId() const { return mResourceId; }
+
+        void startTypeClass(const std::string& ClassName);
+        void endTypeClass();
+    };
+
+    bool genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg);
+    void genScriptClassConstructor(Context& C);
+
+    void genExportVariable(Context& C, const RSExportVar* EV);
+    void genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV);
+    void genPointerTypeExportVariable(Context& C, const RSExportVar* EV);
+    void genVectorTypeExportVariable(Context& C, const RSExportVar* EV);
+    void genRecordTypeExportVariable(Context& C, const RSExportVar* EV);
+    void genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName);
+
+    void genExportFunction(Context& C, const RSExportFunc* EF);
+
+    bool genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg);
+    bool genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg);
+    void genTypeClassConstructor(Context& C, const RSExportRecordType* ERT);
+    void genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT);
+    void genTypeClasSet(Context& C, const RSExportRecordType* ERT);
+    void genTypeClasCopyAll(Context& C, const RSExportRecordType* ERT);
+
+    void genBuildElement(Context& C, const RSExportRecordType* ERT, const char* ElementName, const char* RenderScriptVar);
+    void genAddElementToElementBuilder(Context& C, const RSExportType* ERT, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar);
+    void genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar);
+
+    bool genCreateFieldPacker(Context& C, const RSExportType* T, const char* FieldPackerName);
+    void genPackVarOfType(Context& C, const RSExportType* T, const char* VarName, const char* FieldPackerName);
+
+public:
+    RSReflection(const RSContext* Context) :
+        mRSContext(Context),
+        mLastError("")
+    {
+        return;
+    }
+
+    bool reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName);
+
+    inline const char* getLastError() const {
+        if(mLastError.empty())
+            return NULL;
+        else
+            return mLastError.c_str();
+    }
+};  /* class RSReflection */
+
+}   /* namespace slang */
+
+#endif  /* _SLANG_COMPILER_RS_REFLECTION_HPP */