Merge "Add option to generate reflected C++ code."
diff --git a/RSCCOptions.td b/RSCCOptions.td
index 5e137c1..ebd7f36 100644
--- a/RSCCOptions.td
+++ b/RSCCOptions.td
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010, The Android Open Source Project
+ * Copyright 2010-2012, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -108,6 +108,13 @@
 def _additional_dep_target : Separate<"-a">, Alias<additional_dep_target>;
 
 //===----------------------------------------------------------------------===//
+// Reflection Options
+//===----------------------------------------------------------------------===//
+
+def reflect_cpp : Flag<"-reflect-c++">,
+  HelpText<"Reflect C++ classes">;
+
+//===----------------------------------------------------------------------===//
 // Misc Options
 //===----------------------------------------------------------------------===//
 
diff --git a/llvm-rs-cc.cpp b/llvm-rs-cc.cpp
index d6a3b8d..2cd7bb0 100644
--- a/llvm-rs-cc.cpp
+++ b/llvm-rs-cc.cpp
@@ -273,6 +273,10 @@
           << OptParser->getOptionName(OPT_bitcode_storage)
           << BitcodeStorageValue;
 
+    if (Args->hasArg(OPT_reflect_cpp)) {
+      Opts.mBitcodeStorage = slang::BCST_CPP_CODE;
+    }
+
     Opts.mOutputDepDir =
         Args->getLastArgValue(OPT_output_dep_dir, Opts.mOutputDir);
     Opts.mAdditionalDepTargets =
@@ -475,6 +479,7 @@
                                          Opts.mOptimizationLevel,
                                          Opts.mJavaReflectionPathBase,
                                          Opts.mJavaReflectionPackageName);
+
   Compiler->reset();
 
   return CompileFailed;
diff --git a/slang_rs.cpp b/slang_rs.cpp
index 8b52931..13413c0 100644
--- a/slang_rs.cpp
+++ b/slang_rs.cpp
@@ -319,26 +319,34 @@
       return false;
 
     if (OutputType != Slang::OT_Dependency) {
-      if (!reflectToJava(JavaReflectionPathBase,
-                         JavaReflectionPackageName,
-                         &RealPackageName))
-        return false;
 
-      for (std::vector<std::string>::const_iterator
-               I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end();
-           I != E;
-           I++) {
-        std::string ReflectedName = RSSlangReflectUtils::ComputePackagedPath(
-            JavaReflectionPathBase.c_str(),
-            (RealPackageName + OS_PATH_SEPARATOR_STR + *I).c_str());
-        appendGeneratedFileName(ReflectedName + ".java");
-      }
+      if (BitcodeStorage == BCST_CPP_CODE) {
+        // TODO: Call C++ reflection routines + appendGeneratedFileName().
+      } else {
 
-      if ((OutputType == Slang::OT_Bitcode) &&
-          (BitcodeStorage == BCST_JAVA_CODE) &&
-          !generateBitcodeAccessor(JavaReflectionPathBase,
-                                     RealPackageName.c_str()))
+        if (!reflectToJava(JavaReflectionPathBase,
+                           JavaReflectionPackageName,
+                           &RealPackageName)) {
           return false;
+        }
+
+        for (std::vector<std::string>::const_iterator
+                 I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end();
+             I != E;
+             I++) {
+          std::string ReflectedName = RSSlangReflectUtils::ComputePackagedPath(
+              JavaReflectionPathBase.c_str(),
+              (RealPackageName + OS_PATH_SEPARATOR_STR + *I).c_str());
+          appendGeneratedFileName(ReflectedName + ".java");
+        }
+
+        if ((OutputType == Slang::OT_Bitcode) &&
+            (BitcodeStorage == BCST_JAVA_CODE) &&
+            !generateBitcodeAccessor(JavaReflectionPathBase,
+                                     RealPackageName.c_str())) {
+          return false;
+        }
+      }
     }
 
     if (OutputDep) {
diff --git a/slang_rs_reflect_utils.h b/slang_rs_reflect_utils.h
index f6cfd57..01b93f0 100644
--- a/slang_rs_reflect_utils.h
+++ b/slang_rs_reflect_utils.h
@@ -24,7 +24,8 @@
 // BitCode storage type
 enum BitCodeStorageType {
   BCST_APK_RESOURCE,
-  BCST_JAVA_CODE
+  BCST_JAVA_CODE,
+  BCST_CPP_CODE
 };
 
 class RSSlangReflectUtils {