1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2022 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 "metadata/metadata_builder.h" 18ca0551cfSopenharmony_ci#include "metadata/metadata_dumper.h" 19ca0551cfSopenharmony_ci#include "metadata/metadata_reader.h" 20ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h" 21ca0551cfSopenharmony_ci#include "parser/parser.h" 22ca0551cfSopenharmony_ci#include "util/logger.h" 23ca0551cfSopenharmony_ci#include "util/options.h" 24ca0551cfSopenharmony_ci 25ca0551cfSopenharmony_ciusing namespace OHOS::Idl; 26ca0551cfSopenharmony_ci 27ca0551cfSopenharmony_cistatic const char* TAG = "idl"; 28ca0551cfSopenharmony_ci 29ca0551cfSopenharmony_cistatic int DoOptionsCheck(Options& options) 30ca0551cfSopenharmony_ci{ 31ca0551cfSopenharmony_ci if (options.DoShowUsage()) { 32ca0551cfSopenharmony_ci options.ShowUsage(); 33ca0551cfSopenharmony_ci return 0; 34ca0551cfSopenharmony_ci } 35ca0551cfSopenharmony_ci 36ca0551cfSopenharmony_ci if (options.DoShowVersion()) { 37ca0551cfSopenharmony_ci options.ShowVersion(); 38ca0551cfSopenharmony_ci return 0; 39ca0551cfSopenharmony_ci } 40ca0551cfSopenharmony_ci 41ca0551cfSopenharmony_ci if (options.HasErrors()) { 42ca0551cfSopenharmony_ci options.ShowErrors(); 43ca0551cfSopenharmony_ci return 0; 44ca0551cfSopenharmony_ci } 45ca0551cfSopenharmony_ci 46ca0551cfSopenharmony_ci if (options.GetTargetLanguage().Equals("rust") || 47ca0551cfSopenharmony_ci options.GetTargetLanguage().Equals("ts")) { 48ca0551cfSopenharmony_ci if (options.DoSearchKeywords()) { 49ca0551cfSopenharmony_ci options.ShowWarning(); 50ca0551cfSopenharmony_ci } 51ca0551cfSopenharmony_ci } 52ca0551cfSopenharmony_ci return 1; 53ca0551cfSopenharmony_ci} 54ca0551cfSopenharmony_ci 55ca0551cfSopenharmony_cistatic int DoCompile(Options& options, std::shared_ptr<MetaComponent>& metadata) 56ca0551cfSopenharmony_ci{ 57ca0551cfSopenharmony_ci if (options.DoCompile()) { 58ca0551cfSopenharmony_ci Parser parser(options); 59ca0551cfSopenharmony_ci if (!parser.Parse(options.GetSourceFile())) { 60ca0551cfSopenharmony_ci Logger::E(TAG, "Parsing .idl failed."); 61ca0551cfSopenharmony_ci return -1; 62ca0551cfSopenharmony_ci } 63ca0551cfSopenharmony_ci 64ca0551cfSopenharmony_ci MetadataBuilder builder(parser.GetModule()); 65ca0551cfSopenharmony_ci metadata = builder.Build(); 66ca0551cfSopenharmony_ci if (metadata == nullptr) { 67ca0551cfSopenharmony_ci Logger::E(TAG, "Generate metadata failed."); 68ca0551cfSopenharmony_ci return -1; 69ca0551cfSopenharmony_ci } 70ca0551cfSopenharmony_ci } 71ca0551cfSopenharmony_ci 72ca0551cfSopenharmony_ci if (options.DoDumpMetadata()) { 73ca0551cfSopenharmony_ci MetadataDumper dumper(metadata.get()); 74ca0551cfSopenharmony_ci dumper.Dump(""); 75ca0551cfSopenharmony_ci } 76ca0551cfSopenharmony_ci 77ca0551cfSopenharmony_ci if (options.DoSaveMetadata()) { 78ca0551cfSopenharmony_ci File metadataFile(options.GetMetadataFile(), File::WRITE); 79ca0551cfSopenharmony_ci if (!metadataFile.IsValid()) { 80ca0551cfSopenharmony_ci Logger::E(TAG, "Create metadata file failed."); 81ca0551cfSopenharmony_ci return -1; 82ca0551cfSopenharmony_ci } 83ca0551cfSopenharmony_ci 84ca0551cfSopenharmony_ci MetadataSerializer serializer(metadata.get()); 85ca0551cfSopenharmony_ci serializer.Serialize(); 86ca0551cfSopenharmony_ci uintptr_t data = serializer.GetData(); 87ca0551cfSopenharmony_ci int size = serializer.GetDataSize(); 88ca0551cfSopenharmony_ci 89ca0551cfSopenharmony_ci metadataFile.WriteData(reinterpret_cast<void*>(data), size); 90ca0551cfSopenharmony_ci metadataFile.Flush(); 91ca0551cfSopenharmony_ci metadataFile.Close(); 92ca0551cfSopenharmony_ci } 93ca0551cfSopenharmony_ci return 0; 94ca0551cfSopenharmony_ci} 95ca0551cfSopenharmony_ci 96ca0551cfSopenharmony_cistatic int DoGenerage(const Options& options, std::shared_ptr<MetaComponent>& metadata) 97ca0551cfSopenharmony_ci{ 98ca0551cfSopenharmony_ci if (options.DoGenerateCode()) { 99ca0551cfSopenharmony_ci if (metadata == nullptr) { 100ca0551cfSopenharmony_ci String metadataFile = options.GetMetadataFile(); 101ca0551cfSopenharmony_ci metadata = MetadataReader::ReadMetadataFromFile(metadataFile); 102ca0551cfSopenharmony_ci if (metadata == nullptr) { 103ca0551cfSopenharmony_ci Logger::E(TAG, "Get metadata from \"%s\" failed.", metadataFile.string()); 104ca0551cfSopenharmony_ci return -1; 105ca0551cfSopenharmony_ci } 106ca0551cfSopenharmony_ci } 107ca0551cfSopenharmony_ci 108ca0551cfSopenharmony_ci CodeGenerator codeGen(metadata.get(), options.GetTargetLanguage(), 109ca0551cfSopenharmony_ci options.GetGenerationDirectory(), options.GetAttribute()); 110ca0551cfSopenharmony_ci if (!codeGen.Generate()) { 111ca0551cfSopenharmony_ci Logger::E(TAG, "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); 112ca0551cfSopenharmony_ci return -1; 113ca0551cfSopenharmony_ci } 114ca0551cfSopenharmony_ci } 115ca0551cfSopenharmony_ci return 0; 116ca0551cfSopenharmony_ci} 117ca0551cfSopenharmony_ci 118ca0551cfSopenharmony_ciint main(int argc, char** argv) 119ca0551cfSopenharmony_ci{ 120ca0551cfSopenharmony_ci Options options(argc, argv); 121ca0551cfSopenharmony_ci int checkOffRes = DoOptionsCheck(options); 122ca0551cfSopenharmony_ci if (!checkOffRes) { 123ca0551cfSopenharmony_ci return checkOffRes; 124ca0551cfSopenharmony_ci } 125ca0551cfSopenharmony_ci 126ca0551cfSopenharmony_ci std::shared_ptr<MetaComponent> metadata; 127ca0551cfSopenharmony_ci int compileRes = DoCompile(options, metadata); 128ca0551cfSopenharmony_ci if (compileRes) { 129ca0551cfSopenharmony_ci return compileRes; 130ca0551cfSopenharmony_ci } 131ca0551cfSopenharmony_ci 132ca0551cfSopenharmony_ci int generateRes = DoGenerage(options, metadata); 133ca0551cfSopenharmony_ci if (generateRes) { 134ca0551cfSopenharmony_ci return generateRes; 135ca0551cfSopenharmony_ci } 136ca0551cfSopenharmony_ci 137ca0551cfSopenharmony_ci return 0; 138ca0551cfSopenharmony_ci} 139