• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #include "codegen/code_generator.h"
10 #include "codegen/c_interface_code_emitter.h"
11 #include "codegen/c_client_proxy_code_emitter.h"
12 #include "codegen/c_custom_types_code_emitter.h"
13 #include "codegen/c_service_driver_code_emitter.h"
14 #include "codegen/c_service_impl_code_emitter.h"
15 #include "codegen/c_service_stub_code_emitter.h"
16 #include "codegen/cpp_interface_code_emitter.h"
17 #include "codegen/cpp_client_proxy_code_emitter.h"
18 #include "codegen/cpp_custom_types_code_emitter.h"
19 #include "codegen/cpp_service_driver_code_emitter.h"
20 #include "codegen/cpp_service_impl_code_emitter.h"
21 #include "codegen/cpp_service_stub_code_emitter.h"
22 #include "codegen/java_client_interface_code_emitter.h"
23 #include "codegen/java_client_proxy_code_emitter.h"
24 #include "util/options.h"
25 
26 namespace OHOS {
27 namespace HDI {
28 CodeEmitMap CodeGenerator::cCodeEmitters_ = {
29     {"types", new CCustomTypesCodeEmitter()},
30     {"interface", new CInterfaceCodeEmitter()},
31     {"proxy", new CClientProxyCodeEmitter()},
32     {"driver", new CServiceDriverCodeEmitter()},
33     {"stub", new CServiceStubCodeEmitter()},
34     {"impl", new CServiceImplCodeEmitter()},
35 };
36 
37 CodeEmitMap CodeGenerator::cppCodeEmitters_ = {
38     {"types", new CppCustomTypesCodeEmitter()},
39     {"interface", new CppInterfaceCodeEmitter()},
40     {"proxy", new CppClientProxyCodeEmitter()},
41     {"driver", new CppServiceDriverCodeEmitter()},
42     {"stub", new CppServiceStubCodeEmitter()},
43     {"impl", new CppServiceImplCodeEmitter()},
44 };
45 
46 CodeEmitMap CodeGenerator::javaCodeEmitters_ = {
47     {"clientIface", new JavaClientInterfaceCodeEmitter()},
48     {"proxy", new JavaClientProxyCodeEmitter()},
49 };
50 
Generate()51 bool CodeGenerator::Generate()
52 {
53     const Options& options = Options::GetInstance();
54     String dir = options.GetGenerationDirectory();
55     String language = options.GetTargetLanguage();
56     bool isModeKernel = options.DoGenerateKernelCode();
57     String codePart = options.GetCodePart();
58 
59     for (auto& astPair : astModule_->GetAllAsts()) {
60         AutoPtr<AST> ast = astPair.second;
61         if (language.Equals("c")) {
62             GenerateCCode(ast, dir, codePart, isModeKernel);
63         } else if (language.Equals("cpp")) {
64             GenerateCppCode(ast, dir, codePart);
65         } else if (language.Equals("java")) {
66             GenerateJavaCode(ast, dir, codePart);
67         }
68     }
69 
70     return true;
71 }
72 
GenerateCCode(const AutoPtr<AST> & ast,const String & outDir,const String & codePart,bool isKernel)73 void CodeGenerator::GenerateCCode(const AutoPtr<AST>& ast, const String& outDir, const String& codePart, bool isKernel)
74 {
75     switch (ast->GetASTFileType()) {
76         case ASTFileType::AST_TYPES: {
77             cCodeEmitters_["types"]->OutPut(ast, outDir, isKernel);
78             break;
79         }
80         case ASTFileType::AST_IFACE: {
81             if (codePart.Equals("client")) {
82                 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
83                 cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel);
84                 break;
85             } else if (codePart.Equals("server")) {
86                 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
87                 cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel);
88                 cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel);
89                 cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel);
90                 break;
91             } else {
92                 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
93                 cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel);
94                 cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel);
95                 cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel);
96                 cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel);
97             }
98             break;
99         }
100         case ASTFileType::AST_ICALLBACK:
101             // khdf doesn't support callback
102             cCodeEmitters_["interface"]->OutPut(ast, outDir);
103             cCodeEmitters_["proxy"]->OutPut(ast, outDir);
104             cCodeEmitters_["driver"]->OutPut(ast, outDir);
105             cCodeEmitters_["stub"]->OutPut(ast, outDir);
106             cCodeEmitters_["impl"]->OutPut(ast, outDir);
107             break;
108         default:
109             break;
110     }
111 }
112 
GenerateCppCode(const AutoPtr<AST> & ast,const String & outDir,const String & codePart)113 void CodeGenerator::GenerateCppCode(const AutoPtr<AST>& ast, const String& outDir, const String& codePart)
114 {
115     switch (ast->GetASTFileType()) {
116         case ASTFileType::AST_TYPES:
117             cppCodeEmitters_["types"]->OutPut(ast, outDir);
118             break;
119         case ASTFileType::AST_IFACE: {
120             if (codePart.Equals("client")) {
121                 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
122                 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
123             } else if (codePart.Equals("server")) {
124                 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
125                 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
126                 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
127                 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
128             } else {
129                 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
130                 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
131                 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
132                 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
133                 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
134             }
135             break;
136         }
137         case ASTFileType::AST_ICALLBACK:
138             cppCodeEmitters_["interface"]->OutPut(ast, outDir);
139             cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
140             cppCodeEmitters_["driver"]->OutPut(ast, outDir);
141             cppCodeEmitters_["stub"]->OutPut(ast, outDir);
142             cppCodeEmitters_["impl"]->OutPut(ast, outDir);
143             break;
144         default:
145             break;
146     }
147 }
148 
GenerateJavaCode(const AutoPtr<AST> & ast,const String & outDir,const String & codePart)149 void CodeGenerator::GenerateJavaCode(const AutoPtr<AST>& ast, const String& outDir, const String& codePart)
150 {
151     switch (ast->GetASTFileType()) {
152         case ASTFileType::AST_IFACE:
153             javaCodeEmitters_["clientIface"]->OutPut(ast, outDir);
154             javaCodeEmitters_["proxy"]->OutPut(ast, outDir);
155             break;
156         case ASTFileType::AST_ICALLBACK:
157             javaCodeEmitters_["clientIface"]->OutPut(ast, outDir);
158             javaCodeEmitters_["proxy"]->OutPut(ast, outDir);
159             break;
160         default:
161             break;
162     }
163 }
164 } // namespace HDI
165 } // namespace OHOS