• 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/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 String & targetDirectory)15 bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory)
16 {
17     if (ast_->GetASTFileType() == ASTFileType::AST_IFACE ||
18         ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
19         directory_ = GetFilePath(targetDirectory);
20     } else {
21         return false;
22     }
23 
24     if (!File::CreateParentDir(directory_)) {
25         Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string());
26         return false;
27     }
28 
29     return true;
30 }
31 
EmitCode()32 void JavaClientInterfaceCodeEmitter::EmitCode()
33 {
34     EmitInterfaceFile();
35 }
36 
EmitInterfaceFile()37 void JavaClientInterfaceCodeEmitter::EmitInterfaceFile()
38 {
39     String filePath = String::Format("%s/%s.java", directory_.string(), FileName(interfaceName_).string());
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     String data = sb.ToString();
51     file.WriteData(data.string(), data.GetLength());
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().string());
104     }
105 }
106 
EmitInterfaceDefinition(StringBuilder & sb)107 void JavaClientInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb)
108 {
109     sb.AppendFormat("public interface %s extends IRemoteBroker {\n", interface_->GetName().string());
110     EmitInterfaceMethods(sb, g_tab);
111     sb.Append("}");
112 }
113 
EmitInterfaceMethods(StringBuilder & sb,const String & prefix)114 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder& sb, const 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 String & prefix)125 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr<ASTMethod>& method, StringBuilder& sb,
126     const String& prefix)
127 {
128     if (method->GetParameterNumber() == 0) {
129         sb.Append(prefix).AppendFormat("int %s() throws RemoteException;\n", MethodName(method->GetName()).string());
130     } else {
131         StringBuilder paramStr;
132         paramStr.Append(prefix).AppendFormat("int %s(", MethodName(method->GetName()).string());
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 + g_tab));
143         sb.Append("\n");
144     }
145 }
146 
EmitInterfaceMethodParameter(const AutoPtr<ASTParameter> & param,StringBuilder & sb,const String & prefix)147 void JavaClientInterfaceCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr<ASTParameter>& param,
148     StringBuilder& sb, const String& prefix)
149 {
150     sb.Append(prefix).Append(param->EmitJavaParameter());
151 }
152 } // namespace HDI
153 } // namespace OHOS