• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010-2012, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  // NOLINT
18 #define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_
19 
20 #include <cstdio>
21 #include <list>
22 #include <map>
23 #include <string>
24 
25 #include "clang/Lex/Preprocessor.h"
26 #include "clang/AST/Mangle.h"
27 
28 #include "llvm/ADT/OwningPtr.h"
29 #include "llvm/ADT/StringSet.h"
30 #include "llvm/ADT/StringMap.h"
31 
32 #include "slang_pragma_recorder.h"
33 
34 namespace llvm {
35   class LLVMContext;
36   class TargetData;
37 }   // namespace llvm
38 
39 namespace clang {
40   class VarDecl;
41   class ASTContext;
42   class TargetInfo;
43   class FunctionDecl;
44   class SourceManager;
45 }   // namespace clang
46 
47 namespace slang {
48   class RSExportable;
49   class RSExportVar;
50   class RSExportFunc;
51   class RSExportForEach;
52   class RSExportType;
53 
54 class RSContext {
55   typedef llvm::StringSet<> NeedExportVarSet;
56   typedef llvm::StringSet<> NeedExportFuncSet;
57   typedef llvm::StringSet<> NeedExportTypeSet;
58 
59  public:
60   typedef std::list<RSExportable*> ExportableList;
61   typedef std::list<RSExportVar*> ExportVarList;
62   typedef std::list<RSExportFunc*> ExportFuncList;
63   typedef std::list<RSExportForEach*> ExportForEachList;
64   typedef llvm::StringMap<RSExportType*> ExportTypeMap;
65 
66  private:
67   clang::Preprocessor &mPP;
68   clang::ASTContext &mCtx;
69   const clang::TargetInfo &mTarget;
70   PragmaList *mPragmas;
71   unsigned int mTargetAPI;
72   std::vector<std::string> *mGeneratedFileNames;
73 
74   llvm::TargetData *mTargetData;
75   llvm::LLVMContext &mLLVMContext;
76 
77   ExportableList mExportables;
78 
79   NeedExportTypeSet mNeedExportTypes;
80 
81   std::string *mLicenseNote;
82   std::string mReflectJavaPackageName;
83   std::string mReflectJavaPathName;
84 
85   std::string mRSPackageName;
86 
87   int version;
88   llvm::OwningPtr<clang::MangleContext> mMangleCtx;
89 
90   bool processExportVar(const clang::VarDecl *VD);
91   bool processExportFunc(const clang::FunctionDecl *FD);
92   bool processExportType(const llvm::StringRef &Name);
93 
94   void cleanupForEach();
95 
96   ExportVarList mExportVars;
97   ExportFuncList mExportFuncs;
98   ExportForEachList mExportForEach;
99   ExportTypeMap mExportTypes;
100 
101  public:
102   RSContext(clang::Preprocessor &PP,
103             clang::ASTContext &Ctx,
104             const clang::TargetInfo &Target,
105             PragmaList *Pragmas,
106             unsigned int TargetAPI,
107             std::vector<std::string> *GeneratedFileNames);
108 
getPreprocessor()109   inline clang::Preprocessor &getPreprocessor() const { return mPP; }
getASTContext()110   inline clang::ASTContext &getASTContext() const { return mCtx; }
getMangleContext()111   inline clang::MangleContext &getMangleContext() const {
112     return *mMangleCtx;
113   }
getTargetData()114   inline const llvm::TargetData *getTargetData() const { return mTargetData; }
getLLVMContext()115   inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
getSourceManager()116   inline const clang::SourceManager *getSourceManager() const {
117     return &mPP.getSourceManager();
118   }
getDiagnostics()119   inline clang::DiagnosticsEngine *getDiagnostics() const {
120     return &mPP.getDiagnostics();
121   }
getTargetAPI()122   inline unsigned int getTargetAPI() const {
123     return mTargetAPI;
124   }
125 
setLicenseNote(const std::string & S)126   inline void setLicenseNote(const std::string &S) {
127     mLicenseNote = new std::string(S);
128   }
getLicenseNote()129   inline const std::string *getLicenseNote() const { return mLicenseNote; }
130 
addExportType(const std::string & S)131   inline void addExportType(const std::string &S) {
132     mNeedExportTypes.insert(S);
133     return;
134   }
135 
setReflectJavaPackageName(const std::string & S)136   inline void setReflectJavaPackageName(const std::string &S) {
137     mReflectJavaPackageName = S;
138     return;
139   }
getReflectJavaPackageName()140   inline const std::string &getReflectJavaPackageName() {
141     return mReflectJavaPackageName;
142   }
143 
setRSPackageName(const std::string & S)144   inline void setRSPackageName(const std::string &S) {
145     mRSPackageName = S;
146     return;
147   }
getRSPackageName()148   inline const std::string &getRSPackageName() {
149     return mRSPackageName;
150   }
151 
152   bool processExport();
newExportable(RSExportable * E)153   inline void newExportable(RSExportable *E) {
154     if (E != NULL)
155       mExportables.push_back(E);
156   }
157   typedef ExportableList::iterator exportable_iterator;
exportable_begin()158   exportable_iterator exportable_begin() {
159     return mExportables.begin();
160   }
exportable_end()161   exportable_iterator exportable_end() {
162     return mExportables.end();
163   }
164 
165   typedef ExportVarList::const_iterator const_export_var_iterator;
export_vars_begin()166   const_export_var_iterator export_vars_begin() const {
167     return mExportVars.begin();
168   }
export_vars_end()169   const_export_var_iterator export_vars_end() const {
170     return mExportVars.end();
171   }
hasExportVar()172   inline bool hasExportVar() const {
173     return !mExportVars.empty();
174   }
175 
176   typedef ExportFuncList::const_iterator const_export_func_iterator;
export_funcs_begin()177   const_export_func_iterator export_funcs_begin() const {
178     return mExportFuncs.begin();
179   }
export_funcs_end()180   const_export_func_iterator export_funcs_end() const {
181     return mExportFuncs.end();
182   }
hasExportFunc()183   inline bool hasExportFunc() const { return !mExportFuncs.empty(); }
184 
185   typedef ExportForEachList::const_iterator const_export_foreach_iterator;
export_foreach_begin()186   const_export_foreach_iterator export_foreach_begin() const {
187     return mExportForEach.begin();
188   }
export_foreach_end()189   const_export_foreach_iterator export_foreach_end() const {
190     return mExportForEach.end();
191   }
hasExportForEach()192   inline bool hasExportForEach() const { return !mExportForEach.empty(); }
193 
194   typedef ExportTypeMap::iterator export_type_iterator;
195   typedef ExportTypeMap::const_iterator const_export_type_iterator;
export_types_begin()196   export_type_iterator export_types_begin() { return mExportTypes.begin(); }
export_types_end()197   export_type_iterator export_types_end() { return mExportTypes.end(); }
export_types_begin()198   const_export_type_iterator export_types_begin() const {
199     return mExportTypes.begin();
200   }
export_types_end()201   const_export_type_iterator export_types_end() const {
202     return mExportTypes.end();
203   }
hasExportType()204   inline bool hasExportType() const { return !mExportTypes.empty(); }
findExportType(const llvm::StringRef & TypeName)205   export_type_iterator findExportType(const llvm::StringRef &TypeName) {
206     return mExportTypes.find(TypeName);
207   }
findExportType(const llvm::StringRef & TypeName)208   const_export_type_iterator findExportType(const llvm::StringRef &TypeName)
209       const {
210     return mExportTypes.find(TypeName);
211   }
212 
213   // Insert the specified Typename/Type pair into the map. If the key already
214   // exists in the map, return false and ignore the request, otherwise insert it
215   // and return true.
216   bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type);
217 
218   bool reflectToJava(const std::string &OutputPathBase,
219                      const std::string &OutputPackageName,
220                      const std::string &RSPackageName,
221                      const std::string &InputFileName,
222                      const std::string &OutputBCFileName,
223                      std::string *RealPackageName);
224 
getVersion()225   int getVersion() const { return version; }
setVersion(int v)226   void setVersion(int v) {
227     version = v;
228     return;
229   }
230 
addPragma(const std::string & T,const std::string & V)231   void addPragma(const std::string &T, const std::string &V) {
232     mPragmas->push_back(make_pair(T, V));
233   }
234 
235   ~RSContext();
236 };
237 
238 }   // namespace slang
239 
240 #endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  NOLINT
241