1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License. 5ca0551cfSopenharmony_ci * You may obtain a copy of the License at 6ca0551cfSopenharmony_ci * 7ca0551cfSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ca0551cfSopenharmony_ci * 9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and 13ca0551cfSopenharmony_ci * limitations under the License. 14ca0551cfSopenharmony_ci */ 15ca0551cfSopenharmony_ci 16ca0551cfSopenharmony_ci#include "codegen/code_generator.h" 17ca0551cfSopenharmony_ci#include "parser/parser.h" 18ca0551cfSopenharmony_ci#include "preprocessor/preprocessor.h" 19ca0551cfSopenharmony_ci#include "util/file.h" 20ca0551cfSopenharmony_ci#include "util/logger.h" 21ca0551cfSopenharmony_ci#include "util/options.h" 22ca0551cfSopenharmony_ci#include "hash/hash.h" 23ca0551cfSopenharmony_ci#include "metadata/metadata_builder.h" 24ca0551cfSopenharmony_ci#include "metadata/metadata_dumper.h" 25ca0551cfSopenharmony_ci#include "metadata/metadata_reader.h" 26ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h" 27ca0551cfSopenharmony_ci 28ca0551cfSopenharmony_ciusing namespace OHOS::Idl; 29ca0551cfSopenharmony_ci 30ca0551cfSopenharmony_cistatic int FileParse(Parser &parser) 31ca0551cfSopenharmony_ci{ 32ca0551cfSopenharmony_ci std::vector<FileDetail> fileDetails; 33ca0551cfSopenharmony_ci if (!Preprocessor::Preprocess(fileDetails)) { 34ca0551cfSopenharmony_ci Logger::E(TAG, "failed to preprocess"); 35ca0551cfSopenharmony_ci return -1; 36ca0551cfSopenharmony_ci } 37ca0551cfSopenharmony_ci 38ca0551cfSopenharmony_ci if (!parser.Parse(fileDetails)) { 39ca0551cfSopenharmony_ci Logger::E(TAG, "failed to parse file"); 40ca0551cfSopenharmony_ci return -1; 41ca0551cfSopenharmony_ci } 42ca0551cfSopenharmony_ci 43ca0551cfSopenharmony_ci return 0; 44ca0551cfSopenharmony_ci} 45ca0551cfSopenharmony_ci 46ca0551cfSopenharmony_cistatic void DumpAst(const StrAstMap &allAst) 47ca0551cfSopenharmony_ci{ 48ca0551cfSopenharmony_ci const Options &options = Options::GetInstance(); 49ca0551cfSopenharmony_ci if (!options.DoDumpAST()) { 50ca0551cfSopenharmony_ci return; 51ca0551cfSopenharmony_ci } 52ca0551cfSopenharmony_ci for (const auto &astPair : allAst) { 53ca0551cfSopenharmony_ci AutoPtr<AST> ast = astPair.second; 54ca0551cfSopenharmony_ci if ((options.GetInterfaceType() == InterfaceType::SA) && 55ca0551cfSopenharmony_ci (ast->GetASTFileType() != ASTFileType::AST_IFACE)) { 56ca0551cfSopenharmony_ci continue; 57ca0551cfSopenharmony_ci } 58ca0551cfSopenharmony_ci if (astPair.second != nullptr) { 59ca0551cfSopenharmony_ci printf("%s\n", astPair.second->Dump("").c_str()); 60ca0551cfSopenharmony_ci } 61ca0551cfSopenharmony_ci } 62ca0551cfSopenharmony_ci} 63ca0551cfSopenharmony_ci 64ca0551cfSopenharmony_cistatic int DumpMetaData(const StrAstMap &allAst) 65ca0551cfSopenharmony_ci{ 66ca0551cfSopenharmony_ci Options &options = Options::GetInstance(); 67ca0551cfSopenharmony_ci if ((options.GetInterfaceType() != InterfaceType::SA)) { 68ca0551cfSopenharmony_ci return 0; 69ca0551cfSopenharmony_ci } 70ca0551cfSopenharmony_ci 71ca0551cfSopenharmony_ci AutoPtr<AST> ast; 72ca0551cfSopenharmony_ci for (const auto &astPair : allAst) { 73ca0551cfSopenharmony_ci ast = astPair.second; 74ca0551cfSopenharmony_ci if (ast->GetASTFileType() == ASTFileType::AST_IFACE) { 75ca0551cfSopenharmony_ci break; 76ca0551cfSopenharmony_ci } 77ca0551cfSopenharmony_ci } 78ca0551cfSopenharmony_ci MetadataBuilder builder(ast); 79ca0551cfSopenharmony_ci std::shared_ptr<MetaComponent> metadata = builder.Build(); 80ca0551cfSopenharmony_ci if (metadata == nullptr) { 81ca0551cfSopenharmony_ci Logger::E(TAG, "Generate metadata failed."); 82ca0551cfSopenharmony_ci return -1; 83ca0551cfSopenharmony_ci } 84ca0551cfSopenharmony_ci 85ca0551cfSopenharmony_ci if (options.DoDumpMetadata()) { 86ca0551cfSopenharmony_ci MetadataDumper dumper(metadata.get()); 87ca0551cfSopenharmony_ci printf("%s", dumper.Dump("").c_str()); 88ca0551cfSopenharmony_ci } 89ca0551cfSopenharmony_ci 90ca0551cfSopenharmony_ci if (options.DoSaveMetadata()) { 91ca0551cfSopenharmony_ci File metadataFile(options.GetMetadataFile(), File::WRITE); 92ca0551cfSopenharmony_ci if (!metadataFile.IsValid()) { 93ca0551cfSopenharmony_ci Logger::E(TAG, "Create metadata file failed."); 94ca0551cfSopenharmony_ci return -1; 95ca0551cfSopenharmony_ci } 96ca0551cfSopenharmony_ci 97ca0551cfSopenharmony_ci MetadataSerializer serializer(metadata.get()); 98ca0551cfSopenharmony_ci serializer.Serialize(); 99ca0551cfSopenharmony_ci uintptr_t data = serializer.GetData(); 100ca0551cfSopenharmony_ci int size = serializer.GetDataSize(); 101ca0551cfSopenharmony_ci 102ca0551cfSopenharmony_ci metadataFile.WriteData(reinterpret_cast<void*>(data), size); 103ca0551cfSopenharmony_ci metadataFile.Flush(); 104ca0551cfSopenharmony_ci metadataFile.Close(); 105ca0551cfSopenharmony_ci } 106ca0551cfSopenharmony_ci return 0; 107ca0551cfSopenharmony_ci} 108ca0551cfSopenharmony_ci 109ca0551cfSopenharmony_cistatic int ReadMetaData(StrAstMap &astList) 110ca0551cfSopenharmony_ci{ 111ca0551cfSopenharmony_ci const Options &options = Options::GetInstance(); 112ca0551cfSopenharmony_ci if ((options.GetInterfaceType() != InterfaceType::SA) || options.DoCompile()) { 113ca0551cfSopenharmony_ci return 0; 114ca0551cfSopenharmony_ci } 115ca0551cfSopenharmony_ci std::string metadataFile = options.GetMetadataFile(); 116ca0551cfSopenharmony_ci std::shared_ptr<MetaComponent> metadata = MetadataReader::ReadMetadataFromFile(metadataFile); 117ca0551cfSopenharmony_ci if (metadata == nullptr) { 118ca0551cfSopenharmony_ci Logger::E(TAG, "Get metadata from \"%s\" failed.", metadataFile.c_str()); 119ca0551cfSopenharmony_ci return -1; 120ca0551cfSopenharmony_ci } 121ca0551cfSopenharmony_ci 122ca0551cfSopenharmony_ci MetadataReader reader(metadata.get()); 123ca0551cfSopenharmony_ci astList = reader.ReadMetadataToAst(); 124ca0551cfSopenharmony_ci return 0; 125ca0551cfSopenharmony_ci} 126ca0551cfSopenharmony_ci 127ca0551cfSopenharmony_ciint main(int argc, char **argv) 128ca0551cfSopenharmony_ci{ 129ca0551cfSopenharmony_ci Options &options = Options::GetInstance(); 130ca0551cfSopenharmony_ci if (!options.Parse(argc, argv)) { 131ca0551cfSopenharmony_ci return -1; 132ca0551cfSopenharmony_ci } 133ca0551cfSopenharmony_ci 134ca0551cfSopenharmony_ci if (options.DoShowUsage()) { 135ca0551cfSopenharmony_ci options.ShowUsage(); 136ca0551cfSopenharmony_ci return 0; 137ca0551cfSopenharmony_ci } 138ca0551cfSopenharmony_ci if (options.DoShowVersion()) { 139ca0551cfSopenharmony_ci options.ShowVersion(); 140ca0551cfSopenharmony_ci return 0; 141ca0551cfSopenharmony_ci } 142ca0551cfSopenharmony_ci if (options.HasWarning()) { 143ca0551cfSopenharmony_ci options.ShowWarning(); 144ca0551cfSopenharmony_ci } 145ca0551cfSopenharmony_ci 146ca0551cfSopenharmony_ci if (options.DoGetHashKey()) { 147ca0551cfSopenharmony_ci return Hash::GenHashKey() ? 0 : -1; 148ca0551cfSopenharmony_ci } 149ca0551cfSopenharmony_ci 150ca0551cfSopenharmony_ci StrAstMap astList; 151ca0551cfSopenharmony_ci Parser parser; 152ca0551cfSopenharmony_ci if (options.DoCompile()) { 153ca0551cfSopenharmony_ci if (FileParse(parser) != 0) { 154ca0551cfSopenharmony_ci return -1; 155ca0551cfSopenharmony_ci } 156ca0551cfSopenharmony_ci 157ca0551cfSopenharmony_ci astList = parser.GetAllAst(); 158ca0551cfSopenharmony_ci DumpAst(astList); 159ca0551cfSopenharmony_ci 160ca0551cfSopenharmony_ci if (DumpMetaData(astList) != 0) { 161ca0551cfSopenharmony_ci return -1; 162ca0551cfSopenharmony_ci } 163ca0551cfSopenharmony_ci } 164ca0551cfSopenharmony_ci 165ca0551cfSopenharmony_ci if (!options.DoGenerateCode()) { 166ca0551cfSopenharmony_ci return 0; 167ca0551cfSopenharmony_ci } 168ca0551cfSopenharmony_ci 169ca0551cfSopenharmony_ci if (ReadMetaData(astList) != 0) { 170ca0551cfSopenharmony_ci return -1; 171ca0551cfSopenharmony_ci } 172ca0551cfSopenharmony_ci 173ca0551cfSopenharmony_ci if (!CodegenBuilder::GetInstance().Generate(astList)) { 174ca0551cfSopenharmony_ci Logger::E(TAG, "failed to generate code"); 175ca0551cfSopenharmony_ci return -1; 176ca0551cfSopenharmony_ci } 177ca0551cfSopenharmony_ci return 0; 178ca0551cfSopenharmony_ci}