• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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_client_proxy_code_emitter.h"
11 #include "codegen/c_custom_types_code_emitter.h"
12 #include "codegen/c_interface_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_client_proxy_code_emitter.h"
17 #include "codegen/cpp_custom_types_code_emitter.h"
18 #include "codegen/cpp_interface_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     std::string dir = options.GetGenerationDirectory();
55     Options::Language language = options.GetTargetLanguage();
56     bool isModeKernel = options.DoGenerateKernelCode();
57     std::string codePart = options.GetCodePart();
58 
59     for (const auto &astPair : allAst_) {
60         AutoPtr<AST> ast = astPair.second;
61         switch (language) {
62             case Options::Language::C:
63                 GenerateCCode(ast, dir, codePart, isModeKernel);
64                 break;
65             case Options::Language::CPP:
66                 GenerateCppCode(ast, dir, codePart);
67                 break;
68             case Options::Language::JAVA:
69                 GenerateJavaCode(ast, dir, codePart);
70                 break;
71             default:
72                 break;
73         }
74     }
75 
76     return true;
77 }
78 
GenerateCCode(const AutoPtr<AST> & ast,const std::string & outDir,const std::string & codePart,bool isKernel)79 void CodeGenerator::GenerateCCode(
80     const AutoPtr<AST> &ast, const std::string &outDir, const std::string &codePart, bool isKernel)
81 {
82     switch (ast->GetASTFileType()) {
83         case ASTFileType::AST_TYPES: {
84             cCodeEmitters_["types"]->OutPut(ast, outDir, isKernel);
85             break;
86         }
87         case ASTFileType::AST_IFACE: {
88             if (codePart == "client") {
89                 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
90                 cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel);
91                 break;
92             } else if (codePart == "server") {
93                 cCodeEmitters_["interface"]->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                 break;
98             } else {
99                 cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel);
100                 cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel);
101                 cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel);
102                 cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel);
103                 cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel);
104             }
105             break;
106         }
107         case ASTFileType::AST_ICALLBACK:
108             // khdf doesn't support callback
109             cCodeEmitters_["interface"]->OutPut(ast, outDir);
110             cCodeEmitters_["proxy"]->OutPut(ast, outDir);
111             cCodeEmitters_["driver"]->OutPut(ast, outDir);
112             cCodeEmitters_["stub"]->OutPut(ast, outDir);
113             cCodeEmitters_["impl"]->OutPut(ast, outDir);
114             break;
115         default:
116             break;
117     }
118 }
119 
GenerateCppCode(const AutoPtr<AST> & ast,const std::string & outDir,const std::string & codePart)120 void CodeGenerator::GenerateCppCode(const AutoPtr<AST> &ast, const std::string &outDir, const std::string &codePart)
121 {
122     switch (ast->GetASTFileType()) {
123         case ASTFileType::AST_TYPES:
124             cppCodeEmitters_["types"]->OutPut(ast, outDir);
125             break;
126         case ASTFileType::AST_IFACE: {
127             if (codePart == "client") {
128                 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
129                 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
130             } else if (codePart == "server") {
131                 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
132                 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
133                 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
134                 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
135             } else {
136                 cppCodeEmitters_["interface"]->OutPut(ast, outDir);
137                 cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
138                 cppCodeEmitters_["driver"]->OutPut(ast, outDir);
139                 cppCodeEmitters_["stub"]->OutPut(ast, outDir);
140                 cppCodeEmitters_["impl"]->OutPut(ast, outDir);
141             }
142             break;
143         }
144         case ASTFileType::AST_ICALLBACK:
145             cppCodeEmitters_["interface"]->OutPut(ast, outDir);
146             cppCodeEmitters_["proxy"]->OutPut(ast, outDir);
147             cppCodeEmitters_["driver"]->OutPut(ast, outDir);
148             cppCodeEmitters_["stub"]->OutPut(ast, outDir);
149             cppCodeEmitters_["impl"]->OutPut(ast, outDir);
150             break;
151         default:
152             break;
153     }
154 }
155 
GenerateJavaCode(const AutoPtr<AST> & ast,const std::string & outDir,const std::string & codePart)156 void CodeGenerator::GenerateJavaCode(const AutoPtr<AST> &ast, const std::string &outDir, const std::string &codePart)
157 {
158     switch (ast->GetASTFileType()) {
159         case ASTFileType::AST_IFACE:
160             javaCodeEmitters_["clientIface"]->OutPut(ast, outDir);
161             javaCodeEmitters_["proxy"]->OutPut(ast, outDir);
162             break;
163         case ASTFileType::AST_ICALLBACK:
164             javaCodeEmitters_["clientIface"]->OutPut(ast, outDir);
165             javaCodeEmitters_["proxy"]->OutPut(ast, outDir);
166             break;
167         default:
168             break;
169     }
170 }
171 } // namespace HDI
172 } // namespace OHOS