diff --git a/tools/hdi-gen/ast/ast.h b/tools/hdi-gen/ast/ast.h index 5804b77e..d3a42fe0 100755 --- a/tools/hdi-gen/ast/ast.h +++ b/tools/hdi-gen/ast/ast.h @@ -171,4 +171,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_AST_H +#endif // OHOS_HDI_AST_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index 2f1404a3..e79d33d9 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -119,23 +119,9 @@ void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& nam sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } else { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); + sb.Append("\n"); + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String cpName = String::Format("%sCp", name.string()); @@ -175,25 +161,10 @@ void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), - elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } else { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); + sb.Append("\n"); sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sCp", name.string()); elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); @@ -356,5 +327,180 @@ void ASTArrayType::EmitCppUnMarshalling(const String& parcelName, const String& } sb.Append(prefix).Append("}\n"); } + +void ASTArrayType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); + + sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); + + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING + || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : + String::Format("%s[i]", varName.string()); + elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab).Append("}\n"); + } + + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + if (isClient) { + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + } + + sb.Append(prefix).Append("}\n"); +} + +void ASTArrayType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); + sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); + sb.Append(prefix).Append("} else { \n"); + EmitJavaWriteArrayVar(parcelName, name, sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTArrayType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + switch (elementType_->GetTypeKind()) { + case TypeKind::TYPE_BOOLEAN: + sb.Append(prefix).AppendFormat("%s.readBooleanArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_BYTE: + sb.Append(prefix).AppendFormat("%s.readByteArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SHORT: + sb.Append(prefix).AppendFormat("%s.readShortArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_INT: + case TypeKind::TYPE_FILEDESCRIPTOR: + sb.Append(prefix).AppendFormat("%s.readIntArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_LONG: + sb.Append(prefix).AppendFormat("%s.readLongArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_FLOAT: + sb.Append(prefix).AppendFormat("%s.readFloatArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_DOUBLE: + sb.Append(prefix).AppendFormat("%s.readDoubleArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_STRING: + sb.Append(prefix).AppendFormat("%s.readStringArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SEQUENCEABLE: + sb.Append(prefix).AppendFormat("%s.readSequenceableArray(%s);\n", parcelName.string(), name.string()); + break; + default: + break; + } +} + +void ASTArrayType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + switch (elementType_->GetTypeKind()) { + case TypeKind::TYPE_BOOLEAN: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readBooleanArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_BYTE: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readByteArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_SHORT: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readShortArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_INT: + case TypeKind::TYPE_FILEDESCRIPTOR: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readIntArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_LONG: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readLongArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_FLOAT: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readFloatArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_DOUBLE: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readDoubleArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_STRING: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readStringArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_SEQUENCEABLE: + sb.Append(prefix).AppendFormat("int size = %s.readInt();\n", parcelName.string()); + sb.Append(prefix).AppendFormat("%s %s = new %s[size];\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), + elementType_->EmitJavaType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < size; ++i) {\n"); + elementType_->EmitJavaReadInnerVar(parcelName, "value", true, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s[i] = value;\n", name.string()); + sb.Append(prefix).Append("}\n"); + break; + default: + break; + } +} + +void ASTArrayType::EmitJavaWriteArrayVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + switch (elementType_->GetTypeKind()) { + case TypeKind::TYPE_BOOLEAN: + sb.Append(prefix).AppendFormat("%s.writeBooleanArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_BYTE: + sb.Append(prefix).AppendFormat("%s.writeByteArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SHORT: + sb.Append(prefix).AppendFormat("%s.writeShortArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_INT: + case TypeKind::TYPE_FILEDESCRIPTOR: + sb.Append(prefix).AppendFormat("%s.writeIntArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_LONG: + sb.Append(prefix).AppendFormat("%s.writeLongArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_FLOAT: + sb.Append(prefix).AppendFormat("%s.writeFloatArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_DOUBLE: + sb.Append(prefix).AppendFormat("%s.writeDoubleArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_STRING: + sb.Append(prefix).AppendFormat("%s.writeStringArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SEQUENCEABLE: + sb.Append(prefix).AppendFormat("%s.writeSequenceableArray(%s);\n", parcelName.string(), name.string()); + break; + default: + break; + } +} + +void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenVarName = isClient ? String::Format("*%s", lenName.string()) : lenName; + + sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", varName.string(), + elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenVarName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n"); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index 9518cc66..968b0c82 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -62,7 +62,25 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: + void EmitJavaWriteArrayVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + + void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + AutoPtr elementType_; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_boolean_type.cpp b/tools/hdi-gen/ast/ast_boolean_type.cpp index 36cd2ff6..956854bb 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.cpp +++ b/tools/hdi-gen/ast/ast_boolean_type.cpp @@ -161,5 +161,24 @@ void ASTBooleanType::EmitCppUnMarshalling(const String& parcelName, const String name.string(), parcelName.string()); } } + +void ASTBooleanType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeBoolean(%s);\n", parcelName.string(), name.string()); +} + +void ASTBooleanType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readBoolean();\n", name.string(), parcelName.string()); +} + +void ASTBooleanType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readBoolean();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_boolean_type.h b/tools/hdi-gen/ast/ast_boolean_type.h index f88890d2..ebc90802 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.h +++ b/tools/hdi-gen/ast/ast_boolean_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTBOOLEANTYPE_H +#endif // OHOS_HDI_ASTBOOLEANTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_byte_type.cpp b/tools/hdi-gen/ast/ast_byte_type.cpp index 81f827ea..fb114c3b 100755 --- a/tools/hdi-gen/ast/ast_byte_type.cpp +++ b/tools/hdi-gen/ast/ast_byte_type.cpp @@ -158,5 +158,24 @@ void ASTByteType::EmitCppUnMarshalling(const String& parcelName, const String& n sb.Append(prefix).AppendFormat("%s = %s.ReadInt8();\n", name.string(), parcelName.string()); } } + +void ASTByteType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeByte(%s);\n", parcelName.string(), name.string()); +} + +void ASTByteType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readByte();\n", name.string(), parcelName.string()); +} + +void ASTByteType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readByte();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_byte_type.h b/tools/hdi-gen/ast/ast_byte_type.h index 8170cfee..d5b2cda3 100755 --- a/tools/hdi-gen/ast/ast_byte_type.h +++ b/tools/hdi-gen/ast/ast_byte_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTBYTETYPE_H +#endif // OHOS_HDI_ASTBYTETYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_double_type.cpp b/tools/hdi-gen/ast/ast_double_type.cpp index 35c63e8d..bf6820a4 100755 --- a/tools/hdi-gen/ast/ast_double_type.cpp +++ b/tools/hdi-gen/ast/ast_double_type.cpp @@ -157,5 +157,24 @@ void ASTDoubleType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix).AppendFormat("%s = %s.ReadDouble();\n", name.string(), parcelName.string()); } } + +void ASTDoubleType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeDouble(%s);\n", parcelName.string(), name.string()); +} + +void ASTDoubleType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readDouble();\n", name.string(), parcelName.string()); +} + +void ASTDoubleType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readDouble();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_double_type.h b/tools/hdi-gen/ast/ast_double_type.h index 33e9f939..545482d8 100755 --- a/tools/hdi-gen/ast/ast_double_type.h +++ b/tools/hdi-gen/ast/ast_double_type.h @@ -52,6 +52,15 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/ast/ast_fd_type.cpp b/tools/hdi-gen/ast/ast_fd_type.cpp index 3f0d70f8..deb7b3e5 100755 --- a/tools/hdi-gen/ast/ast_fd_type.cpp +++ b/tools/hdi-gen/ast/ast_fd_type.cpp @@ -167,5 +167,24 @@ void ASTFdType::EmitCppUnMarshalling(const String& parcelName, const String& nam sb.Append(prefix).AppendFormat("%s = %s.ReadFileDescriptor();\n", name.string(), parcelName.string()); } } + +void ASTFdType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s);\n", parcelName.string(), name.string()); +} + +void ASTFdType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readInt();\n", name.string(), parcelName.string()); +} + +void ASTFdType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readInt();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_fd_type.h b/tools/hdi-gen/ast/ast_fd_type.h index ed775c80..ca6eed64 100755 --- a/tools/hdi-gen/ast/ast_fd_type.h +++ b/tools/hdi-gen/ast/ast_fd_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_FDTYPE_H +#endif // OHOS_HDI_FDTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_float_type.cpp b/tools/hdi-gen/ast/ast_float_type.cpp index 1d75ed45..b4dd4544 100755 --- a/tools/hdi-gen/ast/ast_float_type.cpp +++ b/tools/hdi-gen/ast/ast_float_type.cpp @@ -157,5 +157,24 @@ void ASTFloatType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix).AppendFormat("%s = %s.ReadFloat();\n", name.string(), parcelName.string()); } } + +void ASTFloatType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeFloat(%s);\n", parcelName.string(), name.string()); +} + +void ASTFloatType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readFloat();\n", name.string(), parcelName.string()); +} + +void ASTFloatType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readFloat();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_float_type.h b/tools/hdi-gen/ast/ast_float_type.h index dee30553..cb0b07f5 100755 --- a/tools/hdi-gen/ast/ast_float_type.h +++ b/tools/hdi-gen/ast/ast_float_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTFLOATTYPE_H +#endif // OHOS_HDI_ASTFLOATTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_integer_type.cpp b/tools/hdi-gen/ast/ast_integer_type.cpp index 00f73158..62d19751 100755 --- a/tools/hdi-gen/ast/ast_integer_type.cpp +++ b/tools/hdi-gen/ast/ast_integer_type.cpp @@ -157,5 +157,24 @@ void ASTIntegerType::EmitCppUnMarshalling(const String& parcelName, const String sb.Append(prefix).AppendFormat("%s = %s.ReadInt32();\n", name.string(), parcelName.string()); } } + +void ASTIntegerType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s);\n", parcelName.string(), name.string()); +} + +void ASTIntegerType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readInt();\n", name.string(), parcelName.string()); +} + +void ASTIntegerType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readInt();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_integer_type.h b/tools/hdi-gen/ast/ast_integer_type.h index aced5896..5ed7723b 100755 --- a/tools/hdi-gen/ast/ast_integer_type.h +++ b/tools/hdi-gen/ast/ast_integer_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTINTEGERTYPE_H +#endif // OHOS_HDI_ASTINTEGERTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index ddd56c9a..850f7f6c 100755 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -180,5 +180,28 @@ void ASTInterfaceType::EmitCppReadVar(const String& parcelName, const String& na name.string(), name_.string(), parcelName.string()); } } + +void ASTInterfaceType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s.asObject());\n", parcelName.string(), + name.string()); +} + +void ASTInterfaceType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + String stubName = name_.StartsWith("I") ? (name_.Substring(1) + "Stub") : (name_ + "Stub"); + sb.Append(prefix).AppendFormat("%s = %s.asInterface(%s.readRemoteObject());\n", + name.string(), stubName.string(), parcelName.string()); +} + +void ASTInterfaceType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + String stubName = name_.StartsWith("I") ? (name_.Substring(1) + "Stub") : (name_ + "Stub"); + sb.Append(prefix).AppendFormat("%s %s = %s.asInterface(%s.readRemoteObject());\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), stubName.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_interface_type.h b/tools/hdi-gen/ast/ast_interface_type.h index 52673d20..7d3f1154 100755 --- a/tools/hdi-gen/ast/ast_interface_type.h +++ b/tools/hdi-gen/ast/ast_interface_type.h @@ -106,6 +106,15 @@ public: void EmitCppReadVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool initVariable, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: String license_; bool isOneWay_ = false; @@ -117,4 +126,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTINTERFACETYPE_H +#endif // OHOS_HDI_ASTINTERFACETYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index 4c8392ed..a634ae15 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -110,7 +110,7 @@ void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, co void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { -String lenName = String::Format("%sLen", name.string()); + String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( @@ -119,23 +119,9 @@ String lenName = String::Format("%sLen", name.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } else { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); + sb.Append("\n"); + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String cpName = String::Format("%sCp", name.string()); @@ -166,6 +152,7 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( @@ -175,25 +162,10 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), - elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } else { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); + sb.Append("\n"); sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sCp", name.string()); elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); @@ -358,5 +330,76 @@ void ASTListType::EmitCppUnMarshalling(const String& parcelName, const String& n } sb.Append(prefix).Append("}\n"); } + +void ASTListType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); + + sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING + || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : + String::Format("%s[i]", varName.string()); + elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab).Append("}\n"); + } + + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + if (isClient) { + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + } + + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); + sb.Append(prefix).AppendFormat("for (%s element : %s) {\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string()); + elementType_->EmitJavaWriteVar(parcelName, "element", sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + + elementType_->EmitJavaReadInnerVar(parcelName, "value", false, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = new Array%s();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), EmitJavaType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + elementType_->EmitJavaReadInnerVar(parcelName, "value", true, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenVarName = isClient ? String::Format("*%s", lenName.string()) : lenName; + + sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", varName.string(), + elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenVarName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n"); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index 02d5e3c0..fd90497e 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -63,10 +63,25 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: + void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + AutoPtr elementType_ = nullptr; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTLISTTYPE_H +#endif // OHOS_HDI_ASTLISTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_long_type.cpp b/tools/hdi-gen/ast/ast_long_type.cpp index 7cf51b79..fa0cd6f2 100755 --- a/tools/hdi-gen/ast/ast_long_type.cpp +++ b/tools/hdi-gen/ast/ast_long_type.cpp @@ -157,5 +157,24 @@ void ASTLongType::EmitCppUnMarshalling(const String& parcelName, const String& n sb.Append(prefix).AppendFormat("%s = %s.ReadInt64();\n", name.string(), parcelName.string()); } } + +void ASTLongType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeLong(%s);\n", parcelName.string(), name.string()); +} + +void ASTLongType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readLong();\n", name.string(), parcelName.string()); +} + +void ASTLongType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readLong();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_long_type.h b/tools/hdi-gen/ast/ast_long_type.h index 355302f7..130a4bbe 100755 --- a/tools/hdi-gen/ast/ast_long_type.h +++ b/tools/hdi-gen/ast/ast_long_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTLONGTYPE_H +#endif // OHOS_HDI_ASTLONGTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_map_type.cpp b/tools/hdi-gen/ast/ast_map_type.cpp index 999ae841..4fcd823e 100755 --- a/tools/hdi-gen/ast/ast_map_type.cpp +++ b/tools/hdi-gen/ast/ast_map_type.cpp @@ -129,5 +129,44 @@ void ASTMapType::EmitCppUnMarshalling(const String& parcelName, const String& na name.string(), KeyName.string(), valueName.string()); sb.Append(prefix).Append("}\n"); } + +void ASTMapType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); + sb.Append(prefix).AppendFormat("for (Map.Entry<%s, %s> entry : %s.entrySet()) {\n", + keyType_->EmitJavaType(TypeMode::NO_MODE, true).string(), + valueType_->EmitJavaType(TypeMode::NO_MODE, true).string(), name.string()); + keyType_->EmitJavaWriteVar(parcelName, "entry.getKey()", sb, prefix + g_tab); + valueType_->EmitJavaWriteVar(parcelName, "entry.getValue()", sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTMapType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + + keyType_->EmitJavaReadInnerVar(parcelName, "key", false, sb, prefix + g_tab); + valueType_->EmitJavaReadInnerVar(parcelName, "value", false, sb, prefix + g_tab); + + sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTMapType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = new Hash%s();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), EmitJavaType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + + keyType_->EmitJavaReadInnerVar(parcelName, "key", true, sb, prefix + g_tab); + valueType_->EmitJavaReadInnerVar(parcelName, "value", true, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_map_type.h b/tools/hdi-gen/ast/ast_map_type.h index 44c011a1..b020d599 100755 --- a/tools/hdi-gen/ast/ast_map_type.h +++ b/tools/hdi-gen/ast/ast_map_type.h @@ -59,6 +59,15 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: AutoPtr keyType_; AutoPtr valueType_; diff --git a/tools/hdi-gen/ast/ast_method.h b/tools/hdi-gen/ast/ast_method.h index fd157b22..9b4a21d0 100755 --- a/tools/hdi-gen/ast/ast_method.h +++ b/tools/hdi-gen/ast/ast_method.h @@ -82,4 +82,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTMETHOD_H +#endif // OHOS_HDI_ASTMETHOD_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_namespace.h b/tools/hdi-gen/ast/ast_namespace.h index 26944c59..b3d6fc96 100755 --- a/tools/hdi-gen/ast/ast_namespace.h +++ b/tools/hdi-gen/ast/ast_namespace.h @@ -75,4 +75,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTNAMESPACE_H +#endif // OHOS_HDI_ASTNAMESPACE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_node.h b/tools/hdi-gen/ast/ast_node.h index 0aebbaaf..5f894f61 100755 --- a/tools/hdi-gen/ast/ast_node.h +++ b/tools/hdi-gen/ast/ast_node.h @@ -25,4 +25,4 @@ public: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTNODE_H +#endif // OHOS_HDI_ASTNODE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_parameter.cpp b/tools/hdi-gen/ast/ast_parameter.cpp index 462b757e..1e87e1b2 100755 --- a/tools/hdi-gen/ast/ast_parameter.cpp +++ b/tools/hdi-gen/ast/ast_parameter.cpp @@ -215,5 +215,27 @@ void ASTParameter::EmitCWriteVar(const String& parcelName, const String& gotoLab type_->EmitCWriteVar(parcelName, name_, gotoLabel, sb, prefix); } + +void ASTParameter::EmitJavaWriteVar(const String& parcelName, StringBuilder& sb, const String& prefix) const +{ + if (attribute_ == ParamAttr::PARAM_IN) { + type_->EmitJavaWriteVar(parcelName, name_, sb, prefix); + } else { + if (type_->GetTypeKind() == TypeKind::TYPE_ARRAY) { + sb.Append(prefix).AppendFormat("if (%s == null) {\n", name_.string()); + sb.Append(prefix + g_tab).AppendFormat("%s.writeInt(-1);\n", parcelName.string()); + sb.Append(prefix).Append("} else {\n"); + sb.Append(prefix + g_tab).AppendFormat("%s.writeInt(%s.length);\n", parcelName.string(), name_.string()); + sb.Append(prefix).Append("}\n"); + } + } +} + +void ASTParameter::EmitJavaReadVar(const String& parcelName, StringBuilder& sb, const String& prefix) const +{ + if (attribute_ == ParamAttr::PARAM_OUT) { + type_->EmitJavaReadVar(parcelName, name_, sb, prefix); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_parameter.h b/tools/hdi-gen/ast/ast_parameter.h index 6ecc3528..97e4cd22 100755 --- a/tools/hdi-gen/ast/ast_parameter.h +++ b/tools/hdi-gen/ast/ast_parameter.h @@ -70,6 +70,10 @@ public: void EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + + void EmitJavaWriteVar(const String& parcelName, StringBuilder& sb, const String& prefix) const; + + void EmitJavaReadVar(const String& parcelName, StringBuilder& sb, const String& prefix) const; private: String name_; AutoPtr type_ = nullptr; @@ -78,4 +82,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTPARAMETER_H +#endif // OHOS_HDI_ASTPARAMETER_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_sequenceable_type.cpp b/tools/hdi-gen/ast/ast_sequenceable_type.cpp index fd44c906..dac9ef18 100755 --- a/tools/hdi-gen/ast/ast_sequenceable_type.cpp +++ b/tools/hdi-gen/ast/ast_sequenceable_type.cpp @@ -125,5 +125,40 @@ void ASTSequenceableType::EmitCppUnMarshalling(const String& parcelName, const S name.string(), parcelName.string(), name_.string()); } } + +void ASTSequenceableType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + if (EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { + sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s);\n", parcelName.string(), name.string()); + return; + } + sb.Append(prefix).AppendFormat("%s.writeSequenceable(%s);\n", parcelName.string(), name.string()); +} + +void ASTSequenceableType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + if (EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { + sb.Append(prefix).AppendFormat("%s = %s.readRemoteObject();\n", name.string(), parcelName.string()); + return; + } + sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); +} + +void ASTSequenceableType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + if (!isInner && EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { + sb.Append(prefix).AppendFormat("IRemoteObject %s = %s.readRemoteObject();\n", + name.string(), parcelName.string()); + return; + } + if (!isInner) { + sb.Append(prefix).AppendFormat("%s %s = new %s();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), EmitJavaType(TypeMode::NO_MODE).string()); + } + sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_sequenceable_type.h b/tools/hdi-gen/ast/ast_sequenceable_type.h index 92539424..8a1b2826 100755 --- a/tools/hdi-gen/ast/ast_sequenceable_type.h +++ b/tools/hdi-gen/ast/ast_sequenceable_type.h @@ -44,8 +44,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTSEQUENCEABLETYPE_H +#endif // OHOS_HDI_ASTSEQUENCEABLETYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_short_type.cpp b/tools/hdi-gen/ast/ast_short_type.cpp index 0b1c5e99..9f2b4eea 100755 --- a/tools/hdi-gen/ast/ast_short_type.cpp +++ b/tools/hdi-gen/ast/ast_short_type.cpp @@ -158,5 +158,24 @@ void ASTShortType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix).AppendFormat("%s = %s.ReadInt16();\n", name.string(), parcelName.string()); } } + +void ASTShortType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeShort(%s);\n", parcelName.string(), name.string()); +} + +void ASTShortType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readShort();\n", name.string(), parcelName.string()); +} + +void ASTShortType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readShort();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_short_type.h b/tools/hdi-gen/ast/ast_short_type.h index 51e5e2f5..1b5e7642 100755 --- a/tools/hdi-gen/ast/ast_short_type.h +++ b/tools/hdi-gen/ast/ast_short_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTSHORTTYPE_H +#endif // OHOS_HDI_ASTSHORTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_string_type.cpp b/tools/hdi-gen/ast/ast_string_type.cpp index 2e6cf5df..a3c891b1 100755 --- a/tools/hdi-gen/ast/ast_string_type.cpp +++ b/tools/hdi-gen/ast/ast_string_type.cpp @@ -163,5 +163,34 @@ void ASTStringType::EmitCppUnMarshalling(const String& parcelName, const String& name.string(), parcelName.string()); } } + +void ASTStringType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTStringType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeString(%s);\n", parcelName.string(), name.string()); +} + +void ASTStringType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readString();\n", name.string(), parcelName.string()); +} + +void ASTStringType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readString();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_string_type.h b/tools/hdi-gen/ast/ast_string_type.h index 828bfe6f..55f67076 100755 --- a/tools/hdi-gen/ast/ast_string_type.h +++ b/tools/hdi-gen/ast/ast_string_type.h @@ -52,8 +52,20 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTSTRINGTYPE_H +#endif // OHOS_HDI_ASTSTRINGTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_struct_type.cpp b/tools/hdi-gen/ast/ast_struct_type.cpp index c56ce8d4..474c12d6 100755 --- a/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/tools/hdi-gen/ast/ast_struct_type.cpp @@ -249,5 +249,19 @@ void ASTStructType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } + +void ASTStructType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + if (ownership) { + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%sFree(%s, true);\n", name_.string(), varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).Append("}\n"); + } else { + sb.Append(prefix).AppendFormat("%sFree(&%s, false);\n", name_.string(), name.string()); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_struct_type.h b/tools/hdi-gen/ast/ast_struct_type.h index 7da3850f..3eb3f246 100755 --- a/tools/hdi-gen/ast/ast_struct_type.h +++ b/tools/hdi-gen/ast/ast_struct_type.h @@ -117,6 +117,9 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; private: bool isFull_ = false; bool isLite_ = false; diff --git a/tools/hdi-gen/ast/ast_type.cpp b/tools/hdi-gen/ast/ast_type.cpp index b6b158b4..61b859e8 100755 --- a/tools/hdi-gen/ast/ast_type.cpp +++ b/tools/hdi-gen/ast/ast_type.cpp @@ -232,5 +232,29 @@ void ASTType::EmitCppUnMarshalling(const String& parcelName, const String& name, { sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); } + +void ASTType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + // only String, Array, List, struct and union type need recycle memory +} + +void ASTType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Writeing \"%s\" type of data is not supported\n", name_.string()); +} + +void ASTType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); +} + +void ASTType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_type.h b/tools/hdi-gen/ast/ast_type.h index f96725df..7e8cdd4a 100755 --- a/tools/hdi-gen/ast/ast_type.h +++ b/tools/hdi-gen/ast/ast_type.h @@ -151,6 +151,18 @@ public: virtual void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const; + + virtual void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const; + + virtual void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + + virtual void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + + virtual void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const; protected: String name_; AutoPtr namespace_; @@ -159,4 +171,4 @@ protected: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTTYPE_H +#endif // OHOS_HDI_ASTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_uint_type.h b/tools/hdi-gen/ast/ast_uint_type.h index 80ae8f2e..d33e9fcd 100755 --- a/tools/hdi-gen/ast/ast_uint_type.h +++ b/tools/hdi-gen/ast/ast_uint_type.h @@ -56,4 +56,4 @@ public: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTUINTTYPE_H +#endif // OHOS_HDI_ASTUINTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_ulong_type.h b/tools/hdi-gen/ast/ast_ulong_type.h index a53dbbf0..9d616eb9 100755 --- a/tools/hdi-gen/ast/ast_ulong_type.h +++ b/tools/hdi-gen/ast/ast_ulong_type.h @@ -56,4 +56,4 @@ public: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTULONGTYPE_H +#endif // OHOS_HDI_ASTULONGTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_union_type.cpp b/tools/hdi-gen/ast/ast_union_type.cpp index ee49a1c0..ea1404f6 100755 --- a/tools/hdi-gen/ast/ast_union_type.cpp +++ b/tools/hdi-gen/ast/ast_union_type.cpp @@ -262,5 +262,17 @@ void ASTUnionType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } + +void ASTUnionType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + if (ownership) { + String varName = isClient ? String::Format("*%s", name.string()) : name; + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).Append("}\n"); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_union_type.h b/tools/hdi-gen/ast/ast_union_type.h index bcd9acce..951e08ba 100755 --- a/tools/hdi-gen/ast/ast_union_type.h +++ b/tools/hdi-gen/ast/ast_union_type.h @@ -117,6 +117,9 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; private: bool isFull_ = false; bool isLite_ = false; diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp index 909d345d..7ddbd0db 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CClientInterfaceCodeEmitter::EmitCode() { EmitInterfaceHeaderFile(); @@ -19,20 +39,8 @@ void CClientInterfaceCodeEmitter::EmitCode() void CClientInterfaceCodeEmitter::EmitInterfaceHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.h b/tools/hdi-gen/codegen/c_client_interface_code_emitter.h index edf0b206..4a17f93f 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CClientInterfaceCodeEmitter : public CCodeEmitter { public: - CClientInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CCodeEmitter(ast, targetDirectory) {} + CClientInterfaceCodeEmitter() : CCodeEmitter() {} virtual ~CClientInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeaderFile(); void EmitImportInclusions(StringBuilder& sb); @@ -39,4 +40,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H +#endif // OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index 98d984ed..21f7e869 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CClientProxyCodeEmitter::CClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sclient.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_proxy.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CClientProxyCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CClientProxyCodeEmitter::EmitCode() @@ -31,13 +43,7 @@ void CClientProxyCodeEmitter::EmitCode() void CClientProxyCodeEmitter::EmitCbProxyHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(proxyName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CClientProxyCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -69,20 +75,8 @@ void CClientProxyCodeEmitter::EmitCbProxyMethodsDcl(StringBuilder& sb) void CClientProxyCodeEmitter::EmitProxySourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.c", directory_.string(), FileName(proxyName_).string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(proxyName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CClientProxyCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(proxyName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -203,19 +197,10 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); sb.Append("\n"); - sb.Append(prefix + g_tab).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append(prefix + g_tab).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append("\n"); - - sb.Append(prefix + g_tab).Append("if (data == NULL || reply == NULL) {\n"); - sb.Append(prefix + g_tab + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); - sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).Append("goto finished;\n"); - sb.Append(prefix + g_tab).Append("}\n"); + EmitCreateBuf(sb, prefix + g_tab); sb.Append("\n"); String gotoName = GetGotLabel(method); - for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { @@ -241,19 +226,37 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth } } - EmitErrorHandle(method, sb, prefix); - + EmitErrorHandle(method, "errors", true, sb, prefix); sb.Append(prefix).Append("finished:\n"); - sb.Append(prefix + g_tab).Append("if (data != NULL) {\n"); - sb.Append(prefix + g_tab + g_tab).Append("HdfSBufRecycle(data);\n"); - sb.Append(prefix + g_tab).Append("}\n"); - sb.Append(prefix + g_tab).Append("if (reply != NULL) {\n"); - sb.Append(prefix + g_tab + g_tab).Append("HdfSBufRecycle(reply);\n"); - sb.Append(prefix + g_tab).Append("}\n"); + EmitReleaseBuf(sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append("}\n"); } +void CClientProxyCodeEmitter::EmitCreateBuf(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append("\n"); + + sb.Append(prefix).Append("if (data == NULL || reply == NULL) {\n"); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).Append("goto finished;\n"); + sb.Append(prefix).Append("}\n"); +} + +void CClientProxyCodeEmitter::EmitReleaseBuf(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).Append("if (data != NULL) {\n"); + sb.Append(prefix + g_tab).Append("HdfSBufRecycle(data);\n"); + sb.Append(prefix).Append("}\n"); + sb.Append(prefix).Append("if (reply != NULL) {\n"); + sb.Append(prefix + g_tab).Append("HdfSBufRecycle(reply);\n"); + sb.Append(prefix).Append("}\n"); +} + void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) { @@ -308,110 +311,6 @@ String CClientProxyCodeEmitter::GetGotLabel(const AutoPtr& method) return labelName; } -void CClientProxyCodeEmitter::EmitErrorHandle(const AutoPtr& method, StringBuilder& sb, - const String& prefix) -{ - bool errorLabel = false; - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - AutoPtr paramType = param->GetType(); - if (param->GetAttribute() == ParamAttr::PARAM_OUT && - (paramType->GetTypeKind() == TypeKind::TYPE_STRING - || paramType->GetTypeKind() == TypeKind::TYPE_ARRAY - || paramType->GetTypeKind() == TypeKind::TYPE_LIST - || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT - || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { - if (!errorLabel) { - sb.Append(prefix + g_tab).Append("goto finished;\n"); - sb.Append("\n"); - sb.Append(prefix).Append("errors:\n"); - errorLabel = true; - } - - EmitError(paramType, param->GetName(), sb, prefix + g_tab); - sb.Append("\n"); - } - } -} - -void CClientProxyCodeEmitter::EmitError(const AutoPtr& type, const String& name, StringBuilder& sb, - const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: - case TypeKind::TYPE_UNION: { - sb.Append(prefix).AppendFormat("if (*%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - String lenName = String::Format("%sLen", name.string()); - sb.Append(prefix).AppendFormat("if (*%s > 0 && *%s != NULL) {\n", lenName.string(), name.string()); - - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); - String elementName = String::Format("(*%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_LIST: { - String lenName = String::Format("%sLen", name.string()); - sb.Append(prefix).AppendFormat("if (*%s > 0 && *%s != NULL) {\n", lenName.string(), name.string()); - - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); - String elementName = String::Format("(*%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("if (*%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("%sFree(*%s, true);\n", type->GetName().string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - default: - break; - } -} - void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb) { String objName; diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 59b1ccaf..42f83cc6 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CClientProxyCodeEmitter : public CCodeEmitter { public: - CClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CClientProxyCodeEmitter() : CCodeEmitter() {} virtual ~CClientProxyCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitCbProxyHeaderFile(); void EmitProxySourceFile(); @@ -39,15 +41,15 @@ private: void EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitCreateBuf(StringBuilder& sb, const String& prefix); + + void EmitReleaseBuf(StringBuilder& sb, const String& prefix); + void EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix); String GetGotLabel(const AutoPtr& method); - void EmitErrorHandle(const AutoPtr& method, StringBuilder& sb, const String& prefix); - - void EmitError(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix); - void EmitProxyConstruction(StringBuilder&); void EmitProxyGetMethodImpl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index b98e50c1..25edb716 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -11,18 +11,32 @@ #include #include -#include "util/logger.h" - namespace OHOS { namespace HDI { -CCodeEmitter::CCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :LightRefCountBase(), ast_(ast), directory_(targetDirectory) +bool CCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); + if (!Reset(ast, targetDirectory)) { + return false; } - if (interface_ != nullptr) { + EmitCode(); + return true; +} + +bool CCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) +{ + if (ast == nullptr) { + return false; + } + + if (targetDirectory.Equals("")) { + return false; + } + + CleanData(); + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); interfaceName_ = interface_->GetName(); interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; @@ -32,11 +46,33 @@ CCodeEmitter::CCodeEmitter(const AutoPtr& ast, const String& targetDirector stubName_ = infName_ + "Stub"; stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - ImplName_ = infName_ + "Service"; - ImplFullName_ = interface_->GetNamespace()->ToString() + ImplName_; - } else { + implName_ = infName_ + "Service"; + implFullName_ = interface_->GetNamespace()->ToString() + implName_; + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { infName_ = ast_->GetName(); } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void CCodeEmitter::CleanData() +{ + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; + stubName_ = ""; + stubFullName_ = ""; + implName_ = ""; + implFullName_ = ""; } String CCodeEmitter::FileName(const String& name) @@ -80,6 +116,42 @@ void CCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& par sb.Append(prefix).Append(parameter->EmitCParameter()); } +void CCodeEmitter::EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, + StringBuilder& sb, const String& prefix) +{ + if (!isClient) { + sb.Append(prefix).AppendFormat("%s:\n", gotoLabel.string()); + for (int i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr paramType = param->GetType(); + paramType->EmitMemoryRecycle(param->GetName(), isClient, true, sb, prefix + g_tab); + } + return; + } + + bool errorLabel = false; + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr paramType = param->GetType(); + if (param->GetAttribute() == ParamAttr::PARAM_OUT && + (paramType->GetTypeKind() == TypeKind::TYPE_STRING + || paramType->GetTypeKind() == TypeKind::TYPE_ARRAY + || paramType->GetTypeKind() == TypeKind::TYPE_LIST + || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT + || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { + if (!errorLabel) { + sb.Append(prefix + g_tab).Append("goto finished;\n"); + sb.Append("\n"); + sb.Append(prefix).AppendFormat("%s:\n", gotoLabel.string()); + errorLabel = true; + } + + paramType->EmitMemoryRecycle(param->GetName(), isClient, true, sb, prefix + g_tab); + sb.Append("\n"); + } + } +} + void CCodeEmitter::EmitLicense(StringBuilder& sb) { if (ast_->GetLicense().IsEmpty()) { diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index d2a61757..997cf230 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -20,30 +20,27 @@ namespace OHOS { namespace HDI { class CCodeEmitter : public LightRefCountBase { public: - CCodeEmitter(const AutoPtr& ast, const String& targetDirectory); - virtual ~CCodeEmitter() = default; - virtual void EmitCode() = 0; - - inline String GetSourceFile() - { - return sourceFileName_; - } - - inline bool isInvaildDir() - { - return directory_.Equals(""); - } + bool OutPut(const AutoPtr& ast, const String& targetDirectory); static String FileName(const String& name); - protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; void EmitInterfaceMethodCommands(StringBuilder& sb); void EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix); + void EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, StringBuilder& sb, + const String& prefix); + void EmitLicense(StringBuilder& sb); void EmitHeadMacro(StringBuilder& sb, const String& fullName); @@ -69,11 +66,9 @@ protected: String SpecificationParam(StringBuilder& sb, const String& prefix); - AutoPtr ast_; - AutoPtr interface_; - + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; String directory_; - String sourceFileName_; String interfaceName_; String interfaceFullName_; @@ -82,10 +77,10 @@ protected: String proxyFullName_; String stubName_; String stubFullName_; - String ImplName_; - String ImplFullName_; + String implName_; + String implFullName_; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_C_CODE_EMITTER_H +#endif // OHOS_HDI_C_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_code_generator.cpp b/tools/hdi-gen/codegen/c_code_generator.cpp index 2fadd06a..1ff73ae3 100755 --- a/tools/hdi-gen/codegen/c_code_generator.cpp +++ b/tools/hdi-gen/codegen/c_code_generator.cpp @@ -22,63 +22,45 @@ namespace OHOS { namespace HDI { -const char* CCodeGenerator::TAG = "CCodeGenerator"; - -bool CCodeGenerator::Initializate(const AutoPtr& ast, const String& targetDirectory) +bool CCodeGenerator::Generate() { - ast_ = ast; - targetDirectory_ = targetDirectory; + Initializate(); - if (!ResolveDirectory()) { - return false; - } - - if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - AutoPtr customTypesCodeEmitter = new CCustomTypesCodeEmitter(ast_, targetDirectory_); - emitters_.push_back(customTypesCodeEmitter); - return true; - } - - AutoPtr clientInterfaceCodeEmitter = new CClientInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr clientProxyCodeEmitter = new CClientProxyCodeEmitter(ast_, targetDirectory_); - - AutoPtr serviceInterfaceCodeEmitter = new CServiceInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceDriverCodeEmitter = new CServiceDriverCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceStubCodeEmitter = new CServiceStubCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceImplCodeEmitter = new CServiceImplCodeEmitter(ast_, targetDirectory_); - - emitters_.push_back(clientInterfaceCodeEmitter); - emitters_.push_back(clientProxyCodeEmitter); - emitters_.push_back(serviceInterfaceCodeEmitter); - emitters_.push_back(serviceDriverCodeEmitter); - emitters_.push_back(serviceStubCodeEmitter); - emitters_.push_back(serviceImplCodeEmitter); - - return true; -} - -bool CCodeGenerator::Generate() const -{ - for (auto emitter : emitters_) { - if (!emitter->isInvaildDir()) { - emitter->EmitCode(); + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: { + emitters_["types"]->OutPut(ast, targetDirectory_); + break; + } + case ASTFileType::AST_IFACE: + case ASTFileType::AST_ICALLBACK: { + emitters_["clientIface"]->OutPut(ast, targetDirectory_); + emitters_["proxy"]->OutPut(ast, targetDirectory_); + emitters_["serviceIface"]->OutPut(ast, targetDirectory_); + emitters_["driver"]->OutPut(ast, targetDirectory_); + emitters_["stub"]->OutPut(ast, targetDirectory_); + emitters_["impl"]->OutPut(ast, targetDirectory_); + break; + } + default: + break; } } - return true; } -bool CCodeGenerator::ResolveDirectory() +void CCodeGenerator::Initializate() { - String packageFilePath = String::Format("%s/%s/", - targetDirectory_.string(), CCodeEmitter::FileName(ast_->GetPackageName()).string()); - targetDirectory_ = packageFilePath; - - if (!File::CreateParentDir(targetDirectory_)) { - Logger::E(TAG, "create '%s' directory failed!", targetDirectory_); - return false; - } - return true; + emitters_ = { + {"types", new CCustomTypesCodeEmitter()}, + {"clientIface", new CClientInterfaceCodeEmitter()}, + {"proxy", new CClientProxyCodeEmitter()}, + {"serviceIface", new CServiceInterfaceCodeEmitter()}, + {"driver", new CServiceDriverCodeEmitter()}, + {"stub", new CServiceStubCodeEmitter()}, + {"impl", new CServiceImplCodeEmitter()}, + }; } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_code_generator.h b/tools/hdi-gen/codegen/c_code_generator.h index bfdd046d..b878a2a9 100755 --- a/tools/hdi-gen/codegen/c_code_generator.h +++ b/tools/hdi-gen/codegen/c_code_generator.h @@ -16,18 +16,18 @@ namespace OHOS { namespace HDI { class CCodeGenerator : public CodeGenerator { public: - CCodeGenerator() : CodeGenerator(), - emitters_() {} + using CCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; + + CCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : CodeGenerator(astModule, targetDirectory), emitters_() {} virtual ~CCodeGenerator() = default; - bool Initializate(const AutoPtr& ast, const String& targetDirectory) override; - bool Generate() const override; + bool Generate() override; private: - bool ResolveDirectory() override; + void Initializate(); - static const char* TAG; - std::vector> emitters_; + CCodeEmitMap emitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index aba22f4f..4e8f66b2 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -8,9 +8,25 @@ #include "codegen/c_custom_types_code_emitter.h" #include "util/file.h" +#include "util/logger.h" namespace OHOS { namespace HDI { +bool CCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() != ASTFileType::AST_TYPES) { + return false; + } + + directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CCustomTypesCodeEmitter::EmitCode() { EmitCustomTypesHeaderFile(); @@ -21,7 +37,6 @@ void CCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -136,7 +151,6 @@ void CCustomTypesCodeEmitter::EmitCustomTypesSourceFile() { String filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -223,144 +237,80 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, for (size_t i = 0; i < type->GetMemberNumber(); i++) { AutoPtr memberType = type->GetMemberType(i); - String memberName = type->GetMemberName(i); - String name = String::Format("%s->%s", objName.string(), memberName.string()); - - if (memberType->GetTypeKind() == TypeKind::TYPE_STRING) { - String tmpName = String::Format("%sCp", memberName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", name.string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - String paramName = String::Format("&%s", name.string()); - memberType->EmitCUnMarshalling(paramName, sb, g_tab, freeObjStatements_); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_UNION) { - String tmpName = String::Format("%sCp", memberName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", - name.string(), memberType->EmitCType().string(), - tmpName.string(), memberType->EmitCType().string()); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_ARRAY) { - String tmpName = String::Format("%sCp", memberName.string()); - AutoPtr arrayType = dynamic_cast(memberType.Get()); - AutoPtr elementType = arrayType->GetElementType(); - sb.Append(g_tab).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_LIST) { - String tmpName = String::Format("%sCp", memberName.string()); - AutoPtr listType = dynamic_cast(memberType.Get()); - AutoPtr elementType = listType->GetElementType(); - sb.Append(g_tab).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); - sb.Append("\n"); - } else { - memberType->EmitCUnMarshalling(name, sb, g_tab, freeObjStatements_); - sb.Append("\n"); - } + EmitMemberUnmarshalling(memberType, objName, type->GetMemberName(i), sb, g_tab); } sb.Append(g_tab).AppendFormat("return true;\n"); sb.Append("errors:\n"); - for (size_t i = 0; i < type->GetMemberNumber(); i++) { - AutoPtr memberType = type->GetMemberType(i); - String memberName = type->GetMemberName(i); - String name = String::Format("%s->%s", objName.string(), memberName.string()); - EmitError(name, memberType, sb, g_tab); - } + EmitCustomTypeMemoryRecycle(type, objName, sb, g_tab); sb.Append(g_tab).Append("return false;\n"); sb.Append("}\n"); } - -void CCustomTypesCodeEmitter::EmitError(const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix) +void CCustomTypesCodeEmitter::EmitMemberUnmarshalling(const AutoPtr& type, const String& name, + const String& memberName, StringBuilder& sb, const String& prefix) { + String varName = String::Format("%s->%s", name.string(), memberName.string()); switch (type->GetTypeKind()) { case TypeKind::TYPE_STRING: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - String lenName = String::Format("%sLen", name.string()); - - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("(%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&(%s), false);\n", - elementType->GetName().string(), elementName.string()); - } - - sb.Append(prefix + g_tab).Append("}\n"); - } - - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - break; - } - case TypeKind::TYPE_LIST: { - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - String lenName = String::Format("%sLen", name.string()); - - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("(%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&(%s), false);\n", - elementType->GetName().string(), elementName.string()); - } - - sb.Append(prefix + g_tab).Append("}\n"); - } - - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n"); + String tmpName = String::Format("%sCp", memberName.string()); + type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", varName.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); break; } case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("%sFree(&%s, false);\n", type->GetName().string(), name.string()); - sb.Append(prefix).Append("\n"); + String paramName = String::Format("&%s", varName.string()); + type->EmitCUnMarshalling(paramName, sb, g_tab, freeObjStatements_); + sb.Append("\n"); break; } - default: + case TypeKind::TYPE_UNION: { + String tmpName = String::Format("%sCp", memberName.string()); + type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + varName.string(), type->EmitCType().string(), + tmpName.string(), type->EmitCType().string()); + sb.Append("\n"); break; + } + case TypeKind::TYPE_ARRAY: + case TypeKind::TYPE_LIST: { + EmitArrayMemberUnmarshalling(type, memberName, varName, sb, g_tab); + sb.Append("\n"); + break; + } + default: { + type->EmitCUnMarshalling(varName, sb, g_tab, freeObjStatements_); + sb.Append("\n"); + } } } +void CCustomTypesCodeEmitter::EmitArrayMemberUnmarshalling(const AutoPtr& type, const String& memberName, + const String& varName, StringBuilder& sb, const String& prefix) +{ + String tmpName = String::Format("%sCp", memberName.string()); + AutoPtr elementType = nullptr; + if (type->GetTypeKind() == TypeKind::TYPE_ARRAY) { + AutoPtr arrayType = dynamic_cast(type.Get()); + elementType = arrayType->GetElementType(); + } else { + AutoPtr listType = dynamic_cast(type.Get()); + elementType = listType->GetElementType(); + } + + sb.Append(prefix).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); + sb.Append(prefix).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); + type->EmitCUnMarshalling(tmpName, sb, prefix, freeObjStatements_); + sb.Append(prefix).AppendFormat("%s = %s;\n", varName.string(), tmpName.string()); + sb.Append(prefix).AppendFormat("%sLen = %sLen;\n", varName.string(), tmpName.string()); +} + void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const AutoPtr& type) { String objName("dataBlock"); @@ -372,74 +322,32 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - for (size_t i = 0; i < type->GetMemberNumber(); i++) { - AutoPtr memberType = type->GetMemberType(i); - String memberName = type->GetMemberName(i); - String name = String::Format("%s->%s", objName.string(), memberName.string()); - EmitCustomTypeMemberFree(sb, name, memberType, g_tab); - } + EmitCustomTypeMemoryRecycle(type, objName, sb, g_tab); sb.Append(g_tab).Append("if (freeSelf) {\n"); sb.Append(g_tab).Append(g_tab).Append("OsalMemFree(dataBlock);\n"); sb.Append(g_tab).Append("}\n"); - sb.Append("}\n"); } -void CCustomTypesCodeEmitter::EmitCustomTypeMemberFree(StringBuilder& sb, const String& name, - const AutoPtr& type, const String& prefix) +void CCustomTypesCodeEmitter::EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, + StringBuilder& sb, const String& prefix) { - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + String memberName = type->GetMemberName(i); + String varName = String::Format("%s->%s", name.string(), memberName.string()); + switch (memberType->GetTypeKind()) { + case TypeKind::TYPE_STRING: + case TypeKind::TYPE_STRUCT: + case TypeKind::TYPE_ARRAY: + case TypeKind::TYPE_LIST: + memberType->EmitMemoryRecycle(varName, false, false, sb, prefix); + sb.Append("\n"); + break; + default: + break; } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - sb.Append(prefix).AppendFormat("if (%sLen > 0 && %s != NULL) {\n", name.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(%s, false);\n", - elementType->GetName().string(), name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_LIST: { - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - sb.Append(prefix).AppendFormat("if (%sLen > 0 && %s != NULL) {\n", name.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(%s, false);\n", - elementType->GetName().string(), name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("%sFree(&%s, false);\n\n", type->GetName().string(), name.string()); - break; - } - default: - break; } } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h index 2473df8a..6ae5e3a2 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CCustomTypesCodeEmitter : public CCodeEmitter { public: - CCustomTypesCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CCodeEmitter(ast, targetDirectory) {} + CCustomTypesCodeEmitter() : CCodeEmitter() {} virtual ~CCustomTypesCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitCustomTypesHeaderFile(); void EmitHeaderInclusions(StringBuilder& sb); @@ -50,11 +51,15 @@ private: void EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, const AutoPtr& type); - void EmitError(const String& name, const AutoPtr& type, StringBuilder& sb, const String& prefix); + void EmitMemberUnmarshalling(const AutoPtr& type, const String& name, const String& memberName, + StringBuilder& sb, const String& prefix); + + void EmitArrayMemberUnmarshalling(const AutoPtr& type, const String& memberName, const String& varName, + StringBuilder& sb, const String& prefix); void EmitCustomTypeFreeImpl(StringBuilder& sb, const AutoPtr& type); - void EmitCustomTypeMemberFree(StringBuilder& sb, const String& name, const AutoPtr& type, + void EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix); std::vector freeObjStatements_; @@ -62,4 +67,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_C_CUSTOM_TYPES_CODE_EMITTER_H +#endif // OHOS_HDI_C_CUSTOM_TYPES_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index 7aa2954d..3fda364f 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -12,12 +12,19 @@ namespace OHOS { namespace HDI { -CServiceDriverCodeEmitter::CServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_driver.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() != ASTFileType::AST_IFACE) { + return false; + } + + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CServiceDriverCodeEmitter::EmitCode() @@ -30,20 +37,8 @@ void CServiceDriverCodeEmitter::EmitCode() void CServiceDriverCodeEmitter::EmitDriverSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.c", directory_.string(), FileName(infName_ + "Driver").string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Driver").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Driver").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.h b/tools/hdi-gen/codegen/c_service_driver_code_emitter.h index 02a0aab7..c4582f27 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CServiceDriverCodeEmitter : public CCodeEmitter { public: - - CServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CServiceDriverCodeEmitter() : CCodeEmitter() {} virtual ~CServiceDriverCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitDriverSourceFile(); void EmitDriverIncluions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index b5c899db..f483b274 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CServiceImplCodeEmitter::CServiceImplCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_service.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceImplCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CServiceImplCodeEmitter::EmitCode() @@ -31,17 +43,11 @@ void CServiceImplCodeEmitter::EmitCode() void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Service").string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); - EmitHeadMacro(sb, ImplFullName_); + EmitHeadMacro(sb, implFullName_); sb.Append("\n"); sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); sb.Append("\n"); @@ -51,7 +57,7 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() sb.Append("\n"); EmitTailExternC(sb); sb.Append("\n"); - EmitTailMacro(sb, ImplFullName_); + EmitTailMacro(sb, implFullName_); String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -66,20 +72,8 @@ void CServiceImplCodeEmitter::EmitServiceImplConstructDecl(StringBuilder& sb) void CServiceImplCodeEmitter::EmitServiceImplSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.c", directory_.string(), FileName(infName_ + "Service").string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Service").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Service").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h index 99cc5ca1..1ab5fb5e 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CServiceImplCodeEmitter : public CCodeEmitter { public: - CServiceImplCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CServiceImplCodeEmitter() : CCodeEmitter() {} virtual ~CServiceImplCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitServiceImplHeaderFile(); void EmitServiceImplConstructDecl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp index 522e81d7..01bcf358 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CServiceInterfaceCodeEmitter::EmitCode() { if (!isCallbackInterface()) { @@ -21,20 +41,8 @@ void CServiceInterfaceCodeEmitter::EmitCode() void CServiceInterfaceCodeEmitter::EmitInterfaceHeadrFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.h b/tools/hdi-gen/codegen/c_service_interface_code_emitter.h index b1b6f7a9..02f5db78 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CServiceInterfaceCodeEmitter : public CCodeEmitter { public: - CServiceInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CCodeEmitter(ast, targetDirectory) {} + CServiceInterfaceCodeEmitter() : CCodeEmitter() {} virtual ~CServiceInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeadrFile(); void EmitImportInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index 0613842f..e8c6996c 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -13,12 +13,24 @@ namespace OHOS { namespace HDI { -CServiceStubCodeEmitter::CServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_stub.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceStubCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CServiceStubCodeEmitter::EmitCode() @@ -32,13 +44,7 @@ void CServiceStubCodeEmitter::EmitCode() void CServiceStubCodeEmitter::EmitCbServiceStubHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(stubName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -69,20 +75,8 @@ void CServiceStubCodeEmitter::EmitCbServiceStubMethodsDcl(StringBuilder& sb) void CServiceStubCodeEmitter::EmitServiceStubSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.c", directory_.string(), FileName(stubName_).string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(stubName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -115,7 +109,7 @@ void CServiceStubCodeEmitter::EmitServiceStubInclusions(StringBuilder& sb) sb.AppendFormat("#include \"%s.h\"\n", FileName(stubFullName_).string()); EmitServiceStubStdlibInclusions(sb); sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(ImplName_).string()); + sb.AppendFormat("#include \"%s.h\"\n", FileName(implName_).string()); } } @@ -175,25 +169,7 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr } } - if (method->GetParameterNumber() == 0) { - sb.Append(prefix + g_tab).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); - } else { - sb.Append(prefix + g_tab).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitCallParameter(sb, param->GetType(), param->GetAttribute(), param->GetName()); - if (i + 1 < method->GetParameterNumber()) { - sb.Append(", "); - } - } - sb.AppendFormat(");\n", method->GetName().string()); - } - - sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: call %s function failed!\", __func__);\n", method->GetName().string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoName.string()); - sb.Append(prefix + g_tab).Append("}\n"); + EmitStubCallMethod(method, gotoName, sb, prefix + g_tab); sb.Append("\n"); for (int i = 0; i < method->GetParameterNumber(); i++) { @@ -204,12 +180,7 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr } } - sb.Append(prefix).AppendFormat("%s:\n", gotoName.string()); - for (int i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitError(param, sb, prefix + g_tab); - } - + EmitErrorHandle(method, gotoName, false, sb, prefix); sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append(prefix).Append("}\n"); } @@ -264,6 +235,30 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr& method, const String& gotoLabel, + StringBuilder& sb, const String& prefix) +{ + if (method->GetParameterNumber() == 0) { + sb.Append(prefix).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); + } else { + sb.Append(prefix).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + EmitCallParameter(sb, param->GetType(), param->GetAttribute(), param->GetName()); + if (i + 1 < method->GetParameterNumber()) { + sb.Append(", "); + } + } + sb.AppendFormat(");\n", method->GetName().string()); + } + + sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: call %s function failed!\", __func__);\n", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name) { @@ -280,83 +275,6 @@ void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr } } -void CServiceStubCodeEmitter::EmitError(const AutoPtr& param, StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: - case TypeKind::TYPE_UNION: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - String lenName = String::Format("%sLen", param->GetName().string()); - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", - lenName.string(), param->GetName().string()); - - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("%s[i]", param->GetName().string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - break; - } - case TypeKind::TYPE_LIST: { - String lenName = String::Format("%sLen", param->GetName().string()); - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", - lenName.string(), param->GetName().string()); - - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("%s[i]", param->GetName().string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - break; - } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).AppendFormat("%sFree(%s, true);\n", - type->GetName().string(), param->GetName().string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - default: - break; - } -} - void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) { String codeName; diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 46068709..6d24f5ee 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -15,12 +15,13 @@ namespace OHOS { namespace HDI { class CServiceStubCodeEmitter : public CCodeEmitter { public: - CServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CServiceStubCodeEmitter() : CCodeEmitter() {} virtual ~CServiceStubCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: void EmitCbServiceStubHeaderFile(); @@ -41,9 +42,10 @@ private: void EmitReadStubMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, const String& prefix); - void EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name); + void EmitStubCallMethod(const AutoPtr& method, const String& gotoLabel, StringBuilder& sb, + const String& prefix); - void EmitError(const AutoPtr& param, StringBuilder& sb, const String& prefix); + void EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name); void EmitServiceStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/code_generator.h b/tools/hdi-gen/codegen/code_generator.h index 93ba7760..9e001033 100755 --- a/tools/hdi-gen/codegen/code_generator.h +++ b/tools/hdi-gen/codegen/code_generator.h @@ -9,26 +9,21 @@ #ifndef OHOS_HDI_CODEGENERATOR_H #define OHOS_HDI_CODEGENERATOR_H -#include "ast/ast.h" +#include "ast/ast_module.h" namespace OHOS { namespace HDI { class CodeGenerator : public LightRefCountBase { public: - CodeGenerator() : LightRefCountBase(), - targetDirectory_(), - ast_(nullptr) {} + CodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : LightRefCountBase(), astModule_(astModule), targetDirectory_(targetDirectory) {} virtual ~CodeGenerator() = default; - virtual bool Initializate(const AutoPtr& ast, const String& targetDirectory) = 0; - - virtual bool Generate() const = 0; + virtual bool Generate() = 0; protected: - virtual bool ResolveDirectory() = 0; - + AutoPtr astModule_; String targetDirectory_; - AutoPtr ast_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp index 0d2a3769..bb8941be 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CppClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CppClientInterfaceCodeEmitter::EmitCode() { EmitInterfaceHeaderFile(); @@ -19,20 +39,8 @@ void CppClientInterfaceCodeEmitter::EmitCode() void CppClientInterfaceCodeEmitter::EmitInterfaceHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h index 27e5662d..a573ff3a 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CppClientInterfaceCodeEmitter : public CppCodeEmitter { public: - CppClientInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CppCodeEmitter(ast, targetDirectory) {} + CppClientInterfaceCodeEmitter() : CppCodeEmitter() {} virtual ~CppClientInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeaderFile(); void EmitClientInfHeadMacro(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index aa09a870..5ba2bf29 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -13,12 +13,24 @@ namespace OHOS { namespace HDI { -CppClientProxyCodeEmitter::CppClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String proxyName = String::Format("%sclient.%s", - interface_->GetNamespace()->ToString().string(), proxyName_.string()); - sourceFileName_ = String::Format("%s.cpp", FileName(proxyName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppClientProxyCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppClientProxyCodeEmitter::EmitCode() @@ -29,20 +41,8 @@ void CppClientProxyCodeEmitter::EmitCode() void CppClientProxyCodeEmitter::EmitProxyHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.h", directory_.string(), FileName(infName_ + "Proxy").string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Proxy").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppClientProxyCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Proxy").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -142,20 +142,8 @@ void CppClientProxyCodeEmitter::EmitProxyMethodParameter(const AutoPtr remote = servMgr->GetService(\"%sService\");\n", - infName_.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat( + "sptr remote = servMgr->GetService(\"%sService\");\n", infName_.string()); sb.Append(prefix + g_tab + g_tab).Append("if (remote != nullptr) {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return iface_cast<%s>(remote);\n", interface_->GetName().string()); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index 9e97982e..2ab597f3 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CppClientProxyCodeEmitter : public CppCodeEmitter { public: - CppClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CppClientProxyCodeEmitter() : CppCodeEmitter() {} virtual ~CppClientProxyCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitProxyHeaderFile(); void EmitProxyHeadrInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index c788b7ad..a0b6d11b 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -12,16 +12,34 @@ #include #include +#include "util/logger.h" + namespace OHOS { namespace HDI { -CppCodeEmitter::CppCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : LightRefCountBase(), ast_(ast), directory_(targetDirectory) +bool CppCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); + if (!Reset(ast, targetDirectory)) { + return false; } - if (interface_ != nullptr) { + EmitCode(); + return true; +} + +bool CppCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) +{ + if (ast == nullptr) { + return false; + } + + if (targetDirectory.Equals("")) { + return false; + } + + CleanData(); + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); interfaceName_ = interface_->GetName(); interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; @@ -31,11 +49,33 @@ CppCodeEmitter::CppCodeEmitter(const AutoPtr& ast, const String& targetDire stubName_ = infName_ + "Stub"; stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - ImplName_ = infName_ + "Service"; - ImplFullName_ = interface_->GetNamespace()->ToString() + ImplName_; - } else { + implName_ = infName_ + "Service"; + implFullName_ = interface_->GetNamespace()->ToString() + implName_; + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { infName_ = ast_->GetName(); } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void CppCodeEmitter::CleanData() +{ + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; + stubName_ = ""; + stubFullName_ = ""; + implName_ = ""; + implFullName_ = ""; } String CppCodeEmitter::FileName(const String& name) diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index 1a730c62..127161dc 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -19,24 +19,19 @@ namespace OHOS { namespace HDI { class CppCodeEmitter : public LightRefCountBase { public: - CppCodeEmitter(const AutoPtr& ast, const String& targetDirectory); - virtual ~CppCodeEmitter() = default; - virtual void EmitCode() = 0; - - inline String GetSourceFile() - { - return sourceFileName_; - } - - inline bool isInvaildDir() - { - return directory_.Equals(""); - } + bool OutPut(const AutoPtr& ast, const String& targetDirectory); static String FileName(const String& name); protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix); @@ -83,11 +78,9 @@ protected: String SpecificationParam(StringBuilder& sb, const String& prefix); - AutoPtr ast_; - AutoPtr interface_; - + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; String directory_; - String sourceFileName_; String interfaceName_; String interfaceFullName_; @@ -96,8 +89,8 @@ protected: String proxyFullName_; String stubName_; String stubFullName_; - String ImplName_; - String ImplFullName_; + String implName_; + String implFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_code_generator.cpp b/tools/hdi-gen/codegen/cpp_code_generator.cpp index 01452799..7adb9e7a 100755 --- a/tools/hdi-gen/codegen/cpp_code_generator.cpp +++ b/tools/hdi-gen/codegen/cpp_code_generator.cpp @@ -22,63 +22,45 @@ namespace OHOS { namespace HDI { -const char* CppCodeGenerator::TAG = "CppCodeGenerator"; - -bool CppCodeGenerator::Initializate(const AutoPtr& ast, const String& targetDirectory) +bool CppCodeGenerator::Generate() { - ast_ = ast; - targetDirectory_ = targetDirectory; + Initializate(); - if (!ResolveDirectory()) { - return false; - } - - if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - AutoPtr customTypesCodeEmitter = new CppCustomTypesCodeEmitter(ast_, targetDirectory_); - emitters_.push_back(customTypesCodeEmitter); - return true; - } - - AutoPtr clientInterfaceCodeEmitter = new CppClientInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr clientProxyCodeEmitter = new CppClientProxyCodeEmitter(ast_, targetDirectory_); - - AutoPtr serviceInterfaceCodeEmitter = new CppServiceInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceDriverCodeEmitter = new CppServiceDriverCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceStubCodeEmitter = new CppServiceStubCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceImplCodeEmitter = new CppServiceImplCodeEmitter(ast_, targetDirectory_); - - emitters_.push_back(clientInterfaceCodeEmitter); - emitters_.push_back(clientProxyCodeEmitter); - emitters_.push_back(serviceInterfaceCodeEmitter); - emitters_.push_back(serviceDriverCodeEmitter); - emitters_.push_back(serviceStubCodeEmitter); - emitters_.push_back(serviceImplCodeEmitter); - - return true; -} - -bool CppCodeGenerator::Generate() const -{ - for (auto emitter : emitters_) { - if (!emitter->isInvaildDir()) { - emitter->EmitCode(); + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: { + emitters_["types"]->OutPut(ast, targetDirectory_); + break; + } + case ASTFileType::AST_IFACE: + case ASTFileType::AST_ICALLBACK: { + emitters_["clientIface"]->OutPut(ast, targetDirectory_); + emitters_["proxy"]->OutPut(ast, targetDirectory_); + emitters_["serviceIface"]->OutPut(ast, targetDirectory_); + emitters_["driver"]->OutPut(ast, targetDirectory_); + emitters_["stub"]->OutPut(ast, targetDirectory_); + emitters_["impl"]->OutPut(ast, targetDirectory_); + break; + } + default: + break; } } - return true; } -bool CppCodeGenerator::ResolveDirectory() +void CppCodeGenerator::Initializate() { - String packageFilePath = String::Format("%s/%s/", - targetDirectory_.string(), CppCodeEmitter::FileName(ast_->GetPackageName()).string()); - targetDirectory_ = packageFilePath; - - if (!File::CreateParentDir(targetDirectory_)) { - Logger::E(TAG, "create '%s' directory failed!", targetDirectory_); - return false; - } - return true; + emitters_ = { + {"types", new CppCustomTypesCodeEmitter()}, + {"clientIface", new CppClientInterfaceCodeEmitter()}, + {"proxy", new CppClientProxyCodeEmitter()}, + {"serviceIface", new CppServiceInterfaceCodeEmitter()}, + {"driver", new CppServiceDriverCodeEmitter()}, + {"stub", new CppServiceStubCodeEmitter()}, + {"impl", new CppServiceImplCodeEmitter()}, + }; } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_code_generator.h b/tools/hdi-gen/codegen/cpp_code_generator.h index 3a36abf3..5adc37ed 100755 --- a/tools/hdi-gen/codegen/cpp_code_generator.h +++ b/tools/hdi-gen/codegen/cpp_code_generator.h @@ -16,18 +16,18 @@ namespace OHOS { namespace HDI { class CppCodeGenerator : public CodeGenerator { public: - CppCodeGenerator() : CodeGenerator(), - emitters_() {} + using CppCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - ~CppCodeGenerator() override {}; + CppCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : CodeGenerator(astModule, targetDirectory), emitters_() {} - bool Initializate(const AutoPtr& ast, const String& targetDirectory) override; - bool Generate() const override; + ~CppCodeGenerator() = default; + + bool Generate() override; private: - bool ResolveDirectory() override; + void Initializate(); - static const char* TAG; - std::vector> emitters_; + CppCodeEmitMap emitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp index 9a56dec8..f6a6d1d4 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -12,6 +12,21 @@ namespace OHOS { namespace HDI { +bool CppCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() != ASTFileType::AST_TYPES) { + return false; + } + + directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CppCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CppCustomTypesCodeEmitter::EmitCode() { EmitCustomTypesHeaderFile(); @@ -23,7 +38,6 @@ void CppCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); String marcoName = String::Format("%s.%s", ast_->GetPackageName().string(), infName_.string()); - StringBuilder sb; EmitLicense(sb); @@ -171,7 +185,6 @@ void CppCustomTypesCodeEmitter::EmitCustomTypesSourceFile() { String filePath = String::Format("%s%s.cpp", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h index d8e3be78..c311c756 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CppCustomTypesCodeEmitter : public CppCodeEmitter { public: - CppCustomTypesCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CppCodeEmitter(ast, targetDirectory) {} + CppCustomTypesCodeEmitter() : CppCodeEmitter() {} virtual ~CppCustomTypesCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitCustomTypesHeaderFile(); void EmitHeaderFileInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 53190e88..1c5dacf1 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -12,12 +12,19 @@ namespace OHOS { namespace HDI { -CppServiceDriverCodeEmitter::CppServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_driver.cpp", FileName(infFullName).string()); + if (ast_->GetASTFileType() != ASTFileType::AST_IFACE) { + return false; + } + + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppServiceDriverCodeEmitter::EmitCode() @@ -30,14 +37,8 @@ void CppServiceDriverCodeEmitter::EmitCode() void CppServiceDriverCodeEmitter::EmitDriverSourceFile() { - String filePath = String::Format("%sserver/%s.cpp", directory_.string(), FileName(infName_ + "Driver").string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.cpp", directory_.string(), FileName(infName_ + "Driver").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h index 2d67cbf2..f552b32c 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CppServiceDriverCodeEmitter : public CppCodeEmitter { public: - CppServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CppServiceDriverCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceDriverCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitDriverSourceFile(); void EmitDriverIncluions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index 05b86fa3..e06b157a 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CppServiceImplCodeEmitter::CppServiceImplCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String ImplFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), ImplName_.string()); - sourceFileName_ = String::Format("%s.cpp", FileName(ImplFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceImplCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppServiceImplCodeEmitter::EmitCode() @@ -28,30 +40,18 @@ void CppServiceImplCodeEmitter::EmitCode() void CppServiceImplCodeEmitter::EmitImplHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(infName_ + "Service").string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Service").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceImplCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Service").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); - EmitHeadMacro(sb, ImplFullName_); + EmitHeadMacro(sb, implFullName_); sb.Append("\n"); EmitServiceImplInclusions(sb); sb.Append("\n"); EmitServiceImplDecl(sb); sb.Append("\n"); - EmitTailMacro(sb, ImplFullName_); + EmitTailMacro(sb, implFullName_); String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -134,20 +134,8 @@ void CppServiceImplCodeEmitter::EmitServiceImplMethodDecl(const AutoPtr& ast, const String& targetDirectory); + CppServiceImplCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceImplCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitImplHeaderFile(); void EmitServiceImplInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp index bf27cce0..03dbe5bd 100755 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CppServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CppServiceInterfaceCodeEmitter::EmitCode() { if (!isCallbackInterface()) { @@ -21,20 +41,8 @@ void CppServiceInterfaceCodeEmitter::EmitCode() void CppServiceInterfaceCodeEmitter::EmitInterfaceHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h index 7e648887..8a6d8c2e 100755 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CppServiceInterfaceCodeEmitter : public CppCodeEmitter { public: - CppServiceInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CppCodeEmitter(ast, targetDirectory) {} + CppServiceInterfaceCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeaderFile(); void EmitServiceInfHeadMacro(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index bffb79c8..a2bfac6b 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CppServiceStubCodeEmitter::CppServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String stubFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), stubName_.string()); - sourceFileName_ = String::Format("%s.cpp", FileName(stubFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceStubCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppServiceStubCodeEmitter::EmitCode() @@ -28,20 +40,8 @@ void CppServiceStubCodeEmitter::EmitCode() void CppServiceStubCodeEmitter::EmitStubHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(infName_ + "Stub").string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Stub").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -196,20 +196,8 @@ void CppServiceStubCodeEmitter::EmitStubExternalsMethodsDel(StringBuilder& sb) void CppServiceStubCodeEmitter::EmitStubSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.cpp", directory_.string(), FileName(infName_ + "Stub").string()); - } else { - filePath = String::Format("%s%s.cpp", directory_.string(), FileName(infName_ + "Stub").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.cpp", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -290,34 +278,8 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met } } - if (method->GetParameterNumber() == 0) { - if (!isCallbackInterface()) { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = service.%s();\n", method->GetName().string()); - } else { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s();\n", method->GetName().string()); - } - } else { - if (!isCallbackInterface()) { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); - } else { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s(", method->GetName().string()); - } - - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - sb.Append(param->GetName()); - if (i + 1 < method->GetParameterNumber()) { - sb.Append(", "); - } - } - sb.Append(");\n"); - } - - sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); - sb.Append(prefix + g_tab + g_tab).Append("return ec;\n"); - sb.Append(prefix + g_tab).Append("}\n\n"); + EmitStubCallMethod(method, sb, prefix + g_tab); + sb.Append("\n"); if (!method->IsOneWay()) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { @@ -333,6 +295,30 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met sb.Append("}\n"); } +void CppServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, + const String& prefix) +{ + if (!isCallbackInterface()) { + sb.Append(prefix).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); + } else { + sb.Append(prefix).AppendFormat("int32_t ec = %s(", method->GetName().string()); + } + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + sb.Append(param->GetName()); + if (i + 1 < method->GetParameterNumber()) { + sb.Append(", "); + } + } + sb.Append(");\n"); + + sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); + sb.Append(prefix + g_tab).Append("return ec;\n"); + sb.Append(prefix).Append("}\n"); +} + void CppServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) { sb.Append(prefix).AppendFormat("int32_t %s::%sOnRemoteRequest(int cmdId,\n", diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h index 12f7ce1a..a403a30b 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h @@ -15,12 +15,13 @@ namespace OHOS { namespace HDI { class CppServiceStubCodeEmitter : public CppCodeEmitter { public: - CppServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CppServiceStubCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceStubCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: // ISample.idl -> sample_service_stub.h void EmitStubHeaderFile(); @@ -62,6 +63,8 @@ private: void EmitStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); void EmitCbStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/generator_factory.cpp b/tools/hdi-gen/codegen/generator_factory.cpp index 73418e73..e866efc9 100755 --- a/tools/hdi-gen/codegen/generator_factory.cpp +++ b/tools/hdi-gen/codegen/generator_factory.cpp @@ -13,14 +13,21 @@ namespace OHOS { namespace HDI { -AutoPtr GeneratorFactory::GetCodeGenerator(const String& targetLanuage) +GeneratorFactory& GeneratorFactory::GetInstance() +{ + static GeneratorFactory factory; + return factory; +} + +AutoPtr GeneratorFactory::GetCodeGenerator(const AutoPtr& astModule, + const String& targetLanuage, const String& targetDirectory) { if (targetLanuage.Equals("c")) { - return new CCodeGenerator(); + return new CCodeGenerator(astModule, targetDirectory); } else if (targetLanuage.Equals("cpp")) { - return new CppCodeGenerator(); + return new CppCodeGenerator(astModule, targetDirectory); } else if (targetLanuage.Equals("java")) { - return new JavaCodeGenerator(); + return new JavaCodeGenerator(astModule, targetDirectory); } return nullptr; diff --git a/tools/hdi-gen/codegen/generator_factory.h b/tools/hdi-gen/codegen/generator_factory.h index 8b99621f..b572cc73 100755 --- a/tools/hdi-gen/codegen/generator_factory.h +++ b/tools/hdi-gen/codegen/generator_factory.h @@ -9,13 +9,25 @@ #ifndef OHOS_HDI_GENERATORFACTORY_H #define OHOS_HDI_GENERATORFACTORY_H +#include "ast/ast_module.h" #include "codegen/code_generator.h" namespace OHOS { namespace HDI { class GeneratorFactory { public: - AutoPtr GetCodeGenerator(const String& targetLanuage); + GeneratorFactory(const GeneratorFactory&) = default; + + GeneratorFactory& operator=(const GeneratorFactory&) = default; + + ~GeneratorFactory() = default; + + static GeneratorFactory& GetInstance(); + + AutoPtr GetCodeGenerator(const AutoPtr& astModule, const String& targetLanuage, + const String& targetDirectory); +private: + GeneratorFactory() = default; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp index 98bb64cb..7f1c613c 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp @@ -13,6 +13,26 @@ namespace OHOS { namespace HDI { +bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void JavaClientInterfaceCodeEmitter::EmitCode() { EmitInterfaceFile(); @@ -20,13 +40,8 @@ void JavaClientInterfaceCodeEmitter::EmitCode() void JavaClientInterfaceCodeEmitter::EmitInterfaceFile() { - String filePath = String::Format("%s/%s.java", directory_.string(), FileName(interfaceName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } + String filePath = String::Format("%s%s.java", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.h b/tools/hdi-gen/codegen/java_client_interface_code_emitter.h index 9ffecd24..3f41a800 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.h @@ -15,13 +15,13 @@ namespace OHOS { namespace HDI { class JavaClientInterfaceCodeEmitter : public JavaCodeEmitter { public: - JavaClientInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : JavaCodeEmitter(ast, targetDirectory) {} + JavaClientInterfaceCodeEmitter() : JavaCodeEmitter() {} virtual ~JavaClientInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: void EmitInterfaceFile(); diff --git a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp index 0ef26a47..accefc66 100755 --- a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp @@ -11,6 +11,26 @@ namespace OHOS { namespace HDI { +bool JavaClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void JavaClientProxyCodeEmitter::EmitCode() { EmitProxyFile(); @@ -18,14 +38,8 @@ void JavaClientProxyCodeEmitter::EmitCode() void JavaClientProxyCodeEmitter::EmitProxyFile() { - String filePath = String::Format("%s/%s.java", directory_.string(), FileName(proxyName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.java", directory_.string(), FileName(proxyName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -183,22 +197,11 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append("\n"); sb.Append(prefix).AppendFormat(" data.writeInterfaceToken(DESCRIPTOR);\n"); - bool needBlankLine = false; for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); - if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteMethodParameter(param, "data", sb, prefix + g_tab); - needBlankLine = true; - } else { - AutoPtr type = param->GetType(); - if (type->GetTypeKind() == TypeKind::TYPE_ARRAY) { - EmitWriteOutArrayVariable("data", param->GetName(), type, sb, prefix + g_tab); - } - } - } - if (needBlankLine) { - sb.Append("\n"); + param->EmitJavaWriteVar("data", sb, prefix + g_tab); } + sb.Append("\n"); sb.Append(prefix + g_tab).Append("try {\n"); sb.Append(prefix + g_tab + g_tab).AppendFormat("if (remote.sendRequest(COMMAND_%s, data, reply, option)) {\n", @@ -208,9 +211,7 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append(prefix + g_tab).Append(" reply.readException();\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); - if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadMethodParameter(param, "reply", sb, prefix + g_tab + g_tab); - } + param->EmitJavaReadVar("reply", sb, prefix + g_tab + g_tab); } sb.Append(prefix + g_tab).Append("} finally {\n"); @@ -221,423 +222,6 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append(prefix).Append("}\n"); } -void JavaClientProxyCodeEmitter::EmitWriteMethodParameter(const AutoPtr& param, const String& parcelName, - StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - EmitWriteVariable(parcelName, param->GetName(), type, sb, prefix); -} - -void JavaClientProxyCodeEmitter::EmitReadMethodParameter(const AutoPtr& param, const String& parcelName, - StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - EmitReadOutVariable(parcelName, param->GetName(), type, sb, prefix); -} - -void JavaClientProxyCodeEmitter::EmitWriteVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s.writeBoolean(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s.writeByte(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s.writeShort(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s.writeInt(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s.writeLong(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s.writeFloat(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s.writeDouble(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s.writeString(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - if (type->EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { - sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s);\n", parcelName.string(), name.string()); - break; - } - sb.Append(prefix).AppendFormat("%s.writeSequenceable(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INTERFACE: - sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s.asObject());\n", parcelName.string(), - name.string()); - break; - case TypeKind::TYPE_LIST: { - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); - sb.Append(prefix).AppendFormat("for (%s element : %s) {\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string()); - EmitWriteVariable(parcelName, "element", elementType, sb, prefix + g_tab); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_MAP: { - AutoPtr mapType = dynamic_cast(type.Get()); - AutoPtr keyType = mapType->GetKeyType(); - AutoPtr valueType = mapType->GetValueType(); - - sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); - sb.Append(prefix).AppendFormat("for (Map.Entry<%s, %s> entry : %s.entrySet()) {\n", - keyType->EmitJavaType(TypeMode::NO_MODE, true).string(), - valueType->EmitJavaType(TypeMode::NO_MODE, true).string(), name.string()); - EmitWriteVariable(parcelName, "entry.getKey()", keyType, sb, prefix + g_tab); - EmitWriteVariable(parcelName, "entry.getValue()", valueType, sb, prefix + g_tab); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); - sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); - sb.Append(prefix).Append("} else { \n"); - EmitWriteArrayVariable(parcelName, name, elementType, sb, prefix + g_tab); - sb.Append(prefix).Append("}\n"); - break; - } - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitWriteArrayVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s.writeBooleanArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s.writeByteArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s.writeShortArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s.writeIntArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s.writeLongArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s.writeFloatArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s.writeDoubleArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s.writeStringArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - sb.Append(prefix).AppendFormat("%s.writeSequenceableArray(%s);\n", parcelName.string(), name.string()); - break; - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitWriteOutArrayVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); - sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); - sb.Append(prefix).Append("} else {\n"); - sb.Append(prefix).AppendFormat(" %s.writeInt(%s.length);\n", parcelName.string(), name.string()); - sb.Append(prefix).Append("}\n"); -} - -void JavaClientProxyCodeEmitter::EmitReadVariable(const String& parcelName, const String& name, - const AutoPtr& type, ParamAttr attribute, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s %s = %s.readBoolean();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s %s = %s.readByte();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s %s = %s.readShort();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s %s = %s.readInt();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s %s = %s.readLong();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s %s = %s.readFloat();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s %s = %s.readDouble();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s %s = %s.readString();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - if (attribute == ParamAttr::PARAM_OUT && type->EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { - sb.Append(prefix).AppendFormat("IRemoteObject %s = %s.readRemoteObject();\n", - name.string(), parcelName.string()); - break; - } - if (attribute == ParamAttr::PARAM_OUT) { - sb.Append(prefix).AppendFormat("%s %s = new %s();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - type->EmitJavaType(TypeMode::NO_MODE).string()); - } - sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); - - break; - case TypeKind::TYPE_INTERFACE: - sb.Append(prefix).AppendFormat("%s %s = %s.asInterface(%s.readRemoteObject());\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - StubName(type->EmitJavaType(TypeMode::NO_MODE)).string(), parcelName.string()); - break; - case TypeKind::TYPE_LIST: { - sb.Append(prefix).AppendFormat("%s %s = new Array%s();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - type->EmitJavaType(TypeMode::NO_MODE).string()); - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_MAP: { - sb.Append(prefix).AppendFormat("%s %s = new Hash%s();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - type->EmitJavaType(TypeMode::NO_MODE).string()); - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - - AutoPtr mapType = dynamic_cast(type.Get()); - AutoPtr keyType = mapType->GetKeyType(); - AutoPtr valueType = mapType->GetValueType(); - - EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - if (attribute == ParamAttr::PARAM_OUT) { - EmitReadOutArrayVariable(parcelName, name, arrayType, sb, prefix); - } else { - EmitReadArrayVariable(parcelName, name, arrayType, attribute, sb, prefix); - } - break; - } - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitReadArrayVariable(const String& parcelName, const String& name, - const AutoPtr& arrayType, ParamAttr attribute, StringBuilder& sb, const String& prefix) -{ - AutoPtr elementType = arrayType->GetElementType(); - switch (elementType->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readBooleanArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readByteArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readShortArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readIntArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readLongArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readFloatArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readDoubleArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readStringArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - sb.Append(prefix).AppendFormat("int size = %s.readInt();\n", parcelName.string()); - sb.Append(prefix).AppendFormat("%s %s = new %s[size];\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - elementType->EmitJavaType(TypeMode::NO_MODE).string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < size; ++i) {\n"); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s[i] = value;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitReadOutArrayVariable(const String& parcelName, const String& name, - const AutoPtr& arrayType, StringBuilder& sb, const String& prefix) -{ - AutoPtr elementType = arrayType->GetElementType(); - switch (elementType->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s.readBooleanArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s.readByteArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s.readShortArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s.readIntArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s.readLongArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s.readFloatArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s.readDoubleArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s.readStringArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - sb.Append(prefix).AppendFormat("%s.readSequenceableArray(%s);\n", parcelName.string(), name.string()); - break; - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitReadOutVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s = %s.readBoolean();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s = %s.readByte();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s = %s.readShort();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s = %s.readInt();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s = %s.readLong();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s = %s.readFloat();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s = %s.readDouble();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s = %s.readString();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - if (type->EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { - sb.Append(prefix).AppendFormat("%s = %s.readRemoteObject();\n", name.string(), parcelName.string()); - break; - } - sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INTERFACE: - sb.Append(prefix).AppendFormat("%s = %s.asInterface(%s.readRemoteObject());\n", name.string(), - StubName(type->EmitJavaType(TypeMode::NO_MODE)).string(), parcelName.string()); - break; - case TypeKind::TYPE_LIST: { - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_MAP: { - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - - AutoPtr mapType = dynamic_cast(type.Get()); - AutoPtr keyType = mapType->GetKeyType(); - AutoPtr valueType = mapType->GetValueType(); - - EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); - EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - EmitReadOutArrayVariable(parcelName, name, arrayType, sb, prefix); - break; - } - default: - break; - } -} - void JavaClientProxyCodeEmitter::EmitLocalVariable(const AutoPtr& param, StringBuilder& sb, const String& prefix) { @@ -659,10 +243,5 @@ void JavaClientProxyCodeEmitter::EmitLocalVariable(const AutoPtr& param->GetName().string()); } } - -String JavaClientProxyCodeEmitter::StubName(const String& name) -{ - return name.StartsWith("I") ? (name.Substring(1) + "Stub") : (name + "Stub"); -} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h index bc077cb3..c304db6a 100755 --- a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h @@ -16,13 +16,14 @@ namespace OHOS { namespace HDI { class JavaClientProxyCodeEmitter : public JavaCodeEmitter { public: - JavaClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : JavaCodeEmitter(ast, targetDirectory) {} + JavaClientProxyCodeEmitter() : JavaCodeEmitter() {} virtual ~JavaClientProxyCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitProxyFile(); void EmitProxyImports(StringBuilder& sb); @@ -47,21 +48,9 @@ private: void EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix); - void EmitWriteMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, - const String& prefix); - void EmitReadMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, const String& prefix); - void EmitWriteVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - - void EmitWriteArrayVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - - void EmitWriteOutArrayVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - void EmitReadVariable(const String& parcelName, const String& name, const AutoPtr& type, ParamAttr attribute, StringBuilder& sb, const String& prefix); @@ -75,8 +64,6 @@ private: StringBuilder& sb, const String& prefix); void EmitLocalVariable(const AutoPtr& param, StringBuilder& sb, const String& prefix); - - String StubName(const String& name); }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/java_code_emitter.cpp b/tools/hdi-gen/codegen/java_code_emitter.cpp index 51a13752..b96e34c8 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_code_emitter.cpp @@ -13,22 +13,56 @@ namespace OHOS { namespace HDI { -JavaCodeEmitter::JavaCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :LightRefCountBase(), ast_(ast), directory_(targetDirectory) +bool JavaCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); + if (!Reset(ast, targetDirectory)) { + return false; } - if (interface_ != nullptr) { + EmitCode(); + return true; +} + +bool JavaCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) +{ + if (ast == nullptr) { + return false; + } + + if (targetDirectory.Equals("")) { + return false; + } + + CleanData(); + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); interfaceName_ = interface_->GetName(); interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; proxyName_ = infName_ + "Proxy"; proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - } else { + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { infName_ = ast_->GetName(); } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void JavaCodeEmitter::CleanData() +{ + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; } String JavaCodeEmitter::FileName(const String& name) diff --git a/tools/hdi-gen/codegen/java_code_emitter.h b/tools/hdi-gen/codegen/java_code_emitter.h index eb800450..32c1a99a 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.h +++ b/tools/hdi-gen/codegen/java_code_emitter.h @@ -19,24 +19,19 @@ namespace OHOS { namespace HDI { class JavaCodeEmitter : public LightRefCountBase { public: - JavaCodeEmitter(const AutoPtr& ast, const String& targetDirectory); - virtual ~JavaCodeEmitter() = default; - virtual void EmitCode() = 0; - - inline String GetSourceFile() - { - return sourceFileName_; - } - - inline bool isInvaildDir() - { - return directory_.Equals(""); - } + bool OutPut(const AutoPtr& ast, const String& targetDirectory); static String FileName(const String& name); protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; bool CreateDirectory(); @@ -52,11 +47,9 @@ protected: String SpecificationParam(StringBuilder& paramSb, const String& prefix); - AutoPtr ast_; - AutoPtr interface_; - + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; String directory_; - String sourceFileName_; String interfaceName_; String interfaceFullName_; diff --git a/tools/hdi-gen/codegen/java_code_generator.cpp b/tools/hdi-gen/codegen/java_code_generator.cpp index 853aee68..5cae0885 100755 --- a/tools/hdi-gen/codegen/java_code_generator.cpp +++ b/tools/hdi-gen/codegen/java_code_generator.cpp @@ -17,52 +17,32 @@ namespace OHOS { namespace HDI { -const char* JavaCodeGenerator::TAG = "JavaCodeGenerator"; - -bool JavaCodeGenerator::Initializate(const AutoPtr& ast, const String& targetDirectory) +bool JavaCodeGenerator::Generate() { - if (ast->GetASTFileType() == ASTFileType::AST_TYPES) { - Logger::E(TAG, "java has no types idl."); - return false; - } + Initializate(); - ast_ = ast; - targetDirectory_ = targetDirectory; - - if (!ResolveDirectory()) { - return false; - } - - AutoPtr clientInterfaceCodeEmitter = new JavaClientInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr clientProxyCodeEmitter = new JavaClientProxyCodeEmitter(ast_, targetDirectory_); - - emitters_.push_back(clientInterfaceCodeEmitter); - emitters_.push_back(clientProxyCodeEmitter); - return true; -} - -bool JavaCodeGenerator::Generate() const -{ - for (auto emitter : emitters_) { - if (!emitter->isInvaildDir()) { - emitter->EmitCode(); + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + switch (ast->GetASTFileType()) { + case ASTFileType::AST_IFACE: + case ASTFileType::AST_ICALLBACK: { + emitters_["clientIface"]->OutPut(ast, targetDirectory_); + emitters_["proxy"]->OutPut(ast, targetDirectory_); + break; + } + default: + break; } } - return true; } -bool JavaCodeGenerator::ResolveDirectory() +void JavaCodeGenerator::Initializate() { - String packageFilePath = String::Format("%s/%s/", - targetDirectory_.string(), JavaCodeEmitter::FileName(ast_->GetPackageName()).string()); - targetDirectory_ = packageFilePath; - - if (!File::CreateParentDir(targetDirectory_)) { - Logger::E(TAG, "create '%s' directory failed!", targetDirectory_); - return false; - } - return true; + emitters_ = { + {"clientIface", new JavaClientInterfaceCodeEmitter()}, + {"proxy", new JavaClientProxyCodeEmitter()}, + }; } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_code_generator.h b/tools/hdi-gen/codegen/java_code_generator.h index 0fea5d53..0274854e 100755 --- a/tools/hdi-gen/codegen/java_code_generator.h +++ b/tools/hdi-gen/codegen/java_code_generator.h @@ -16,18 +16,18 @@ namespace OHOS { namespace HDI { class JavaCodeGenerator : public CodeGenerator { public: - JavaCodeGenerator() : CodeGenerator(), - emitters_() {} + using JavaCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; + + JavaCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : CodeGenerator(astModule, targetDirectory), emitters_() {} ~JavaCodeGenerator() override {}; - bool Initializate(const AutoPtr& ast, const String& targetDirectory) override; - bool Generate() const override; + bool Generate() override; private: - bool ResolveDirectory() override; + void Initializate(); - static const char* TAG; - std::vector> emitters_; + JavaCodeEmitMap emitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/main.cpp b/tools/hdi-gen/main.cpp index 907efed6..e54e597a 100755 --- a/tools/hdi-gen/main.cpp +++ b/tools/hdi-gen/main.cpp @@ -18,7 +18,6 @@ using namespace OHOS::HDI; int main(int argc, char** argv) { Options& options = Options::GetInstance().Parse(argc, argv); - if (options.HasErrors()) { options.ShowErrors(); return 0; @@ -44,47 +43,25 @@ int main(int argc, char** argv) Logger::E("hdi-gen", "open idl file failed!"); return -1; } - printf("%s:%lu\n", idlFile->GetPath().string(), idlFile->GetHashKey()); return 0; } ModuleParser moduleParser(options); - if (!moduleParser.ParserDependencies()) { - Logger::E("hdi-gen", "Parsing dependencies failed."); + AutoPtr astModule = moduleParser.Parse(); + if (astModule == nullptr) { return -1; } - if (!moduleParser.CompileFiles()) { - Logger::E("hdi-gen", "Parsing .idl failed."); - return -1; - } - - AutoPtr astModule = moduleParser.GetAStModule(); - if (!options.DoGenerateCode()) { return 0; } - for (auto& astPair : astModule->GetAllAsts()) { - AutoPtr ast = astPair.second; - GeneratorFactory factory; - AutoPtr codeGen = factory.GetCodeGenerator(options.GetTargetLanguage()); - if (codeGen == nullptr) { - Logger::E("hdi-gen", "new Generate failed."); - return -1; - } - - if (!codeGen->Initializate(ast, options.GetGenerationDirectory())) { - Logger::E("hdi-gen", "Generate initializate failed."); - return -1; - } - - if (!codeGen->Generate()) { - Logger::E("hdi-gen", "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); - return -1; - } + AutoPtr codeGen = GeneratorFactory::GetInstance().GetCodeGenerator(astModule, + options.GetTargetLanguage(), options.GetGenerationDirectory()); + if (!codeGen->Generate()) { + Logger::E("hdi-gen", "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); + return -1; } - return 0; } \ No newline at end of file diff --git a/tools/hdi-gen/parser/module_parser.cpp b/tools/hdi-gen/parser/module_parser.cpp index b4ef43b3..222f89f7 100755 --- a/tools/hdi-gen/parser/module_parser.cpp +++ b/tools/hdi-gen/parser/module_parser.cpp @@ -13,17 +13,28 @@ namespace OHOS { namespace HDI { -const char* ModuleParser::TAG = "ModuleParser"; +AutoPtr ModuleParser::Parse() +{ + if (!ParserDependencies()) { + return nullptr; + } + + if (!CompileFiles()) { + return nullptr; + } + + return module_; +} bool ModuleParser::ParserDependencies() { if (!ParserAllImports(option_.GetSourceFile())) { - Logger::E(TAG, "Parsing all idl file failed."); + Logger::E(g_tab, "Parsing all idl file failed."); return false; } if (!CheckCircularReference()) { - Logger::E(TAG, "has circle reference."); + Logger::E(g_tab, "has circle reference."); return false; } @@ -36,7 +47,7 @@ bool ModuleParser::CompileFiles() for (const auto& filePath : compileFiles_) { if (!parserPtr->Parse(filePath)) { - Logger::E(TAG, "parse %s failed", filePath.string()); + Logger::E(g_tab, "parse %s failed", filePath.string()); return false; } } @@ -73,19 +84,19 @@ bool ModuleParser::ParserAllImportsRecursion(const std::shared_ptr& std::unique_ptr parserPtr = std::make_unique(option_); std::shared_ptr file = nullptr; if (!parserPtr->Parse(filePath, file)) { - Logger::E(TAG, "Parsing %s failed.", filePath.string()); + Logger::E(g_tab, "Parsing %s failed.", filePath.string()); return false; } if (file == nullptr) { - Logger::E(TAG, "Parsing %s failed, generator filedetail is nullptr.", filePath.string()); + Logger::E(g_tab, "Parsing %s failed, generator filedetail is nullptr.", filePath.string()); return false; } sourceFiles_[file->GetFullName()] = file; if (!ParserAllImportsRecursion(file)) { - Logger::E(TAG, "Parsing %s file's import failed.", file->GetFilePath().string()); + Logger::E(g_tab, "Parsing %s file's import failed.", file->GetFilePath().string()); return false; } } diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 07cf1449..4041d914 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -31,17 +31,13 @@ public: ~ModuleParser() {} + AutoPtr Parse(); +private: // parser file and circular reference bool ParserDependencies(); bool CompileFiles(); - inline AutoPtr GetAStModule() const - { - return module_; - } - -private: // parse all idl file involved in compilation. bool ParserAllImports(const String& rootFilePath); @@ -50,7 +46,6 @@ private: // check circular reference and reverse topology sorting of all idl file bool CheckCircularReference(); - static const char* TAG; const Options& option_; FileDetailMap sourceFiles_; diff --git a/tools/hdi-gen/parser/parser.cpp b/tools/hdi-gen/parser/parser.cpp index 73a1499d..26d4f5fd 100755 --- a/tools/hdi-gen/parser/parser.cpp +++ b/tools/hdi-gen/parser/parser.cpp @@ -185,10 +185,8 @@ bool Parser::ParseIdlImport(std::shared_ptr& fileDetailPtr) bool Parser::ParseFile() { bool ret = true; - ast_ = new AST(); ast_->SetIdlFile(lexer_->GetFilePath()); - ParseLicense(); Token token; @@ -229,17 +227,7 @@ bool Parser::ParseFile() } } lexer_->GetToken(); - - // here, ast_ cannot be a sequenceable idl - if (ast_->GetInterfaceDef() != nullptr) { - if (ast_->GetInterfaceDef()->IsCallback()) { - ast_->SetAStFileType(ASTFileType::AST_ICALLBACK); - } else { - ast_->SetAStFileType(ASTFileType::AST_IFACE); - } - } else { - ast_->SetAStFileType(ASTFileType::AST_TYPES); - } + SetAstFileType(); return ret; } @@ -413,48 +401,11 @@ bool Parser::ParseAttribute() bool ret = true; AutoPtr attributes = nullptr; - // read '[' - Token token = lexer_->GetToken(); - if (token == Token::BRACKETS_LEFT) { - attributes = new Attribute(); - token = lexer_->PeekToken(); - while (token != Token::BRACKETS_RIGHT) { - switch (token) { - case Token::ONEWAY: - attributes->isOneWay = true; - break; - case Token::CALLBACK: - attributes->isCallback = true; - break; - case Token::FULL: - attributes->isFull = true; - break; - case Token::LITE: - attributes->isLite = true; - break; - default: { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); - lexer_->GetToken(); - return false; - } - } - lexer_->GetToken(); - token = lexer_->PeekToken(); - if (token == Token::COMMA) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } else if (token == Token::BRACKETS_RIGHT) { - break; - } else { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - return false; - } - } - lexer_->GetToken(); + if (!ParseAttributeBody(attributes)) { + return false; } - token = lexer_->PeekToken(); + Token token = lexer_->PeekToken(); switch (token) { case Token::ENUM: ret = ParseEnumDefine(attributes) && ret; @@ -479,11 +430,6 @@ bool Parser::ParseAttribute() bool Parser::ParseInterface(const AutoPtr& attributes) { lexer_->GetToken(); - bool ret = true; - bool isOneWay = false; - bool isCallback = false; - bool isFull = false; - bool isLite = false; String interfaceName; Token token = lexer_->PeekToken(); @@ -494,7 +440,6 @@ bool Parser::ParseInterface(const AutoPtr& attributes) return false; } lexer_->GetToken(); - interfaceName = lexer_->GetIdentifier(); token = lexer_->PeekToken(); @@ -504,8 +449,6 @@ bool Parser::ParseInterface(const AutoPtr& attributes) lexer_->GetToken(); return false; } - - // read '{' lexer_->GetToken(); if (interfaceName.IsEmpty()) { @@ -529,7 +472,13 @@ bool Parser::ParseInterface(const AutoPtr& attributes) interface->SetFull(attributes->isFull); interface->SetLite(attributes->isLite); } + return ParseInterfaceBody(interface); +} +bool Parser::ParseInterfaceBody(const AutoPtr& interface) +{ + bool ret = true; + Token token = lexer_->PeekToken(); while (token != Token::BRACES_RIGHT && token != Token::END_OF_FILE) { ret = ParseMethod(interface) && ret; token = lexer_->PeekToken(); @@ -540,7 +489,6 @@ bool Parser::ParseInterface(const AutoPtr& attributes) lexer_->SkipEof(); return false; } - lexer_->GetToken(); if (ast_->GetInterfaceDef() != nullptr) { @@ -550,16 +498,13 @@ bool Parser::ParseInterface(const AutoPtr& attributes) } ast_->AddInterfaceDef(interface); - return ret; } bool Parser::ParseMethod(const AutoPtr& interface) { - bool ret = true; - AutoPtr attributes = new Attribute(); - ret = ParseMethodAttr(interface, attributes) && ret; - if (!ret) { + AutoPtr attributes = nullptr; + if (!ParseAttributeBody(attributes)) { return false; } @@ -580,7 +525,7 @@ bool Parser::ParseMethod(const AutoPtr& interface) } return false; } - token = lexer_->GetToken(); + lexer_->GetToken(); AutoPtr method = new ASTMethod(); method->SetName(lexer_->GetIdentifier()); @@ -591,24 +536,73 @@ bool Parser::ParseMethod(const AutoPtr& interface) method->SetLite(attributes->isLite); } - token = lexer_->PeekToken(); - if (token != Token::PARENTHESES_LEFT) { - LogError(String("'(' is expected.")); - if (token == Token::BRACES_RIGHT) { - return false; - } - // jump over colon - lexer_->GetToken(); - while (token != Token::SEMICOLON && token != Token::END_OF_FILE) { - token = lexer_->PeekToken(); - if (token == Token::BRACES_RIGHT) { - break; - } - lexer_->GetToken(); - } + if (!ParseParameterList(method)) { return false; } - token = lexer_->GetToken(); + + interface->AddMethod(method); + return true; +} + +bool Parser::ParseAttributeBody(AutoPtr& attributes) +{ + Token token = lexer_->PeekToken(); + if (token != Token::BRACKETS_LEFT) { + return true; + } + lexer_->GetToken(); + + attributes = new Attribute(); + token = lexer_->PeekToken(); + while (token != Token::BRACKETS_RIGHT) { + switch (token) { + case Token::ONEWAY: + attributes->isOneWay = true; + break; + case Token::CALLBACK: + attributes->isCallback = true; + break; + case Token::FULL: + attributes->isFull = true; + break; + case Token::LITE: + attributes->isLite = true; + break; + default: { + LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); + lexer_->Skip(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); + lexer_->GetToken(); + return false; + } + } + lexer_->GetToken(); + token = lexer_->PeekToken(); + if (token == Token::COMMA) { + lexer_->GetToken(); + token = lexer_->PeekToken(); + } else if (token == Token::BRACKETS_RIGHT) { + break; + } else { + LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); + lexer_->Skip(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); + lexer_->GetToken(); + return false; + } + } + lexer_->GetToken(); + return true; +} + +bool Parser::ParseParameterList(AutoPtr& method) +{ + bool ret = true; + Token token = lexer_->PeekToken(); + if (token != Token::PARENTHESES_LEFT) { + LogError(String("'(' is expected.")); + lexer_->Skip(';'); + return false; + } + lexer_->GetToken(); token = lexer_->PeekToken(); while (token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { @@ -637,64 +631,44 @@ bool Parser::ParseMethod(const AutoPtr& interface) return false; } lexer_->GetToken(); - interface->AddMethod(method); - return ret; -} - -bool Parser::ParseMethodAttr(const AutoPtr& interface, const AutoPtr& attributes) -{ - if (interface == nullptr || attributes == nullptr) { - return false; - } - - Token token = lexer_->PeekToken(); - if (token == Token::BRACES_RIGHT) { - LogError(String::Format("%s has no method.", interface->GetName().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACES_RIGHT)); - lexer_->GetToken(); - return false; - } - - if (token == Token::BRACKETS_LEFT) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - while (token != Token::BRACKETS_RIGHT) { - switch (token) { - case Token::ONEWAY: - attributes->isOneWay = true; - break; - case Token::FULL: - attributes->isFull = true; - break; - case Token::LITE: - attributes->isLite = true; - break; - default: { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); - lexer_->GetToken(); - return false; - } - } - lexer_->GetToken(); - token = lexer_->PeekToken(); - if (token == Token::COMMA) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } else if (token == Token::BRACKETS_RIGHT) { - } else { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); - lexer_->GetToken(); - return false; - } - } - lexer_->GetToken(); - } return true; } bool Parser::ParseParameter(const AutoPtr& method) +{ + AutoPtr parameter = new ASTParameter(); + if (!ParseParamAttr(parameter)) { + return false; + } + + AutoPtr type = ParseType(); + + Token token = lexer_->PeekToken(); + if (type == nullptr) { + while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { + lexer_->GetToken(); + token = lexer_->PeekToken(); + } + return false; + } + + if (token != Token::IDENTIFIER) { + LogError(String("Parameter name is expected.")); + while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { + lexer_->GetToken(); + token = lexer_->PeekToken(); + } + return false; + } + lexer_->GetToken(); + + parameter->SetName(lexer_->GetIdentifier()); + parameter->SetType(type); + method->AddParameter(parameter); + return true; +} + +bool Parser::ParseParamAttr(const AutoPtr& parameter) { Token token = lexer_->PeekToken(); if (token != Token::BRACKETS_LEFT) { @@ -707,52 +681,11 @@ bool Parser::ParseParameter(const AutoPtr& method) } lexer_->GetToken(); - AutoPtr parameter = new ASTParameter(); - if (!ParseParamAttr(parameter)) { - return false; - } - - token = lexer_->PeekToken(); - if (token != Token::BRACKETS_RIGHT) { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - while (token != Token::SEMICOLON && token != Token::END_OF_FILE) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } - return false; - } - lexer_->GetToken(); - AutoPtr type = ParseType(); - if (type == nullptr) { - while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } - return false; - } - - token = lexer_->PeekToken(); - if (token != Token::IDENTIFIER) { - LogError(String("Parameter name is expected.")); - while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } - return false; - } - lexer_->GetToken(); - parameter->SetName(lexer_->GetIdentifier()); - parameter->SetType(type); - method->AddParameter(parameter); - return true; -} - -bool Parser::ParseParamAttr(const AutoPtr& parameter) -{ if (parameter == nullptr) { return false; } - Token token = lexer_->PeekToken(); + + token = lexer_->PeekToken(); if (token == Token::IN) { lexer_->GetToken(); parameter->SetAttribute(ParamAttr::PARAM_IN); @@ -768,6 +701,18 @@ bool Parser::ParseParamAttr(const AutoPtr& parameter) } return false; } + + token = lexer_->PeekToken(); + if (token != Token::BRACKETS_RIGHT) { + LogError(String::Format("']' is expected.")); + while (token != Token::SEMICOLON && token != Token::END_OF_FILE) { + lexer_->GetToken(); + token = lexer_->PeekToken(); + } + return false; + } + lexer_->GetToken(); + return true; } @@ -791,25 +736,8 @@ AutoPtr Parser::ParseType() lexer_->GetToken(); type = ast_->FindType(lexer_->GetIdentifier()); } else if (token == Token::UNSIGNED) { - String unsignedStr = lexer_->DumpToken(); lexer_->GetToken(); - token = lexer_->PeekToken(); - switch (token) { - case Token::CHAR: - case Token::SHORT: - case Token::INTEGER: - case Token::LONG: { - type = ast_->FindType(unsignedStr + " " + lexer_->DumpToken()); - lexer_->GetToken(); - break; - } - default: { - LogError(typeLineNo, typeColumnNo, - String::Format("'unsigned %s' type was not declared in the idl file.", - lexer_->DumpToken().string())); - return nullptr; - } - } + type = ParseUnsignedType(typeLineNo, typeColumnNo); } else { LogError(typeLineNo, typeColumnNo, String("Invalid type name.")); return nullptr; @@ -823,23 +751,7 @@ AutoPtr Parser::ParseType() token = lexer_->PeekToken(); if (token == Token::BRACKETS_LEFT) { lexer_->GetToken(); - token = lexer_->PeekToken(); - if (token != Token::BRACKETS_RIGHT) { - LogError(typeLineNo, typeColumnNo, String("']' is expected.")); - return nullptr; - } - lexer_->GetToken(); - - if (type != nullptr) { - AutoPtr arrayType = new ASTArrayType(); - arrayType->SetElementType(type); - - type = ast_->FindType(arrayType->ToString()); - if (type == nullptr) { - ast_->AddType(arrayType.Get()); - type = static_cast(arrayType.Get()); - } - } + type = ParseArrayType(type); } if (!CheckType(typeLineNo, typeColumnNo, type)) { @@ -849,6 +761,31 @@ AutoPtr Parser::ParseType() return type; } +AutoPtr Parser::ParseUnsignedType(int typeLineNo, int typeColumnNo) +{ + AutoPtr type = nullptr; + String unsignedStr = lexer_->DumpToken(); + Token token = lexer_->PeekToken(); + switch (token) { + case Token::CHAR: + case Token::SHORT: + case Token::INTEGER: + case Token::LONG: { + type = ast_->FindType(unsignedStr + " " + lexer_->DumpToken()); + lexer_->GetToken(); + break; + } + default: { + LogError(typeLineNo, typeColumnNo, + String::Format("'unsigned %s' type was not declared in the idl file.", + lexer_->DumpToken().string())); + return nullptr; + } + } + + return type; +} + AutoPtr Parser::ParseList() { lexer_->GetToken(); @@ -936,6 +873,31 @@ AutoPtr Parser::ParseMap() return ret; } +AutoPtr Parser::ParseArrayType(const AutoPtr& elementType) +{ + Token token = lexer_->PeekToken(); + if (token != Token::BRACKETS_RIGHT) { + LogError(String("']' is expected.")); + return nullptr; + } + lexer_->GetToken(); + + if (elementType == nullptr) { + return nullptr; + } + + AutoPtr arrayType = new ASTArrayType(); + arrayType->SetElementType(elementType); + AutoPtr type = ast_->FindType(arrayType->ToString()); + + if (type == nullptr) { + ast_->AddType(arrayType.Get()); + type = static_cast(arrayType.Get()); + } + + return type; +} + AutoPtr Parser::ParseCustomType() { Token token = lexer_->GetToken(); @@ -1106,7 +1068,22 @@ bool Parser::ParseStructDefine(const AutoPtr& attributes) type->SetName(lexer_->GetIdentifier()); lexer_->GetToken(); - token = lexer_->PeekToken(); + if (!ParseStructMember(type)) { + return false; + } + + if (attributes != nullptr) { + type->SetFull(attributes->isFull); + type->SetLite(attributes->isLite); + } + + ast_->AddTypeDefinition(type.Get()); + return true; +} + +bool Parser::ParseStructMember(const AutoPtr& type) +{ + Token token = lexer_->PeekToken(); if (token != Token::BRACES_LEFT) { lexer_->SkipCurrentLine(';'); return false; @@ -1129,7 +1106,6 @@ bool Parser::ParseStructDefine(const AutoPtr& attributes) } String memberName = lexer_->GetIdentifier(); lexer_->GetToken(); - type->AddMember(member, memberName); token = lexer_->PeekToken(); @@ -1152,13 +1128,6 @@ bool Parser::ParseStructDefine(const AutoPtr& attributes) return false; } lexer_->GetToken(); - - if (attributes != nullptr) { - type->SetFull(attributes->isFull); - type->SetLite(attributes->isLite); - } - - ast_->AddTypeDefinition(type.Get()); return true; } @@ -1180,7 +1149,22 @@ bool Parser::ParseUnionDefine(const AutoPtr& attributes) type->SetName(lexer_->GetIdentifier()); lexer_->GetToken(); - token = lexer_->PeekToken(); + if (!ParseUnionMember(type)) { + return false; + } + + if (attributes != nullptr) { + type->SetFull(attributes->isFull); + type->SetLite(attributes->isLite); + } + + ast_->AddTypeDefinition(type.Get()); + return true; +} + +bool Parser::ParseUnionMember(const AutoPtr& type) +{ + Token token = lexer_->PeekToken(); if (token != Token::BRACES_LEFT) { lexer_->SkipCurrentLine(';'); return false; @@ -1203,7 +1187,6 @@ bool Parser::ParseUnionDefine(const AutoPtr& attributes) } String memberName = lexer_->GetIdentifier(); lexer_->GetToken(); - type->AddMember(member, memberName); token = lexer_->PeekToken(); @@ -1226,13 +1209,6 @@ bool Parser::ParseUnionDefine(const AutoPtr& attributes) return false; } lexer_->GetToken(); - - if (attributes != nullptr) { - type->SetFull(attributes->isFull); - type->SetLite(attributes->isLite); - } - - ast_->AddTypeDefinition(type.Get()); return true; } @@ -1268,6 +1244,19 @@ bool Parser::CheckType(int lineNo, int columnNo, const AutoPtr& type) return true; } +void Parser::SetAstFileType() +{ + if (ast_->GetInterfaceDef() != nullptr) { + if (ast_->GetInterfaceDef()->IsCallback()) { + ast_->SetAStFileType(ASTFileType::AST_ICALLBACK); + } else { + ast_->SetAStFileType(ASTFileType::AST_IFACE); + } + } else { + ast_->SetAStFileType(ASTFileType::AST_TYPES); + } +} + bool Parser::CheckIntegrity() { if (ast_ == nullptr) { @@ -1287,36 +1276,10 @@ bool Parser::CheckIntegrity() switch (ast_->GetASTFileType()) { case ASTFileType::AST_IFACE: { - AutoPtr interface = ast_->GetInterfaceDef(); - if (interface == nullptr) { - LogError(String("ast's interface is empty.")); - return false; - } - - if (ast_->GetTypeDefinitionNumber() > 0) { - LogError(String("interface ast cannot has custom types.")); - return false; - } - - if (interface->GetMethodNumber() == 0) { - LogError(String("interface ast has no method.")); - return false; - } - - break; + return CheckInterfaceAst(); } case ASTFileType::AST_ICALLBACK: { - AutoPtr interface = ast_->GetInterfaceDef(); - if (interface == nullptr) { - LogError(String("ast's interface is empty.")); - return false; - } - - if (!interface->IsCallback()) { - LogError(String("ast is callback, but ast's interface is not callback.")); - return false; - } - break; + return CheckCallbackAst(); } case ASTFileType::AST_SEQUENCEABLE: { LogError(String("it's impossible that ast is sequenceable.")); @@ -1336,6 +1299,41 @@ bool Parser::CheckIntegrity() return true; } +bool Parser::CheckInterfaceAst() +{ + AutoPtr interface = ast_->GetInterfaceDef(); + if (interface == nullptr) { + LogError(String("ast's interface is empty.")); + return false; + } + + if (ast_->GetTypeDefinitionNumber() > 0) { + LogError(String("interface ast cannot has custom types.")); + return false; + } + + if (interface->GetMethodNumber() == 0) { + LogError(String("interface ast has no method.")); + return false; + } + return true; +} + +bool Parser::CheckCallbackAst() +{ + AutoPtr interface = ast_->GetInterfaceDef(); + if (interface == nullptr) { + LogError(String("ast's interface is empty.")); + return false; + } + + if (!interface->IsCallback()) { + LogError(String("ast is callback, but ast's interface is not callback.")); + return false; + } + return true; +} + bool Parser::IsValidTypeName(const String& typeName) { if (typeName[0] == '.') { diff --git a/tools/hdi-gen/parser/parser.h b/tools/hdi-gen/parser/parser.h index 578bb836..bfd1f02d 100755 --- a/tools/hdi-gen/parser/parser.h +++ b/tools/hdi-gen/parser/parser.h @@ -81,9 +81,13 @@ private: bool ParseInterface(const AutoPtr& attributes = nullptr); + bool ParseInterfaceBody(const AutoPtr& interface); + bool ParseMethod(const AutoPtr& interface); - bool ParseMethodAttr(const AutoPtr& interface, const AutoPtr& attributes); + bool ParseAttributeBody(AutoPtr& attributes); + + bool ParseParameterList(AutoPtr& method); bool ParseParameter(const AutoPtr& method); @@ -91,10 +95,14 @@ private: AutoPtr ParseType(); + AutoPtr ParseUnsignedType(int typeLineNo, int typeColumnNo); + AutoPtr ParseList(); AutoPtr ParseMap(); + AutoPtr ParseArrayType(const AutoPtr& elementType); + AutoPtr ParseCustomType(); bool ParseEnumDefine(const AutoPtr& attributes = nullptr); @@ -105,12 +113,22 @@ private: bool ParseStructDefine(const AutoPtr& attributes = nullptr); + bool ParseStructMember(const AutoPtr& type); + bool ParseUnionDefine(const AutoPtr& attributes = nullptr); + bool ParseUnionMember(const AutoPtr& type); + bool CheckType(int lineNo, int columnNo, const AutoPtr& type); + void SetAstFileType(); + bool CheckIntegrity(); + bool CheckInterfaceAst(); + + bool CheckCallbackAst(); + bool IsValidTypeName(const String& typeName); bool CheckPackageName(const String& filePath, const String& packageName); diff --git a/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp b/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp index 36ac0bd4..d4b93700 100755 --- a/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp +++ b/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp @@ -21,7 +21,19 @@ using namespace OHOS; using namespace testing::ext; -static struct IStructTest* g_testClient = nullptr; +static const uint32_t g_arrayLen = 2; +static const int8_t g_integer8Var = 65; +static const int16_t g_integer16Var = 3; +static const int32_t g_integer32Var = 4; +static const int64_t g_integer64Var = 5; +static const uint8_t g_uInteger8Var = 97; +static const uint16_t g_uInteger16Var = 7; +static const uint32_t g_uInteger32Var = 8; +static const uint64_t g_uInteger64Var = 8; +static const float g_floatVar = 10.5; +static const double g_doubleVar = 11.55; + +static struct IStructTest *g_testClient = nullptr; class CStructTest : public testing::Test { public: @@ -54,15 +66,15 @@ HWTEST_F(CStructTest, CStructTest_001, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_002, TestSize.Level1) { - struct SSample* srcObj = (struct SSample*)OsalMemCalloc(sizeof(struct SSample)); + struct SSample *srcObj = (struct SSample *)OsalMemCalloc(sizeof(struct SSample)); ASSERT_NE(srcObj, nullptr); srcObj->m1 = true; - srcObj->m2 = 1; - srcObj->m3 = 10.125; + srcObj->m2 = g_integer32Var; + srcObj->m3 = g_doubleVar; srcObj->m4 = strdup("hello world"); - struct SSample* destObj = nullptr; + struct SSample *destObj = nullptr; int32_t ec = g_testClient->SSampleTest(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -77,22 +89,22 @@ HWTEST_F(CStructTest, CStructTest_002, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_003, TestSize.Level1) { - struct SSample2* srcObj = (struct SSample2*)OsalMemCalloc(sizeof(struct SSample2)); + struct SSample2 *srcObj = (struct SSample2 *)OsalMemCalloc(sizeof(struct SSample2)); ASSERT_NE(srcObj, nullptr); srcObj->m1 = true; - srcObj->m2 = 65; - srcObj->m3 = 10; - srcObj->m4 = 20; - srcObj->m5 = 30; - srcObj->m6 = 97; - srcObj->m7 = 100; - srcObj->m8 = 200; - srcObj->m9 = 300; - srcObj->m10 = 10.5; - srcObj->m11 = 20.125; + srcObj->m2 = g_integer8Var; + srcObj->m3 = g_integer16Var; + srcObj->m4 = g_integer32Var; + srcObj->m5 = g_integer64Var; + srcObj->m6 = g_uInteger8Var; + srcObj->m7 = g_uInteger16Var; + srcObj->m8 = g_uInteger32Var; + srcObj->m9 = g_uInteger64Var; + srcObj->m10 = g_floatVar; + srcObj->m11 = g_doubleVar; - struct SSample2* destObj = nullptr; + struct SSample2 *destObj = nullptr; int32_t ec = g_testClient->SSample2Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -114,33 +126,30 @@ HWTEST_F(CStructTest, CStructTest_003, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_004, TestSize.Level1) { - struct SSample3* srcObj = (struct SSample3*)OsalMemCalloc(sizeof(struct SSample3)); + struct SSample3 *srcObj = (struct SSample3 *)OsalMemCalloc(sizeof(struct SSample3)); ASSERT_NE(srcObj, nullptr); srcObj->m1 = strdup("hello world"); srcObj->m2 = MEM_THREE; - srcObj->m3.m1 = true; - srcObj->m3.m2 = 65; - srcObj->m3.m3 = 10; - srcObj->m3.m4 = 20; - srcObj->m3.m5 = 30; - srcObj->m3.m6 = 97; - srcObj->m3.m7 = 100; - srcObj->m3.m8 = 200; - srcObj->m3.m9 = 300; - srcObj->m3.m10 = 10.5; - srcObj->m3.m11 = 20.125; - + srcObj->m3.m2 = g_integer8Var; + srcObj->m3.m3 = g_integer16Var; + srcObj->m3.m4 = g_integer32Var; + srcObj->m3.m5 = g_integer64Var; + srcObj->m3.m6 = g_uInteger8Var; + srcObj->m3.m7 = g_uInteger16Var; + srcObj->m3.m8 = g_uInteger32Var; + srcObj->m3.m9 = g_uInteger64Var; + srcObj->m3.m10 = g_floatVar; + srcObj->m3.m11 = g_doubleVar; srcObj->m4 = open("/fdtest1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); - struct SSample3* destObj = nullptr; + struct SSample3 *destObj = nullptr; int32_t ec = g_testClient->SSample3Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); EXPECT_STREQ(srcObj->m1, destObj->m1); EXPECT_EQ(srcObj->m2, destObj->m2); - EXPECT_EQ((srcObj->m3.m1 ? 1 : 0), (destObj->m3.m1 ? 1 : 0)); EXPECT_EQ(srcObj->m3.m2, destObj->m3.m2); EXPECT_EQ(srcObj->m3.m3, destObj->m3.m3); @@ -152,109 +161,116 @@ HWTEST_F(CStructTest, CStructTest_004, TestSize.Level1) EXPECT_EQ(srcObj->m3.m9, destObj->m3.m9); EXPECT_FLOAT_EQ(srcObj->m3.m10, destObj->m3.m10); EXPECT_DOUBLE_EQ(srcObj->m3.m11, destObj->m3.m11); - SSample3Free(srcObj, true); SSample3Free(destObj, true); } -HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) +static void SSample4Part1Init(struct SSample4 *srcObj) { - struct SSample4* srcObj = (struct SSample4*)OsalMemCalloc(sizeof(struct SSample4)); - ASSERT_NE(srcObj, nullptr); - - srcObj->m1Len = 2; - srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * srcObj->m1Len); + srcObj->m1Len = g_arrayLen; + srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m1Len; i++) { srcObj->m1[i] = true; } - srcObj->m2Len = 2; - srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * srcObj->m2Len); + srcObj->m2Len = g_arrayLen; + srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m2Len; i++) { - srcObj->m2[i] = 65; + srcObj->m2[i] = g_integer8Var; } - srcObj->m3Len = 2; - srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * srcObj->m3Len); + srcObj->m3Len = g_arrayLen; + srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m3Len; i++) { - srcObj->m3[i] = 3; + srcObj->m3[i] = g_integer16Var; } - srcObj->m4Len = 2; - srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * srcObj->m4Len); + srcObj->m4Len = g_arrayLen; + srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m4Len; i++) { - srcObj->m4[i] = 4; + srcObj->m4[i] = g_integer32Var; } - srcObj->m5Len = 2; - srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * srcObj->m5Len); + srcObj->m5Len = g_arrayLen; + srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m5Len; i++) { - srcObj->m5[i] = 5; + srcObj->m5[i] = g_integer64Var; } +} - srcObj->m6Len = 2; - srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * srcObj->m6Len); +static void SSample4Part2Init(struct SSample4 *srcObj) +{ + srcObj->m6Len = g_arrayLen; + srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m6Len; i++) { - srcObj->m6[i] = 97; + srcObj->m6[i] = g_uInteger8Var; } - srcObj->m7Len = 2; - srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * srcObj->m7Len); + srcObj->m7Len = g_arrayLen; + srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m7Len; i++) { - srcObj->m7[i] = 7; + srcObj->m7[i] = g_uInteger16Var; } - srcObj->m8Len = 2; - srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * srcObj->m8Len); + srcObj->m8Len = g_arrayLen; + srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m8Len; i++) { - srcObj->m8[i] = 8; + srcObj->m8[i] = g_uInteger32Var; } - srcObj->m9Len = 2; - srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * srcObj->m9Len); + srcObj->m9Len = g_arrayLen; + srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m9Len; i++) { - srcObj->m9[i] = 9; + srcObj->m9[i] = g_uInteger64Var; } - srcObj->m10Len = 2; - srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * srcObj->m10Len); + srcObj->m10Len = g_arrayLen; + srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m10Len; i++) { - srcObj->m10[i] = 10.5; + srcObj->m10[i] = g_floatVar; } - srcObj->m11Len = 2; - srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * srcObj->m11Len); + srcObj->m11Len = g_arrayLen; + srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m11Len; i++) { - srcObj->m11[i] = 11.55; + srcObj->m11[i] = g_doubleVar; } +} - srcObj->m12Len = 2; - srcObj->m12 = (char**)OsalMemCalloc(sizeof(char*) * srcObj->m12Len); +static void SSample4Part3Init(struct SSample4 *srcObj) +{ + srcObj->m12Len = g_arrayLen; + srcObj->m12 = (char**)OsalMemCalloc(sizeof(char *) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m12Len; i++) { - const char* str = "hello world"; + const char *str = "hello world"; srcObj->m12[i] = strdup(str); } - srcObj->m13Len = 2; - srcObj->m13 = (enum ESample*)OsalMemCalloc(sizeof(enum ESample) * srcObj->m13Len); + srcObj->m13Len = g_arrayLen; + srcObj->m13 = (enum ESample *)OsalMemCalloc(sizeof(enum ESample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m13Len; i++) { srcObj->m13[i] = MEM_ONE; } - srcObj->m14Len = 2; - srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * srcObj->m14Len); + srcObj->m14Len = g_arrayLen; + srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m14Len; i++) { srcObj->m14[i].m1 = true; - srcObj->m14[i].m2 = 2; - srcObj->m14[i].m3 = 3.55; + srcObj->m14[i].m2 = g_integer32Var; + srcObj->m14[i].m3 = g_doubleVar; srcObj->m14[i].m4 = strdup("hello"); } +} - struct SSample4* destObj = nullptr; - int32_t ec = g_testClient->SSample4Test(g_testClient, srcObj, &destObj); - ASSERT_EQ(ec, HDF_SUCCESS); - +static void SSample4Init(struct SSample4 *srcObj) +{ + SSample4Part1Init(srcObj); + SSample4Part2Init(srcObj); + SSample4Part3Init(srcObj); +} +static void CompareSSample4Part1(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ for (uint32_t i = 0; i < srcObj->m1Len; i++) { EXPECT_EQ((srcObj->m1[i] ? 1 : 0), (destObj->m1[i] ? 1 : 0)); } @@ -274,7 +290,10 @@ HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m5Len; i++) { EXPECT_EQ(srcObj->m5[i], destObj->m5[i]); } +} +static void CompareSSample4Part2(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ for (uint32_t i = 0; i < srcObj->m6Len; i++) { EXPECT_EQ(srcObj->m6[i], destObj->m6[i]); } @@ -298,7 +317,10 @@ HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m11Len; i++) { EXPECT_DOUBLE_EQ(srcObj->m11[i], destObj->m11[i]); } +} +static void CompareSSample4Part3(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ for (uint32_t i = 0; i < srcObj->m12Len; i++) { EXPECT_STREQ(srcObj->m12[i], destObj->m12[i]); } @@ -313,108 +335,138 @@ HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) EXPECT_DOUBLE_EQ((srcObj->m14[i]).m3, (destObj->m14[i]).m3); EXPECT_STREQ((srcObj->m14[i]).m4, (destObj->m14[i]).m4); } +} + +static void CompareSSample4(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ + CompareSSample4Part1(srcObj, destObj); + CompareSSample4Part2(srcObj, destObj); + CompareSSample4Part3(srcObj, destObj); +} + +HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) +{ + struct SSample4 *srcObj = (struct SSample4*)OsalMemCalloc(sizeof(struct SSample4)); + ASSERT_NE(srcObj, nullptr); + + SSample4Init(srcObj); + + struct SSample4 *destObj = nullptr; + int32_t ec = g_testClient->SSample4Test(g_testClient, srcObj, &destObj); + ASSERT_EQ(ec, HDF_SUCCESS); + + CompareSSample4(srcObj, destObj); SSample4Free(srcObj, true); SSample4Free(destObj, true); } -HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) +static void SSample5Part1Init(struct SSample4 *srcObj) { - struct SSample5* srcObj = (struct SSample5*)OsalMemCalloc(sizeof(struct SSample5)); - ASSERT_NE(srcObj, nullptr); - - srcObj->m1Len = 2; - srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * srcObj->m1Len); + srcObj->m1Len = g_arrayLen; + srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m1Len; i++) { srcObj->m1[i] = true; } - srcObj->m2Len = 2; - srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * srcObj->m2Len); + srcObj->m2Len = g_arrayLen; + srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m2Len; i++) { - srcObj->m2[i] = 65; + srcObj->m2[i] = g_integer8Var; } - srcObj->m3Len = 2; - srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * srcObj->m3Len); + srcObj->m3Len = g_arrayLen; + srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m3Len; i++) { - srcObj->m3[i] = 3; + srcObj->m3[i] = g_integer16Var; } - srcObj->m4Len = 2; - srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * srcObj->m4Len); + srcObj->m4Len = g_arrayLen; + srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m4Len; i++) { - srcObj->m4[i] = 4; + srcObj->m4[i] = g_integer32Var; } - srcObj->m5Len = 2; - srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * srcObj->m5Len); + srcObj->m5Len = g_arrayLen; + srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m5Len; i++) { - srcObj->m5[i] = 5; + srcObj->m5[i] = g_integer64Var; } +} - srcObj->m6Len = 2; - srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * srcObj->m6Len); +static void SSample5Part2Init(struct SSample4 *srcObj) +{ + srcObj->m6Len = g_arrayLen; + srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m6Len; i++) { - srcObj->m6[i] = 97; + srcObj->m6[i] = g_uInteger8Var; } - srcObj->m7Len = 2; - srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * srcObj->m7Len); + srcObj->m7Len = g_arrayLen; + srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m7Len; i++) { - srcObj->m7[i] = 7; + srcObj->m7[i] = g_uInteger16Var; } - srcObj->m8Len = 2; - srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * srcObj->m8Len); + srcObj->m8Len = g_arrayLen; + srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m8Len; i++) { - srcObj->m8[i] = 8; + srcObj->m8[i] = g_uInteger32Var; } - srcObj->m9Len = 2; - srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * srcObj->m9Len); + srcObj->m9Len = g_arrayLen; + srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m9Len; i++) { - srcObj->m9[i] = 9; + srcObj->m9[i] = g_uInteger64Var; } - srcObj->m10Len = 2; - srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * srcObj->m10Len); + srcObj->m10Len = g_arrayLen; + srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m10Len; i++) { - srcObj->m10[i] = 10.5; + srcObj->m10[i] = g_floatVar; } - srcObj->m11Len = 2; - srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * srcObj->m11Len); + srcObj->m11Len = g_arrayLen; + srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m11Len; i++) { - srcObj->m11[i] = 11.55; + srcObj->m11[i] = g_doubleVar; } +} - srcObj->m12Len = 2; - srcObj->m12 = (char**)OsalMemCalloc(sizeof(char*) * srcObj->m12Len); +static void SSample5Part3Init(struct SSample4 *srcObj) +{ + srcObj->m12Len = g_arrayLen; + srcObj->m12 = (char**)OsalMemCalloc(sizeof(char *) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m12Len; i++) { - const char* str = "hello world"; + const char *str = "hello world"; srcObj->m12[i] = strdup(str); } - srcObj->m13Len = 2; - srcObj->m13 = (enum ESample*)OsalMemCalloc(sizeof(enum ESample) * srcObj->m13Len); + srcObj->m13Len = g_arrayLen; + srcObj->m13 = (enum ESample *)OsalMemCalloc(sizeof(enum ESample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m13Len; i++) { srcObj->m13[i] = MEM_ONE; } - srcObj->m14Len = 2; - srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * srcObj->m14Len); + srcObj->m14Len = g_arrayLen; + srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m14Len; i++) { srcObj->m14[i].m1 = true; - srcObj->m14[i].m2 = 2; - srcObj->m14[i].m3 = 3.55; + srcObj->m14[i].m2 = g_integer32Var; + srcObj->m14[i].m3 = g_doubleVar; srcObj->m14[i].m4 = strdup("hello"); } +} - struct SSample5* destObj = nullptr; - int32_t ec = g_testClient->SSample5Test(g_testClient, srcObj, &destObj); - ASSERT_EQ(ec, HDF_SUCCESS); +static void SSample5Init(struct SSample5 *srcObj) +{ + SSample5Part1Init(srcObj); + SSample5Part2Init(srcObj); + SSample5Part3Init(srcObj); +} +static void CompareSSample5Part1(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ for (uint32_t i = 0; i < srcObj->m1Len; i++) { EXPECT_EQ((srcObj->m1[i] ? 1 : 0), (destObj->m1[i] ? 1 : 0)); } @@ -434,7 +486,10 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m5Len; i++) { EXPECT_EQ(srcObj->m5[i], destObj->m5[i]); } +} +static void CompareSSample5Part2(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ for (uint32_t i = 0; i < srcObj->m6Len; i++) { EXPECT_EQ(srcObj->m6[i], destObj->m6[i]); } @@ -458,7 +513,10 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m11Len; i++) { EXPECT_DOUBLE_EQ(srcObj->m11[i], destObj->m11[i]); } +} +static void CompareSSample5Part3(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ for (uint32_t i = 0; i < srcObj->m12Len; i++) { EXPECT_STREQ(srcObj->m12[i], destObj->m12[i]); } @@ -473,6 +531,27 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) EXPECT_DOUBLE_EQ((srcObj->m14[i]).m3, (destObj->m14[i]).m3); EXPECT_STREQ((srcObj->m14[i]).m4, (destObj->m14[i]).m4); } +} + +static void CompareSSample5(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ + CompareSSample5Part1(srcObj, destObj); + CompareSSample5Part2(srcObj, destObj); + CompareSSample5Part3(srcObj, destObj); +} + +HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) +{ + struct SSample5 *srcObj = (struct SSample5*)OsalMemCalloc(sizeof(struct SSample5)); + ASSERT_NE(srcObj, nullptr); + + SSample5Init(srcObj); + + struct SSample5 *destObj = nullptr; + int32_t ec = g_testClient->SSample5Test(g_testClient, srcObj, &destObj); + ASSERT_EQ(ec, HDF_SUCCESS); + + CompareSSample5(srcObj, destObj); SSample5Free(srcObj, true); SSample5Free(destObj, true); @@ -480,27 +559,27 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_007, TestSize.Level1) { - struct SSample6* srcObj = (struct SSample6*)OsalMemCalloc(sizeof(struct SSample6)); + struct SSample6 *srcObj = (struct SSample6 *)OsalMemCalloc(sizeof(struct SSample6)); ASSERT_NE(srcObj, nullptr); srcObj->m1.m1 = true; - srcObj->m1.m2 = 1; + srcObj->m1.m2 = g_integer32Var; - srcObj->m2Len = 2; - srcObj->m2 = (union USample*)OsalMemCalloc(sizeof(union USample) * srcObj->m2Len); + srcObj->m2Len = g_arrayLen; + srcObj->m2 = (union USample*)OsalMemCalloc(sizeof(union USample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m2Len; i++) { (srcObj->m2[i]).m1 = true; (srcObj->m2[i]).m2 = 2; } - srcObj->m3Len = 2; - srcObj->m3 = (union USample*)OsalMemCalloc(sizeof(union USample) * srcObj->m3Len); + srcObj->m3Len = g_arrayLen; + srcObj->m3 = (union USample*)OsalMemCalloc(sizeof(union USample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m3Len; i++) { (srcObj->m3[i]).m1 = true; (srcObj->m3[i]).m2 = 2; } - struct SSample6* destObj = nullptr; + struct SSample6 *destObj = nullptr; int32_t ec = g_testClient->SSample6Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); diff --git a/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp b/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp index 6a26787e..3473bf4a 100755 --- a/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp +++ b/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp @@ -114,31 +114,8 @@ HWTEST_F(CppStructTest, CppStructTest_004, TestSize.Level1) close(destObj.m4); } -HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) +static void CompareSSample4Part1(const SSample4& srcObj, const SSample4& destObj) const { - SSample4 srcObj = { - {true, false}, - {65, 66}, - {3, 4}, - {5, 6}, - {7, 8}, - {97, 98}, - {30, 40}, - {50, 60}, - {70, 80}, - {10.5, 20.5}, - {30.125, 30.125}, - {"hello", "world"}, - {ESample::MEM_ONE, ESample::MEM_THREE}, - {{true, 1, 1000.125, "hello"}, {false, 1, 1000.125, "world"}}, - {sptr(new SequenceData(1, 1.2, "hello")), sptr(new SequenceData(2, 2.2, "world"))}, - }; - - SSample4 destObj; - - int32_t ec = g_testClient->SSample4Test(srcObj, destObj); - ASSERT_EQ(ec, HDF_SUCCESS); - for (size_t i = 0; i < srcObj.m1.size(); i++) { EXPECT_EQ((srcObj.m1[i] ? 1 : 0), (destObj.m1[i] ? 1 : 0)); } @@ -158,7 +135,10 @@ HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) for (size_t i = 0; i < srcObj.m5.size(); i++) { EXPECT_EQ(srcObj.m5[i], destObj.m5[i]); } +} +static void CompareSSample4Part2(const SSample4& srcObj, const SSample4& destObj) const +{ for (size_t i = 0; i < srcObj.m6.size(); i++) { EXPECT_EQ(srcObj.m6[i], destObj.m6[i]); } @@ -182,7 +162,10 @@ HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) for (size_t i = 0; i < srcObj.m11.size(); i++) { EXPECT_DOUBLE_EQ(srcObj.m11[i], destObj.m11[i]); } +} +static void CompareSSample4Part3(const SSample4& srcObj, const SSample4& destObj) const +{ for (size_t i = 0; i < srcObj.m12.size(); i++) { EXPECT_EQ(srcObj.m12[i], destObj.m12[i]); } @@ -212,9 +195,16 @@ HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) } } -HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) +static void CompareSSample4(const SSample4& srcObj, const SSample4& destObj) const { - SSample5 srcObj = { + CompareSSample4Part1(srcObj, destObj); + CompareSSample4Part2(srcObj, destObj); + CompareSSample4Part3(srcObj, destObj); +} + +HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) +{ + SSample4 srcObj = { {true, false}, {65, 66}, {3, 4}, @@ -232,11 +222,16 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) {sptr(new SequenceData(1, 1.2, "hello")), sptr(new SequenceData(2, 2.2, "world"))}, }; - SSample5 destObj; + SSample4 destObj; - int32_t ec = g_testClient->SSample5Test(srcObj, destObj); + int32_t ec = g_testClient->SSample4Test(srcObj, destObj); ASSERT_EQ(ec, HDF_SUCCESS); + CompareSSample4(srcObj, destObj); +} + +static void CompareSSample5Part1(const SSample5& srcObj, const SSample5& destObj) const +{ for (size_t i = 0; i < srcObj.m1.size(); i++) { EXPECT_EQ((srcObj.m1[i] ? 1 : 0), (destObj.m1[i] ? 1 : 0)); } @@ -256,7 +251,10 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) for (size_t i = 0; i < srcObj.m5.size(); i++) { EXPECT_EQ(srcObj.m5[i], destObj.m5[i]); } +} +static void CompareSSample5Part2(const SSample5& srcObj, const SSample5& destObj) const +{ for (size_t i = 0; i < srcObj.m6.size(); i++) { EXPECT_EQ(srcObj.m6[i], destObj.m6[i]); } @@ -280,7 +278,10 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) for (size_t i = 0; i < srcObj.m11.size(); i++) { EXPECT_DOUBLE_EQ(srcObj.m11[i], destObj.m11[i]); } +} +static void CompareSSample5Part3(const SSample5& srcObj, const SSample5& destObj) const +{ for (size_t i = 0; i < srcObj.m12.size(); i++) { EXPECT_EQ(srcObj.m12[i], destObj.m12[i]); } @@ -308,4 +309,39 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) std::cout << "var1 or var2 is nullptr" << std::endl; } } +} + +static void CompareSSample5(const SSample5& srcObj, const SSample5& destObj) const +{ + CompareSSample5Part1(srcObj, destObj); + CompareSSample5Part2(srcObj, destObj); + CompareSSample5Part3(srcObj, destObj); +} + +HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) +{ + SSample5 srcObj = { + {true, false}, + {65, 66}, + {3, 4}, + {5, 6}, + {7, 8}, + {97, 98}, + {30, 40}, + {50, 60}, + {70, 80}, + {10.5, 20.5}, + {30.125, 30.125}, + {"hello", "world"}, + {ESample::MEM_ONE, ESample::MEM_THREE}, + {{true, 1, 1000.125, "hello"}, {false, 1, 1000.125, "world"}}, + {sptr(new SequenceData(1, 1.2, "hello")), sptr(new SequenceData(2, 2.2, "world"))}, + }; + + SSample5 destObj; + + int32_t ec = g_testClient->SSample5Test(srcObj, destObj); + ASSERT_EQ(ec, HDF_SUCCESS); + + CompareSSample5(srcObj, destObj); } \ No newline at end of file diff --git a/tools/hdi-gen/util/file.h b/tools/hdi-gen/util/file.h index 988b9c96..dec9279a 100755 --- a/tools/hdi-gen/util/file.h +++ b/tools/hdi-gen/util/file.h @@ -88,4 +88,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_FILE_H +#endif // OHOS_HDI_FILE_H \ No newline at end of file diff --git a/tools/hdi-gen/util/light_refcount_base.h b/tools/hdi-gen/util/light_refcount_base.h index b0ea2547..2afac227 100755 --- a/tools/hdi-gen/util/light_refcount_base.h +++ b/tools/hdi-gen/util/light_refcount_base.h @@ -38,4 +38,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_LIGHTREFCOUNTBASE_H +#endif // OHOS_HDI_LIGHTREFCOUNTBASE_H \ No newline at end of file diff --git a/tools/hdi-gen/util/logger.h b/tools/hdi-gen/util/logger.h index c2d6ad93..2ba473cb 100755 --- a/tools/hdi-gen/util/logger.h +++ b/tools/hdi-gen/util/logger.h @@ -46,4 +46,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_LOGGER_H +#endif // OHOS_HDI_LOGGER_H \ No newline at end of file diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index 8825856b..a8f8a7c4 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -122,4 +122,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDIL_OPTION_H +#endif // OHOS_HDIL_OPTION_H \ No newline at end of file