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