• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010, 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   int version;
86   llvm::OwningPtr<clang::MangleContext> mMangleCtx;
87 
88   bool processExportVar(const clang::VarDecl *VD);
89   bool processExportFunc(const clang::FunctionDecl *FD);
90   bool processExportType(const llvm::StringRef &Name);
91 
92   void cleanupForEach();
93 
94   ExportVarList mExportVars;
95   ExportFuncList mExportFuncs;
96   ExportForEachList mExportForEach;
97   ExportTypeMap mExportTypes;
98 
99  public:
100   RSContext(clang::Preprocessor &PP,
101             clang::ASTContext &Ctx,
102             const clang::TargetInfo &Target,
103             PragmaList *Pragmas,
104             unsigned int TargetAPI,
105             std::vector<std::string> *GeneratedFileNames);
106 
getPreprocessor()107   inline clang::Preprocessor &getPreprocessor() const { return mPP; }
getASTContext()108   inline clang::ASTContext &getASTContext() const { return mCtx; }
getMangleContext()109   inline clang::MangleContext &getMangleContext() const {
110     return *mMangleCtx;
111   }
getTargetData()112   inline const llvm::TargetData *getTargetData() const { return mTargetData; }
getLLVMContext()113   inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
getSourceManager()114   inline const clang::SourceManager *getSourceManager() const {
115     return &mPP.getSourceManager();
116   }
getDiagnostics()117   inline clang::DiagnosticsEngine *getDiagnostics() const {
118     return &mPP.getDiagnostics();
119   }
getTargetAPI()120   inline unsigned int getTargetAPI() const {
121     return mTargetAPI;
122   }
123 
setLicenseNote(const std::string & S)124   inline void setLicenseNote(const std::string &S) {
125     mLicenseNote = new std::string(S);
126   }
getLicenseNote()127   inline const std::string *getLicenseNote() const { return mLicenseNote; }
128 
addExportType(const std::string & S)129   inline void addExportType(const std::string &S) {
130     mNeedExportTypes.insert(S);
131     return;
132   }
133 
setReflectJavaPackageName(const std::string & S)134   inline void setReflectJavaPackageName(const std::string &S) {
135     mReflectJavaPackageName = S;
136     return;
137   }
getReflectJavaPackageName()138   inline const std::string &getReflectJavaPackageName() {
139     return mReflectJavaPackageName;
140   }
141 
142   bool processExport();
newExportable(RSExportable * E)143   inline void newExportable(RSExportable *E) {
144     if (E != NULL)
145       mExportables.push_back(E);
146   }
147   typedef ExportableList::iterator exportable_iterator;
exportable_begin()148   exportable_iterator exportable_begin() {
149     return mExportables.begin();
150   }
exportable_end()151   exportable_iterator exportable_end() {
152     return mExportables.end();
153   }
154 
155   typedef ExportVarList::const_iterator const_export_var_iterator;
export_vars_begin()156   const_export_var_iterator export_vars_begin() const {
157     return mExportVars.begin();
158   }
export_vars_end()159   const_export_var_iterator export_vars_end() const {
160     return mExportVars.end();
161   }
hasExportVar()162   inline bool hasExportVar() const {
163     return !mExportVars.empty();
164   }
165 
166   typedef ExportFuncList::const_iterator const_export_func_iterator;
export_funcs_begin()167   const_export_func_iterator export_funcs_begin() const {
168     return mExportFuncs.begin();
169   }
export_funcs_end()170   const_export_func_iterator export_funcs_end() const {
171     return mExportFuncs.end();
172   }
hasExportFunc()173   inline bool hasExportFunc() const { return !mExportFuncs.empty(); }
174 
175   typedef ExportForEachList::const_iterator const_export_foreach_iterator;
export_foreach_begin()176   const_export_foreach_iterator export_foreach_begin() const {
177     return mExportForEach.begin();
178   }
export_foreach_end()179   const_export_foreach_iterator export_foreach_end() const {
180     return mExportForEach.end();
181   }
hasExportForEach()182   inline bool hasExportForEach() const { return !mExportForEach.empty(); }
183 
184   typedef ExportTypeMap::iterator export_type_iterator;
185   typedef ExportTypeMap::const_iterator const_export_type_iterator;
export_types_begin()186   export_type_iterator export_types_begin() { return mExportTypes.begin(); }
export_types_end()187   export_type_iterator export_types_end() { return mExportTypes.end(); }
export_types_begin()188   const_export_type_iterator export_types_begin() const {
189     return mExportTypes.begin();
190   }
export_types_end()191   const_export_type_iterator export_types_end() const {
192     return mExportTypes.end();
193   }
hasExportType()194   inline bool hasExportType() const { return !mExportTypes.empty(); }
findExportType(const llvm::StringRef & TypeName)195   export_type_iterator findExportType(const llvm::StringRef &TypeName) {
196     return mExportTypes.find(TypeName);
197   }
findExportType(const llvm::StringRef & TypeName)198   const_export_type_iterator findExportType(const llvm::StringRef &TypeName)
199       const {
200     return mExportTypes.find(TypeName);
201   }
202 
203   // Insert the specified Typename/Type pair into the map. If the key already
204   // exists in the map, return false and ignore the request, otherwise insert it
205   // and return true.
206   bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type);
207 
208   bool reflectToJava(const std::string &OutputPathBase,
209                      const std::string &OutputPackageName,
210                      const std::string &InputFileName,
211                      const std::string &OutputBCFileName,
212                      std::string *RealPackageName);
213 
getVersion()214   int getVersion() const { return version; }
setVersion(int v)215   void setVersion(int v) {
216     version = v;
217     return;
218   }
219 
addPragma(const std::string & T,const std::string & V)220   void addPragma(const std::string &T, const std::string &V) {
221     mPragmas->push_back(make_pair(T, V));
222   }
223 
224   ~RSContext();
225 };
226 
227 }   // namespace slang
228 
229 #endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  NOLINT
230