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/java_client_interface_code_emitter.h"
10 #include "util/file.h"
11 #include "util/logger.h"
12
13 namespace OHOS {
14 namespace HDI {
ResolveDirectory(const std::string & targetDirectory)15 bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const std::string &targetDirectory)
16 {
17 if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
18 directory_ = GetFileParentPath(targetDirectory);
19 } else {
20 return false;
21 }
22
23 if (!File::CreateParentDir(directory_)) {
24 Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.c_str());
25 return false;
26 }
27
28 return true;
29 }
30
EmitCode()31 void JavaClientInterfaceCodeEmitter::EmitCode()
32 {
33 EmitInterfaceFile();
34 }
35
EmitInterfaceFile()36 void JavaClientInterfaceCodeEmitter::EmitInterfaceFile()
37 {
38 std::string filePath =
39 File::AdapterPath(StringHelper::Format("%s/%s.java", directory_.c_str(), FileName(interfaceName_).c_str()));
40 File file(filePath, File::WRITE);
41 StringBuilder sb;
42
43 EmitLicense(sb);
44 EmitPackage(sb);
45 sb.Append("\n");
46 EmitInterfaceImports(sb);
47 sb.Append("\n");
48 EmitInterfaceDefinition(sb);
49
50 std::string data = sb.ToString();
51 file.WriteData(data.c_str(), data.size());
52 file.Flush();
53 file.Close();
54 }
55
EmitInterfaceImports(StringBuilder & sb)56 void JavaClientInterfaceCodeEmitter::EmitInterfaceImports(StringBuilder &sb)
57 {
58 EmitInterfaceCorelibImports(sb);
59 EmitInterfaceSelfDefinedTypeImports(sb);
60 EmitInterfaceDBinderImports(sb);
61 }
62
EmitInterfaceCorelibImports(StringBuilder & sb)63 void JavaClientInterfaceCodeEmitter::EmitInterfaceCorelibImports(StringBuilder &sb)
64 {
65 bool includeList = false;
66 bool includeMap = false;
67
68 const AST::TypeStringMap &types = ast_->GetTypes();
69 for (const auto &pair : types) {
70 AutoPtr<ASTType> type = pair.second;
71 switch (type->GetTypeKind()) {
72 case TypeKind::TYPE_LIST: {
73 if (!includeList) {
74 sb.Append("import java.util.List;\n");
75 includeList = true;
76 }
77 break;
78 }
79 case TypeKind::TYPE_MAP: {
80 if (!includeMap) {
81 sb.Append("import java.util.Map;\n");
82 sb.Append("import java.util.HashMap;\n");
83 includeMap = true;
84 }
85 break;
86 }
87 default:
88 break;
89 }
90 }
91 }
92
EmitInterfaceDBinderImports(StringBuilder & sb)93 void JavaClientInterfaceCodeEmitter::EmitInterfaceDBinderImports(StringBuilder &sb)
94 {
95 sb.Append("import ohos.rpc.IRemoteBroker;\n");
96 sb.Append("import ohos.rpc.RemoteException;\n");
97 }
98
EmitInterfaceSelfDefinedTypeImports(StringBuilder & sb)99 void JavaClientInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeImports(StringBuilder &sb)
100 {
101 for (const auto &importPair : ast_->GetImports()) {
102 AutoPtr<AST> import = importPair.second;
103 sb.AppendFormat("import %s;\n", import->GetFullName().c_str());
104 }
105 }
106
EmitInterfaceDefinition(StringBuilder & sb)107 void JavaClientInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder &sb)
108 {
109 sb.AppendFormat("public interface %s extends IRemoteBroker {\n", interface_->GetName().c_str());
110 EmitInterfaceMethods(sb, TAB);
111 sb.Append("}");
112 }
113
EmitInterfaceMethods(StringBuilder & sb,const std::string & prefix)114 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder &sb, const std::string &prefix)
115 {
116 for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
117 AutoPtr<ASTMethod> method = interface_->GetMethod(i);
118 EmitInterfaceMethod(method, sb, prefix);
119 if (i + 1 < interface_->GetMethodNumber()) {
120 sb.Append("\n");
121 }
122 }
123 }
124
EmitInterfaceMethod(const AutoPtr<ASTMethod> & method,StringBuilder & sb,const std::string & prefix)125 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethod(
126 const AutoPtr<ASTMethod> &method, StringBuilder &sb, const std::string &prefix)
127 {
128 if (method->GetParameterNumber() == 0) {
129 sb.Append(prefix).AppendFormat("int %s() throws RemoteException;\n", MethodName(method->GetName()).c_str());
130 } else {
131 StringBuilder paramStr;
132 paramStr.Append(prefix).AppendFormat("int %s(", MethodName(method->GetName()).c_str());
133 for (size_t i = 0; i < method->GetParameterNumber(); i++) {
134 AutoPtr<ASTParameter> param = method->GetParameter(i);
135 EmitInterfaceMethodParameter(param, paramStr, "");
136 if (i + 1 < method->GetParameterNumber()) {
137 paramStr.Append(", ");
138 }
139 }
140
141 paramStr.Append(") throws RemoteException;");
142 sb.Append(SpecificationParam(paramStr, prefix + TAB));
143 sb.Append("\n");
144 }
145 }
146
EmitInterfaceMethodParameter(const AutoPtr<ASTParameter> & param,StringBuilder & sb,const std::string & prefix)147 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethodParameter(
148 const AutoPtr<ASTParameter> ¶m, StringBuilder &sb, const std::string &prefix)
149 {
150 sb.Append(prefix).Append(param->EmitJavaParameter());
151 }
152 } // namespace HDI
153 } // namespace OHOS